- commit
- 233b30fa19769226fc33168a98d12649dec767b8
- parent
- 08438331d0253ee0270cbaaedd37b5c9e5141166
- author
- Dami <dami.etoile@gmail.com>
@@ -10,4 +10,5 @@ coverage/
1010 playwright-report/1111 test-results/1212 .playwright-cli/13+.nzip-*/1314 .DS_Store@@ -0,0 +1,42 @@
1+import { fileURLToPath } from "node:url";2+import preact from "@astrojs/preact";3+import { defineConfig } from "astro/config";4+import { jazzPlugin } from "jazz-tools/dev/vite";5+6+const workspaceRoot = fileURLToPath(new URL("../../", import.meta.url));7+const schemaDir = fileURLToPath(new URL("./src", import.meta.url));8+const cloudAppId = process.env.JAZZ_APP_ID?.trim();9+const cloudServerUrl = process.env.JAZZ_SERVER_URL?.trim();10+const managedJazzServer = process.env.LOFI_SKIP_JAZZ_MANAGED === "1"11+ ? false12+ : { allowLocalFirstAuth: true };13+14+if (Boolean(cloudAppId) !== Boolean(cloudServerUrl)) {15+ throw new Error(16+ "Cloud mode requires both JAZZ_APP_ID and JAZZ_SERVER_URL; set the missing name or remove the partial pair.",17+ );18+}19+if (cloudAppId && cloudServerUrl) {20+ process.env.VITE_JAZZ_APP_ID = cloudAppId;21+ process.env.VITE_JAZZ_SERVER_URL = cloudServerUrl;22+}23+24+export default defineConfig({25+ output: "static",26+ integrations: [preact({ compat: true, devtools: true })],27+ vite: {28+ plugins: [29+ jazzPlugin({30+ schemaDir,31+ inspector: false,32+ server: managedJazzServer,33+ }),34+ ],35+ server: {36+ fs: { allow: [workspaceRoot] },37+ },38+ resolve: {39+ noExternal: ["@astrojs/preact"],40+ },41+ },42+});@@ -0,0 +1,18 @@
1+{2+ "name": "lofi device contract",3+ "short_name": "lofi",4+ "description": "M1 local-first durability and identity contract harness",5+ "start_url": "./",6+ "scope": "./",7+ "display": "standalone",8+ "background_color": "#18231f",9+ "theme_color": "#18231f",10+ "icons": [11+ {12+ "src": "./favicon.svg",13+ "sizes": "any",14+ "type": "image/svg+xml",15+ "purpose": "any maskable"16+ }17+ ]18+}@@ -0,0 +1,49 @@
1+const BUILD_REVISION = "__LOFI_BUILD_REVISION__";2+const CACHE_NAME = `lofi-shell-${BUILD_REVISION}`;3+4+self.addEventListener("install", (event) => {5+ event.waitUntil((async () => {6+ const manifestUrl = new URL("./lofi-precache.json", self.registration.scope);7+ const response = await fetch(manifestUrl, { cache: "no-store" });8+ if (!response.ok) throw new Error(`precache manifest failed: ${response.status}`);9+ const paths = await response.json();10+ const cache = await caches.open(CACHE_NAME);11+ await cache.addAll(paths.map((path) => new URL(path, self.registration.scope)));12+ await self.skipWaiting();13+ })());14+});15+16+self.addEventListener("activate", (event) => {17+ event.waitUntil((async () => {18+ for (const name of await caches.keys()) {19+ if (name.startsWith("lofi-shell-") && name !== CACHE_NAME) await caches.delete(name);20+ }21+ await self.clients.claim();22+ })());23+});24+25+self.addEventListener("fetch", (event) => {26+ if (event.request.method !== "GET") return;27+ const requestUrl = new URL(event.request.url);28+ if (requestUrl.origin !== self.location.origin) return;29+ event.respondWith((async () => {30+ const cached = await caches.match(event.request, {31+ ignoreSearch: event.request.mode === "navigate",32+ });33+ if (cached) return cached;34+ try {35+ const response = await fetch(event.request);36+ if (response.ok) {37+ const cache = await caches.open(CACHE_NAME);38+ void cache.put(event.request, response.clone());39+ }40+ return response;41+ } catch (error) {42+ if (event.request.mode === "navigate") {43+ const shell = await caches.match(new URL("./", self.registration.scope));44+ if (shell) return shell;45+ }46+ throw error;47+ }48+ })());49+});@@ -0,0 +1,63 @@
1+import { useDeviceCapabilities } from "../runtime/use-device-capabilities.ts";2+import { settleUiMutation } from "../runtime/ui-mutation.ts";3+4+export default function DeviceStatus() {5+ const { report, requestPersistence } = useDeviceCapabilities();6+ if (!report) return <p class="device-status">Checking durable-storage capabilities…</p>;7+8+ return (9+ <section class="device-status" aria-labelledby="device-status-title">10+ <header>11+ <p class="eyebrow">Device gate</p>12+ <h2 id="device-status-title">13+ {report.durableDriverSupported ? "Durable driver supported" : "Durable driver blocked"}14+ </h2>15+ </header>16+ <dl>17+ <div>18+ <dt>Context</dt>19+ <dd>{report.secureContext ? "secure" : "not secure"}</dd>20+ </div>21+ <div>22+ <dt>OPFS</dt>23+ <dd>{report.opfs ? "available" : "missing"}</dd>24+ </div>25+ <div>26+ <dt>SharedWorker</dt>27+ <dd>{report.sharedWorker ? "available" : "missing"}</dd>28+ </div>29+ <div>30+ <dt>Web Locks</dt>31+ <dd>{report.webLocks ? "available" : "missing"}</dd>32+ </div>33+ <div>34+ <dt>Storage persistence</dt>35+ <dd>{report.persistentPermission}</dd>36+ </div>37+ <div>38+ <dt>Display mode</dt>39+ <dd>{report.displayMode}</dd>40+ </div>41+ <div>42+ <dt>Identity</dt>43+ <dd>device-local key</dd>44+ </div>45+ <div>46+ <dt>Passkey backup</dt>47+ <dd>blocked by alpha security review</dd>48+ </div>49+ </dl>50+ <button type="button" onClick={() => void settleUiMutation(requestPersistence())}>51+ Request storage persistence52+ </button>53+ <p>54+ OPFS capability and eviction protection are separate. A declined persistence request does55+ not mean the Jazz driver is using memory.56+ </p>57+ <p>58+ Clearing site data destroys the device-local identity unless a separate recovery mechanism59+ has been verified. This prototype does not claim passkey recovery.60+ </p>61+ </section>62+ );63+}@@ -0,0 +1,58 @@
1+import { useState } from "preact/hooks";2+import "../runtime/boot.ts";3+import { settleUiMutation } from "../runtime/ui-mutation.ts";4+import { useNotes } from "../runtime/use-notes.ts";5+6+export interface NotesIslandProps {7+ label: string;8+}9+10+export default function NotesIsland({ label }: NotesIslandProps) {11+ const state = useNotes();12+ const [body, setBody] = useState("");13+ const inputId = `note-${label.toLowerCase().replaceAll(/[^a-z0-9]+/g, "-")}`;14+15+ return (16+ <section class="island" data-island={label}>17+ <header>18+ <p class="eyebrow">{label}</p>19+ <h2>Shared notes</h2>20+ </header>21+ <form22+ onSubmit={(event) => {23+ event.preventDefault();24+ const next = body.trim();25+ if (!next) return;26+ setBody("");27+ void settleUiMutation(state.add(next));28+ }}29+ >30+ <label for={inputId}>New note</label>31+ <div class="composer">32+ <input33+ id={inputId}34+ value={body}35+ onInput={(event) => setBody(event.currentTarget.value)}36+ autocomplete="off"37+ />38+ <button type="submit">Add from {label}</button>39+ </div>40+ </form>41+ <p class="state" role="status">42+ {state.status === "loading" && "Opening persistent storage…"}43+ {state.status === "error" && `Error: ${state.error}`}44+ {state.status === "ready" &&45+ `${state.notes.length} note(s) · last write ${state.durability}`}46+ </p>47+ <ul aria-label={`${label} notes`}>48+ {state.notes.map((note) => <li key={note.id} data-note-id={note.id}>{note.body}</li>)}49+ </ul>50+ <p class="diagnostics" data-diagnostics>51+ storage {state.diagnostics.storageState} · clients {state.diagnostics.activeClients}{" "}52+ · consumers {state.diagnostics.activeConsumers} · subscriptions{" "}53+ {state.diagnostics.activeVendorSubscriptions} · error listeners {state54+ .diagnostics.activeMutationListeners}55+ </p>56+ </section>57+ );58+}@@ -0,0 +1,35 @@
1+---2+import NotesIsland from "../components/NotesIsland";3+import DeviceStatus from "../components/DeviceStatus";4+import "../styles/global.css";5+---6+7+<!doctype html>8+<html lang="en">9+ <head>10+ <meta charset="UTF-8" />11+ <meta name="viewport" content="width=device-width" />12+ <meta name="theme-color" content="#18231f" />13+ <link rel="icon" href="./favicon.svg" type="image/svg+xml" />14+ <link rel="manifest" href="./manifest.webmanifest" />15+ <title>lofi prototype</title>16+ </head>17+ <body>18+ <main>19+ <header class="hero">20+ <p class="eyebrow">M1 graduated candidate</p>21+ <h1>One local-first runtime.<br />Two Astro islands.</h1>22+ <p>23+ Writes are local first, storage is explicit, and framework machinery stays behind the24+ component boundary.25+ </p>26+ </header>27+ <div class="island-grid">28+ <NotesIsland label="North island" client:load />29+ <NotesIsland label="South island" client:load />30+ </div>31+ <DeviceStatus client:load />32+ <footer>Thin Preact adapter · static Astro shell · Deno command surface</footer>33+ </main>34+ </body>35+</html>@@ -0,0 +1,9 @@
1+import { schema as s } from "jazz-tools";2+import { app } from "./schema.ts";3+4+export default s.definePermissions(app, ({ policy, session }) => {5+ policy.notes.allowRead.where({ $createdBy: session.user_id });6+ policy.notes.allowInsert.always();7+ policy.notes.allowUpdate.where({ $createdBy: session.user_id });8+ policy.notes.allowDelete.where({ $createdBy: session.user_id });9+});@@ -0,0 +1,16 @@
1+/// <reference path="../env.d.ts" />2+3+import type { DbConfig } from "jazz-tools";4+5+const LOCAL_APP_ID = "00000000-0000-0000-0000-00000000f153";6+export const appId = import.meta.env?.VITE_JAZZ_APP_ID ?? LOCAL_APP_ID;7+export const serverUrl = import.meta.env?.VITE_JAZZ_SERVER_URL;8+9+export function databaseConfig(secret: string): DbConfig {10+ return {11+ appId,12+ ...(serverUrl ? { serverUrl } : {}),13+ secret,14+ driver: { type: "persistent", dbName: `lofi-prototype-${appId}` },15+ };16+}@@ -0,0 +1,98 @@
1+export type DeviceCapabilityReport = {2+ secureContext: boolean;3+ opfs: boolean;4+ sharedWorker: boolean;5+ webLocks: boolean;6+ messageChannel: boolean;7+ durableDriverSupported: boolean;8+ persistentPermission: "granted" | "not-granted" | "unavailable" | "error";9+ displayMode: "standalone" | "browser";10+};11+12+type StorageManagerWithOpfs = StorageManager & {13+ getDirectory?: () => Promise<FileSystemDirectoryHandle>;14+};15+16+function browserStorage(): StorageManagerWithOpfs | undefined {17+ return typeof navigator === "undefined"18+ ? undefined19+ : navigator.storage as StorageManagerWithOpfs | undefined;20+}21+22+export function durableCapabilityReport(): Omit<23+ DeviceCapabilityReport,24+ "persistentPermission"25+> {26+ const storage = browserStorage();27+ const locks = typeof navigator === "undefined" ? undefined : navigator.locks;28+ const secureContext = globalThis.isSecureContext === true;29+ const opfs = typeof storage?.getDirectory === "function";30+ const sharedWorker = typeof globalThis.SharedWorker === "function";31+ const webLocks = typeof locks?.request === "function";32+ const messageChannel = typeof globalThis.MessageChannel === "function";33+ return {34+ secureContext,35+ opfs,36+ sharedWorker,37+ webLocks,38+ messageChannel,39+ durableDriverSupported: secureContext && opfs && sharedWorker && webLocks && messageChannel,40+ displayMode: typeof globalThis.matchMedia === "function" &&41+ globalThis.matchMedia("(display-mode: standalone)").matches42+ ? "standalone"43+ : "browser",44+ };45+}46+47+export async function readDeviceCapabilityReport(): Promise<DeviceCapabilityReport> {48+ const base = durableCapabilityReport();49+ const storage = browserStorage();50+ if (typeof storage?.persisted !== "function") {51+ return { ...base, persistentPermission: "unavailable" };52+ }53+ try {54+ return {55+ ...base,56+ persistentPermission: await storage.persisted() ? "granted" : "not-granted",57+ };58+ } catch {59+ return { ...base, persistentPermission: "error" };60+ }61+}62+63+export async function requestPersistentStorage(): Promise<DeviceCapabilityReport> {64+ const storage = browserStorage();65+ if (typeof storage?.persist !== "function") return await readDeviceCapabilityReport();66+ try {67+ await storage.persist();68+ } catch {69+ // The subsequent read reports the browser's authoritative persisted state.70+ }71+ return await readDeviceCapabilityReport();72+}73+74+export class DurableStorageUnsupportedError extends Error {75+ override name = "DurableStorageUnsupportedError";76+ readonly report: ReturnType<typeof durableCapabilityReport>;77+78+ constructor(report = durableCapabilityReport()) {79+ const missing = Object.entries({80+ secureContext: report.secureContext,81+ opfs: report.opfs,82+ sharedWorker: report.sharedWorker,83+ webLocks: report.webLocks,84+ messageChannel: report.messageChannel,85+ }).filter(([, available]) => !available).map(([name]) => name);86+ super(87+ `Durable local storage is unsupported; missing ${88+ missing.join(", ")89+ }. Use the stable HTTPS device URL in a supported browser.`,90+ );91+ this.report = report;92+ }93+}94+95+export function assertDurableBrowser(): void {96+ const report = durableCapabilityReport();97+ if (!report.durableDriverSupported) throw new DurableStorageUnsupportedError(report);98+}@@ -0,0 +1,144 @@
1+import { BrowserAuthSecretStore, createDb, type Db } from "jazz-tools";2+import { appId, databaseConfig } from "./config.ts";3+import { assertDurableBrowser } from "./device-capabilities.ts";4+import { NotesStore, type RuntimeDiagnostics } from "./notes-store.ts";5+import {6+ AdapterLifecycle,7+ createSerializedResourceState,8+ getResource,9+ recreateResource,10+ type SerializedResourceState,11+ shutdownResource,12+} from "./resource-lifecycle.ts";13+14+export type LofiRuntime = {15+ db: Db;16+ notes: NotesStore;17+ diagnostics: RuntimeDiagnostics;18+ shutdown(): Promise<void>;19+};20+21+export const runtimeRecreatedEvent = "lofi:runtime-recreated";22+23+type RuntimeSlot = {24+ client: SerializedResourceState<Db>;25+ diagnostics: RuntimeDiagnostics;26+};27+28+const slotName = "__LOFI_ALPHA53_RUNTIME__";29+const browserGlobal = globalThis as typeof globalThis & { [slotName]?: RuntimeSlot };30+31+function slot(): RuntimeSlot {32+ browserGlobal[slotName] ??= {33+ client: createSerializedResourceState<Db>(),34+ diagnostics: {35+ storageState: "persistent-requested",36+ clientsCreated: 0,37+ activeClients: 0,38+ activeConsumers: 0,39+ activeVendorSubscriptions: 0,40+ totalVendorSubscriptions: 0,41+ activeMutationListeners: 0,42+ totalMutationListeners: 0,43+ unsubscribeCalls: 0,44+ localWaitCalls: 0,45+ mutationErrors: 0,46+ },47+ };48+ return browserGlobal[slotName];49+}50+51+async function createClient(state: RuntimeSlot): Promise<Db> {52+ try {53+ assertDurableBrowser();54+ const secret = await BrowserAuthSecretStore.getOrCreateSecret({ appId });55+ const db = await createDb(databaseConfig(secret));56+ state.diagnostics.storageState = "persistent-driver-open";57+ state.diagnostics.clientsCreated += 1;58+ state.diagnostics.activeClients += 1;59+ return db;60+ } catch (error) {61+ state.diagnostics.storageState = "failed";62+ throw error;63+ }64+}65+66+async function destroyClient(state: RuntimeSlot, db: Db): Promise<void> {67+ await db.shutdown();68+ state.diagnostics.activeClients -= 1;69+}70+71+const adapter = new AdapterLifecycle<Db, LofiRuntime>();72+let recreationPromise: Promise<LofiRuntime> | null = null;73+let shutdownPromise: Promise<void> | null = null;74+75+function attachRuntime(state: RuntimeSlot, db: Db): LofiRuntime {76+ const notes = new NotesStore(db, state.diagnostics);77+ const stopMutationErrors = db.onMutationError((event) => notes.reportMutationError(event));78+ state.diagnostics.activeMutationListeners += 1;79+ state.diagnostics.totalMutationListeners += 1;80+ let active = true;81+ const runtime: LofiRuntime = {82+ db,83+ notes,84+ diagnostics: state.diagnostics,85+ shutdown() {86+ if (!active) return Promise.resolve();87+ active = false;88+ notes.close();89+ stopMutationErrors();90+ state.diagnostics.activeMutationListeners -= 1;91+ return Promise.resolve();92+ },93+ };94+ return runtime;95+}96+97+export function getRuntime(): Promise<LofiRuntime> {98+ if (recreationPromise) return recreationPromise;99+ const state = slot();100+ return adapter.get(101+ () => getResource(state.client, () => createClient(state)),102+ (db) => attachRuntime(state, db),103+ );104+}105+106+export function getRuntimeDiagnostics(): RuntimeDiagnostics {107+ return { ...slot().diagnostics };108+}109+110+export function recreateRuntime(): Promise<LofiRuntime> {111+ if (recreationPromise) return recreationPromise;112+ const state = slot();113+ const operation = (async () => {114+ await adapter.release((runtime) => runtime.shutdown());115+ const db = await recreateResource(116+ state.client,117+ () => createClient(state),118+ (current) => destroyClient(state, current),119+ );120+ return await adapter.get(() => Promise.resolve(db), (current) => attachRuntime(state, current));121+ })();122+ const tracked = operation.finally(() => {123+ if (recreationPromise === tracked) recreationPromise = null;124+ });125+ recreationPromise = tracked;126+ return tracked;127+}128+129+export function shutdownRuntime(): Promise<void> {130+ if (shutdownPromise) return shutdownPromise;131+ const state = slot();132+ const operation = (async () => {133+ await recreationPromise?.catch(() => undefined);134+ await adapter.release((runtime) => runtime.shutdown());135+ await shutdownResource(state.client, (db) => destroyClient(state, db));136+ })();137+ const tracked = operation.finally(() => {138+ if (shutdownPromise === tracked) shutdownPromise = null;139+ });140+ shutdownPromise = tracked;141+ return tracked;142+}143+144+import.meta.hot?.dispose(() => adapter.dispose((runtime) => runtime.shutdown()));@@ -0,0 +1,149 @@
1+import type { Db, MutationErrorEvent } from "jazz-tools";2+import { app } from "../schema.ts";3+import { serverUrl } from "./config.ts";4+5+export type Note = { id: string; body: string; createdAt: Date };6+export type NotesSnapshot = {7+ status: "loading" | "ready" | "error";8+ notes: Note[];9+ durability: "none" | "local" | "global" | "failed";10+ error: string | null;11+};12+13+export type RuntimeDiagnostics = {14+ storageState: "persistent-requested" | "persistent-driver-open" | "failed";15+ clientsCreated: number;16+ activeClients: number;17+ activeConsumers: number;18+ activeVendorSubscriptions: number;19+ totalVendorSubscriptions: number;20+ activeMutationListeners: number;21+ totalMutationListeners: number;22+ unsubscribeCalls: number;23+ localWaitCalls: number;24+ mutationErrors: number;25+};26+27+type Listener = () => void;28+29+export class NotesStore {30+ readonly #db: Db;31+ readonly #diagnostics: RuntimeDiagnostics;32+ readonly #listeners = new Set<Listener>();33+ #vendorUnsubscribe: (() => void) | null = null;34+ #snapshot: NotesSnapshot = {35+ status: "loading",36+ notes: [],37+ durability: "none",38+ error: null,39+ };40+41+ constructor(db: Db, diagnostics: RuntimeDiagnostics) {42+ this.#db = db;43+ this.#diagnostics = diagnostics;44+ }45+46+ getSnapshot = (): NotesSnapshot => this.#snapshot;47+48+ subscribe = (listener: Listener): () => void => {49+ this.#listeners.add(listener);50+ this.#diagnostics.activeConsumers = this.#listeners.size;51+ if (this.#listeners.size === 1) this.#openVendorSubscription();52+ this.#emit();53+ let active = true;54+ return () => {55+ if (!active) return;56+ active = false;57+ this.#listeners.delete(listener);58+ this.#diagnostics.activeConsumers = this.#listeners.size;59+ if (this.#listeners.size === 0) this.#closeVendorSubscription();60+ else this.#emit();61+ };62+ };63+64+ async add(body: string): Promise<void> {65+ const write = this.#db.insert(app.notes, { body, createdAt: new Date() });66+ try {67+ await write.wait({ tier: "local" });68+ this.#diagnostics.localWaitCalls += 1;69+ this.#set({ durability: "local", error: null });70+ if (serverUrl) {71+ void write.wait({ tier: "global" }).then(72+ () => this.#set({ durability: "global", error: null }),73+ (error) => this.#fail(error),74+ );75+ }76+ } catch (error) {77+ this.#fail(error);78+ throw error;79+ }80+ }81+82+ async update(id: string, body: string): Promise<void> {83+ try {84+ await this.#db.update(app.notes, id, { body }).wait({ tier: "local" });85+ this.#diagnostics.localWaitCalls += 1;86+ this.#set({ durability: "local", error: null });87+ } catch (error) {88+ this.#fail(error);89+ throw error;90+ }91+ }92+93+ reportMutationError(event: MutationErrorEvent) {94+ this.#diagnostics.mutationErrors += 1;95+ this.#fail(new Error(`${event.code}: ${event.reason}`));96+ }97+98+ close() {99+ this.#listeners.clear();100+ this.#diagnostics.activeConsumers = 0;101+ this.#closeVendorSubscription();102+ }103+104+ #openVendorSubscription() {105+ if (this.#vendorUnsubscribe) return;106+ try {107+ this.#vendorUnsubscribe = this.#db.subscribeAll(app.notes, (delta) => {108+ this.#snapshot = {109+ ...this.#snapshot,110+ status: "ready",111+ notes: delta.all as Note[],112+ error: null,113+ };114+ this.#emit();115+ });116+ this.#diagnostics.activeVendorSubscriptions += 1;117+ this.#diagnostics.totalVendorSubscriptions += 1;118+ } catch (error) {119+ this.#fail(error);120+ }121+ }122+123+ #closeVendorSubscription() {124+ if (!this.#vendorUnsubscribe) return;125+ this.#vendorUnsubscribe();126+ this.#diagnostics.unsubscribeCalls += 1;127+ this.#vendorUnsubscribe = null;128+ this.#diagnostics.activeVendorSubscriptions -= 1;129+ }130+131+ #set(change: Partial<NotesSnapshot>) {132+ this.#snapshot = { ...this.#snapshot, ...change };133+ this.#emit();134+ }135+136+ #fail(error: unknown) {137+ this.#snapshot = {138+ ...this.#snapshot,139+ status: "error",140+ durability: "failed",141+ error: error instanceof Error ? error.message : String(error),142+ };143+ this.#emit();144+ }145+146+ #emit() {147+ for (const listener of this.#listeners) listener();148+ }149+}@@ -0,0 +1,156 @@
1+import type { Db, MutationErrorEvent } from "jazz-tools";2+import { NotesStore, type RuntimeDiagnostics } from "./notes-store.ts";3+4+const test = (globalThis as unknown as {5+ Deno: { test(name: string, body: () => void | Promise<void>): void };6+}).Deno.test;7+8+function assert(condition: unknown, message: string): asserts condition {9+ if (!condition) throw new Error(message);10+}11+12+function assertCount(actual: number, expected: number, message: string) {13+ if (actual !== expected) throw new Error(`${message}: expected ${expected}, received ${actual}`);14+}15+16+function diagnostics(): RuntimeDiagnostics {17+ return {18+ storageState: "persistent-driver-open",19+ clientsCreated: 1,20+ activeClients: 1,21+ activeConsumers: 0,22+ activeVendorSubscriptions: 0,23+ totalVendorSubscriptions: 0,24+ activeMutationListeners: 1,25+ totalMutationListeners: 1,26+ unsubscribeCalls: 0,27+ localWaitCalls: 0,28+ mutationErrors: 0,29+ };30+}31+32+function fakeDb() {33+ let subscriber: ((delta: { all: unknown[] }) => void) | null = null;34+ let unsubscribeCalls = 0;35+ let rejectNextWrite: Error | null = null;36+ const writes: Array<{ operation: "insert" | "update"; value: unknown }> = [];37+38+ function handle() {39+ return {40+ wait: ({ tier }: { tier: "local" | "global" }) => {41+ assert(tier === "local", "local-only tests must not request a global wait");42+ if (rejectNextWrite) {43+ const error = rejectNextWrite;44+ rejectNextWrite = null;45+ return Promise.reject(error);46+ }47+ return Promise.resolve();48+ },49+ };50+ }51+52+ const value = {53+ subscribeAll(_collection: unknown, callback: (delta: { all: unknown[] }) => void) {54+ subscriber = callback;55+ return () => {56+ unsubscribeCalls += 1;57+ subscriber = null;58+ };59+ },60+ insert(_collection: unknown, next: unknown) {61+ writes.push({ operation: "insert", value: next });62+ return handle();63+ },64+ update(_collection: unknown, id: string, next: unknown) {65+ writes.push({ operation: "update", value: { id, next } });66+ return handle();67+ },68+ } as unknown as Db;69+70+ return {71+ value,72+ publish(all: unknown[]) {73+ assert(subscriber, "expected an active vendor subscription");74+ subscriber({ all });75+ },76+ failNextWrite(message: string) {77+ rejectNextWrite = new Error(message);78+ },79+ writes,80+ unsubscribeCalls: () => unsubscribeCalls,81+ };82+}83+84+test("two consumers share one vendor subscription and clean up idempotently", () => {85+ const db = fakeDb();86+ const counts = diagnostics();87+ const store = new NotesStore(db.value, counts);88+ let firstUpdates = 0;89+ let secondUpdates = 0;90+91+ const stopFirst = store.subscribe(() => firstUpdates += 1);92+ const stopSecond = store.subscribe(() => secondUpdates += 1);93+ assertCount(counts.activeConsumers, 2, "both component consumers must be counted");94+ assertCount(95+ counts.activeVendorSubscriptions,96+ 1,97+ "one query should have one vendor subscription",98+ );99+ assertCount(counts.totalVendorSubscriptions, 1, "the underlying query should open once");100+101+ db.publish([{ id: "note-1", body: "shared", createdAt: new Date(0) }]);102+ assert(store.getSnapshot().status === "ready", "the first query result must end loading");103+ assert(store.getSnapshot().notes.length === 1, "the query result must be published");104+ assert(firstUpdates > 0 && secondUpdates > 0, "both roots must receive reactive updates");105+106+ stopFirst();107+ assertCount(counts.activeConsumers, 1, "unmounting one root must leave the other active");108+ assertCount(109+ counts.activeVendorSubscriptions,110+ 1,111+ "the remaining consumer must retain the query",112+ );113+ stopFirst();114+ assertCount(counts.activeConsumers, 1, "unsubscribe must be idempotent");115+116+ stopSecond();117+ assertCount(counts.activeConsumers, 0, "the final unmount must remove all consumers");118+ assertCount(counts.activeVendorSubscriptions, 0, "the final unmount must close the query");119+ assertCount(db.unsubscribeCalls(), 1, "the vendor unsubscribe must run exactly once");120+ assertCount(counts.unsubscribeCalls, 1, "cleanup must remain externally diagnosable");121+});122+123+test("local writes are awaited and failures remain visible", async () => {124+ const db = fakeDb();125+ const counts = diagnostics();126+ const store = new NotesStore(db.value, counts);127+128+ await store.add("first");129+ await store.update("note-1", "edited");130+ assert(counts.localWaitCalls === 2, "every accepted write must await local durability");131+ assert(db.writes.length === 2, "insert and update must reach the vanilla Jazz boundary");132+ assert(store.getSnapshot().durability === "local", "the UI may claim local after the wait");133+134+ db.failNextWrite("disk full");135+ let rejected = false;136+ try {137+ await store.add("cannot persist");138+ } catch {139+ rejected = true;140+ }141+ assert(rejected, "a failed local wait must reject the public mutation");142+ assert(store.getSnapshot().status === "error", "a failed local wait must reach UI state");143+ assert(store.getSnapshot().error === "disk full", "the durable-write cause must remain visible");144+});145+146+test("public mutation errors update observable diagnostics", () => {147+ const db = fakeDb();148+ const counts = diagnostics();149+ const store = new NotesStore(db.value, counts);150+ store.reportMutationError({151+ code: "WriteRejected",152+ reason: "permission denied",153+ } as MutationErrorEvent);154+ assert(counts.mutationErrors === 1, "mutation errors must be counted");155+ assert(store.getSnapshot().error?.includes("permission denied"), "the reason must reach the UI");156+});@@ -0,0 +1,34 @@
1+import {2+ getRuntime,3+ getRuntimeDiagnostics,4+ recreateRuntime,5+ runtimeRecreatedEvent,6+ shutdownRuntime,7+} from "./lofi-runtime.ts";8+9+export type PrototypeProbe = {10+ diagnostics: typeof getRuntimeDiagnostics;11+ add(body: string): Promise<void>;12+ update(id: string, body: string): Promise<void>;13+ recreate(): Promise<void>;14+ shutdown(): Promise<void>;15+};16+17+declare global {18+ interface Window {19+ __LOFI_PROTOTYPE__?: PrototypeProbe;20+ }21+}22+23+if (typeof document !== "undefined") {24+ (globalThis as typeof globalThis & Window).__LOFI_PROTOTYPE__ = {25+ diagnostics: getRuntimeDiagnostics,26+ add: async (body) => await (await getRuntime()).notes.add(body),27+ update: async (id, body) => await (await getRuntime()).notes.update(id, body),28+ recreate: async () => {29+ await recreateRuntime();30+ globalThis.dispatchEvent(new Event(runtimeRecreatedEvent));31+ },32+ shutdown: shutdownRuntime,33+ };34+}@@ -0,0 +1,57 @@
1+export type PwaRegistrationState =2+ | "development-disabled"3+ | "unsupported"4+ | "registering"5+ | "ready"6+ | "failed";7+8+declare global {9+ interface Window {10+ __LOFI_PWA_STATE__?: PwaRegistrationState;11+ }12+}13+14+function setState(state: PwaRegistrationState) {15+ if (typeof document !== "undefined") {16+ (globalThis as typeof globalThis & Window).__LOFI_PWA_STATE__ = state;17+ }18+}19+20+export function waitForActivation(worker: ServiceWorker): Promise<void> {21+ if (worker.state === "activated") return Promise.resolve();22+ if (worker.state === "redundant") return Promise.reject(new Error("service worker is redundant"));23+24+ return new Promise((resolve, reject) => {25+ const onStateChange = () => {26+ if (worker.state === "activated") {27+ worker.removeEventListener("statechange", onStateChange);28+ resolve();29+ } else if (worker.state === "redundant") {30+ worker.removeEventListener("statechange", onStateChange);31+ reject(new Error("service worker installation failed"));32+ }33+ };34+ worker.addEventListener("statechange", onStateChange);35+ onStateChange();36+ });37+}38+39+export function registerProductionServiceWorker(): void {40+ if (!import.meta.env.PROD) {41+ setState("development-disabled");42+ return;43+ }44+ if (!("serviceWorker" in navigator)) {45+ setState("unsupported");46+ return;47+ }48+ setState("registering");49+ const workerUrl = new URL("./sw.js", document.baseURI);50+ void (async () => {51+ const registration = await navigator.serviceWorker.register(workerUrl);52+ const worker = registration.installing ?? registration.waiting ?? registration.active;53+ if (!worker) throw new Error("service worker registration has no worker");54+ await waitForActivation(worker);55+ setState("ready");56+ })().catch(() => setState("failed"));57+}@@ -0,0 +1,48 @@
1+import { waitForActivation } from "./pwa.ts";2+3+const test = (globalThis as unknown as {4+ Deno: { test(name: string, body: () => void | Promise<void>): void };5+}).Deno.test;6+7+class FakeServiceWorker extends EventTarget {8+ state: ServiceWorkerState;9+10+ constructor(state: ServiceWorkerState) {11+ super();12+ this.state = state;13+ }14+15+ transition(state: ServiceWorkerState) {16+ this.state = state;17+ this.dispatchEvent(new Event("statechange"));18+ }19+}20+21+function asServiceWorker(worker: FakeServiceWorker): ServiceWorker {22+ return worker as unknown as ServiceWorker;23+}24+25+test("service worker activation resolves for an active worker", async () => {26+ await waitForActivation(asServiceWorker(new FakeServiceWorker("activated")));27+});28+29+test("service worker activation waits for the activated state", async () => {30+ const worker = new FakeServiceWorker("installing");31+ const activation = waitForActivation(asServiceWorker(worker));32+ worker.transition("activated");33+ await activation;34+});35+36+test("service worker activation rejects a redundant install", async () => {37+ const worker = new FakeServiceWorker("installing");38+ const activation = waitForActivation(asServiceWorker(worker));39+ worker.transition("redundant");40+ await activation.then(41+ () => {42+ throw new Error("expected redundant worker to reject");43+ },44+ (error) => {45+ if (!(error instanceof Error) || !error.message.includes("installation failed")) throw error;46+ },47+ );48+});@@ -0,0 +1,120 @@
1+export type SerializedResourceState<T> = {2+ value: T | null;3+ promise: Promise<T> | null;4+ queue: Promise<void>;5+ recreation: Promise<T> | null;6+};7+8+export function createSerializedResourceState<T>(): SerializedResourceState<T> {9+ return { value: null, promise: null, queue: Promise.resolve(), recreation: null };10+}11+12+function enqueue<T, R>(13+ state: SerializedResourceState<T>,14+ operation: () => Promise<R>,15+): Promise<R> {16+ const result = state.queue.then(operation, operation);17+ state.queue = result.then(() => undefined, () => undefined);18+ return result;19+}20+21+export function getResource<T>(22+ state: SerializedResourceState<T>,23+ create: () => Promise<T>,24+): Promise<T> {25+ if (state.promise) return state.promise;26+ const pending = enqueue(state, async () => {27+ if (state.value) return state.value;28+ const value = await create();29+ state.value = value;30+ return value;31+ });32+ const tracked = pending.catch((error) => {33+ if (state.promise === tracked) state.promise = null;34+ throw error;35+ });36+ state.promise = tracked;37+ return tracked;38+}39+40+export function recreateResource<T>(41+ state: SerializedResourceState<T>,42+ create: () => Promise<T>,43+ destroy: (value: T) => Promise<void>,44+): Promise<T> {45+ if (state.recreation) return state.recreation;46+ const recreation = enqueue(state, async () => {47+ const previous = state.value;48+ state.value = null;49+ state.promise = null;50+ if (previous) await destroy(previous);51+ const value = await create();52+ state.value = value;53+ state.promise = Promise.resolve(value);54+ return value;55+ });56+ const tracked = recreation.finally(() => {57+ if (state.recreation === tracked) state.recreation = null;58+ });59+ state.recreation = tracked;60+ return tracked;61+}62+63+export function shutdownResource<T>(64+ state: SerializedResourceState<T>,65+ destroy: (value: T) => Promise<void>,66+): Promise<void> {67+ return enqueue(state, async () => {68+ const value = state.value;69+ state.value = null;70+ state.promise = null;71+ if (value) await destroy(value);72+ });73+}74+75+export class AdapterDisposedError extends Error {76+ override name = "AdapterDisposedError";77+}78+79+export class AdapterLifecycle<Dependency, Instance> {80+ #disposed = false;81+ #generation = 0;82+ #instance: Instance | null = null;83+ #promise: Promise<Instance> | null = null;84+85+ get(86+ acquire: () => Promise<Dependency>,87+ attach: (dependency: Dependency) => Instance,88+ ): Promise<Instance> {89+ if (this.#disposed) return Promise.reject(new AdapterDisposedError("adapter module disposed"));90+ if (this.#promise) return this.#promise;91+ const generation = this.#generation;92+ const pending = acquire().then((dependency) => {93+ if (this.#disposed || generation !== this.#generation) {94+ throw new AdapterDisposedError("adapter lifecycle changed before attach");95+ }96+ const instance = attach(dependency);97+ this.#instance = instance;98+ return instance;99+ });100+ const tracked = pending.catch((error) => {101+ if (this.#promise === tracked) this.#promise = null;102+ throw error;103+ });104+ this.#promise = tracked;105+ return tracked;106+ }107+108+ async release(close: (instance: Instance) => Promise<void>): Promise<void> {109+ this.#generation += 1;110+ const instance = this.#instance;111+ this.#instance = null;112+ this.#promise = null;113+ if (instance) await close(instance);114+ }115+116+ dispose(close: (instance: Instance) => Promise<void>): void {117+ this.#disposed = true;118+ void this.release(close);119+ }120+}@@ -0,0 +1,78 @@
1+import {2+ AdapterDisposedError,3+ AdapterLifecycle,4+ createSerializedResourceState,5+ getResource,6+ recreateResource,7+ shutdownResource,8+} from "./resource-lifecycle.ts";9+10+const test = (globalThis as unknown as {11+ Deno: { test(name: string, body: () => void | Promise<void>): void };12+}).Deno.test;13+14+function assert(condition: unknown, message: string): asserts condition {15+ if (!condition) throw new Error(message);16+}17+18+function assertCount(actual: number, expected: number, message: string) {19+ if (actual !== expected) throw new Error(`${message}: expected ${expected}, received ${actual}`);20+}21+22+test("concurrent recreation is single-flight and shutdown is idempotent", async () => {23+ const state = createSerializedResourceState<{ id: number }>();24+ let created = 0;25+ let destroyed = 0;26+ const create = () => Promise.resolve({ id: ++created });27+ const destroy = (_value: { id: number }) => {28+ destroyed += 1;29+ return Promise.resolve();30+ };31+32+ const initial = await getResource(state, create);33+ assert(initial.id === 1, "the initial client must be created once");34+ const [first, second] = await Promise.all([35+ recreateResource(state, create, destroy),36+ recreateResource(state, create, destroy),37+ ]);38+ assert(first === second, "concurrent callers must receive the same replacement");39+ assertCount(created, 2, "one concurrent recreation must create one replacement");40+ assertCount(destroyed, 1, "one concurrent recreation must destroy the old client once");41+42+ await Promise.all([43+ shutdownResource(state, destroy),44+ shutdownResource(state, destroy),45+ ]);46+ assertCount(destroyed, 2, "concurrent shutdown must destroy the replacement once");47+});48+49+test("HMR disposal before dependency resolution never attaches an obsolete adapter", async () => {50+ const lifecycle = new AdapterLifecycle<{ id: number }, { id: number }>();51+ let resolveDependency: ((value: { id: number }) => void) | undefined;52+ const deferred = new Promise<{ id: number }>((resolve) => resolveDependency = resolve);53+ let attached = 0;54+ let closed = 0;55+ const pending = lifecycle.get(56+ () => deferred,57+ (dependency) => {58+ attached += 1;59+ return dependency;60+ },61+ );62+63+ lifecycle.dispose((_instance) => {64+ closed += 1;65+ return Promise.resolve();66+ });67+ resolveDependency?.({ id: 1 });68+69+ let rejected = false;70+ try {71+ await pending;72+ } catch (error) {73+ rejected = error instanceof AdapterDisposedError;74+ }75+ assert(rejected, "the obsolete adapter promise must reject as disposed");76+ assert(attached === 0, "an obsolete module must not register an adapter or mutation listener");77+ assert(closed === 0, "nothing should close when attachment never happened");78+});@@ -0,0 +1,9 @@
1+import { settleUiMutation } from "./ui-mutation.ts";2+3+const test = (globalThis as unknown as {4+ Deno: { test(name: string, body: () => void | Promise<void>): void };5+}).Deno.test;6+7+test("UI mutation boundary handles a rejection after runtime state projection", async () => {8+ await settleUiMutation(Promise.reject(new Error("durable write failed")));9+});@@ -0,0 +1,24 @@
1+import { useCallback, useEffect, useState } from "preact/hooks";2+import {3+ type DeviceCapabilityReport,4+ readDeviceCapabilityReport,5+ requestPersistentStorage,6+} from "./device-capabilities.ts";7+8+export function useDeviceCapabilities() {9+ const [report, setReport] = useState<DeviceCapabilityReport | null>(null);10+ useEffect(() => {11+ let active = true;12+ void readDeviceCapabilityReport().then((next) => {13+ if (active) setReport(next);14+ });15+ return () => {16+ active = false;17+ };18+ }, []);19+ const requestPersistence = useCallback(async () => {20+ const next = await requestPersistentStorage();21+ setReport(next);22+ }, []);23+ return { report, requestPersistence };24+}@@ -0,0 +1,64 @@
1+import { useCallback, useEffect, useState } from "preact/hooks";2+import { getRuntime, getRuntimeDiagnostics, runtimeRecreatedEvent } from "./lofi-runtime.ts";3+import type { NotesSnapshot, RuntimeDiagnostics } from "./notes-store.ts";4+5+const initial: NotesSnapshot = {6+ status: "loading",7+ notes: [],8+ durability: "none",9+ error: null,10+};11+12+export function useNotes() {13+ const [snapshot, setSnapshot] = useState(initial);14+ const [diagnostics, setDiagnostics] = useState<RuntimeDiagnostics>(getRuntimeDiagnostics());15+16+ useEffect(() => {17+ let cancelled = false;18+ let connectionGeneration = 0;19+ let unsubscribe: (() => void) | undefined;20+ const connect = () => {21+ const generation = ++connectionGeneration;22+ unsubscribe?.();23+ unsubscribe = undefined;24+ setSnapshot(initial);25+ void getRuntime().then((runtime) => {26+ if (cancelled || generation !== connectionGeneration) return;27+ const update = () => {28+ setSnapshot(runtime.notes.getSnapshot());29+ setDiagnostics(getRuntimeDiagnostics());30+ };31+ unsubscribe = runtime.notes.subscribe(update);32+ update();33+ }, (error) => {34+ if (cancelled || generation !== connectionGeneration) return;35+ setSnapshot({36+ ...initial,37+ status: "error",38+ durability: "failed",39+ error: error instanceof Error ? error.message : String(error),40+ });41+ });42+ };43+ connect();44+ globalThis.addEventListener(runtimeRecreatedEvent, connect);45+ return () => {46+ cancelled = true;47+ connectionGeneration += 1;48+ globalThis.removeEventListener(runtimeRecreatedEvent, connect);49+ unsubscribe?.();50+ };51+ }, []);52+53+ const add = useCallback(async (body: string) => {54+ const runtime = await getRuntime();55+ await runtime.notes.add(body);56+ }, []);57+58+ const update = useCallback(async (id: string, body: string) => {59+ const runtime = await getRuntime();60+ await runtime.notes.update(id, body);61+ }, []);62+63+ return { ...snapshot, diagnostics, add, update };64+}@@ -0,0 +1,159 @@
1+:root {2+ color: #eff8f2;3+ background: #18231f;4+ font-family: Inter, ui-sans-serif, system-ui, sans-serif;5+}6+7+* {8+ box-sizing: border-box;9+}10+11+body {12+ margin: 0;13+}14+15+main {16+ margin: 0 auto;17+ max-width: 78rem;18+ min-height: 100vh;19+ padding: 4rem 1.5rem;20+}21+22+.hero {23+ max-width: 58rem;24+}25+26+.eyebrow,27+.diagnostics {28+ color: #9bc9b1;29+ font-size: 0.75rem;30+ font-weight: 800;31+ letter-spacing: 0.09em;32+ text-transform: uppercase;33+}34+35+h1 {36+ font-size: clamp(2.6rem, 7vw, 6.5rem);37+ letter-spacing: -0.055em;38+ line-height: 0.9;39+ margin: 0.7rem 0 1.5rem;40+}41+42+.hero > p:last-child {43+ color: #bed0c6;44+ font-size: 1.15rem;45+ line-height: 1.6;46+ max-width: 48rem;47+}48+49+.island-grid {50+ display: grid;51+ gap: 1rem;52+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 28rem), 1fr));53+ margin-top: 3rem;54+}55+56+.island {57+ background: #22332c;58+ border: 1px solid #3b594c;59+ border-radius: 0.7rem;60+ min-height: 24rem;61+ padding: 1.4rem;62+}63+64+.device-status {65+ background: #1d2b25;66+ border: 1px solid #3b594c;67+ border-radius: 0.7rem;68+ margin-top: 1rem;69+ padding: 1.4rem;70+}71+72+.device-status h2 {73+ margin: 0.25rem 0 1rem;74+}75+76+.device-status dl {77+ display: grid;78+ gap: 0.5rem;79+ grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));80+}81+82+.device-status dl div {83+ background: #18231f;84+ padding: 0.75rem;85+}86+87+.device-status dt {88+ color: #9bc9b1;89+ font-size: 0.75rem;90+ font-weight: 800;91+ text-transform: uppercase;92+}93+94+.device-status dd {95+ margin: 0.25rem 0 0;96+}97+98+.island h2 {99+ font-size: 1.5rem;100+ margin: 0.25rem 0 1.5rem;101+}102+103+label {104+ display: block;105+ font-weight: 750;106+ margin-bottom: 0.5rem;107+}108+109+.composer {110+ display: flex;111+ gap: 0.5rem;112+}113+114+input,115+button {116+ border: 1px solid #68927e;117+ border-radius: 0.35rem;118+ font: inherit;119+ padding: 0.7rem 0.8rem;120+}121+122+input {123+ background: #f3faf6;124+ flex: 1;125+ min-width: 0;126+}127+128+button {129+ background: #99e5bd;130+ color: #122019;131+ cursor: pointer;132+ font-weight: 800;133+}134+135+.state {136+ color: #bed0c6;137+ min-height: 1.5rem;138+}139+140+ul {141+ display: grid;142+ gap: 0.5rem;143+ list-style: none;144+ padding: 0;145+}146+147+li {148+ background: #18231f;149+ border-left: 3px solid #99e5bd;150+ padding: 0.75rem 0.9rem;151+}152+153+footer {154+ margin-top: 2rem;155+}156+157+a {158+ color: #99e5bd;159+}@@ -1,18 +1,33 @@
11 {22 "imports": {3+ "@astrojs/check": "npm:@astrojs/check@0.9.9",4+ "@astrojs/preact": "npm:@astrojs/preact@6.0.1",5+ "astro": "npm:astro@7.0.9",6+ "astro/config": "npm:astro@7.0.9/config",37 "jazz-tools": "npm:jazz-tools@2.0.0-alpha.53",48 "jazz-tools/dev/vite": "npm:jazz-tools@2.0.0-alpha.53/dev/vite",9+ "preact": "npm:preact@10.29.7",10+ "preact/hooks": "npm:preact@10.29.7/hooks",11+ "preact/jsx-dev-runtime": "npm:preact@10.29.7/jsx-dev-runtime",12+ "preact/jsx-runtime": "npm:preact@10.29.7/jsx-runtime",13+ "typescript": "npm:typescript@6.0.3",514 "vite": "npm:vite@8.0.1"615 },716 "nodeModulesDir": "auto",817 "compilerOptions": {9- "lib": ["deno.ns", "dom", "dom.iterable", "esnext"]18+ "lib": ["deno.ns", "dom", "dom.iterable", "esnext"],19+ "jsx": "react-jsx",20+ "jsxImportSource": "preact"1021 },1122 "tasks": {1223 "check:env": "deno run --allow-env=JAZZ_APP_ID,JAZZ_SERVER_URL,JAZZ_ADMIN_SECRET,BACKEND_SECRET --allow-read=.env tools/check_env.ts",1324 "check:secrets": "deno run --allow-env=JAZZ_ADMIN_SECRET,BACKEND_SECRET --allow-read --allow-run=git tools/check_secret_leaks.ts",14- "check": "deno fmt --check && deno lint && deno check tools/*.ts spikes/jazz2-baseline/*.ts spikes/jazz2-baseline/src/*.ts && deno task test && deno task check:env && deno task check:secrets",15- "test": "deno test --allow-read --allow-write=. --allow-run=git tools",25+ "check:astro": "LOFI_SKIP_JAZZ_MANAGED=1 JAZZ_ADMIN_SECRET= BACKEND_SECRET= deno run -A npm:astro@7.0.9 check --root apps/prototype",26+ "check": "deno fmt --check && deno lint && deno check tools/*.ts spikes/jazz2-baseline/*.ts spikes/jazz2-baseline/src/*.ts apps/prototype/*.ts apps/prototype/src/**/*.ts apps/prototype/src/**/*.tsx && deno task check:astro && deno task test && deno task check:env && deno task check:secrets",27+ "test": "deno test --allow-read --allow-write=. --allow-run=git tools apps/prototype/src/runtime",28+ "dev": "deno run --allow-env=JAZZ_APP_ID,JAZZ_SERVER_URL,JAZZ_ADMIN_SECRET,BACKEND_SECRET --allow-read=.env,apps/prototype/.env --allow-write=apps/prototype/.env --allow-run tools/run_prototype.ts dev",29+ "build": "deno run --allow-env=JAZZ_APP_ID,JAZZ_SERVER_URL,JAZZ_ADMIN_SECRET,BACKEND_SECRET --allow-read=.env,apps/prototype/.env,apps/prototype/dist --allow-write=apps/prototype/.env,apps/prototype/dist --allow-run tools/run_prototype.ts build",30+ "preview": "deno run --allow-net --allow-read=apps/prototype/dist tools/preview.ts",1631 "spike:jazz2:dev": "deno run --allow-read=spikes/jazz2-baseline/.env --allow-write=spikes/jazz2-baseline/.env --allow-run tools/run_jazz2_spike.ts local",1732 "spike:jazz2:cloud": "deno run --allow-read=spikes/jazz2-baseline/.env --allow-write=spikes/jazz2-baseline/.env --allow-run tools/run_jazz2_spike.ts cloud",1833 "spike:jazz2:build": "deno run -A npm:vite@8.0.1 build spikes/jazz2-baseline --config spikes/jazz2-baseline/vite.config.ts",@@ -1,22 +1,447 @@
11 {22 "version": "5",33 "specifiers": {4+ "npm:@astrojs/check@0.9.9": "0.9.9_typescript@6.0.3",5+ "npm:@astrojs/preact@6.0.1": "6.0.1_preact@10.29.7__preact-render-to-string@6.7.0_@babel+core@7.29.7",6+ "npm:astro@7.0.9": "7.0.9_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1",47 "npm:jazz-tools@2.0.0-alpha.53": "2.0.0-alpha.53",5- "npm:vite@8.0.1": "8.0.1_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2"8+ "npm:preact@10.29.7": "10.29.7_preact-render-to-string@6.7.0",9+ "npm:typescript@6.0.3": "6.0.3",10+ "npm:vite@8.0.1": "8.0.1_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1"611 },712 "npm": {13+ "@astrojs/check@0.9.9_typescript@6.0.3": {14+ "integrity": "sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg==",15+ "dependencies": [16+ "@astrojs/language-server",17+ "chokidar@4.0.3",18+ "kleur",19+ "typescript",20+ "yargs"21+ ],22+ "bin": true23+ },24+ "@astrojs/compiler-binding-darwin-arm64@0.3.1": {25+ "integrity": "sha512-IEmEF2fUIlTHtpeE/isyEGVOB14cEyh/LZOFYt6wn3jNyVpdC8aR5OZ+RzFUR/f+8ZDM1LaMwZKvoA7eMyJeFw==",26+ "os": ["darwin"],27+ "cpu": ["arm64"]28+ },29+ "@astrojs/compiler-binding-darwin-x64@0.3.1": {30+ "integrity": "sha512-GF2kIxjpPDLsn94zbZNMsxEmkU828QqnmM7kiQJnaooS3jmI+I7kk6+oI6EpwOsK3femCMdcm+wmOsEqtGrmjQ==",31+ "os": ["darwin"],32+ "cpu": ["x64"]33+ },34+ "@astrojs/compiler-binding-linux-arm64-gnu@0.3.1": {35+ "integrity": "sha512-XJL3SDmOtVrqFhCirNcHwE91+IesJqlgNo23I4qW9QUYfwzm/TBZuH61fgqsb1ttgR1mMYz6ooPWs0JDhwMqpQ==",36+ "os": ["linux"],37+ "cpu": ["arm64"]38+ },39+ "@astrojs/compiler-binding-linux-arm64-musl@0.3.1": {40+ "integrity": "sha512-xqE8BVbDoBueK/B47w30PtkVofUWJKGkwoMVE+EOMLf11rnoANxIAdA9FPqY+rng4oNI5ndHGsri1yPj2k8vZQ==",41+ "os": ["linux"],42+ "cpu": ["arm64"]43+ },44+ "@astrojs/compiler-binding-linux-x64-gnu@0.3.1": {45+ "integrity": "sha512-1y0StU1qiCuDFH3rmbRJXcxdfHxFPrES1Rd+RLffosvUR7I2cH5SF5SFnBN9vXpzpkmyElZm3Yr47iJBPN7vVA==",46+ "os": ["linux"],47+ "cpu": ["x64"]48+ },49+ "@astrojs/compiler-binding-linux-x64-musl@0.3.1": {50+ "integrity": "sha512-16q0fYf7kpbmdObZEeZJEup8hQv/whgNwVjrSvT8umrKwLDSnNIWiQpm09lQQu6bweZB0XyIvHwlPitvJhC+hg==",51+ "os": ["linux"],52+ "cpu": ["x64"]53+ },54+ "@astrojs/compiler-binding-wasm32-wasi@0.3.1_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1": {55+ "integrity": "sha512-cB456shIwDv/PrVT+2QG7LFndpHkVge5HjqADKZgGaAc9JHVktCtjSrcdkRQ+3tbkPazNKaTLRjXLIiz2NIx9g==",56+ "dependencies": [57+ "@napi-rs/wasm-runtime"58+ ],59+ "cpu": ["wasm32"]60+ },61+ "@astrojs/compiler-binding-win32-arm64-msvc@0.3.1": {62+ "integrity": "sha512-ur/9+If/yTE69mmeX5MqSZndL0HOyx67GeNZUy3N7wVdWpLz9UTJXwyWS4UR2PUQHitghjsM5xoX0Ge56WRVQQ==",63+ "os": ["win32"],64+ "cpu": ["arm64"]65+ },66+ "@astrojs/compiler-binding-win32-x64-msvc@0.3.1": {67+ "integrity": "sha512-k0W+kDBzDkNZOqu4kElDvCOIbKw5Ut9S1WZ1Krj3KTgNuBERNKXsMMsRLLcbgfdMdbe7bTekQLshZrrvmYpmwA==",68+ "os": ["win32"],69+ "cpu": ["x64"]70+ },71+ "@astrojs/compiler-binding@0.3.1_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1": {72+ "integrity": "sha512-DaAUj29AIBU2XdJ8uwcab8lW5O2pk9pY8AXkcMw0sw77nVa3oeTYRcO+Dvbbpoexf6ThMc0FMWYCQ/wN1/T7oQ==",73+ "optionalDependencies": [74+ "@astrojs/compiler-binding-darwin-arm64",75+ "@astrojs/compiler-binding-darwin-x64",76+ "@astrojs/compiler-binding-linux-arm64-gnu",77+ "@astrojs/compiler-binding-linux-arm64-musl",78+ "@astrojs/compiler-binding-linux-x64-gnu",79+ "@astrojs/compiler-binding-linux-x64-musl",80+ "@astrojs/compiler-binding-wasm32-wasi",81+ "@astrojs/compiler-binding-win32-arm64-msvc",82+ "@astrojs/compiler-binding-win32-x64-msvc"83+ ]84+ },85+ "@astrojs/compiler-rs@0.3.1_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1": {86+ "integrity": "sha512-aT7xkgsbNoS6nriY5qKpbihK43slFHO41iqgHCTdOvn1ifaQxLCc5yXy+6GzAtiafoaC1zA7OwVXCXMsvUZOkg==",87+ "dependencies": [88+ "@astrojs/compiler-binding"89+ ]90+ },91+ "@astrojs/compiler@2.13.1": {92+ "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="93+ },94+ "@astrojs/internal-helpers@0.10.1": {95+ "integrity": "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q==",96+ "dependencies": [97+ "@types/hast",98+ "@types/mdast",99+ "js-yaml",100+ "picomatch@4.0.5",101+ "retext-smartypants",102+ "shiki",103+ "smol-toml",104+ "unified"105+ ]106+ },107+ "@astrojs/language-server@2.16.12_typescript@6.0.3": {108+ "integrity": "sha512-3LpFphBCzveUgm5ZVDINB/v3YA4TgPa1EMOEFn3Zt/Ww6jojR25iN+kmzeUz7v/b9xkmq+hMACTX4hizN3VCEQ==",109+ "dependencies": [110+ "@astrojs/compiler",111+ "@astrojs/yaml2ts",112+ "@jridgewell/sourcemap-codec",113+ "@volar/kit",114+ "@volar/language-core",115+ "@volar/language-server",116+ "@volar/language-service",117+ "muggle-string",118+ "tinyglobby",119+ "volar-service-css",120+ "volar-service-emmet",121+ "volar-service-html",122+ "volar-service-prettier",123+ "volar-service-typescript",124+ "volar-service-typescript-twoslash-queries",125+ "volar-service-yaml",126+ "vscode-html-languageservice",127+ "vscode-uri"128+ ],129+ "bin": true130+ },131+ "@astrojs/markdown-satteri@0.3.4": {132+ "integrity": "sha512-6Lvt/bQZEBW+zzdhPblvfZEy5PGEYJaUsUqaCgwHeRPxZJL1gc9I+DRLKWJjjYTWDzVUTzXlMq4WwSK+X34CVw==",133+ "dependencies": [134+ "@astrojs/internal-helpers",135+ "@astrojs/prism",136+ "github-slugger",137+ "hast-util-from-html",138+ "satteri"139+ ]140+ },141+ "@astrojs/preact@6.0.1_preact@10.29.7__preact-render-to-string@6.7.0_@babel+core@7.29.7": {142+ "integrity": "sha512-jZgBe87lfaG1rmv4jQkeVmCmVX5WISHJyVaG9GjvqmgLSmSyd0EVXrflSMPBrKcNlQENYDBMk+q2g/5qfdREEg==",143+ "dependencies": [144+ "@astrojs/internal-helpers",145+ "@preact/preset-vite",146+ "@preact/signals",147+ "devalue",148+ "preact",149+ "preact-render-to-string",150+ "vite@8.1.4_esbuild@0.28.1"151+ ]152+ },153+ "@astrojs/prism@4.0.2": {154+ "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==",155+ "dependencies": [156+ "prismjs"157+ ]158+ },159+ "@astrojs/telemetry@3.3.3": {160+ "integrity": "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==",161+ "dependencies": [162+ "ci-info",163+ "dset",164+ "is-docker",165+ "package-manager-detector"166+ ]167+ },168+ "@astrojs/yaml2ts@0.2.4": {169+ "integrity": "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==",170+ "dependencies": [171+ "yaml"172+ ]173+ },174+ "@babel/code-frame@7.29.7": {175+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",176+ "dependencies": [177+ "@babel/helper-validator-identifier",178+ "js-tokens",179+ "picocolors"180+ ]181+ },182+ "@babel/compat-data@7.29.7": {183+ "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="184+ },185+ "@babel/core@7.29.7": {186+ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",187+ "dependencies": [188+ "@babel/code-frame",189+ "@babel/generator",190+ "@babel/helper-compilation-targets",191+ "@babel/helper-module-transforms",192+ "@babel/helpers",193+ "@babel/parser",194+ "@babel/template",195+ "@babel/traverse",196+ "@babel/types",197+ "@jridgewell/remapping",198+ "convert-source-map",199+ "debug",200+ "gensync",201+ "json5",202+ "semver@6.3.1"203+ ]204+ },205+ "@babel/generator@7.29.7": {206+ "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==",207+ "dependencies": [208+ "@babel/parser",209+ "@babel/types",210+ "@jridgewell/gen-mapping",211+ "@jridgewell/trace-mapping",212+ "jsesc"213+ ]214+ },215+ "@babel/helper-annotate-as-pure@7.29.7": {216+ "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==",217+ "dependencies": [218+ "@babel/types"219+ ]220+ },221+ "@babel/helper-compilation-targets@7.29.7": {222+ "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",223+ "dependencies": [224+ "@babel/compat-data",225+ "@babel/helper-validator-option",226+ "browserslist",227+ "lru-cache@5.1.1",228+ "semver@6.3.1"229+ ]230+ },231+ "@babel/helper-globals@7.29.7": {232+ "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="233+ },234+ "@babel/helper-module-imports@7.29.7": {235+ "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",236+ "dependencies": [237+ "@babel/traverse",238+ "@babel/types"239+ ]240+ },241+ "@babel/helper-module-transforms@7.29.7_@babel+core@7.29.7": {242+ "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",243+ "dependencies": [244+ "@babel/core",245+ "@babel/helper-module-imports",246+ "@babel/helper-validator-identifier",247+ "@babel/traverse"248+ ]249+ },250+ "@babel/helper-plugin-utils@7.29.7": {251+ "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="252+ },253+ "@babel/helper-string-parser@7.29.7": {254+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="255+ },256+ "@babel/helper-validator-identifier@7.29.7": {257+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="258+ },259+ "@babel/helper-validator-option@7.29.7": {260+ "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="261+ },262+ "@babel/helpers@7.29.7": {263+ "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",264+ "dependencies": [265+ "@babel/template",266+ "@babel/types"267+ ]268+ },269+ "@babel/parser@7.29.7": {270+ "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",271+ "dependencies": [272+ "@babel/types"273+ ],274+ "bin": true275+ },276+ "@babel/plugin-syntax-jsx@7.29.7_@babel+core@7.29.7": {277+ "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==",278+ "dependencies": [279+ "@babel/core",280+ "@babel/helper-plugin-utils"281+ ]282+ },283+ "@babel/plugin-transform-react-jsx-development@7.29.7_@babel+core@7.29.7": {284+ "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==",285+ "dependencies": [286+ "@babel/core",287+ "@babel/plugin-transform-react-jsx"288+ ]289+ },290+ "@babel/plugin-transform-react-jsx@7.29.7_@babel+core@7.29.7": {291+ "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==",292+ "dependencies": [293+ "@babel/core",294+ "@babel/helper-annotate-as-pure",295+ "@babel/helper-module-imports",296+ "@babel/helper-plugin-utils",297+ "@babel/plugin-syntax-jsx",298+ "@babel/types"299+ ]300+ },8301 "@babel/runtime@7.29.7": {9302 "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="10303 },11- "@emnapi/core@1.11.2": {12- "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==",304+ "@babel/template@7.29.7": {305+ "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",306+ "dependencies": [307+ "@babel/code-frame",308+ "@babel/parser",309+ "@babel/types"310+ ]311+ },312+ "@babel/traverse@7.29.7": {313+ "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==",314+ "dependencies": [315+ "@babel/code-frame",316+ "@babel/generator",317+ "@babel/helper-globals",318+ "@babel/parser",319+ "@babel/template",320+ "@babel/types",321+ "debug"322+ ]323+ },324+ "@babel/types@7.29.7": {325+ "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",326+ "dependencies": [327+ "@babel/helper-string-parser",328+ "@babel/helper-validator-identifier"329+ ]330+ },331+ "@bruits/satteri-darwin-arm64@0.9.5": {332+ "integrity": "sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow==",333+ "os": ["darwin"],334+ "cpu": ["arm64"]335+ },336+ "@bruits/satteri-darwin-x64@0.9.5": {337+ "integrity": "sha512-6T26Z5Kf3cFW2PSlk9p7zT7yVxvuBSiJvYyz9u8KjYwMTqZyIDOj2wDyNpxKV4+6yUVG7rddq2QwvG/8LJA2+Q==",338+ "os": ["darwin"],339+ "cpu": ["x64"]340+ },341+ "@bruits/satteri-linux-arm64-gnu@0.9.5": {342+ "integrity": "sha512-u51id17uJwNEMK9nBlICsq6U31c+XVqQueVBkwRIzZG+gMpS8TOJctt5h5Wz33Z8xnMdTd+adtACVz0yHgGuOA==",343+ "os": ["linux"],344+ "cpu": ["arm64"]345+ },346+ "@bruits/satteri-linux-arm64-musl@0.9.5": {347+ "integrity": "sha512-v39HxiwGC5Rqm01HksP6+5Y+xKLPlsuVFgIgpEAo+SiQ22c+mJVhS3u7Z6ePAKdhL5NJoK1xq70kLz3L13AhpQ==",348+ "os": ["linux"],349+ "cpu": ["arm64"]350+ },351+ "@bruits/satteri-linux-x64-gnu@0.9.5": {352+ "integrity": "sha512-F3uO8uFp3pAP5ZGXttwvh57GS7s0lL953tnNdyI2gRyP4kOOkp6pyGojNJzCjkDvWI2Cvb9iNrKok3aqQPauAw==",353+ "os": ["linux"],354+ "cpu": ["x64"]355+ },356+ "@bruits/satteri-linux-x64-musl@0.9.5": {357+ "integrity": "sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q==",358+ "os": ["linux"],359+ "cpu": ["x64"]360+ },361+ "@bruits/satteri-wasm32-wasi@0.9.5": {362+ "integrity": "sha512-zauAuMwfPnKPUkd4AFixRFpXdgKwP2mKgxrIIo2gJzW0/ZneF9dbHnLkojSpaBnCCp7VUL1hIi5WWZvB1CqmAQ==",363+ "dependencies": [364+ "@emnapi/core",365+ "@emnapi/runtime",366+ "@napi-rs/wasm-runtime"367+ ],368+ "cpu": ["wasm32"]369+ },370+ "@bruits/satteri-win32-arm64-msvc@0.9.5": {371+ "integrity": "sha512-SrfE7NEsgZjBvU3c+RR6oQRu0ToXY5uVJEbieXEF0YTctIV2zAVlbaMjWLts074QCgh3a+XHWkR/lWh2VH2LUg==",372+ "os": ["win32"],373+ "cpu": ["arm64"]374+ },375+ "@bruits/satteri-win32-x64-msvc@0.9.5": {376+ "integrity": "sha512-5Kw9ZAtTGS8WHizyn+CJhjjfIQrw+7jcZodpmpXJjefnO15M8UexIi6JR2E5thyvsmHyhL6ZDDMUNR4bKJPd4g==",377+ "os": ["win32"],378+ "cpu": ["x64"]379+ },380+ "@capsizecss/unpack@4.0.1": {381+ "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==",382+ "dependencies": [383+ "fontkitten"384+ ]385+ },386+ "@clack/core@1.4.3": {387+ "integrity": "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==",388+ "dependencies": [389+ "fast-wrap-ansi",390+ "sisteransi"391+ ]392+ },393+ "@clack/prompts@1.7.0": {394+ "integrity": "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==",395+ "dependencies": [396+ "@clack/core",397+ "fast-string-width",398+ "fast-wrap-ansi",399+ "sisteransi"400+ ]401+ },402+ "@emmetio/abbreviation@2.3.3": {403+ "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==",404+ "dependencies": [405+ "@emmetio/scanner"406+ ]407+ },408+ "@emmetio/css-abbreviation@2.1.8": {409+ "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==",410+ "dependencies": [411+ "@emmetio/scanner"412+ ]413+ },414+ "@emmetio/css-parser@0.4.1": {415+ "integrity": "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==",416+ "dependencies": [417+ "@emmetio/stream-reader",418+ "@emmetio/stream-reader-utils"419+ ]420+ },421+ "@emmetio/html-matcher@1.3.0": {422+ "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==",423+ "dependencies": [424+ "@emmetio/scanner"425+ ]426+ },427+ "@emmetio/scanner@1.0.4": {428+ "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA=="429+ },430+ "@emmetio/stream-reader-utils@0.1.0": {431+ "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A=="432+ },433+ "@emmetio/stream-reader@2.2.0": {434+ "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw=="435+ },436+ "@emnapi/core@1.11.1": {437+ "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",13438 "dependencies": [14439 "@emnapi/wasi-threads",15440 "tslib"16441 ]17442 },18- "@emnapi/runtime@1.11.2": {19- "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==",443+ "@emnapi/runtime@1.11.1": {444+ "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",20445 "dependencies": [21446 "tslib"22447 ]@@ -32,131 +457,261 @@
32457 "os": ["aix"],33458 "cpu": ["ppc64"]34459 },460+ "@esbuild/aix-ppc64@0.28.1": {461+ "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==",462+ "os": ["aix"],463+ "cpu": ["ppc64"]464+ },35465 "@esbuild/android-arm64@0.27.7": {36466 "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",37467 "os": ["android"],38468 "cpu": ["arm64"]39469 },470+ "@esbuild/android-arm64@0.28.1": {471+ "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==",472+ "os": ["android"],473+ "cpu": ["arm64"]474+ },40475 "@esbuild/android-arm@0.27.7": {41476 "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",42477 "os": ["android"],43478 "cpu": ["arm"]44479 },480+ "@esbuild/android-arm@0.28.1": {481+ "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==",482+ "os": ["android"],483+ "cpu": ["arm"]484+ },45485 "@esbuild/android-x64@0.27.7": {46486 "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",47487 "os": ["android"],48488 "cpu": ["x64"]49489 },490+ "@esbuild/android-x64@0.28.1": {491+ "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==",492+ "os": ["android"],493+ "cpu": ["x64"]494+ },50495 "@esbuild/darwin-arm64@0.27.7": {51496 "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",52497 "os": ["darwin"],53498 "cpu": ["arm64"]54499 },500+ "@esbuild/darwin-arm64@0.28.1": {501+ "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==",502+ "os": ["darwin"],503+ "cpu": ["arm64"]504+ },55505 "@esbuild/darwin-x64@0.27.7": {56506 "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",57507 "os": ["darwin"],58508 "cpu": ["x64"]59509 },510+ "@esbuild/darwin-x64@0.28.1": {511+ "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==",512+ "os": ["darwin"],513+ "cpu": ["x64"]514+ },60515 "@esbuild/freebsd-arm64@0.27.7": {61516 "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",62517 "os": ["freebsd"],63518 "cpu": ["arm64"]64519 },520+ "@esbuild/freebsd-arm64@0.28.1": {521+ "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==",522+ "os": ["freebsd"],523+ "cpu": ["arm64"]524+ },65525 "@esbuild/freebsd-x64@0.27.7": {66526 "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",67527 "os": ["freebsd"],68528 "cpu": ["x64"]69529 },530+ "@esbuild/freebsd-x64@0.28.1": {531+ "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==",532+ "os": ["freebsd"],533+ "cpu": ["x64"]534+ },70535 "@esbuild/linux-arm64@0.27.7": {71536 "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",72537 "os": ["linux"],73538 "cpu": ["arm64"]74539 },540+ "@esbuild/linux-arm64@0.28.1": {541+ "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==",542+ "os": ["linux"],543+ "cpu": ["arm64"]544+ },75545 "@esbuild/linux-arm@0.27.7": {76546 "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",77547 "os": ["linux"],78548 "cpu": ["arm"]79549 },550+ "@esbuild/linux-arm@0.28.1": {551+ "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==",552+ "os": ["linux"],553+ "cpu": ["arm"]554+ },80555 "@esbuild/linux-ia32@0.27.7": {81556 "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",82557 "os": ["linux"],83558 "cpu": ["ia32"]84559 },560+ "@esbuild/linux-ia32@0.28.1": {561+ "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==",562+ "os": ["linux"],563+ "cpu": ["ia32"]564+ },85565 "@esbuild/linux-loong64@0.27.7": {86566 "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",87567 "os": ["linux"],88568 "cpu": ["loong64"]89569 },570+ "@esbuild/linux-loong64@0.28.1": {571+ "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==",572+ "os": ["linux"],573+ "cpu": ["loong64"]574+ },90575 "@esbuild/linux-mips64el@0.27.7": {91576 "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",92577 "os": ["linux"],93578 "cpu": ["mips64el"]94579 },580+ "@esbuild/linux-mips64el@0.28.1": {581+ "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==",582+ "os": ["linux"],583+ "cpu": ["mips64el"]584+ },95585 "@esbuild/linux-ppc64@0.27.7": {96586 "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",97587 "os": ["linux"],98588 "cpu": ["ppc64"]99589 },590+ "@esbuild/linux-ppc64@0.28.1": {591+ "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==",592+ "os": ["linux"],593+ "cpu": ["ppc64"]594+ },100595 "@esbuild/linux-riscv64@0.27.7": {101596 "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",102597 "os": ["linux"],103598 "cpu": ["riscv64"]104599 },600+ "@esbuild/linux-riscv64@0.28.1": {601+ "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==",602+ "os": ["linux"],603+ "cpu": ["riscv64"]604+ },105605 "@esbuild/linux-s390x@0.27.7": {106606 "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",107607 "os": ["linux"],108608 "cpu": ["s390x"]109609 },610+ "@esbuild/linux-s390x@0.28.1": {611+ "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==",612+ "os": ["linux"],613+ "cpu": ["s390x"]614+ },110615 "@esbuild/linux-x64@0.27.7": {111616 "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",112617 "os": ["linux"],113618 "cpu": ["x64"]114619 },620+ "@esbuild/linux-x64@0.28.1": {621+ "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==",622+ "os": ["linux"],623+ "cpu": ["x64"]624+ },115625 "@esbuild/netbsd-arm64@0.27.7": {116626 "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",117627 "os": ["netbsd"],118628 "cpu": ["arm64"]119629 },630+ "@esbuild/netbsd-arm64@0.28.1": {631+ "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==",632+ "os": ["netbsd"],633+ "cpu": ["arm64"]634+ },120635 "@esbuild/netbsd-x64@0.27.7": {121636 "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",122637 "os": ["netbsd"],123638 "cpu": ["x64"]124639 },640+ "@esbuild/netbsd-x64@0.28.1": {641+ "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==",642+ "os": ["netbsd"],643+ "cpu": ["x64"]644+ },125645 "@esbuild/openbsd-arm64@0.27.7": {126646 "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",127647 "os": ["openbsd"],128648 "cpu": ["arm64"]129649 },650+ "@esbuild/openbsd-arm64@0.28.1": {651+ "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==",652+ "os": ["openbsd"],653+ "cpu": ["arm64"]654+ },130655 "@esbuild/openbsd-x64@0.27.7": {131656 "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",132657 "os": ["openbsd"],133658 "cpu": ["x64"]134659 },660+ "@esbuild/openbsd-x64@0.28.1": {661+ "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==",662+ "os": ["openbsd"],663+ "cpu": ["x64"]664+ },135665 "@esbuild/openharmony-arm64@0.27.7": {136666 "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",137667 "os": ["openharmony"],138668 "cpu": ["arm64"]139669 },670+ "@esbuild/openharmony-arm64@0.28.1": {671+ "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==",672+ "os": ["openharmony"],673+ "cpu": ["arm64"]674+ },140675 "@esbuild/sunos-x64@0.27.7": {141676 "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",142677 "os": ["sunos"],143678 "cpu": ["x64"]144679 },680+ "@esbuild/sunos-x64@0.28.1": {681+ "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==",682+ "os": ["sunos"],683+ "cpu": ["x64"]684+ },145685 "@esbuild/win32-arm64@0.27.7": {146686 "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",147687 "os": ["win32"],148688 "cpu": ["arm64"]149689 },690+ "@esbuild/win32-arm64@0.28.1": {691+ "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==",692+ "os": ["win32"],693+ "cpu": ["arm64"]694+ },150695 "@esbuild/win32-ia32@0.27.7": {151696 "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",152697 "os": ["win32"],153698 "cpu": ["ia32"]154699 },700+ "@esbuild/win32-ia32@0.28.1": {701+ "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==",702+ "os": ["win32"],703+ "cpu": ["ia32"]704+ },155705 "@esbuild/win32-x64@0.27.7": {156706 "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",157707 "os": ["win32"],158708 "cpu": ["x64"]159709 },710+ "@esbuild/win32-x64@0.28.1": {711+ "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==",712+ "os": ["win32"],713+ "cpu": ["x64"]714+ },160715 "@garden-co/jazz-napi-darwin-arm64@2.0.0-alpha.53": {161716 "integrity": "sha512-CqDtWl9+coVdCvMfhA5vQR8ZiqCztLj0QLG9NKg96nqZ/ZTB7Pt4JPT4ipfUf3COtzzkPY5MU6lv5zk92Kdp4Q==",162717 "os": ["darwin"],@@ -177,16 +732,211 @@
177732 "os": ["win32"],178733 "cpu": ["x64"]179734 },180- "@napi-rs/wasm-runtime@1.1.6_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2": {181- "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==",182- "dependencies": [183- "@emnapi/core",184- "@emnapi/runtime",185- "@tybys/wasm-util"186- ]187- },188- "@noble/hashes@2.2.0": {189- "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="735+ "@img/colour@1.1.0": {736+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="737+ },738+ "@img/sharp-darwin-arm64@0.35.3": {739+ "integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==",740+ "optionalDependencies": [741+ "@img/sharp-libvips-darwin-arm64"742+ ],743+ "os": ["darwin"],744+ "cpu": ["arm64"]745+ },746+ "@img/sharp-darwin-x64@0.35.3": {747+ "integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==",748+ "optionalDependencies": [749+ "@img/sharp-libvips-darwin-x64"750+ ],751+ "os": ["darwin"],752+ "cpu": ["x64"]753+ },754+ "@img/sharp-freebsd-wasm32@0.35.3": {755+ "integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==",756+ "dependencies": [757+ "@img/sharp-wasm32"758+ ],759+ "os": ["freebsd"]760+ },761+ "@img/sharp-libvips-darwin-arm64@1.3.2": {762+ "integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==",763+ "os": ["darwin"],764+ "cpu": ["arm64"]765+ },766+ "@img/sharp-libvips-darwin-x64@1.3.2": {767+ "integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==",768+ "os": ["darwin"],769+ "cpu": ["x64"]770+ },771+ "@img/sharp-libvips-linux-arm64@1.3.2": {772+ "integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==",773+ "os": ["linux"],774+ "cpu": ["arm64"]775+ },776+ "@img/sharp-libvips-linux-arm@1.3.2": {777+ "integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==",778+ "os": ["linux"],779+ "cpu": ["arm"]780+ },781+ "@img/sharp-libvips-linux-ppc64@1.3.2": {782+ "integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==",783+ "os": ["linux"],784+ "cpu": ["ppc64"]785+ },786+ "@img/sharp-libvips-linux-riscv64@1.3.2": {787+ "integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==",788+ "os": ["linux"],789+ "cpu": ["riscv64"]790+ },791+ "@img/sharp-libvips-linux-s390x@1.3.2": {792+ "integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==",793+ "os": ["linux"],794+ "cpu": ["s390x"]795+ },796+ "@img/sharp-libvips-linux-x64@1.3.2": {797+ "integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==",798+ "os": ["linux"],799+ "cpu": ["x64"]800+ },801+ "@img/sharp-libvips-linuxmusl-arm64@1.3.2": {802+ "integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==",803+ "os": ["linux"],804+ "cpu": ["arm64"]805+ },806+ "@img/sharp-libvips-linuxmusl-x64@1.3.2": {807+ "integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==",808+ "os": ["linux"],809+ "cpu": ["x64"]810+ },811+ "@img/sharp-linux-arm64@0.35.3": {812+ "integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==",813+ "optionalDependencies": [814+ "@img/sharp-libvips-linux-arm64"815+ ],816+ "os": ["linux"],817+ "cpu": ["arm64"]818+ },819+ "@img/sharp-linux-arm@0.35.3": {820+ "integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==",821+ "optionalDependencies": [822+ "@img/sharp-libvips-linux-arm"823+ ],824+ "os": ["linux"],825+ "cpu": ["arm"]826+ },827+ "@img/sharp-linux-ppc64@0.35.3": {828+ "integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==",829+ "optionalDependencies": [830+ "@img/sharp-libvips-linux-ppc64"831+ ],832+ "os": ["linux"],833+ "cpu": ["ppc64"]834+ },835+ "@img/sharp-linux-riscv64@0.35.3": {836+ "integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==",837+ "optionalDependencies": [838+ "@img/sharp-libvips-linux-riscv64"839+ ],840+ "os": ["linux"],841+ "cpu": ["riscv64"]842+ },843+ "@img/sharp-linux-s390x@0.35.3": {844+ "integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==",845+ "optionalDependencies": [846+ "@img/sharp-libvips-linux-s390x"847+ ],848+ "os": ["linux"],849+ "cpu": ["s390x"]850+ },851+ "@img/sharp-linux-x64@0.35.3": {852+ "integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==",853+ "optionalDependencies": [854+ "@img/sharp-libvips-linux-x64"855+ ],856+ "os": ["linux"],857+ "cpu": ["x64"]858+ },859+ "@img/sharp-linuxmusl-arm64@0.35.3": {860+ "integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==",861+ "optionalDependencies": [862+ "@img/sharp-libvips-linuxmusl-arm64"863+ ],864+ "os": ["linux"],865+ "cpu": ["arm64"]866+ },867+ "@img/sharp-linuxmusl-x64@0.35.3": {868+ "integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==",869+ "optionalDependencies": [870+ "@img/sharp-libvips-linuxmusl-x64"871+ ],872+ "os": ["linux"],873+ "cpu": ["x64"]874+ },875+ "@img/sharp-wasm32@0.35.3": {876+ "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==",877+ "dependencies": [878+ "@emnapi/runtime"879+ ]880+ },881+ "@img/sharp-webcontainers-wasm32@0.35.3": {882+ "integrity": "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==",883+ "dependencies": [884+ "@img/sharp-wasm32"885+ ],886+ "cpu": ["wasm32"]887+ },888+ "@img/sharp-win32-arm64@0.35.3": {889+ "integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==",890+ "os": ["win32"],891+ "cpu": ["arm64"]892+ },893+ "@img/sharp-win32-ia32@0.35.3": {894+ "integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==",895+ "os": ["win32"],896+ "cpu": ["ia32"]897+ },898+ "@img/sharp-win32-x64@0.35.3": {899+ "integrity": "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==",900+ "os": ["win32"],901+ "cpu": ["x64"]902+ },903+ "@jridgewell/gen-mapping@0.3.13": {904+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",905+ "dependencies": [906+ "@jridgewell/sourcemap-codec",907+ "@jridgewell/trace-mapping"908+ ]909+ },910+ "@jridgewell/remapping@2.3.5": {911+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",912+ "dependencies": [913+ "@jridgewell/gen-mapping",914+ "@jridgewell/trace-mapping"915+ ]916+ },917+ "@jridgewell/resolve-uri@3.1.2": {918+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="919+ },920+ "@jridgewell/sourcemap-codec@1.5.5": {921+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="922+ },923+ "@jridgewell/trace-mapping@0.3.31": {924+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",925+ "dependencies": [926+ "@jridgewell/resolve-uri",927+ "@jridgewell/sourcemap-codec"928+ ]929+ },930+ "@napi-rs/wasm-runtime@1.1.6_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1": {931+ "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==",932+ "dependencies": [933+ "@emnapi/core",934+ "@emnapi/runtime",935+ "@tybys/wasm-util"936+ ]937+ },938+ "@noble/hashes@2.2.0": {939+ "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="190940 },191941 "@opentelemetry/api-logs@0.216.0": {192942 "integrity": "sha512-KmGTgvxTJ0J01d4mOeX1wMV5NUTNf9HebIuOOGDfIn0a/IrnXIQbOnlylDyl9tkDv4h0DUpdI/GqCdLzfTkUXg==",@@ -204,19 +954,12 @@
204954 "@opentelemetry/semantic-conventions"205955 ]206956 },207- "@opentelemetry/core@2.9.0_@opentelemetry+api@1.9.1": {208- "integrity": "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==",209- "dependencies": [210- "@opentelemetry/api",211- "@opentelemetry/semantic-conventions"212- ]213- },214957 "@opentelemetry/exporter-logs-otlp-http@0.216.0_@opentelemetry+api@1.9.1": {215958 "integrity": "sha512-8SUzQY/aExKkz6Ab3vOf6gu690Xk4wHH90dGwXinejQzazn5HCIRR7yPVU/2fEuiZ73R92MU4qI3djHfYP7NJg==",216959 "dependencies": [217960 "@opentelemetry/api",218961 "@opentelemetry/api-logs",219- "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",962+ "@opentelemetry/core",220963 "@opentelemetry/otlp-exporter-base",221964 "@opentelemetry/otlp-transformer",222965 "@opentelemetry/sdk-logs"@@ -226,10 +969,10 @@
226969 "integrity": "sha512-DhWjvj0PUPFwFnhOEivpum8sJzj6FTuyx88zff+oHVLUhfd6cLyw4AIai/F4j0PZqYZBFuMT/OTMUd9wdXnBEQ==",227970 "dependencies": [228971 "@opentelemetry/api",229- "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",972+ "@opentelemetry/core",230973 "@opentelemetry/otlp-exporter-base",231974 "@opentelemetry/otlp-transformer",232- "@opentelemetry/resources@2.7.1_@opentelemetry+api@1.9.1",975+ "@opentelemetry/resources",233976 "@opentelemetry/sdk-trace-base"234977 ]235978 },@@ -237,7 +980,7 @@
237980 "integrity": "sha512-sSnvb5f+FYa4mfYxj03rmmUh+aDwo3jok62dgIWUDw8ZCUPzEbgtv/YhZyKUSlKNNey7Uc5xmJgmtTLLIV6UDQ==",238981 "dependencies": [239982 "@opentelemetry/api",240- "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",983+ "@opentelemetry/core",241984 "@opentelemetry/otlp-transformer"242985 ]243986 },@@ -246,8 +989,8 @@
246989 "dependencies": [247990 "@opentelemetry/api",248991 "@opentelemetry/api-logs",249- "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",250- "@opentelemetry/resources@2.7.1_@opentelemetry+api@1.9.1",992+ "@opentelemetry/core",993+ "@opentelemetry/resources",251994 "@opentelemetry/sdk-logs",252995 "@opentelemetry/sdk-metrics",253996 "@opentelemetry/sdk-trace-base",@@ -258,15 +1001,7 @@
2581001 "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==",2591002 "dependencies": [2601003 "@opentelemetry/api",261- "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",262- "@opentelemetry/semantic-conventions"263- ]264- },265- "@opentelemetry/resources@2.9.0_@opentelemetry+api@1.9.1": {266- "integrity": "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==",267- "dependencies": [268- "@opentelemetry/api",269- "@opentelemetry/core@2.9.0_@opentelemetry+api@1.9.1",1004+ "@opentelemetry/core",2701005 "@opentelemetry/semantic-conventions"2711006 ]2721007 },@@ -275,8 +1010,8 @@
2751010 "dependencies": [2761011 "@opentelemetry/api",2771012 "@opentelemetry/api-logs",278- "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",279- "@opentelemetry/resources@2.7.1_@opentelemetry+api@1.9.1",1013+ "@opentelemetry/core",1014+ "@opentelemetry/resources",2801015 "@opentelemetry/semantic-conventions"2811016 ]2821017 },@@ -284,25 +1019,82 @@
2841019 "integrity": "sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==",2851020 "dependencies": [2861021 "@opentelemetry/api",287- "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",288- "@opentelemetry/resources@2.7.1_@opentelemetry+api@1.9.1"1022+ "@opentelemetry/core",1023+ "@opentelemetry/resources"2891024 ]2901025 },2911026 "@opentelemetry/sdk-trace-base@2.7.1_@opentelemetry+api@1.9.1": {2921027 "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==",2931028 "dependencies": [2941029 "@opentelemetry/api",295- "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",296- "@opentelemetry/resources@2.7.1_@opentelemetry+api@1.9.1",1030+ "@opentelemetry/core",1031+ "@opentelemetry/resources",2971032 "@opentelemetry/semantic-conventions"2981033 ]2991034 },3001035 "@opentelemetry/semantic-conventions@1.43.0": {3011036 "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg=="3021037 },1038+ "@oslojs/encoding@1.1.0": {1039+ "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="1040+ },3031041 "@oxc-project/types@0.120.0": {3041042 "integrity": "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg=="3051043 },1044+ "@oxc-project/types@0.139.0": {1045+ "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw=="1046+ },1047+ "@preact/preset-vite@2.10.5_@babel+core@7.29.7_vite@8.1.4__esbuild@0.28.1_preact@10.29.7__preact-render-to-string@6.7.0_preact-render-to-string@6.7.0__preact@10.29.7": {1048+ "integrity": "sha512-p0vJpxiVO7KWWazWny3LUZ+saXyZKWv6Ju0bYMWNJRp2YveufRPgSUB1C4MTqGJfz07EehMgfN+AJNwQy+w6Iw==",1049+ "dependencies": [1050+ "@babel/core",1051+ "@babel/plugin-transform-react-jsx",1052+ "@babel/plugin-transform-react-jsx-development",1053+ "@prefresh/vite",1054+ "@rollup/pluginutils@5.4.0",1055+ "babel-plugin-transform-hook-names",1056+ "debug",1057+ "magic-string",1058+ "picocolors",1059+ "vite@8.1.4_esbuild@0.28.1",1060+ "vite-prerender-plugin",1061+ "zimmerframe"1062+ ]1063+ },1064+ "@preact/signals-core@1.14.4": {1065+ "integrity": "sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA=="1066+ },1067+ "@preact/signals@2.9.3_preact@10.29.7__preact-render-to-string@6.7.0_preact-render-to-string@6.7.0__preact@10.29.7": {1068+ "integrity": "sha512-4g3L/dYgUt0PPE6mnYsgCP/3DEhmAYTQxjzwfSPnXQ7Lj1WPBBEY83F48X0RcNEP3ycr57T8Hcpg4PVU5VM7pg==",1069+ "dependencies": [1070+ "@preact/signals-core",1071+ "preact"1072+ ]1073+ },1074+ "@prefresh/babel-plugin@0.5.3": {1075+ "integrity": "sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ=="1076+ },1077+ "@prefresh/core@1.5.10_preact@10.29.7__preact-render-to-string@6.7.0_preact-render-to-string@6.7.0__preact@10.29.7": {1078+ "integrity": "sha512-7yPTFbG56sutaFu8krp3B4a200KOFUvrtlllKWRuLjsYXo9UUucHOZRcer+gtgMkFTpv6ob8TGcTwA32bSwa1w==",1079+ "dependencies": [1080+ "preact"1081+ ]1082+ },1083+ "@prefresh/utils@1.2.1": {1084+ "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw=="1085+ },1086+ "@prefresh/vite@2.4.12_preact@10.29.7__preact-render-to-string@6.7.0_vite@8.1.4__esbuild@0.28.1_preact-render-to-string@6.7.0__preact@10.29.7": {1087+ "integrity": "sha512-FY1fzXpUjiuosznMV0YM7XAOPZjB5FIdWS0W24+XnlxYkt9hNAwwsiKYn+cuTEoMtD/ZVazS5QVssBr9YhpCQA==",1088+ "dependencies": [1089+ "@babel/core",1090+ "@prefresh/babel-plugin",1091+ "@prefresh/core",1092+ "@prefresh/utils",1093+ "@rollup/pluginutils@4.2.1",1094+ "preact",1095+ "vite@8.1.4_esbuild@0.28.1"1096+ ]1097+ },3061098 "@protobufjs/aspromise@1.1.2": {3071099 "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="3081100 },@@ -341,81 +1133,178 @@
3411133 "os": ["android"],3421134 "cpu": ["arm64"]3431135 },1136+ "@rolldown/binding-android-arm64@1.1.5": {1137+ "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==",1138+ "os": ["android"],1139+ "cpu": ["arm64"]1140+ },3441141 "@rolldown/binding-darwin-arm64@1.0.0-rc.10": {3451142 "integrity": "sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==",3461143 "os": ["darwin"],3471144 "cpu": ["arm64"]3481145 },1146+ "@rolldown/binding-darwin-arm64@1.1.5": {1147+ "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==",1148+ "os": ["darwin"],1149+ "cpu": ["arm64"]1150+ },3491151 "@rolldown/binding-darwin-x64@1.0.0-rc.10": {3501152 "integrity": "sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==",3511153 "os": ["darwin"],3521154 "cpu": ["x64"]3531155 },1156+ "@rolldown/binding-darwin-x64@1.1.5": {1157+ "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==",1158+ "os": ["darwin"],1159+ "cpu": ["x64"]1160+ },3541161 "@rolldown/binding-freebsd-x64@1.0.0-rc.10": {3551162 "integrity": "sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==",3561163 "os": ["freebsd"],3571164 "cpu": ["x64"]3581165 },1166+ "@rolldown/binding-freebsd-x64@1.1.5": {1167+ "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==",1168+ "os": ["freebsd"],1169+ "cpu": ["x64"]1170+ },3591171 "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10": {3601172 "integrity": "sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==",3611173 "os": ["linux"],3621174 "cpu": ["arm"]3631175 },1176+ "@rolldown/binding-linux-arm-gnueabihf@1.1.5": {1177+ "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==",1178+ "os": ["linux"],1179+ "cpu": ["arm"]1180+ },3641181 "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10": {3651182 "integrity": "sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==",3661183 "os": ["linux"],3671184 "cpu": ["arm64"]3681185 },1186+ "@rolldown/binding-linux-arm64-gnu@1.1.5": {1187+ "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==",1188+ "os": ["linux"],1189+ "cpu": ["arm64"]1190+ },3691191 "@rolldown/binding-linux-arm64-musl@1.0.0-rc.10": {3701192 "integrity": "sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==",3711193 "os": ["linux"],3721194 "cpu": ["arm64"]3731195 },1196+ "@rolldown/binding-linux-arm64-musl@1.1.5": {1197+ "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==",1198+ "os": ["linux"],1199+ "cpu": ["arm64"]1200+ },3741201 "@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10": {3751202 "integrity": "sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==",3761203 "os": ["linux"],3771204 "cpu": ["ppc64"]3781205 },1206+ "@rolldown/binding-linux-ppc64-gnu@1.1.5": {1207+ "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==",1208+ "os": ["linux"],1209+ "cpu": ["ppc64"]1210+ },3791211 "@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10": {3801212 "integrity": "sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==",3811213 "os": ["linux"],3821214 "cpu": ["s390x"]3831215 },1216+ "@rolldown/binding-linux-s390x-gnu@1.1.5": {1217+ "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==",1218+ "os": ["linux"],1219+ "cpu": ["s390x"]1220+ },3841221 "@rolldown/binding-linux-x64-gnu@1.0.0-rc.10": {3851222 "integrity": "sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==",3861223 "os": ["linux"],3871224 "cpu": ["x64"]3881225 },1226+ "@rolldown/binding-linux-x64-gnu@1.1.5": {1227+ "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==",1228+ "os": ["linux"],1229+ "cpu": ["x64"]1230+ },3891231 "@rolldown/binding-linux-x64-musl@1.0.0-rc.10": {3901232 "integrity": "sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==",3911233 "os": ["linux"],3921234 "cpu": ["x64"]3931235 },1236+ "@rolldown/binding-linux-x64-musl@1.1.5": {1237+ "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==",1238+ "os": ["linux"],1239+ "cpu": ["x64"]1240+ },3941241 "@rolldown/binding-openharmony-arm64@1.0.0-rc.10": {3951242 "integrity": "sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==",3961243 "os": ["openharmony"],3971244 "cpu": ["arm64"]3981245 },399- "@rolldown/binding-wasm32-wasi@1.0.0-rc.10_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2": {1246+ "@rolldown/binding-openharmony-arm64@1.1.5": {1247+ "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==",1248+ "os": ["openharmony"],1249+ "cpu": ["arm64"]1250+ },1251+ "@rolldown/binding-wasm32-wasi@1.0.0-rc.10_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1": {4001252 "integrity": "sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==",4011253 "dependencies": [4021254 "@napi-rs/wasm-runtime"4031255 ],4041256 "cpu": ["wasm32"]4051257 },1258+ "@rolldown/binding-wasm32-wasi@1.1.5": {1259+ "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==",1260+ "dependencies": [1261+ "@emnapi/core",1262+ "@emnapi/runtime",1263+ "@napi-rs/wasm-runtime"1264+ ],1265+ "cpu": ["wasm32"]1266+ },4061267 "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10": {4071268 "integrity": "sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==",4081269 "os": ["win32"],4091270 "cpu": ["arm64"]4101271 },1272+ "@rolldown/binding-win32-arm64-msvc@1.1.5": {1273+ "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==",1274+ "os": ["win32"],1275+ "cpu": ["arm64"]1276+ },4111277 "@rolldown/binding-win32-x64-msvc@1.0.0-rc.10": {4121278 "integrity": "sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==",4131279 "os": ["win32"],4141280 "cpu": ["x64"]4151281 },1282+ "@rolldown/binding-win32-x64-msvc@1.1.5": {1283+ "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==",1284+ "os": ["win32"],1285+ "cpu": ["x64"]1286+ },4161287 "@rolldown/pluginutils@1.0.0-rc.10": {4171288 "integrity": "sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg=="4181289 },1290+ "@rolldown/pluginutils@1.0.1": {1291+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="1292+ },1293+ "@rollup/pluginutils@4.2.1": {1294+ "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",1295+ "dependencies": [1296+ "estree-walker",1297+ "picomatch@2.3.2"1298+ ]1299+ },1300+ "@rollup/pluginutils@5.4.0": {1301+ "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",1302+ "dependencies": [1303+ "@types/estree",1304+ "estree-walker",1305+ "picomatch@4.0.5"1306+ ]1307+ },4191308 "@scure/base@2.2.0": {4201309 "integrity": "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="4211310 },@@ -426,6 +1315,61 @@
4261315 "@scure/base"4271316 ]4281317 },1318+ "@shikijs/core@4.3.1": {1319+ "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==",1320+ "dependencies": [1321+ "@shikijs/primitive",1322+ "@shikijs/types",1323+ "@shikijs/vscode-textmate",1324+ "@types/hast",1325+ "hast-util-to-html"1326+ ]1327+ },1328+ "@shikijs/engine-javascript@4.3.1": {1329+ "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==",1330+ "dependencies": [1331+ "@shikijs/types",1332+ "@shikijs/vscode-textmate",1333+ "oniguruma-to-es"1334+ ]1335+ },1336+ "@shikijs/engine-oniguruma@4.3.1": {1337+ "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==",1338+ "dependencies": [1339+ "@shikijs/types",1340+ "@shikijs/vscode-textmate"1341+ ]1342+ },1343+ "@shikijs/langs@4.3.1": {1344+ "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==",1345+ "dependencies": [1346+ "@shikijs/types"1347+ ]1348+ },1349+ "@shikijs/primitive@4.3.1": {1350+ "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==",1351+ "dependencies": [1352+ "@shikijs/types",1353+ "@shikijs/vscode-textmate",1354+ "@types/hast"1355+ ]1356+ },1357+ "@shikijs/themes@4.3.1": {1358+ "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==",1359+ "dependencies": [1360+ "@shikijs/types"1361+ ]1362+ },1363+ "@shikijs/types@4.3.1": {1364+ "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==",1365+ "dependencies": [1366+ "@shikijs/vscode-textmate",1367+ "@types/hast"1368+ ]1369+ },1370+ "@shikijs/vscode-textmate@10.0.2": {1371+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="1372+ },4291373 "@standard-schema/spec@1.1.0": {4301374 "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="4311375 },@@ -435,61 +1379,682 @@
4351379 "tslib"4361380 ]4371381 },1382+ "@types/estree-jsx@1.0.5": {1383+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",1384+ "dependencies": [1385+ "@types/estree"1386+ ]1387+ },1388+ "@types/estree@1.0.9": {1389+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="1390+ },1391+ "@types/hast@3.0.5": {1392+ "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==",1393+ "dependencies": [1394+ "@types/unist"1395+ ]1396+ },1397+ "@types/mdast@4.0.4": {1398+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",1399+ "dependencies": [1400+ "@types/unist"1401+ ]1402+ },1403+ "@types/nlcst@2.0.3": {1404+ "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==",1405+ "dependencies": [1406+ "@types/unist"1407+ ]1408+ },4381409 "@types/node@25.6.0": {4391410 "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==",4401411 "dependencies": [4411412 "undici-types"4421413 ]4431414 },444- "detect-libc@2.1.2": {445- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="1415+ "@types/unist@3.0.3": {1416+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="4461417 },447- "esbuild@0.27.7": {448- "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",449- "optionalDependencies": [450- "@esbuild/aix-ppc64",451- "@esbuild/android-arm",452- "@esbuild/android-arm64",453- "@esbuild/android-x64",454- "@esbuild/darwin-arm64",455- "@esbuild/darwin-x64",456- "@esbuild/freebsd-arm64",457- "@esbuild/freebsd-x64",458- "@esbuild/linux-arm",459- "@esbuild/linux-arm64",460- "@esbuild/linux-ia32",461- "@esbuild/linux-loong64",462- "@esbuild/linux-mips64el",463- "@esbuild/linux-ppc64",464- "@esbuild/linux-riscv64",465- "@esbuild/linux-s390x",466- "@esbuild/linux-x64",467- "@esbuild/netbsd-arm64",468- "@esbuild/netbsd-x64",469- "@esbuild/openbsd-arm64",470- "@esbuild/openbsd-x64",471- "@esbuild/openharmony-arm64",472- "@esbuild/sunos-x64",473- "@esbuild/win32-arm64",474- "@esbuild/win32-ia32",475- "@esbuild/win32-x64"476- ],477- "scripts": true,478- "bin": true1418+ "@ungap/structured-clone@1.3.3": {1419+ "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg=="4791420 },480- "fdir@6.5.0_picomatch@4.0.4": {481- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",1421+ "@volar/kit@2.4.28_typescript@6.0.3": {1422+ "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==",4821423 "dependencies": [483- "picomatch"484- ],485- "optionalPeers": [486- "picomatch"1424+ "@volar/language-service",1425+ "@volar/typescript",1426+ "typesafe-path",1427+ "typescript",1428+ "vscode-languageserver-textdocument",1429+ "vscode-uri"4871430 ]4881431 },489- "fsevents@2.3.3": {490- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",491- "os": ["darwin"],492- "scripts": true1432+ "@volar/language-core@2.4.28": {1433+ "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==",1434+ "dependencies": [1435+ "@volar/source-map"1436+ ]1437+ },1438+ "@volar/language-server@2.4.28": {1439+ "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==",1440+ "dependencies": [1441+ "@volar/language-core",1442+ "@volar/language-service",1443+ "@volar/typescript",1444+ "path-browserify",1445+ "request-light@0.7.0",1446+ "vscode-languageserver",1447+ "vscode-languageserver-protocol",1448+ "vscode-languageserver-textdocument",1449+ "vscode-uri"1450+ ]1451+ },1452+ "@volar/language-service@2.4.28": {1453+ "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==",1454+ "dependencies": [1455+ "@volar/language-core",1456+ "vscode-languageserver-protocol",1457+ "vscode-languageserver-textdocument",1458+ "vscode-uri"1459+ ]1460+ },1461+ "@volar/source-map@2.4.28": {1462+ "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ=="1463+ },1464+ "@volar/typescript@2.4.28": {1465+ "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==",1466+ "dependencies": [1467+ "@volar/language-core",1468+ "path-browserify",1469+ "vscode-uri"1470+ ]1471+ },1472+ "@vscode/emmet-helper@2.11.0": {1473+ "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==",1474+ "dependencies": [1475+ "emmet",1476+ "jsonc-parser@2.3.1",1477+ "vscode-languageserver-textdocument",1478+ "vscode-languageserver-types@3.18.0",1479+ "vscode-uri"1480+ ]1481+ },1482+ "@vscode/l10n@0.0.18": {1483+ "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="1484+ },1485+ "ajv-draft-04@1.0.0_ajv@8.20.0": {1486+ "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==",1487+ "dependencies": [1488+ "ajv"1489+ ],1490+ "optionalPeers": [1491+ "ajv"1492+ ]1493+ },1494+ "ajv-i18n@4.2.0_ajv@8.20.0": {1495+ "integrity": "sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==",1496+ "dependencies": [1497+ "ajv"1498+ ]1499+ },1500+ "ajv@8.20.0": {1501+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",1502+ "dependencies": [1503+ "fast-deep-equal",1504+ "fast-uri",1505+ "json-schema-traverse",1506+ "require-from-string"1507+ ]1508+ },1509+ "am-i-vibing@0.4.0": {1510+ "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==",1511+ "dependencies": [1512+ "process-ancestry"1513+ ],1514+ "bin": true1515+ },1516+ "ansi-regex@5.0.1": {1517+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="1518+ },1519+ "ansi-styles@4.3.0": {1520+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",1521+ "dependencies": [1522+ "color-convert"1523+ ]1524+ },1525+ "anymatch@3.1.3": {1526+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",1527+ "dependencies": [1528+ "normalize-path",1529+ "picomatch@2.3.2"1530+ ]1531+ },1532+ "argparse@2.0.1": {1533+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="1534+ },1535+ "aria-query@5.3.2": {1536+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="1537+ },1538+ "astro@7.0.9_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1": {1539+ "integrity": "sha512-WB5pA4LLQnmqjBh6EIu0z8aUV4q2/AoThgSZq57Rsp+oqqvPu7OwZ5eF+W4ku20TUTxIhiJW8dccuGvJPiW2UA==",1540+ "dependencies": [1541+ "@astrojs/compiler-rs",1542+ "@astrojs/internal-helpers",1543+ "@astrojs/markdown-satteri",1544+ "@astrojs/telemetry",1545+ "@capsizecss/unpack",1546+ "@clack/prompts",1547+ "@oslojs/encoding",1548+ "@rollup/pluginutils@5.4.0",1549+ "am-i-vibing",1550+ "aria-query",1551+ "axobject-query",1552+ "ci-info",1553+ "clsx",1554+ "common-ancestor-path",1555+ "cookie",1556+ "devalue",1557+ "diff",1558+ "dset",1559+ "es-module-lexer",1560+ "esbuild@0.28.1",1561+ "flattie",1562+ "fontace",1563+ "get-tsconfig",1564+ "github-slugger",1565+ "html-escaper",1566+ "http-cache-semantics",1567+ "js-yaml",1568+ "jsonc-parser@3.3.1",1569+ "magic-string",1570+ "magicast",1571+ "mrmime",1572+ "neotraverse",1573+ "obug",1574+ "p-limit",1575+ "p-queue",1576+ "package-manager-detector",1577+ "piccolore",1578+ "picomatch@4.0.5",1579+ "semver@7.8.5",1580+ "shiki",1581+ "smol-toml",1582+ "svgo",1583+ "tinyclip",1584+ "tinyexec",1585+ "tinyglobby",1586+ "ultrahtml",1587+ "unifont",1588+ "unstorage",1589+ "vite@8.1.4_esbuild@0.28.1",1590+ "vitefu",1591+ "xxhash-wasm",1592+ "yargs-parser@22.0.0",1593+ "zod"1594+ ],1595+ "optionalDependencies": [1596+ "sharp"1597+ ],1598+ "bin": true1599+ },1600+ "axobject-query@4.1.0": {1601+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="1602+ },1603+ "babel-plugin-transform-hook-names@1.0.2_@babel+core@7.29.7": {1604+ "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==",1605+ "dependencies": [1606+ "@babel/core"1607+ ]1608+ },1609+ "bail@2.0.2": {1610+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="1611+ },1612+ "baseline-browser-mapping@2.10.43": {1613+ "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==",1614+ "bin": true1615+ },1616+ "boolbase@1.0.0": {1617+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="1618+ },1619+ "browserslist@4.28.6": {1620+ "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==",1621+ "dependencies": [1622+ "baseline-browser-mapping",1623+ "caniuse-lite",1624+ "electron-to-chromium",1625+ "node-releases",1626+ "update-browserslist-db"1627+ ],1628+ "bin": true1629+ },1630+ "caniuse-lite@1.0.30001805": {1631+ "integrity": "sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA=="1632+ },1633+ "ccount@2.0.1": {1634+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="1635+ },1636+ "character-entities-html4@2.1.0": {1637+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="1638+ },1639+ "character-entities-legacy@3.0.0": {1640+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="1641+ },1642+ "chokidar@4.0.3": {1643+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",1644+ "dependencies": [1645+ "readdirp@4.1.2"1646+ ]1647+ },1648+ "chokidar@5.0.0": {1649+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",1650+ "dependencies": [1651+ "readdirp@5.0.0"1652+ ]1653+ },1654+ "ci-info@4.4.0": {1655+ "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="1656+ },1657+ "cliui@8.0.1": {1658+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",1659+ "dependencies": [1660+ "string-width",1661+ "strip-ansi",1662+ "wrap-ansi"1663+ ]1664+ },1665+ "clsx@2.1.1": {1666+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="1667+ },1668+ "color-convert@2.0.1": {1669+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",1670+ "dependencies": [1671+ "color-name"1672+ ]1673+ },1674+ "color-name@1.1.4": {1675+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="1676+ },1677+ "comma-separated-tokens@2.0.3": {1678+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="1679+ },1680+ "commander@11.1.0": {1681+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="1682+ },1683+ "common-ancestor-path@2.0.0": {1684+ "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="1685+ },1686+ "convert-source-map@2.0.0": {1687+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="1688+ },1689+ "cookie-es@1.2.3": {1690+ "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="1691+ },1692+ "cookie@1.1.1": {1693+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="1694+ },1695+ "crossws@0.3.5": {1696+ "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==",1697+ "dependencies": [1698+ "uncrypto"1699+ ]1700+ },1701+ "css-select@5.2.2": {1702+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",1703+ "dependencies": [1704+ "boolbase",1705+ "css-what",1706+ "domhandler",1707+ "domutils",1708+ "nth-check"1709+ ]1710+ },1711+ "css-tree@2.2.1": {1712+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",1713+ "dependencies": [1714+ "mdn-data@2.0.28",1715+ "source-map-js"1716+ ]1717+ },1718+ "css-tree@3.2.1": {1719+ "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==",1720+ "dependencies": [1721+ "mdn-data@2.27.1",1722+ "source-map-js"1723+ ]1724+ },1725+ "css-what@6.2.2": {1726+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="1727+ },1728+ "csso@5.0.5": {1729+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",1730+ "dependencies": [1731+ "css-tree@2.2.1"1732+ ]1733+ },1734+ "debug@4.4.3": {1735+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",1736+ "dependencies": [1737+ "ms"1738+ ]1739+ },1740+ "defu@6.1.7": {1741+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="1742+ },1743+ "dequal@2.0.3": {1744+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="1745+ },1746+ "destr@2.0.5": {1747+ "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="1748+ },1749+ "detect-libc@2.1.2": {1750+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="1751+ },1752+ "devalue@5.8.1": {1753+ "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw=="1754+ },1755+ "devlop@1.1.0": {1756+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",1757+ "dependencies": [1758+ "dequal"1759+ ]1760+ },1761+ "diff@8.0.4": {1762+ "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="1763+ },1764+ "dom-serializer@2.0.0": {1765+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",1766+ "dependencies": [1767+ "domelementtype",1768+ "domhandler",1769+ "entities@4.5.0"1770+ ]1771+ },1772+ "domelementtype@2.3.0": {1773+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="1774+ },1775+ "domhandler@5.0.3": {1776+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",1777+ "dependencies": [1778+ "domelementtype"1779+ ]1780+ },1781+ "domutils@3.2.2": {1782+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",1783+ "dependencies": [1784+ "dom-serializer",1785+ "domelementtype",1786+ "domhandler"1787+ ]1788+ },1789+ "dset@3.1.4": {1790+ "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="1791+ },1792+ "electron-to-chromium@1.5.389": {1793+ "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg=="1794+ },1795+ "emmet@2.4.11": {1796+ "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==",1797+ "dependencies": [1798+ "@emmetio/abbreviation",1799+ "@emmetio/css-abbreviation"1800+ ]1801+ },1802+ "emoji-regex@8.0.0": {1803+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="1804+ },1805+ "entities@4.5.0": {1806+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="1807+ },1808+ "entities@6.0.1": {1809+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="1810+ },1811+ "es-module-lexer@2.3.1": {1812+ "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA=="1813+ },1814+ "esbuild@0.27.7": {1815+ "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",1816+ "optionalDependencies": [1817+ "@esbuild/aix-ppc64@0.27.7",1818+ "@esbuild/android-arm@0.27.7",1819+ "@esbuild/android-arm64@0.27.7",1820+ "@esbuild/android-x64@0.27.7",1821+ "@esbuild/darwin-arm64@0.27.7",1822+ "@esbuild/darwin-x64@0.27.7",1823+ "@esbuild/freebsd-arm64@0.27.7",1824+ "@esbuild/freebsd-x64@0.27.7",1825+ "@esbuild/linux-arm@0.27.7",1826+ "@esbuild/linux-arm64@0.27.7",1827+ "@esbuild/linux-ia32@0.27.7",1828+ "@esbuild/linux-loong64@0.27.7",1829+ "@esbuild/linux-mips64el@0.27.7",1830+ "@esbuild/linux-ppc64@0.27.7",1831+ "@esbuild/linux-riscv64@0.27.7",1832+ "@esbuild/linux-s390x@0.27.7",1833+ "@esbuild/linux-x64@0.27.7",1834+ "@esbuild/netbsd-arm64@0.27.7",1835+ "@esbuild/netbsd-x64@0.27.7",1836+ "@esbuild/openbsd-arm64@0.27.7",1837+ "@esbuild/openbsd-x64@0.27.7",1838+ "@esbuild/openharmony-arm64@0.27.7",1839+ "@esbuild/sunos-x64@0.27.7",1840+ "@esbuild/win32-arm64@0.27.7",1841+ "@esbuild/win32-ia32@0.27.7",1842+ "@esbuild/win32-x64@0.27.7"1843+ ],1844+ "scripts": true,1845+ "bin": true1846+ },1847+ "esbuild@0.28.1": {1848+ "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==",1849+ "optionalDependencies": [1850+ "@esbuild/aix-ppc64@0.28.1",1851+ "@esbuild/android-arm@0.28.1",1852+ "@esbuild/android-arm64@0.28.1",1853+ "@esbuild/android-x64@0.28.1",1854+ "@esbuild/darwin-arm64@0.28.1",1855+ "@esbuild/darwin-x64@0.28.1",1856+ "@esbuild/freebsd-arm64@0.28.1",1857+ "@esbuild/freebsd-x64@0.28.1",1858+ "@esbuild/linux-arm@0.28.1",1859+ "@esbuild/linux-arm64@0.28.1",1860+ "@esbuild/linux-ia32@0.28.1",1861+ "@esbuild/linux-loong64@0.28.1",1862+ "@esbuild/linux-mips64el@0.28.1",1863+ "@esbuild/linux-ppc64@0.28.1",1864+ "@esbuild/linux-riscv64@0.28.1",1865+ "@esbuild/linux-s390x@0.28.1",1866+ "@esbuild/linux-x64@0.28.1",1867+ "@esbuild/netbsd-arm64@0.28.1",1868+ "@esbuild/netbsd-x64@0.28.1",1869+ "@esbuild/openbsd-arm64@0.28.1",1870+ "@esbuild/openbsd-x64@0.28.1",1871+ "@esbuild/openharmony-arm64@0.28.1",1872+ "@esbuild/sunos-x64@0.28.1",1873+ "@esbuild/win32-arm64@0.28.1",1874+ "@esbuild/win32-ia32@0.28.1",1875+ "@esbuild/win32-x64@0.28.1"1876+ ],1877+ "scripts": true,1878+ "bin": true1879+ },1880+ "escalade@3.2.0": {1881+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="1882+ },1883+ "estree-walker@2.0.2": {1884+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="1885+ },1886+ "eventemitter3@5.0.4": {1887+ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="1888+ },1889+ "extend@3.0.2": {1890+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="1891+ },1892+ "fast-deep-equal@3.1.3": {1893+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="1894+ },1895+ "fast-string-truncated-width@3.0.3": {1896+ "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="1897+ },1898+ "fast-string-width@3.0.2": {1899+ "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==",1900+ "dependencies": [1901+ "fast-string-truncated-width"1902+ ]1903+ },1904+ "fast-uri@3.1.3": {1905+ "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg=="1906+ },1907+ "fast-wrap-ansi@0.2.2": {1908+ "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==",1909+ "dependencies": [1910+ "fast-string-width"1911+ ]1912+ },1913+ "fdir@6.5.0_picomatch@4.0.5": {1914+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",1915+ "dependencies": [1916+ "picomatch@4.0.5"1917+ ],1918+ "optionalPeers": [1919+ "picomatch@4.0.5"1920+ ]1921+ },1922+ "flattie@1.1.1": {1923+ "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="1924+ },1925+ "fontace@0.4.1": {1926+ "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==",1927+ "dependencies": [1928+ "fontkitten"1929+ ]1930+ },1931+ "fontkitten@1.0.3": {1932+ "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==",1933+ "dependencies": [1934+ "tiny-inflate"1935+ ]1936+ },1937+ "fsevents@2.3.3": {1938+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",1939+ "os": ["darwin"],1940+ "scripts": true1941+ },1942+ "gensync@1.0.0-beta.2": {1943+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="1944+ },1945+ "get-caller-file@2.0.5": {1946+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="1947+ },1948+ "get-tsconfig@5.0.0-beta.4": {1949+ "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==",1950+ "dependencies": [1951+ "resolve-pkg-maps"1952+ ]1953+ },1954+ "github-slugger@2.0.0": {1955+ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="1956+ },1957+ "h3@1.15.11": {1958+ "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==",1959+ "dependencies": [1960+ "cookie-es",1961+ "crossws",1962+ "defu",1963+ "destr",1964+ "iron-webcrypto",1965+ "node-mock-http",1966+ "radix3",1967+ "ufo",1968+ "uncrypto"1969+ ]1970+ },1971+ "hast-util-from-html@2.0.3": {1972+ "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==",1973+ "dependencies": [1974+ "@types/hast",1975+ "devlop",1976+ "hast-util-from-parse5",1977+ "parse5",1978+ "vfile",1979+ "vfile-message"1980+ ]1981+ },1982+ "hast-util-from-parse5@8.0.3": {1983+ "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",1984+ "dependencies": [1985+ "@types/hast",1986+ "@types/unist",1987+ "devlop",1988+ "hastscript",1989+ "property-information",1990+ "vfile",1991+ "vfile-location",1992+ "web-namespaces"1993+ ]1994+ },1995+ "hast-util-parse-selector@4.0.0": {1996+ "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",1997+ "dependencies": [1998+ "@types/hast"1999+ ]2000+ },2001+ "hast-util-to-html@9.0.5": {2002+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",2003+ "dependencies": [2004+ "@types/hast",2005+ "@types/unist",2006+ "ccount",2007+ "comma-separated-tokens",2008+ "hast-util-whitespace",2009+ "html-void-elements",2010+ "mdast-util-to-hast",2011+ "property-information",2012+ "space-separated-tokens",2013+ "stringify-entities",2014+ "zwitch"2015+ ]2016+ },2017+ "hast-util-whitespace@3.0.0": {2018+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",2019+ "dependencies": [2020+ "@types/hast"2021+ ]2022+ },2023+ "hastscript@9.0.1": {2024+ "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",2025+ "dependencies": [2026+ "@types/hast",2027+ "comma-separated-tokens",2028+ "hast-util-parse-selector",2029+ "property-information",2030+ "space-separated-tokens"2031+ ]2032+ },2033+ "he@1.2.0": {2034+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",2035+ "bin": true2036+ },2037+ "html-escaper@3.0.3": {2038+ "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="2039+ },2040+ "html-void-elements@3.0.0": {2041+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="2042+ },2043+ "http-cache-semantics@4.2.0": {2044+ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="2045+ },2046+ "iron-webcrypto@1.2.1": {2047+ "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="2048+ },2049+ "is-docker@4.0.0": {2050+ "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==",2051+ "bin": true2052+ },2053+ "is-fullwidth-code-point@3.0.0": {2054+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="2055+ },2056+ "is-plain-obj@4.1.0": {2057+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="4932058 },4942059 "jazz-napi@2.0.0-alpha.53": {4952060 "integrity": "sha512-5+EEUoahaNA2d0IqvYDlmrx9bjhLjpvkbt5Nab+C09EeKGnJcz7JJbofC0xuJDe++9I7/8cnYps7YcAYjdK3Ug==",@@ -506,12 +2071,12 @@
5062071 "@opentelemetry/api",5072072 "@opentelemetry/exporter-logs-otlp-http",5082073 "@opentelemetry/exporter-trace-otlp-http",509- "@opentelemetry/resources@2.9.0_@opentelemetry+api@1.9.1",2074+ "@opentelemetry/resources",5102075 "@opentelemetry/sdk-logs",5112076 "@opentelemetry/sdk-trace-base",5122077 "@scure/bip39",5132078 "@standard-schema/spec",514- "esbuild",2079+ "esbuild@0.27.7",5152080 "jazz-wasm",5162081 "jose",5172082 "json-schema-to-ts",@@ -529,6 +2094,20 @@
5292094 "jose@6.2.3": {5302095 "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw=="5312096 },2097+ "js-tokens@4.0.0": {2098+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="2099+ },2100+ "js-yaml@4.3.0": {2101+ "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",2102+ "dependencies": [2103+ "argparse"2104+ ],2105+ "bin": true2106+ },2107+ "jsesc@3.1.0": {2108+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",2109+ "bin": true2110+ },5322111 "json-schema-to-ts@3.1.1": {5332112 "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==",5342113 "dependencies": [@@ -536,6 +2115,25 @@
5362115 "ts-algebra"5372116 ]5382117 },2118+ "json-schema-traverse@1.0.0": {2119+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="2120+ },2121+ "json5@2.2.3": {2122+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",2123+ "bin": true2124+ },2125+ "jsonc-parser@2.3.1": {2126+ "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="2127+ },2128+ "jsonc-parser@3.3.1": {2129+ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="2130+ },2131+ "kleur@4.1.5": {2132+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="2133+ },2134+ "kolorist@1.8.0": {2135+ "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="2136+ },5392137 "lightningcss-android-arm64@1.32.0": {5402138 "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",5412139 "os": ["android"],@@ -613,96 +2211,644 @@
6132211 "long@5.3.2": {6142212 "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="6152213 },616- "nanoid@3.3.11": {617- "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",618- "bin": true619- },620- "picocolors@1.1.1": {621- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="2214+ "lru-cache@11.5.2": {2215+ "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="6222216 },623- "picomatch@4.0.4": {624- "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="2217+ "lru-cache@5.1.1": {2218+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",2219+ "dependencies": [2220+ "yallist"2221+ ]6252222 },626- "pluralize-esm@9.0.5": {627- "integrity": "sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA=="2223+ "magic-string@0.30.21": {2224+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",2225+ "dependencies": [2226+ "@jridgewell/sourcemap-codec"2227+ ]6282228 },629- "postcss@8.5.10": {630- "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==",2229+ "magicast@0.5.3": {2230+ "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==",6312231 "dependencies": [632- "nanoid",633- "picocolors",2232+ "@babel/parser",2233+ "@babel/types",6342234 "source-map-js"6352235 ]6362236 },637- "protobufjs@8.0.1": {638- "integrity": "sha512-NWWCCscLjs+cOKF/s/XVNFRW7Yih0fdH+9brffR5NZCy8k42yRdl5KlWKMVXuI1vfCoy4o1z80XR/W/QUb3V3w==",2237+ "mdast-util-to-hast@13.2.1": {2238+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",6392239 "dependencies": [640- "@protobufjs/aspromise",641- "@protobufjs/base64",642- "@protobufjs/codegen",643- "@protobufjs/eventemitter",644- "@protobufjs/fetch",645- "@protobufjs/float",646- "@protobufjs/inquire",647- "@protobufjs/path",648- "@protobufjs/pool",649- "@protobufjs/utf8",650- "@types/node",651- "long"652- ],653- "scripts": true2240+ "@types/hast",2241+ "@types/mdast",2242+ "@ungap/structured-clone",2243+ "devlop",2244+ "micromark-util-sanitize-uri",2245+ "trim-lines",2246+ "unist-util-position",2247+ "unist-util-visit",2248+ "vfile"2249+ ]6542250 },655- "rolldown@1.0.0-rc.10_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2": {656- "integrity": "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==",2251+ "mdn-data@2.0.28": {2252+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="2253+ },2254+ "mdn-data@2.27.1": {2255+ "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="2256+ },2257+ "micromark-util-character@2.1.1": {2258+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",2259+ "dependencies": [2260+ "micromark-util-symbol",2261+ "micromark-util-types"2262+ ]2263+ },2264+ "micromark-util-encode@2.0.1": {2265+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="2266+ },2267+ "micromark-util-sanitize-uri@2.0.1": {2268+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",2269+ "dependencies": [2270+ "micromark-util-character",2271+ "micromark-util-encode",2272+ "micromark-util-symbol"2273+ ]2274+ },2275+ "micromark-util-symbol@2.0.1": {2276+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="2277+ },2278+ "micromark-util-types@2.0.2": {2279+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="2280+ },2281+ "mrmime@2.0.1": {2282+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="2283+ },2284+ "ms@2.1.3": {2285+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="2286+ },2287+ "muggle-string@0.4.1": {2288+ "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="2289+ },2290+ "nanoid@3.3.16": {2291+ "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",2292+ "bin": true2293+ },2294+ "neotraverse@0.6.18": {2295+ "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="2296+ },2297+ "nlcst-to-string@4.0.0": {2298+ "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==",2299+ "dependencies": [2300+ "@types/nlcst"2301+ ]2302+ },2303+ "node-fetch-native@1.6.7": {2304+ "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="2305+ },2306+ "node-html-parser@6.1.13": {2307+ "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==",2308+ "dependencies": [2309+ "css-select",2310+ "he"2311+ ]2312+ },2313+ "node-mock-http@1.0.4": {2314+ "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="2315+ },2316+ "node-releases@2.0.51": {2317+ "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ=="2318+ },2319+ "normalize-path@3.0.0": {2320+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="2321+ },2322+ "nth-check@2.1.1": {2323+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",2324+ "dependencies": [2325+ "boolbase"2326+ ]2327+ },2328+ "obug@2.1.3": {2329+ "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg=="2330+ },2331+ "ofetch@1.5.1": {2332+ "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==",2333+ "dependencies": [2334+ "destr",2335+ "node-fetch-native",2336+ "ufo"2337+ ]2338+ },2339+ "ohash@2.0.11": {2340+ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="2341+ },2342+ "oniguruma-parser@0.12.2": {2343+ "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw=="2344+ },2345+ "oniguruma-to-es@4.3.6": {2346+ "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==",2347+ "dependencies": [2348+ "oniguruma-parser",2349+ "regex",2350+ "regex-recursion"2351+ ]2352+ },2353+ "p-limit@7.3.0": {2354+ "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==",2355+ "dependencies": [2356+ "yocto-queue"2357+ ]2358+ },2359+ "p-queue@9.3.1": {2360+ "integrity": "sha512-POWdiIPmsUPGwb4FeQ4OBg46aqmcInSWe45CKDsGHiOBiVQM9chqfQTuqhuTzcg2Vz9faTI65at0KkVyVEiCHw==",2361+ "dependencies": [2362+ "eventemitter3",2363+ "p-timeout"2364+ ]2365+ },2366+ "p-timeout@7.0.1": {2367+ "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg=="2368+ },2369+ "package-manager-detector@1.7.0": {2370+ "integrity": "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ=="2371+ },2372+ "parse5@7.3.0": {2373+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",2374+ "dependencies": [2375+ "entities@6.0.1"2376+ ]2377+ },2378+ "path-browserify@1.0.1": {2379+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="2380+ },2381+ "piccolore@0.1.3": {2382+ "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="2383+ },2384+ "picocolors@1.1.1": {2385+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="2386+ },2387+ "picomatch@2.3.2": {2388+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="2389+ },2390+ "picomatch@4.0.5": {2391+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="2392+ },2393+ "pluralize-esm@9.0.5": {2394+ "integrity": "sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA=="2395+ },2396+ "postcss@8.5.19": {2397+ "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==",2398+ "dependencies": [2399+ "nanoid",2400+ "picocolors",2401+ "source-map-js"2402+ ]2403+ },2404+ "preact-render-to-string@6.7.0_preact@10.29.7": {2405+ "integrity": "sha512-Z4WR8fmLMRpdYqJ9i7vrlXSsSrxVJydwrkEXHapexfARbWfGb7vGcnvNQnIzN0cXciMVOlz/XLoiMCi9gUsy9Q==",2406+ "dependencies": [2407+ "preact"2408+ ]2409+ },2410+ "preact@10.29.7_preact-render-to-string@6.7.0": {2411+ "integrity": "sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==",2412+ "dependencies": [2413+ "preact-render-to-string"2414+ ],2415+ "optionalPeers": [2416+ "preact-render-to-string"2417+ ]2418+ },2419+ "prettier@3.9.5": {2420+ "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==",2421+ "bin": true2422+ },2423+ "prismjs@1.30.0": {2424+ "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="2425+ },2426+ "process-ancestry@0.1.0": {2427+ "integrity": "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg=="2428+ },2429+ "property-information@7.2.0": {2430+ "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="2431+ },2432+ "protobufjs@8.0.1": {2433+ "integrity": "sha512-NWWCCscLjs+cOKF/s/XVNFRW7Yih0fdH+9brffR5NZCy8k42yRdl5KlWKMVXuI1vfCoy4o1z80XR/W/QUb3V3w==",2434+ "dependencies": [2435+ "@protobufjs/aspromise",2436+ "@protobufjs/base64",2437+ "@protobufjs/codegen",2438+ "@protobufjs/eventemitter",2439+ "@protobufjs/fetch",2440+ "@protobufjs/float",2441+ "@protobufjs/inquire",2442+ "@protobufjs/path",2443+ "@protobufjs/pool",2444+ "@protobufjs/utf8",2445+ "@types/node",2446+ "long"2447+ ],2448+ "scripts": true2449+ },2450+ "radix3@1.1.2": {2451+ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="2452+ },2453+ "readdirp@4.1.2": {2454+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="2455+ },2456+ "readdirp@5.0.0": {2457+ "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="2458+ },2459+ "regex-recursion@6.0.2": {2460+ "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",2461+ "dependencies": [2462+ "regex-utilities"2463+ ]2464+ },2465+ "regex-utilities@2.3.0": {2466+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="2467+ },2468+ "regex@6.1.0": {2469+ "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==",2470+ "dependencies": [2471+ "regex-utilities"2472+ ]2473+ },2474+ "request-light@0.5.8": {2475+ "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg=="2476+ },2477+ "request-light@0.7.0": {2478+ "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q=="2479+ },2480+ "require-directory@2.1.1": {2481+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="2482+ },2483+ "require-from-string@2.0.2": {2484+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="2485+ },2486+ "resolve-pkg-maps@1.0.0": {2487+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="2488+ },2489+ "retext-smartypants@6.2.0": {2490+ "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==",2491+ "dependencies": [2492+ "@types/nlcst",2493+ "nlcst-to-string",2494+ "unist-util-visit"2495+ ]2496+ },2497+ "rolldown@1.0.0-rc.10_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1": {2498+ "integrity": "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==",2499+ "dependencies": [2500+ "@oxc-project/types@0.120.0",2501+ "@rolldown/pluginutils@1.0.0-rc.10"2502+ ],2503+ "optionalDependencies": [2504+ "@rolldown/binding-android-arm64@1.0.0-rc.10",2505+ "@rolldown/binding-darwin-arm64@1.0.0-rc.10",2506+ "@rolldown/binding-darwin-x64@1.0.0-rc.10",2507+ "@rolldown/binding-freebsd-x64@1.0.0-rc.10",2508+ "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10",2509+ "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10",2510+ "@rolldown/binding-linux-arm64-musl@1.0.0-rc.10",2511+ "@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10",2512+ "@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10",2513+ "@rolldown/binding-linux-x64-gnu@1.0.0-rc.10",2514+ "@rolldown/binding-linux-x64-musl@1.0.0-rc.10",2515+ "@rolldown/binding-openharmony-arm64@1.0.0-rc.10",2516+ "@rolldown/binding-wasm32-wasi@1.0.0-rc.10_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1",2517+ "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10",2518+ "@rolldown/binding-win32-x64-msvc@1.0.0-rc.10"2519+ ],2520+ "bin": true2521+ },2522+ "rolldown@1.1.5": {2523+ "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==",6572524 "dependencies": [658- "@oxc-project/types",659- "@rolldown/pluginutils"2525+ "@oxc-project/types@0.139.0",2526+ "@rolldown/pluginutils@1.0.1"6602527 ],6612528 "optionalDependencies": [662- "@rolldown/binding-android-arm64",663- "@rolldown/binding-darwin-arm64",664- "@rolldown/binding-darwin-x64",665- "@rolldown/binding-freebsd-x64",666- "@rolldown/binding-linux-arm-gnueabihf",667- "@rolldown/binding-linux-arm64-gnu",668- "@rolldown/binding-linux-arm64-musl",669- "@rolldown/binding-linux-ppc64-gnu",670- "@rolldown/binding-linux-s390x-gnu",671- "@rolldown/binding-linux-x64-gnu",672- "@rolldown/binding-linux-x64-musl",673- "@rolldown/binding-openharmony-arm64",674- "@rolldown/binding-wasm32-wasi",675- "@rolldown/binding-win32-arm64-msvc",676- "@rolldown/binding-win32-x64-msvc"2529+ "@rolldown/binding-android-arm64@1.1.5",2530+ "@rolldown/binding-darwin-arm64@1.1.5",2531+ "@rolldown/binding-darwin-x64@1.1.5",2532+ "@rolldown/binding-freebsd-x64@1.1.5",2533+ "@rolldown/binding-linux-arm-gnueabihf@1.1.5",2534+ "@rolldown/binding-linux-arm64-gnu@1.1.5",2535+ "@rolldown/binding-linux-arm64-musl@1.1.5",2536+ "@rolldown/binding-linux-ppc64-gnu@1.1.5",2537+ "@rolldown/binding-linux-s390x-gnu@1.1.5",2538+ "@rolldown/binding-linux-x64-gnu@1.1.5",2539+ "@rolldown/binding-linux-x64-musl@1.1.5",2540+ "@rolldown/binding-openharmony-arm64@1.1.5",2541+ "@rolldown/binding-wasm32-wasi@1.1.5",2542+ "@rolldown/binding-win32-arm64-msvc@1.1.5",2543+ "@rolldown/binding-win32-x64-msvc@1.1.5"6772544 ],6782545 "bin": true6792546 },2547+ "satteri@0.9.5": {2548+ "integrity": "sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==",2549+ "dependencies": [2550+ "@types/estree-jsx",2551+ "@types/hast",2552+ "@types/mdast",2553+ "@types/unist"2554+ ],2555+ "optionalDependencies": [2556+ "@bruits/satteri-darwin-arm64",2557+ "@bruits/satteri-darwin-x64",2558+ "@bruits/satteri-linux-arm64-gnu",2559+ "@bruits/satteri-linux-arm64-musl",2560+ "@bruits/satteri-linux-x64-gnu",2561+ "@bruits/satteri-linux-x64-musl",2562+ "@bruits/satteri-wasm32-wasi",2563+ "@bruits/satteri-win32-arm64-msvc",2564+ "@bruits/satteri-win32-x64-msvc"2565+ ]2566+ },2567+ "sax@1.6.0": {2568+ "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="2569+ },2570+ "semver@6.3.1": {2571+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",2572+ "bin": true2573+ },2574+ "semver@7.8.5": {2575+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",2576+ "bin": true2577+ },2578+ "sharp@0.35.3": {2579+ "integrity": "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==",2580+ "dependencies": [2581+ "@img/colour",2582+ "detect-libc",2583+ "semver@7.8.5"2584+ ],2585+ "optionalDependencies": [2586+ "@img/sharp-darwin-arm64",2587+ "@img/sharp-darwin-x64",2588+ "@img/sharp-freebsd-wasm32",2589+ "@img/sharp-libvips-darwin-arm64",2590+ "@img/sharp-libvips-darwin-x64",2591+ "@img/sharp-libvips-linux-arm",2592+ "@img/sharp-libvips-linux-arm64",2593+ "@img/sharp-libvips-linux-ppc64",2594+ "@img/sharp-libvips-linux-riscv64",2595+ "@img/sharp-libvips-linux-s390x",2596+ "@img/sharp-libvips-linux-x64",2597+ "@img/sharp-libvips-linuxmusl-arm64",2598+ "@img/sharp-libvips-linuxmusl-x64",2599+ "@img/sharp-linux-arm",2600+ "@img/sharp-linux-arm64",2601+ "@img/sharp-linux-ppc64",2602+ "@img/sharp-linux-riscv64",2603+ "@img/sharp-linux-s390x",2604+ "@img/sharp-linux-x64",2605+ "@img/sharp-linuxmusl-arm64",2606+ "@img/sharp-linuxmusl-x64",2607+ "@img/sharp-webcontainers-wasm32",2608+ "@img/sharp-win32-arm64",2609+ "@img/sharp-win32-ia32",2610+ "@img/sharp-win32-x64"2611+ ]2612+ },2613+ "shiki@4.3.1": {2614+ "integrity": "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==",2615+ "dependencies": [2616+ "@shikijs/core",2617+ "@shikijs/engine-javascript",2618+ "@shikijs/engine-oniguruma",2619+ "@shikijs/langs",2620+ "@shikijs/themes",2621+ "@shikijs/types",2622+ "@shikijs/vscode-textmate",2623+ "@types/hast"2624+ ]2625+ },2626+ "simple-code-frame@1.3.0": {2627+ "integrity": "sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==",2628+ "dependencies": [2629+ "kolorist"2630+ ]2631+ },2632+ "sisteransi@1.0.5": {2633+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="2634+ },2635+ "smol-toml@1.7.0": {2636+ "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ=="2637+ },6802638 "source-map-js@1.2.1": {6812639 "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="6822640 },683- "tinyglobby@0.2.16": {684- "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",2641+ "source-map@0.7.6": {2642+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="2643+ },2644+ "space-separated-tokens@2.0.2": {2645+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="2646+ },2647+ "stack-trace@1.0.0": {2648+ "integrity": "sha512-H6D7134xi6qONvh7ZHKgviXf+rd3vhGBSvebPZCaUkd8zvQ+7PtDw6CljPTe4cXWNf2IKZGNqw6VJXSb9IgBpA=="2649+ },2650+ "string-width@4.2.3": {2651+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",2652+ "dependencies": [2653+ "emoji-regex",2654+ "is-fullwidth-code-point",2655+ "strip-ansi"2656+ ]2657+ },2658+ "stringify-entities@4.0.4": {2659+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",2660+ "dependencies": [2661+ "character-entities-html4",2662+ "character-entities-legacy"2663+ ]2664+ },2665+ "strip-ansi@6.0.1": {2666+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",2667+ "dependencies": [2668+ "ansi-regex"2669+ ]2670+ },2671+ "svgo@4.0.2": {2672+ "integrity": "sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==",2673+ "dependencies": [2674+ "commander",2675+ "css-select",2676+ "css-tree@3.2.1",2677+ "css-what",2678+ "csso",2679+ "picocolors",2680+ "sax"2681+ ],2682+ "bin": true2683+ },2684+ "tiny-inflate@1.0.3": {2685+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="2686+ },2687+ "tinyclip@0.1.15": {2688+ "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A=="2689+ },2690+ "tinyexec@1.2.4": {2691+ "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="2692+ },2693+ "tinyglobby@0.2.17": {2694+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",6852695 "dependencies": [6862696 "fdir",687- "picomatch"2697+ "picomatch@4.0.5"6882698 ]6892699 },2700+ "trim-lines@3.0.1": {2701+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="2702+ },2703+ "trough@2.2.0": {2704+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="2705+ },6902706 "ts-algebra@2.0.0": {6912707 "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw=="6922708 },6932709 "tslib@2.8.1": {6942710 "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="6952711 },2712+ "typesafe-path@0.2.2": {2713+ "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA=="2714+ },2715+ "typescript-auto-import-cache@0.3.6": {2716+ "integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==",2717+ "dependencies": [2718+ "semver@7.8.5"2719+ ]2720+ },2721+ "typescript@6.0.3": {2722+ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",2723+ "bin": true2724+ },2725+ "ufo@1.6.4": {2726+ "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="2727+ },2728+ "ultrahtml@1.7.0": {2729+ "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g=="2730+ },2731+ "uncrypto@0.1.3": {2732+ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="2733+ },6962734 "undici-types@7.19.2": {6972735 "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="6982736 },699- "vite@8.0.1_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2": {2737+ "unified@11.0.5": {2738+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",2739+ "dependencies": [2740+ "@types/unist",2741+ "bail",2742+ "devlop",2743+ "extend",2744+ "is-plain-obj",2745+ "trough",2746+ "vfile"2747+ ]2748+ },2749+ "unifont@0.7.4": {2750+ "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==",2751+ "dependencies": [2752+ "css-tree@3.2.1",2753+ "ofetch",2754+ "ohash"2755+ ]2756+ },2757+ "unist-util-is@6.0.1": {2758+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",2759+ "dependencies": [2760+ "@types/unist"2761+ ]2762+ },2763+ "unist-util-position@5.0.0": {2764+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",2765+ "dependencies": [2766+ "@types/unist"2767+ ]2768+ },2769+ "unist-util-stringify-position@4.0.0": {2770+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",2771+ "dependencies": [2772+ "@types/unist"2773+ ]2774+ },2775+ "unist-util-visit-parents@6.0.2": {2776+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",2777+ "dependencies": [2778+ "@types/unist",2779+ "unist-util-is"2780+ ]2781+ },2782+ "unist-util-visit@5.1.0": {2783+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",2784+ "dependencies": [2785+ "@types/unist",2786+ "unist-util-is",2787+ "unist-util-visit-parents"2788+ ]2789+ },2790+ "unstorage@1.17.5": {2791+ "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==",2792+ "dependencies": [2793+ "anymatch",2794+ "chokidar@5.0.0",2795+ "destr",2796+ "h3",2797+ "lru-cache@11.5.2",2798+ "node-fetch-native",2799+ "ofetch",2800+ "ufo"2801+ ]2802+ },2803+ "update-browserslist-db@1.2.3_browserslist@4.28.6": {2804+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",2805+ "dependencies": [2806+ "browserslist",2807+ "escalade",2808+ "picocolors"2809+ ],2810+ "bin": true2811+ },2812+ "vfile-location@5.0.3": {2813+ "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",2814+ "dependencies": [2815+ "@types/unist",2816+ "vfile"2817+ ]2818+ },2819+ "vfile-message@4.0.3": {2820+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",2821+ "dependencies": [2822+ "@types/unist",2823+ "unist-util-stringify-position"2824+ ]2825+ },2826+ "vfile@6.0.3": {2827+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",2828+ "dependencies": [2829+ "@types/unist",2830+ "vfile-message"2831+ ]2832+ },2833+ "vite-prerender-plugin@0.5.13_vite@8.1.4__esbuild@0.28.1": {2834+ "integrity": "sha512-IKSpYkzDBsKAxa05naRbj7GvNVMSdww/Z/E89oO3xndz+gWnOBOKOAbEXv7qDhktY/j3vHgJmoV1pPzqU2tx9g==",2835+ "dependencies": [2836+ "kolorist",2837+ "magic-string",2838+ "node-html-parser",2839+ "simple-code-frame",2840+ "source-map",2841+ "stack-trace",2842+ "vite@8.1.4_esbuild@0.28.1"2843+ ]2844+ },2845+ "vite@8.0.1_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1": {7002846 "integrity": "sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw==",7012847 "dependencies": [7022848 "lightningcss",703- "picomatch",2849+ "picomatch@4.0.5",7042850 "postcss",705- "rolldown",2851+ "rolldown@1.0.0-rc.10_@emnapi+core@1.11.1_@emnapi+runtime@1.11.1",7062852 "tinyglobby"7072853 ],7082854 "optionalDependencies": [@@ -710,13 +2856,260 @@
7102856 ],7112857 "bin": true7122858 },2859+ "vite@8.1.4_esbuild@0.28.1": {2860+ "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==",2861+ "dependencies": [2862+ "esbuild@0.28.1",2863+ "lightningcss",2864+ "picomatch@4.0.5",2865+ "postcss",2866+ "rolldown@1.1.5",2867+ "tinyglobby"2868+ ],2869+ "optionalDependencies": [2870+ "fsevents"2871+ ],2872+ "optionalPeers": [2873+ "esbuild@0.28.1"2874+ ],2875+ "bin": true2876+ },2877+ "vitefu@1.1.3_vite@8.1.4__esbuild@0.28.1_esbuild@0.28.1": {2878+ "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==",2879+ "dependencies": [2880+ "vite@8.1.4_esbuild@0.28.1"2881+ ],2882+ "optionalPeers": [2883+ "vite@8.1.4_esbuild@0.28.1"2884+ ]2885+ },2886+ "volar-service-css@0.0.71_@volar+language-service@2.4.28": {2887+ "integrity": "sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==",2888+ "dependencies": [2889+ "@volar/language-service",2890+ "vscode-css-languageservice",2891+ "vscode-languageserver-textdocument",2892+ "vscode-uri"2893+ ],2894+ "optionalPeers": [2895+ "@volar/language-service"2896+ ]2897+ },2898+ "volar-service-emmet@0.0.71_@volar+language-service@2.4.28": {2899+ "integrity": "sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==",2900+ "dependencies": [2901+ "@emmetio/css-parser",2902+ "@emmetio/html-matcher",2903+ "@volar/language-service",2904+ "@vscode/emmet-helper",2905+ "vscode-uri"2906+ ],2907+ "optionalPeers": [2908+ "@volar/language-service"2909+ ]2910+ },2911+ "volar-service-html@0.0.71_@volar+language-service@2.4.28": {2912+ "integrity": "sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==",2913+ "dependencies": [2914+ "@volar/language-service",2915+ "vscode-html-languageservice",2916+ "vscode-languageserver-textdocument",2917+ "vscode-uri"2918+ ],2919+ "optionalPeers": [2920+ "@volar/language-service"2921+ ]2922+ },2923+ "volar-service-prettier@0.0.71_@volar+language-service@2.4.28": {2924+ "integrity": "sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==",2925+ "dependencies": [2926+ "@volar/language-service",2927+ "vscode-uri"2928+ ],2929+ "optionalPeers": [2930+ "@volar/language-service"2931+ ]2932+ },2933+ "volar-service-typescript-twoslash-queries@0.0.71_@volar+language-service@2.4.28": {2934+ "integrity": "sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==",2935+ "dependencies": [2936+ "@volar/language-service",2937+ "vscode-uri"2938+ ],2939+ "optionalPeers": [2940+ "@volar/language-service"2941+ ]2942+ },2943+ "volar-service-typescript@0.0.71_@volar+language-service@2.4.28": {2944+ "integrity": "sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==",2945+ "dependencies": [2946+ "@volar/language-service",2947+ "path-browserify",2948+ "semver@7.8.5",2949+ "typescript-auto-import-cache",2950+ "vscode-languageserver-textdocument",2951+ "vscode-nls",2952+ "vscode-uri"2953+ ],2954+ "optionalPeers": [2955+ "@volar/language-service"2956+ ]2957+ },2958+ "volar-service-yaml@0.0.71_@volar+language-service@2.4.28": {2959+ "integrity": "sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==",2960+ "dependencies": [2961+ "@volar/language-service",2962+ "vscode-uri",2963+ "yaml-language-server"2964+ ],2965+ "optionalPeers": [2966+ "@volar/language-service"2967+ ]2968+ },2969+ "vscode-css-languageservice@6.3.10": {2970+ "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==",2971+ "dependencies": [2972+ "@vscode/l10n",2973+ "vscode-languageserver-textdocument",2974+ "vscode-languageserver-types@3.17.5",2975+ "vscode-uri"2976+ ]2977+ },2978+ "vscode-html-languageservice@5.6.2": {2979+ "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==",2980+ "dependencies": [2981+ "@vscode/l10n",2982+ "vscode-languageserver-textdocument",2983+ "vscode-languageserver-types@3.18.0",2984+ "vscode-uri"2985+ ]2986+ },2987+ "vscode-json-languageservice@4.1.8": {2988+ "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==",2989+ "dependencies": [2990+ "jsonc-parser@3.3.1",2991+ "vscode-languageserver-textdocument",2992+ "vscode-languageserver-types@3.18.0",2993+ "vscode-nls",2994+ "vscode-uri"2995+ ]2996+ },2997+ "vscode-jsonrpc@8.2.0": {2998+ "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="2999+ },3000+ "vscode-languageserver-protocol@3.17.5": {3001+ "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",3002+ "dependencies": [3003+ "vscode-jsonrpc",3004+ "vscode-languageserver-types@3.17.5"3005+ ]3006+ },3007+ "vscode-languageserver-textdocument@1.0.12": {3008+ "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="3009+ },3010+ "vscode-languageserver-types@3.17.5": {3011+ "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="3012+ },3013+ "vscode-languageserver-types@3.18.0": {3014+ "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g=="3015+ },3016+ "vscode-languageserver@9.0.1": {3017+ "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==",3018+ "dependencies": [3019+ "vscode-languageserver-protocol"3020+ ],3021+ "bin": true3022+ },3023+ "vscode-nls@5.2.0": {3024+ "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng=="3025+ },3026+ "vscode-uri@3.1.0": {3027+ "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="3028+ },3029+ "web-namespaces@2.0.1": {3030+ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="3031+ },7133032 "web-streams-polyfill@4.3.0": {7143033 "integrity": "sha512-/Gnggvj9oSrEvJbDyyPtAnxBt5fGQM2iWOKQNu7ie1OxDgK40iZpyV3TKaRiEzVj1oA1UxKnEy9XPXh6PW3eVw=="3034+ },3035+ "wrap-ansi@7.0.0": {diff truncated
@@ -0,0 +1,33 @@
1+# ADR 0002: Graduate the thin Preact adapter2+3+Status: accepted\4+Date: 2026-07-15\5+Issues: #5, #66+7+## Decision8+9+Use Preact directly over a small lofi-owned external store backed by Jazz's vanilla `Db` API. Keep10+one browser-global database promise, share one vendor query subscription across equivalent island11+consumers, and replace adapter instances during HMR without shutting down the database.12+13+Product components may use Preact, lofi hooks, and application types. They may not import Jazz,14+construct a client/provider, choose a transport, or branch on storage implementation.15+16+## Why17+18+Jazz 2.0.0-alpha.53's React bindings require React 19's `use`. Preact 10.29.7 compat does not export19+that API, so the alias-only control fails its production build. A custom semantic polyfill would be20+a larger and riskier compatibility layer than the adapter it was meant to avoid.21+22+The thin path passed two-root reactivity, retained local writes, explicit and concurrent client23+recreation, teardown, error visibility, deferred-initialization disposal, and five HMR cycles. Its24+reachable JavaScript is 6,983 gzip bytes larger than the single-view vanilla API control; that is an25+indicative floor rather than an equivalent-UI bundle claim.26+27+## Consequences28+29+- Jazz alpha churn is isolated to `apps/prototype/src/runtime` and schema/config files.30+- Component authors get context-free hooks that work across independent Astro islands.31+- The adapter owns query snapshot identity, cleanup, mutation error mapping, and HMR lifecycle.32+- Deferred asynchronous subscription failures remain limited by Jazz's public API and must not be33+ represented as observable UI errors until the vendor exposes a channel.@@ -0,0 +1,29 @@
1+# ADR 0003: Use static Astro through the Deno command surface2+3+Status: accepted\4+Date: 2026-07-15\5+Issue: #66+7+## Decision8+9+Use Astro 7 static output with independently hydrated Preact islands. Run development, checking,10+testing, building, and production preview through repository-owned Deno tasks. Serve the production11+directory with the small Deno preview command.12+13+Do not add `@deno/astro-adapter` to the graduated application until an on-demand route exists.14+15+## Why16+17+The local-first PWA needs a prerendered offline-capable shell and currently has no server-rendered18+route. Static Astro built and hydrated the exact Jazz stack under Deno, starts within the contract19+budget, and avoids an unnecessary runtime/deployment layer. A clean-room Deno adapter control also20+passed, so the decision is about product simplicity rather than a blocked fallback.21+22+## Consequences23+24+- `deno task preview` serves retained build output, not a fresh implicit build.25+- The wrapper owns stable user-facing status, safe environment projection, signal forwarding, and26+ the post-build secret scan.27+- Astro/Vite/Jazz npm compatibility details remain internal to config and generated runtime files.28+- A future SSR requirement must open a new contract decision and can adopt the already-proven Deno29+ adapter path.@@ -0,0 +1,37 @@
1+# ADR 0004: Reject Jazz alpha.53 passkey backup2+3+Status: accepted\4+Date: 2026-07-15\5+Issue: #86+7+## Decision8+9+Do not ship or invoke `BrowserPasskeyBackup` from `jazz-tools@2.0.0-alpha.53`. Present the identity10+as a device-local auth key. State explicitly that passkey backup is blocked by security review and11+that clearing site data can make the identity unrecoverable.12+13+Do not expose 24-word phrase export/import in M1. Retain its exact semantics for a later deliberate14+UX: it is a reversible encoding of the full-control auth seed and recovers identity authority, not15+unsynced local data.16+17+## Why18+19+The exact package stores the raw 32-byte Jazz auth secret in the WebAuthn user handle and reads it20+back from `AuthenticatorAssertionResponse.userHandle`. The WebAuthn specification defines that field21+as an account identifier and warns that authenticators may reveal it without prior user22+verification. Ceremony flags and credProtect do not establish a general confidentiality contract for23+the field.24+25+The API also cannot prove that a created credential is synced or manage/revoke its credentials.26+Physical-device success would therefore not establish the security or recovery promise lofi needs.27+28+## Replacement acceptance29+30+A replacement must:31+32+- keep the auth seed out of WebAuthn identifiers and non-confidential metadata;33+- wrap/encrypt the seed using an authenticator-derived or otherwise reviewed secret;34+- bind a stable RP ID and verify the complete ceremony/server record as applicable;35+- distinguish local credential creation from ecosystem backup state;36+- support duplicate prevention, inventory, replacement, and recovery failure UX;37+- retain real iOS and Android browser/installed-app evidence before graduation.@@ -49,9 +49,11 @@ cd lofi
4949 deno task dev5050 ```5151 52-The graduated `apps/prototype` must then support a local write, reload, offline edit, reconnect,53-check, test, build, and preview. Git is a contributor prerequisite for this repository journey; Deno54-remains the only required global runtime for a generated application.52+The graduated `apps/prototype` must then support a local write, reload, offline cold-start and edit,53+check, test, build, and preview. It does not claim observable transport reconnection or convergence54+because the pinned Jazz API exposes neither signal; that remains a later test contract. Git is a55+contributor prerequisite for this repository journey; Deno remains the only required global runtime56+for a generated application.5557 5658 ## End-to-end journey contract5759 @@ -62,7 +64,7 @@ remains the only required global runtime for a generated application.
6264 | Develop | Run `deno task dev`. | One local URL, storage mode, identity state, sync mode, and PWA readiness are printed. | Unsupported durable storage stops or requires explicit ephemeral opt-in; it never silently degrades. |6365 | First write | Use the starter UI to create data. | UI updates without awaiting network; data survives reload or runtime recreation. | A failed durable write is visible in UI and diagnostics with impact and remediation. |6466 | Reload/HMR | Reload and edit an island five times. | Identity and local data remain; client/subscription counts do not grow. | Duplicate runtime resources fail a development assertion with the responsible subsystem named. |65-| Offline | Disable network, read and edit, then reconnect. | Local behavior continues and observable sync eventually converges. | Unsupported or failed sync remains visible; no “synced” claim is fabricated. |67+| Offline | Disable network, cold-start, read, and edit. | Local behavior continues; returning online makes no unsupported connection-state claim. | Unsupported or failed sync remains visible; convergence waits for an explicit observable test seam. |6668 | Check/test | Run `deno task check` and `deno task test`. | Static checks and deterministic local-first tests pass without hidden global tools in generated apps. | Failure prints the failing check and preserves browser/log evidence. |6769 | Build/preview | Run `deno task build`, then `deno task preview`. | Production output is served through the supported Deno path. | npm-compat or adapter failure names the internal fallback; no undocumented user-facing Node command appears. |6870 | Device | Open the printed stable HTTPS origin on a phone. | Secure-context, storage, install, and passkey capability are diagnosed. | An unstable relying-party ID is rejected before passkey creation and the stable-origin action is named. |@@ -85,28 +87,28 @@ remains the only required global runtime for a generated application.
8587 8688 ## Measurable promises8789 88-| ID | Promise | v0 budget or condition | Evidence owner | M1 gate | Status |89-| --------------- | -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | --------------------------------- | ------- | --------- |90-| DX-CREATE-01 | Named creation is non-interactive. | Deno is the only required global runtime; zero prompts; uncached time reported. | M2 | no | proposed |91-| DX-CMD-01 | The public command surface is small. | create, dev, doctor, check, test, build, preview only. | #2 and #6 | yes | proposed |92-| DX-TTFW-01 | Generated create-to-retained-write is fast. | At most three shell commands and two minutes on the recorded machine/network. | M2 | no | proposed |93-| DX-PROTOTYPE-01 | The M1 checkout reaches a retained write quickly. | `deno task dev` to retained write within 60 seconds after cached setup. | integrated M1 prototype | yes | proposed |94-| DX-START-01 | Cached development startup feels immediate. | Warm median at most 2 seconds; slowest at most 5 seconds across five samples. | #6 | yes | proposed |95-| DX-HMR-01 | UI edits retain state and runtime cardinality. | Median feedback at most 300 ms; one client and one subscription per consumer after five edits. | #5 and #6 | yes | proposed |96-| DX-AUTHOR-01 | Product edits avoid framework plumbing. | The integrated task changes only schema, app config, page/island, style, or test files. | integrated prototype | yes | proposed |97-| DX-LEAK-01 | Runtime machinery stays outside product UI. | No provider, raw client, worker, transport URL, Workbox config, or browser branch in product UI. | #5, #6, integration | yes | proposed |98-| DX-LOCAL-01 | Local work does not await network/auth round trips. | Subscribed UI reflects an offline write in the same event turn or next render; reload retains it. | #7 | yes | validated |99-| DX-DUR-01 | Durable mode never silently becomes ephemeral. | Boot reports durable, unsupported, or explicitly opted-in memory mode. | #4 and #7 | yes | proposed |100-| DX-SYNC-01 | Application-data transport has one lofi-owned surface. | App config selects a named adapter; product UI never constructs peers or transports. | #7 and integration | yes | proposed |101-| DX-OBS-01 | Diagnostics expose only truthful signals. | Configured state and per-write durability map to public APIs; unavailable transport detail is named. | #7 | yes | revised |102-| DX-ENV-01 | Environment handling is safe by construction. | Real env ignored; allowlisted loader; server values absent from client projection and built output. | #3, #7, final build | yes | proposed |103-| DX-ERROR-01 | Failures state capability, impact, and action. | No secret values; common config recovery is one edit plus rerun. | #3, #4, #6 | yes | proposed |104-| DX-AUTH-01 | Identity wording matches custody/recovery. | UI distinguishes local identity, passkey backup/restore, and bearer recovery phrase. | #8 | yes | proposed |105-| DX-DEVICE-01 | M1 device/auth tests use a stable secure origin. | Tested origin preserves relying-party ID across browser and installed-app sessions. | #8 | yes | proposed |106-| DX-DEVICE-UX-01 | Device preview is one productized command. | Primary path prints stable URL, capability report, and remediation. | M3 | no | proposed |107-| DX-OFFLINE-01 | Installed production cold-start renders retained data offline. | Airplane-mode launch renders shell and data. | feasibility #4; full M3 | no | proposed |108-| DX-BUILD-01 | Development and production share the Deno command contract. | `deno task build` and `preview`; no undocumented Node command. | #6 | yes | proposed |109-| DX-TEST-01 | Local-first tests avoid hand-timed sleeps. | Readiness-based offline/two-client primitives. | feasibility #7; M2 implementation | no | proposed |90+| ID | Promise | v0 budget or condition | Evidence owner | M1 gate | Status |91+| --------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ------- | --------- |92+| DX-CREATE-01 | Named creation is non-interactive. | Deno is the only required global runtime; zero prompts; uncached time reported. | M2 | no | proposed |93+| DX-CMD-01 | The public command surface is small. | create, dev, doctor, check, test, build, preview only. | #2 and #6 | yes | validated |94+| DX-TTFW-01 | Generated create-to-retained-write is fast. | At most three shell commands and two minutes on the recorded machine/network. | M2 | no | proposed |95+| DX-PROTOTYPE-01 | The M1 checkout reaches a retained write quickly. | `deno task dev` to retained write within 60 seconds after cached setup. | integrated M1 prototype | yes | validated |96+| DX-START-01 | Cached development startup feels immediate. | Warm median at most 2 seconds; slowest at most 5 seconds across five samples. | #6 | yes | validated |97+| DX-HMR-01 | UI edits retain state and runtime cardinality. | Median feedback at most 300 ms; one client and one vendor subscription per shared query after five edits. | #5 and #6 | yes | validated |98+| DX-AUTHOR-01 | Product edits avoid framework plumbing. | The integrated task changes only schema, app config, page/island, style, or test files. | integrated prototype | yes | validated |99+| DX-LEAK-01 | Runtime machinery stays outside product UI. | No provider, raw client, worker, transport URL, Workbox config, or browser branch in product UI. | #5, #6, integration | yes | validated |100+| DX-LOCAL-01 | Local work does not await network/auth round trips. | Subscribed UI reflects an offline write in the same event turn or next render; reload retains it. | #7 | yes | validated |101+| DX-DUR-01 | Durable mode never silently becomes ephemeral. | Boot reports durable, unsupported, or explicitly opted-in memory mode. | #4 and #7 | yes | validated |102+| DX-SYNC-01 | Application-data transport has one lofi-owned surface. | App config selects a named adapter; product UI never constructs peers or transports. | #7 and integration | yes | validated |103+| DX-OBS-01 | Diagnostics expose only truthful signals. | Configured state and per-write durability map to public APIs; unavailable transport detail is named. | #7 | yes | validated |104+| DX-ENV-01 | Environment handling is safe by construction. | Real env ignored; allowlisted loader; server values absent from client projection and built output. | #3, #7, final build | yes | validated |105+| DX-ERROR-01 | Failures state capability, impact, and action. | No secret values; common config recovery is one edit plus rerun. | #3, #4, #6 | yes | validated |106+| DX-AUTH-01 | Identity wording matches custody/recovery. | UI identifies the device-local key, blocks the rejected alpha passkey path, and defines any future phrase as an identity bearer secret rather than data backup. | #8 | yes | revised |107+| DX-DEVICE-01 | Device/auth tests use a stable, appropriately isolated origin. | M1 proves a stable HTTPS PWA scope for OPFS; installed-app RP-ID preservation and identity isolation remain required before any replacement passkey ceremony. | #4 and #8 | yes | revised |108+| DX-DEVICE-UX-01 | Device preview is one productized command. | Primary path prints stable URL, capability report, and remediation. | M3 | no | proposed |109+| DX-OFFLINE-01 | Installed production cold-start renders retained data offline. | Airplane-mode launch renders shell and data. | feasibility #4; full M3 | no | proposed |110+| DX-BUILD-01 | Development and production share the Deno command contract. | `deno task build` and `preview`; no undocumented Node command. | #6 | yes | validated |111+| DX-TEST-01 | Local-first tests avoid hand-timed sleeps. | Readiness-based offline/two-client primitives. | feasibility #7; M2 implementation | no | proposed |110112 111113 ## Canonical command surface and output contract112114 @@ -233,27 +235,26 @@ generator gets its own fixture inspection.
233235 ## M1 acceptance checklist234236 235237 - [x] Optional `.env` and process precedence select the expected mode without printing values.236-- [ ] Exact Jazz alpha, Deno, Astro, Preact, browser, OS, and device versions are retained.238+- [x] Exact Jazz alpha, Deno, Astro, Preact, browser, and executed OS versions are retained;239+ physical device versions are explicitly deferred to M3 by the M1 approval.237240 - [x] Vendor control proves local write, subscription, reload retention, and optional cloud sync.238241 - [x] Observability inventory maps each promised diagnostic to evidence or removes it.239-- [ ] Preact decision passes mount/update/unmount/recreate and five-cycle HMR checks.240-- [ ] Two Astro islands share exactly one client and update each other.241-- [ ] `deno task dev`, `check`, `test`, `build`, and `preview` work from the checkout.242-- [ ] Startup/HMR measurements follow the declared protocol.243-- [ ] OPFS matrix covers reload, browser/app termination, device restart, foreground/background,244- multi-tab leadership/concurrent writes, and browser persistence API behavior on exact iPhone245- tab/installed and Android tab/installed versions.246-- [ ] OPFS evidence distinguishes durable, unsupported, and memory fallback and ends with an247- explicit raise-floor/degrade/Classic-Jazz/change-layer decision tree.248-- [ ] Identity matrix covers fresh profile, cleared site data, deleted passkey, sign-out, switching,249- recovery phrase, same-ecosystem restore, and cross-platform restore in browser and installed250- variants.251-- [ ] Auth evidence uses stable HTTPS/RP-ID, states that the recovery phrase is a bearer secret, and252- decides first-run, backup reminder, recovery, and unrecoverable-loss UX wording.253-- [ ] Integrated prototype works offline, reloads retained data, and visibly reconnects.254-- [ ] Final build passes server-secret scanning and contains no development-only inspector.255-- [ ] Every M1-gated promise is validated, revised, or rejected with evidence.256-- [ ] Final contract and decisions identify all remaining post-M1 work without implying completion.242+- [x] Preact decision passes mount/update/unmount/recreate and five-cycle HMR checks.243+- [x] Two Astro islands share exactly one client and update each other.244+- [x] `deno task dev`, `check`, `test`, `build`, and `preview` work from the checkout.245+- [x] Startup/HMR measurements follow the declared protocol.246+- [x] OPFS evidence distinguishes durable, unsupported, and memory fallback, retains the complete247+ physical checklist for M3, and records the product owner's M1 HTTPS-artifact approval.248+- [x] Identity ceremony testing stopped at the security pre-gate; the unsafe alpha passkey design is249+ rejected rather than exercised or implied to work.250+- [x] Auth evidence rejects the unsafe ceremony, makes a stable isolated RP ID a replacement251+ precondition, states that a recovery phrase is a bearer secret, and defines honest first-run,252+ backup, and unrecoverable-loss wording.253+- [x] Integrated prototype works offline and reloads retained local data without a false transport254+ reconnection claim.255+- [x] Final build passes server-secret scanning and contains no development-only inspector.256+- [x] Every M1-gated promise is validated, revised, or rejected with evidence.257+- [x] Final contract and decisions identify all remaining post-M1 work without implying completion.257258 258259 ## M1 falsification map259260 @@ -0,0 +1,94 @@
1+# Astro + Deno toolchain evidence — 2026-07-152+3+Issue: [#6](https://github.com/FelineStateMachine/lofi/issues/6)\4+Baseline commit: `0843833`\5+Machine: macOS 26.5.1, Deno 2.9.0, Headless Chrome 150.0.0.0\6+Pins: Astro 7.0.9, @astrojs/preact 6.0.1, Preact 10.29.7, Jazz 2.0.0-alpha.537+8+## Go decision9+10+Graduate Astro static output with Deno as the only public command runtime. Do not install the Deno11+Astro adapter until an on-demand route actually exists. The PWA target benefits from a prerendered12+shell; a server adapter adds runtime modules and deployment choices without serving M1.13+14+## Exact command surface15+16+```sh17+deno task dev18+deno task check19+deno task test20+deno task build21+deno task preview22+```23+24+The build produced one prerendered route, wrote a short Git build identity, and ran the nested-dist25+secret scan. The Deno preview served the retained production output and printed its URL plus build26+identity. No Node command or global Node installation was used.27+28+Routine `check` and `build` disable Jazz's managed development server, so neither command publishes29+a schema or exposes server secrets to Astro. Development retains automatic schema publication. The30+production bundle contains no `__LOFI_PROTOTYPE__` test probe, and preview serves the web manifest31+as `application/manifest+json`.32+33+## Two-island and lifecycle result34+35+Two independent `client:load` Preact roots share one browser-global Jazz database and one query36+subscription. A write in either root updates both. Reload and explicit client recreation retained37+OPFS data. Five HMR edits preserved local identity/data and settled after each edit at:38+39+```text40+active clients: 141+active component consumers: 242+active vendor subscriptions: 143+active mutation listeners: 144+```45+46+Two concurrent recreation requests coalesced to one replacement client and returned to the same 1 /47+2 / 1 / 1 steady state. Lifecycle tests also defer database initialization past HMR disposal and48+verify that the obsolete module never attaches its store or mutation listener.49+50+The runtime forwards SIGINT/SIGTERM to Astro so the wrapper does not orphan a development server.51+Astro 7's agent-detected background mode is disabled inside the stable lofi wrapper; the public52+command remains foreground and Ctrl-C behaves conventionally.53+54+## Startup measurements55+56+Measurement begins at command invocation and ends when Astro prints the usable local URL.57+58+| Mode | Samples | Median | Slowest |59+| ----------------------------------- | ---------------------------------------- | -------: | -------: |60+| Cold app caches cleared + `--force` | 1 | 1,187 ms | 1,187 ms |61+| Warm | 1,210 / 1,179 / 1,181 / 1,178 / 1,180 ms | 1,180 ms | 1,210 ms |62+63+Astro's internal warm measurements were 886 / 853 / 839 / 828 / 851 ms. The lofi wall time is the64+contract value because it includes the wrapper. Dependency download was already warm and is not65+misreported as an uncached project-creation measurement; that belongs to M2's generator.66+67+The final checkout-to-retained-write run took 18,998 ms from `deno task dev` invocation through a68+local durability-confirmed write visible in both islands. Reload retained the row and restored the 169+/ 2 / 1 / 1 steady state. This validates DX-PROTOTYPE-01's 60-second cached-checkout budget.70+71+## npm-compatibility findings72+73+The exact stack passed after retaining these settings:74+75+- `nodeModulesDir: "auto"`;76+- explicit Preact subpath imports, including `jsx-dev-runtime`;77+- `vite.resolve.noExternal: ["@astrojs/preact"]` to resolve Astro's virtual Preact options module;78+- a Preact-aware app `tsconfig.json`;79+- workspace filesystem allowance for Jazz's Deno npm-cache WASM path;80+- a preseeded internal Jazz app ID to avoid the plugin's first-run `.env` restart race.81+82+Astro's dependency graph resolves Vite 8.1.4 while the standalone Jazz control remains pinned to83+Vite 8.0.1. Both passed. Investigation stayed inside Deno; the agreed Node-build fallback was not84+needed.85+86+A clean-room server control also built and ran with `@deno/astro-adapter@0.6.0` when hostname, port,87+and start were explicit. Static mode is still the M1 choice because no request-time rendering88+requirement exists.89+90+## Contract delta91+92+No public Node fallback is necessary. DX-START-01, DX-BUILD-01, and the M1 part of DX-CMD-01 are93+validated. DX-HMR-01 uses one underlying subscription per shared query rather than duplicating one94+per island consumer.@@ -0,0 +1,91 @@
1+# Identity and recovery evidence — 2026-07-152+3+Issue: [#8](https://github.com/FelineStateMachine/lofi/issues/8)\4+Baseline commit: `0843833`\5+Exact package: `jazz-tools@2.0.0-alpha.53`6+7+## Decision8+9+Reject `BrowserPasskeyBackup` from the M1 product contract. Do not invoke it, present it as backup,10+or run real-device ceremonies until Jazz changes the storage design or provides a security argument11+that satisfies the WebAuthn user-handle model.12+13+This is a security kill before the device matrix, not a claim that the physical flows passed. The14+stable HTTPS device site explicitly says passkey backup is blocked.15+16+## Source finding17+18+Retained installed-source hashes:19+20+```text21+e9dcea8ed17538cc9e58f7a97d74c8ff719336e3db1f26a7f44d6ed9f25688df passkey-backup.js22+c95327809b841996f5fd12b7f740ebc09b0771f4e95f9cf69dcd385dc589b747 recovery-phrase.js23+```24+25+`BrowserPasskeyBackup.backup()` decodes the 32-byte Jazz auth secret and assigns those bytes26+directly to `PublicKeyCredentialUserEntity.id`. `restore()` returns assertion `userHandle` as the27+same auth secret. No encryption, wrapping key, large-blob encryption, or server-held recovery record28+exists in this path.29+30+WebAuthn Level 3 says user handles are account identifiers, must not contain personally identifying31+information, and may be revealed by authenticators without prior user verification. A full-control32+Jazz auth secret has a stronger confidentiality requirement than the field WebAuthn defines. See33+[§14.6.1 User Handle Contents](https://www.w3.org/TR/webauthn-3/#sctn-user-handle-privacy).34+35+The implementation requests a platform discoverable credential, required user verification, and the36+credProtect extension, then verifies UP/UV flags on restore. Those are useful ceremony controls but37+do not redefine `user.id` as secret storage. The package also:38+39+- ignores the credential returned by `credentials.create()` and records no credential ID;40+- treats a resolved `null` create result as success;41+- records no backup-eligibility or backup-state signal, so it cannot prove ecosystem sync;42+- supplies no exclude list, list, has, delete, or clear-passkey operation;43+- can create duplicate credentials on repeated backup;44+- returns a restored secret but leaves saving it and recreating the database to the caller.45+46+## Accurate identity model47+48+| Action | Exact meaning |49+| ----------------- | --------------------------------------------------------------------------------------------------------- |50+| First visit | Generate a random 32-byte auth seed and keep it in namespaced browser localStorage. |51+| Clear site data | Remove the local seed and OPFS state; the next boot creates a different identity. |52+| “Sign out” helper | Clear and regenerate the seed, so this is identity rotation, not a logged-out state. |53+| 24-word phrase | Reversible BIP39 encoding of the same seed; no password, KDF, encryption, reset, revocation, or rotation. |54+| Restore identity | Save the recovered seed and recreate the database/client. It does not restore unsynced OPFS rows. |55+56+Both a future safe passkey mechanism and the phrase recover identity authority only. Data lost with57+site storage returns only when it was separately synced and remains readable by that identity.58+59+## Product wording60+61+Use:62+63+- “This device has a local identity key.”64+- “Passkey backup is unavailable in this alpha because it did not pass security review.”65+- “The 24 words are a full-control bearer secret. Anyone with all words can act with this identity.”66+- “Identity recovery is not data backup. Unsynced device data cannot be recovered.”67+- “Without a verified recovery method, clearing site data can permanently lose access.”68+69+Do not use “passkey-only account,” “login,” “cloud backup,” “sign out,” or “data recovery” for the70+current behavior.71+72+## First-run and recovery UX decision73+74+M1 creates the local identity without a network round trip and immediately states its device-local75+custody. Passkey backup controls are absent. A phrase export/import UI is deferred until it can76+provide deliberate reveal/confirmation, prevent logging or telemetry, and make the bearer-secret and77+identity-only limits unavoidable. Until then the prototype is honest but unrecoverable after78+site-data loss.79+80+## Deferred device matrix81+82+Fresh profile, deleted passkey, same-ecosystem restore, cross-platform restore, iOS tab/Home Screen,83+and Android browser/installed-app passkey cases are **not run** because the candidate mechanism84+failed the pre-device security gate. Reopen the matrix only for a replacement mechanism with a85+confidential secret-wrapping design and explicit RP-ID contract.86+87+## Contract delta88+89+DX-AUTH-01 is revised: M1 validates truthful local-identity wording and rejects the alpha passkey90+mechanism. DX-DEVICE-01 remains required for OPFS/PWA testing, but no unsafe passkey ceremony is91+performed merely to fill a matrix.@@ -0,0 +1,83 @@
1+# OPFS device checklist2+3+Issue: [#4](https://github.com/FelineStateMachine/lofi/issues/4)\4+Build: fill from the site's `lofi-build.json`\5+Jazz: 2.0.0-alpha.536+7+Never record environment values, identity secrets, or note contents that are sensitive. Use unique8+throwaway note labels such as `ios-tab-A-1`.9+10+## Record before testing11+12+| Field | Value |13+| ------------------------------- | ----------------------------------------------------- |14+| Device model | |15+| OS and exact version | |16+| Browser and exact version | |17+| Surface | browser tab / iOS Home Screen / Android installed app |18+| Canonical HTTPS URL | |19+| Display mode shown by site | |20+| Secure context | pass / fail |21+| OPFS | pass / fail |22+| SharedWorker | pass / fail |23+| Web Locks | pass / fail |24+| `navigator.storage.persisted()` | granted / not granted / unavailable / error |25+| After request | granted / not granted / unavailable / error |26+| Runtime storage state | `persistent-driver-open` / failed |27+28+If the site says `Durable driver blocked`, stop. Record the missing capability. Never continue under29+a memory fallback.30+31+## Durability32+33+Use a new throwaway label for each row and confirm it appears in both islands.34+35+| Test | Action | Required result | Result |36+| ------------------- | ------------------------------------------------------------ | --------------------------------------- | ------ |37+| Reload | Add note, reload page | Note returns | |38+| Browser termination | Add note, terminate browser from app switcher, reopen URL | Note returns | |39+| App termination | Installed surface: add note, terminate installed app, reopen | Note returns | |40+| Device restart | Add note, restart device, reopen same surface | Note returns | |41+| Background | Add note, background 5+ minutes, foreground | Note remains; app becomes reactive | |42+| Offline foreground | Load once, airplane mode, reopen installed surface, add note | Shell and local write work | |43+| Reconnect | Disable airplane mode | Local note remains; no false sync claim | |44+45+## Multi-tab / multi-window46+47+1. Open the exact canonical URL in tab/window A and B.48+2. Confirm both show `persistent-driver-open`.49+3. Add `A-<timestamp>` in A; confirm B updates without reload.50+4. Add `B-<timestamp>` in B; confirm A updates without reload.51+5. Submit once from both surfaces as closely together as possible; confirm both distinct notes52+ appear in both surfaces.53+6. Close A; write in B; reopen A and confirm the write.54+7. Confirm every live page shows one active client and one underlying subscription locally. Counts55+ are per page; the Jazz SharedWorker owns cross-tab leader/follower coordination.56+57+## Installation58+59+### iPhone60+61+1. Run the browser-tab matrix in Safari.62+2. Use Share → Add to Home Screen.63+3. Open from the icon and verify the site reports `standalone`.64+4. Repeat app termination, device restart, offline cold start, and background tests.65+66+### Android67+68+1. Confirm Chrome is version 148 or newer.69+2. Run the browser-tab matrix.70+3. Install from Chrome's install action.71+4. Open from the icon and verify `standalone`.72+5. Repeat app termination, device restart, offline cold start, and background tests.73+74+## Decision75+76+- **Graduate current floor:** every required surface passes and reports the persistent driver.77+- **Raise platform floor:** failures map to an older browser/OS with a known working newer floor.78+- **Degrade safely:** only if lofi adds an explicit user-selected ephemeral mode with a destructive79+ warning; never automatic.80+- **Evaluate Classic Jazz:** only if its IndexedDB path passes the same matrix and the alpha OPFS81+ path does not.82+- **Change data layer:** any required current target silently falls back, corrupts, or loses data83+ and no honest persistent adapter passes.@@ -0,0 +1,63 @@
1+# OPFS desktop preflight and device evidence — 2026-07-152+3+Issue: [#4](https://github.com/FelineStateMachine/lofi/issues/4)\4+Exact stack: Jazz 2.0.0-alpha.53, Astro 7.0.9, Preact 10.29.7, Deno 2.9.0\5+Desktop preflight: macOS 26.5.1, Headless Chrome 150.0.0.06+7+## Enforced behavior8+9+The graduated runtime requests only Jazz's persistent driver and rejects boot before creating an10+identity/database when secure context, OPFS, SharedWorker, Web Locks, or MessageChannel is missing.11+There is no memory configuration or automatic fallback. UI separately reports:12+13+- capability eligibility;14+- `persistent-driver-open` only after `createDb()` resolves;15+- per-write local durability only after `WriteHandle.wait({ tier: "local" })`;16+- `navigator.storage.persisted()` state and the result of an explicit persistence request.17+18+## Desktop preflight19+20+- capability report: secure context, OPFS available, SharedWorker available, Web Locks available;21+- initial eviction-persistence state: not granted;22+- a write updated both islands, survived reload, and survived explicit/concurrent client recreation;23+- two same-origin pages and the exact Jazz control exercised the SharedWorker baseline in #7;24+- production service worker reached `ready`, controlled the page, and installed a revisioned cache;25+- with browser networking forced offline, a cold page reload rendered the prerendered shell;26+- while still offline, a new local write appeared in both islands, reached local durability, and27+ survived another offline reload plus a subsequent online reload;28+- recursive build scan found no server-secret name or value in the client artifact.29+30+Returning online is recorded only as retained local behavior. The pinned Jazz API exposes no public31+connection-state or convergence signal, so this evidence makes no transport-reconnection claim.32+33+This is preflight only. It does not replace the required physical iPhone and Android evidence.34+35+## Physical matrix status36+37+| Surface | Status |38+| ----------------------- | -------------- |39+| iPhone Safari tab | deferred to M3 |40+| iPhone Home Screen app | deferred to M3 |41+| Android Chrome 148+ tab | deferred to M3 |42+| Android installed app | deferred to M3 |43+44+## M1 approval45+46+The product owner approved the M1 OPFS/PWA feasibility decision on 2026-07-15 from the stable HTTPS47+artifact at <https://n.zip/2c6d/>. The live page hydrated both islands, reported a secure context,48+OPFS, SharedWorker, Web Locks, and `persistent-driver-open`, retained a write across reload, and49+preserved the 1 / 2 / 1 / 1 runtime cardinality.50+51+The host exposed one integration defect: its explicit `index.html` canonical redirect used HTTP,52+which made a service-worker precache transaction redundant. Lofi now caches and falls back to the53+canonical scope root (`./`) and reports a redundant worker as `failed`; an nzip host patch is being54+prepared upstream. This does not change the durability decision.55+56+After republishing that workaround as artifact sequence 3, the live worker activated with scope57+`https://n.zip/2c6d/`, installed the revisioned cache, controlled the next load, and rendered the58+hydrated persistent-driver UI after a forced offline reload. The only offline console failure was59+nzip's Cloudflare browser-analytics request; no application resource or hydration failed.60+61+This approval validates the M1 capability gate; it is not a claim that the physical matrix above62+ran. The full checklist remains required for M3 production PWA hardening. The shared nzip origin is63+also accepted only for OPFS/PWA feasibility, not as passkey or identity-isolation evidence.@@ -0,0 +1,25 @@
1+import { fileURLToPath } from "node:url";2+import { defineConfig } from "vite";3+4+const compat = fileURLToPath(5+ new URL(6+ "../../../node_modules/.deno/preact@10.29.7/node_modules/preact/compat/dist/compat.module.js",7+ import.meta.url,8+ ),9+);10+const jsxRuntime = fileURLToPath(11+ new URL(12+ "../../../node_modules/.deno/preact@10.29.7/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js",13+ import.meta.url,14+ ),15+);16+17+export default defineConfig({18+ resolve: {19+ alias: [20+ { find: "react/jsx-runtime", replacement: jsxRuntime },21+ { find: "react-dom", replacement: compat },22+ { find: "react", replacement: compat },23+ ],24+ },25+});@@ -0,0 +1,96 @@
1+# Preact integration evidence — 2026-07-152+3+Issue: [#5](https://github.com/FelineStateMachine/lofi/issues/5)\4+Baseline commit: `0843833`\5+Machine: macOS 26.5.1, Deno 2.9.0, Headless Chrome 150.0.0.0\6+Pins: Jazz 2.0.0-alpha.53, Preact 10.29.7, Astro 7.0.97+8+## Decision rule9+10+Correct loading, updates, local durability waits, teardown, errors, recreation, two roots, and five11+HMR edits are hard gates for a Preact integration candidate. The exact vanilla lane is the vendor12+API control established in #7, not a component-adapter candidate. A compatibility strategy may use13+documented aliases, but it may not add a lofi-owned implementation of React semantics. When multiple14+candidates pass, fewer author-facing concepts and less owned maintenance win; bundle contribution is15+the tie-breaker.16+17+## Results18+19+| Strategy | Correctness | Reachable production JS | Framework-specific burden | Result |20+| ------------------------------------- | ------------------------------------ | ----------------------------: | ------------------------------------------ | ------------ |21+| Exact vanilla Jazz control | Core query/write/persistence control | 213,080 B raw / 57,823 B gzip | One imperative DOM view | API baseline |22+| `preact/compat` + Jazz React bindings | Fail at build | Not meaningful | Would require a React 19 semantic polyfill | Reject |23+| Thin Preact adapter over vanilla Jazz | Pass candidate gates | 228,829 B raw / 64,806 B gzip | 524 runtime LOC plus 242 test LOC | Graduate |24+25+The thin Astro/Preact page has 15,749 B raw / 6,983 B gzip more reachable JavaScript than the26+single-view vanilla API control. This is an indicative floor, not a same-UI bundle claim. Both load27+the same 9,799,438 B Jazz WASM payload (3,078,164 B with local gzip). Browser resource timing,28+rather than every emitted file, defines “reachable”; the Astro/Jazz build emits additional29+server/client copies that the page does not request. The compat candidate has no valid production30+contribution because it cannot build without changing the semantic contract.31+32+## Compatibility control33+34+Reproduce the rejected lane:35+36+```sh37+deno run -A npm:vite@8.0.1 build spikes/preact-integration/compat-control \38+ --config spikes/preact-integration/compat-control/vite.config.ts39+```40+41+Vite transforms 332 modules and then stops because `jazz-tools/dist/react-core/use-all.js`42+statically imports React 19's `use`, which `preact@10.29.7/compat` does not export. The exact Jazz43+package declares optional peer `react >=19`; Preact compat identifies as React 18.3.1. A homemade44+`use` implementation would own more unstable semantics than the thin adapter and would invalidate45+the comparison.46+47+## Thin-adapter gates48+49+`deno test apps/prototype/src/runtime` retains deterministic coverage for:50+51+- loading to ready and reactive delivery to two consumers;52+- one underlying Jazz query shared by both roots;53+- idempotent unmount and final vendor unsubscribe;54+- insert/update waits at the public local durability tier;55+- rejected local writes and public mutation errors reaching UI state.56+- concurrent recreation coalescing and idempotent database shutdown;57+- HMR disposal before deferred database creation never attaching an obsolete adapter;58+- rejected component-boundary mutations being handled after runtime state projection.59+60+Production-browser results:61+62+- a north-island write appeared in both roots and reported `local` only after `WriteHandle.wait`;63+- reload retained the note;64+- explicit database recreation retained the note and settled at one active client, two consumers,65+ and one vendor subscription;66+- the final five-edit rerun after lifecycle hardening measured 318, 131, 130, 126, and 29 ms (130 ms67+ median, 318 ms slowest);68+- after every edit, retained data remained visible and steady cardinality stayed 1 / 2 / 1;69+- no browser `error` or `unhandledrejection` event was observed on the live write, recreation, or70+ HMR paths.71+72+The rejected-local-write path is retained deterministically at the store and UI promise boundary;73+the exact browser database does not expose a supported fault-injection hook, so this evidence does74+not claim a browser-injected storage failure.75+76+Total subscription and unsubscribe counters increase together across HMR because adapter code is77+replaced. The database client is deliberately preserved; preserving the adapter itself would leave78+edited adapter code stale.79+80+The final rerun measured from filesystem modification time to the browser-observed replacement DOM81+attribute. It followed the same five-edit protocol after adding generation cancellation, serialized82+client recreation, and mutation-listener diagnostics; the retained row and 1 / 2 / 1 / 1 steady83+state were checked after every edit.84+85+## Honest limitation86+87+The public `Db.subscribeAll()` callback has no asynchronous error channel. The adapter surfaces88+synchronous query setup failures, rejected local/global write waits, and `db.onMutationError()`. It89+does not claim that every deferred subscription-start failure can reach UI state. This is a Jazz API90+gap, not a hidden success state.91+92+## Contract delta93+94+DX-HMR-01 changes from “one subscription per consumer” to “one underlying vendor subscription per95+shared query, with consumer count reported separately.” This is stricter about resource ownership96+and matches the proven two-island topology.@@ -0,0 +1,52 @@
1+import { extname, join, normalize } from "node:path";2+3+const root = "apps/prototype/dist";4+const portFlag = Deno.args.findIndex((arg) => arg === "--port");5+const port = portFlag >= 0 ? Number(Deno.args[portFlag + 1]) : 4321;6+if (!Number.isInteger(port) || port < 1 || port > 65_535) {7+ console.error("error: --port must be an integer from 1 to 65535");8+ Deno.exit(2);9+}10+11+const contentTypes: Record<string, string> = {12+ ".css": "text/css; charset=utf-8",13+ ".html": "text/html; charset=utf-8",14+ ".js": "text/javascript; charset=utf-8",15+ ".json": "application/json; charset=utf-8",16+ ".svg": "image/svg+xml",17+ ".wasm": "application/wasm",18+ ".webmanifest": "application/manifest+json",19+};20+21+async function buildIdentity(): Promise<string> {22+ try {23+ const value = JSON.parse(await Deno.readTextFile(`${root}/lofi-build.json`));24+ return typeof value.revision === "string" ? value.revision : "unknown";25+ } catch {26+ console.error("error: production build is missing or stale; run `deno task build` first");27+ Deno.exit(1);28+ }29+}30+31+const revision = await buildIdentity();32+console.log(`lofi preview: http://127.0.0.1:${port}/ (build ${revision})`);33+34+Deno.serve({ hostname: "127.0.0.1", port }, async (request) => {35+ const url = new URL(request.url);36+ let pathname = decodeURIComponent(url.pathname);37+ if (pathname.endsWith("/")) pathname += "index.html";38+ const relative = normalize(pathname).replace(/^[/\\]+/, "");39+ if (relative.startsWith("..")) return new Response("Not found", { status: 404 });40+ const path = join(root, relative);41+ try {42+ const body = await Deno.readFile(path);43+ return new Response(request.method === "HEAD" ? null : body, {44+ headers: {45+ "content-type": contentTypes[extname(path)] ?? "application/octet-stream",46+ },47+ });48+ } catch (error) {49+ if (error instanceof Deno.errors.NotFound) return new Response("Not found", { status: 404 });50+ throw error;51+ }52+});@@ -0,0 +1,176 @@
1+import { environmentNames, validateEnvironment } from "./env_contract.ts";2+import { loadEnvironment } from "./load_env.ts";3+4+const INTERNAL_ENV = "apps/prototype/.env";5+const LOCAL_APP_ID = "00000000-0000-0000-0000-00000000f153";6+7+async function ensureStableLocalAppId() {8+ let content = "";9+ try {10+ content = await Deno.readTextFile(INTERNAL_ENV);11+ } catch (error) {12+ if (!(error instanceof Deno.errors.NotFound)) throw error;13+ }14+ if (/^VITE_JAZZ_APP_ID=/m.test(content)) return;15+ const separator = content.length > 0 && !content.endsWith("\n") ? "\n" : "";16+ await Deno.writeTextFile(17+ INTERNAL_ENV,18+ `${content}${separator}VITE_JAZZ_APP_ID=${LOCAL_APP_ID}\n`,19+ );20+}21+22+async function forward(stream: ReadableStream<Uint8Array>, target: WritableStream<Uint8Array>) {23+ await stream.pipeTo(target, { preventClose: true });24+}25+26+async function run(args: string[], env: Record<string, string>): Promise<number> {27+ const child = new Deno.Command(Deno.execPath(), {28+ args,29+ env,30+ stdin: "inherit",31+ stdout: "piped",32+ stderr: "piped",33+ }).spawn();34+ const forwardSignal = (signal: Deno.Signal) => {35+ try {36+ child.kill(signal);37+ } catch (error) {38+ if (!(error instanceof Deno.errors.NotFound)) throw error;39+ }40+ };41+ const onInterrupt = () => forwardSignal("SIGINT");42+ const onTerminate = () => forwardSignal("SIGTERM");43+ Deno.addSignalListener("SIGINT", onInterrupt);44+ Deno.addSignalListener("SIGTERM", onTerminate);45+ const output = forward(child.stdout, Deno.stdout.writable);46+ const errors = forward(child.stderr, Deno.stderr.writable);47+ try {48+ const [status] = await Promise.all([child.status, output, errors]);49+ return status.code;50+ } finally {51+ Deno.removeSignalListener("SIGINT", onInterrupt);52+ Deno.removeSignalListener("SIGTERM", onTerminate);53+ }54+}55+56+async function routeCount(): Promise<number> {57+ let count = 0;58+ async function visit(path: string) {59+ for await (const entry of Deno.readDir(path)) {60+ const child = `${path}/${entry.name}`;61+ if (entry.isDirectory) await visit(child);62+ else if (entry.isFile && entry.name.endsWith(".html")) count += 1;63+ }64+ }65+ try {66+ await visit("apps/prototype/dist");67+ } catch (error) {68+ if (!(error instanceof Deno.errors.NotFound)) throw error;69+ }70+ return count;71+}72+73+async function buildFiles(root: string): Promise<string[]> {74+ const files: string[] = [];75+ async function visit(path: string) {76+ for await (const entry of Deno.readDir(path)) {77+ const child = `${path}/${entry.name}`;78+ if (entry.isDirectory) await visit(child);79+ else if (entry.isFile) files.push(`./${child.slice(root.length + 1)}`);80+ }81+ }82+ await visit(root);83+ return files.sort();84+}85+86+const command = Deno.args[0];87+if (command !== "dev" && command !== "build") {88+ console.error("usage: run_prototype.ts <dev|build>");89+ Deno.exit(2);90+}91+92+const environment = await loadEnvironment();93+const validation = validateEnvironment(environment);94+if (!validation.ok) {95+ console.error("lofi environment mode: invalid");96+ for (const error of validation.errors) console.error(`error: ${error}`);97+ Deno.exit(1);98+}99+for (const warning of validation.warnings) console.warn(`warning: ${warning}`);100+await ensureStableLocalAppId();101+102+const validatedEnvironment = Object.fromEntries(103+ environmentNames104+ .map((name) => [name, environment[name]?.trim() ?? ""] as const)105+ .filter(([, value]) => value.length > 0),106+);107+const childEnvironment = { ...validatedEnvironment };108+if (command === "dev") childEnvironment.ASTRO_DEV_BACKGROUND = "1";109+if (command === "build") {110+ childEnvironment.LOFI_SKIP_JAZZ_MANAGED = "1";111+ childEnvironment.JAZZ_ADMIN_SECRET = "";112+ childEnvironment.BACKEND_SECRET = "";113+}114+115+const forwardedArgs = Deno.args.slice(1).filter((argument, index) => {116+ return !(index === 0 && argument === "--");117+});118+119+if (command === "dev") {120+ console.log("lofi dev");121+ console.log("Storage: persistent/OPFS requested; browser diagnosis in UI");122+ console.log("Identity: device-local key; passkey backup blocked by alpha security review");123+ console.log(124+ `Sync: ${125+ validation.mode === "cloud-configured" ? "managed configured" : "local development server"126+ }`,127+ );128+ console.log("PWA: development service worker disabled");129+}130+131+const exitCode = await run(132+ [133+ "run",134+ "-A",135+ "npm:astro@7.0.9",136+ command,137+ "--root",138+ "apps/prototype",139+ ...forwardedArgs,140+ ],141+ childEnvironment,142+);143+if (exitCode !== 0) Deno.exit(exitCode);144+145+if (command === "build") {146+ const revision = new TextDecoder().decode(147+ (await new Deno.Command("git", {148+ args: ["rev-parse", "--short", "HEAD"],149+ stdout: "piped",150+ }).output()).stdout,151+ ).trim();152+ await Deno.writeTextFile(153+ "apps/prototype/dist/lofi-build.json",154+ `${JSON.stringify({ revision, builtAt: new Date().toISOString() })}\n`,155+ );156+ const serviceWorkerPath = "apps/prototype/dist/sw.js";157+ const serviceWorker = await Deno.readTextFile(serviceWorkerPath);158+ await Deno.writeTextFile(159+ serviceWorkerPath,160+ serviceWorker.replace("__LOFI_BUILD_REVISION__", revision),161+ );162+ const precache = (await buildFiles("apps/prototype/dist"))163+ .filter((path) => path !== "./lofi-precache.json")164+ .map((path) => path === "./index.html" ? "./" : path);165+ precache.push("./lofi-precache.json");166+ await Deno.writeTextFile(167+ "apps/prototype/dist/lofi-precache.json",168+ `${JSON.stringify(precache.sort())}\n`,169+ );170+ const scanCode = await run(171+ ["task", "check:secrets"],172+ validatedEnvironment,173+ );174+ if (scanCode !== 0) Deno.exit(scanCode);175+ console.log(`lofi build: apps/prototype/dist (${await routeCount()} routes, ${revision})`);176+}