- commit
- 00c7f18ccc0817a1a8b629fce2777461644fd831
- parent
- 3f91b41b48e7b74ff731b855208d71124b6b5de1
- author
- Dami <dami.etoile@gmail.com>
@@ -1,5 +1,5 @@
1-# Client-visible Jazz configuration. The M1 baseline spike will confirm the2-# exact public/private classification and generated-project names.1+# lofi's client-visible Jazz configuration. The runtime maps this complete pair2+# to framework-prefixed vendor names internally; product UI never reads it.33 JAZZ_APP_ID=44 JAZZ_SERVER_URL=55 @@ -1,9 +1,22 @@
11 {2+ "imports": {3+ "jazz-tools": "npm:jazz-tools@2.0.0-alpha.53",4+ "jazz-tools/dev/vite": "npm:jazz-tools@2.0.0-alpha.53/dev/vite",5+ "vite": "npm:vite@8.0.1"6+ },7+ "nodeModulesDir": "auto",8+ "compilerOptions": {9+ "lib": ["deno.ns", "dom", "dom.iterable", "esnext"]10+ },211 "tasks": {312 "check:env": "deno run --allow-env=JAZZ_APP_ID,JAZZ_SERVER_URL,JAZZ_ADMIN_SECRET,BACKEND_SECRET --allow-read=.env tools/check_env.ts",413 "check:secrets": "deno run --allow-env=JAZZ_ADMIN_SECRET,BACKEND_SECRET --allow-read --allow-run=git tools/check_secret_leaks.ts",5- "check": "deno fmt --check && deno lint && deno check tools/*.ts && deno task test && deno task check:env && deno task check:secrets",6- "test": "deno test --allow-read --allow-write=. --allow-run=git tools"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",16+ "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",17+ "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",18+ "spike:jazz2:build": "deno run -A npm:vite@8.0.1 build spikes/jazz2-baseline --config spikes/jazz2-baseline/vite.config.ts",19+ "spike:jazz2:preview": "deno run -A npm:vite@8.0.1 preview spikes/jazz2-baseline --config spikes/jazz2-baseline/vite.config.ts --host 127.0.0.1"720 },821 "fmt": {922 "lineWidth": 100,@@ -0,0 +1,723 @@
1+{2+ "version": "5",3+ "specifiers": {4+ "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"6+ },7+ "npm": {8+ "@babel/runtime@7.29.7": {9+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="10+ },11+ "@emnapi/core@1.11.2": {12+ "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==",13+ "dependencies": [14+ "@emnapi/wasi-threads",15+ "tslib"16+ ]17+ },18+ "@emnapi/runtime@1.11.2": {19+ "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==",20+ "dependencies": [21+ "tslib"22+ ]23+ },24+ "@emnapi/wasi-threads@1.2.2": {25+ "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==",26+ "dependencies": [27+ "tslib"28+ ]29+ },30+ "@esbuild/aix-ppc64@0.27.7": {31+ "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",32+ "os": ["aix"],33+ "cpu": ["ppc64"]34+ },35+ "@esbuild/android-arm64@0.27.7": {36+ "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",37+ "os": ["android"],38+ "cpu": ["arm64"]39+ },40+ "@esbuild/android-arm@0.27.7": {41+ "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",42+ "os": ["android"],43+ "cpu": ["arm"]44+ },45+ "@esbuild/android-x64@0.27.7": {46+ "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",47+ "os": ["android"],48+ "cpu": ["x64"]49+ },50+ "@esbuild/darwin-arm64@0.27.7": {51+ "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",52+ "os": ["darwin"],53+ "cpu": ["arm64"]54+ },55+ "@esbuild/darwin-x64@0.27.7": {56+ "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",57+ "os": ["darwin"],58+ "cpu": ["x64"]59+ },60+ "@esbuild/freebsd-arm64@0.27.7": {61+ "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",62+ "os": ["freebsd"],63+ "cpu": ["arm64"]64+ },65+ "@esbuild/freebsd-x64@0.27.7": {66+ "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",67+ "os": ["freebsd"],68+ "cpu": ["x64"]69+ },70+ "@esbuild/linux-arm64@0.27.7": {71+ "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",72+ "os": ["linux"],73+ "cpu": ["arm64"]74+ },75+ "@esbuild/linux-arm@0.27.7": {76+ "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",77+ "os": ["linux"],78+ "cpu": ["arm"]79+ },80+ "@esbuild/linux-ia32@0.27.7": {81+ "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",82+ "os": ["linux"],83+ "cpu": ["ia32"]84+ },85+ "@esbuild/linux-loong64@0.27.7": {86+ "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",87+ "os": ["linux"],88+ "cpu": ["loong64"]89+ },90+ "@esbuild/linux-mips64el@0.27.7": {91+ "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",92+ "os": ["linux"],93+ "cpu": ["mips64el"]94+ },95+ "@esbuild/linux-ppc64@0.27.7": {96+ "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",97+ "os": ["linux"],98+ "cpu": ["ppc64"]99+ },100+ "@esbuild/linux-riscv64@0.27.7": {101+ "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",102+ "os": ["linux"],103+ "cpu": ["riscv64"]104+ },105+ "@esbuild/linux-s390x@0.27.7": {106+ "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",107+ "os": ["linux"],108+ "cpu": ["s390x"]109+ },110+ "@esbuild/linux-x64@0.27.7": {111+ "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",112+ "os": ["linux"],113+ "cpu": ["x64"]114+ },115+ "@esbuild/netbsd-arm64@0.27.7": {116+ "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",117+ "os": ["netbsd"],118+ "cpu": ["arm64"]119+ },120+ "@esbuild/netbsd-x64@0.27.7": {121+ "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",122+ "os": ["netbsd"],123+ "cpu": ["x64"]124+ },125+ "@esbuild/openbsd-arm64@0.27.7": {126+ "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",127+ "os": ["openbsd"],128+ "cpu": ["arm64"]129+ },130+ "@esbuild/openbsd-x64@0.27.7": {131+ "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",132+ "os": ["openbsd"],133+ "cpu": ["x64"]134+ },135+ "@esbuild/openharmony-arm64@0.27.7": {136+ "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",137+ "os": ["openharmony"],138+ "cpu": ["arm64"]139+ },140+ "@esbuild/sunos-x64@0.27.7": {141+ "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",142+ "os": ["sunos"],143+ "cpu": ["x64"]144+ },145+ "@esbuild/win32-arm64@0.27.7": {146+ "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",147+ "os": ["win32"],148+ "cpu": ["arm64"]149+ },150+ "@esbuild/win32-ia32@0.27.7": {151+ "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",152+ "os": ["win32"],153+ "cpu": ["ia32"]154+ },155+ "@esbuild/win32-x64@0.27.7": {156+ "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",157+ "os": ["win32"],158+ "cpu": ["x64"]159+ },160+ "@garden-co/jazz-napi-darwin-arm64@2.0.0-alpha.53": {161+ "integrity": "sha512-CqDtWl9+coVdCvMfhA5vQR8ZiqCztLj0QLG9NKg96nqZ/ZTB7Pt4JPT4ipfUf3COtzzkPY5MU6lv5zk92Kdp4Q==",162+ "os": ["darwin"],163+ "cpu": ["arm64"]164+ },165+ "@garden-co/jazz-napi-darwin-x64@2.0.0-alpha.53": {166+ "integrity": "sha512-WpFZq5nBOAuL8chWTSzqqcYfcjki57ngmgN0+TrFHbARNtX+BFl5HepIsHceJaDxV6iid9XWu0lGzBMZ+5osYw==",167+ "os": ["darwin"],168+ "cpu": ["x64"]169+ },170+ "@garden-co/jazz-napi-linux-x64-gnu@2.0.0-alpha.53": {171+ "integrity": "sha512-4hnSynKd5nOhwoV3W4KfQ5BRcqLaiBghDZQJG5187QdUOBvoOssJaBdO8cvvEAKPW4/c1jShwk1WSO1aCI8rtQ==",172+ "os": ["linux"],173+ "cpu": ["x64"]174+ },175+ "@garden-co/jazz-napi-win32-x64-msvc@2.0.0-alpha.53": {176+ "integrity": "sha512-TNPa9uHA29eq3q5LgaBP61D5ukLaSjcFGxcsMSMuFff5spXTMSFyo9YSeBe9DaLVQgdtmzjLgptOnZIVRXK0lw==",177+ "os": ["win32"],178+ "cpu": ["x64"]179+ },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=="190+ },191+ "@opentelemetry/api-logs@0.216.0": {192+ "integrity": "sha512-KmGTgvxTJ0J01d4mOeX1wMV5NUTNf9HebIuOOGDfIn0a/IrnXIQbOnlylDyl9tkDv4h0DUpdI/GqCdLzfTkUXg==",193+ "dependencies": [194+ "@opentelemetry/api"195+ ]196+ },197+ "@opentelemetry/api@1.9.1": {198+ "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="199+ },200+ "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1": {201+ "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==",202+ "dependencies": [203+ "@opentelemetry/api",204+ "@opentelemetry/semantic-conventions"205+ ]206+ },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+ },214+ "@opentelemetry/exporter-logs-otlp-http@0.216.0_@opentelemetry+api@1.9.1": {215+ "integrity": "sha512-8SUzQY/aExKkz6Ab3vOf6gu690Xk4wHH90dGwXinejQzazn5HCIRR7yPVU/2fEuiZ73R92MU4qI3djHfYP7NJg==",216+ "dependencies": [217+ "@opentelemetry/api",218+ "@opentelemetry/api-logs",219+ "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",220+ "@opentelemetry/otlp-exporter-base",221+ "@opentelemetry/otlp-transformer",222+ "@opentelemetry/sdk-logs"223+ ]224+ },225+ "@opentelemetry/exporter-trace-otlp-http@0.216.0_@opentelemetry+api@1.9.1": {226+ "integrity": "sha512-DhWjvj0PUPFwFnhOEivpum8sJzj6FTuyx88zff+oHVLUhfd6cLyw4AIai/F4j0PZqYZBFuMT/OTMUd9wdXnBEQ==",227+ "dependencies": [228+ "@opentelemetry/api",229+ "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",230+ "@opentelemetry/otlp-exporter-base",231+ "@opentelemetry/otlp-transformer",232+ "@opentelemetry/resources@2.7.1_@opentelemetry+api@1.9.1",233+ "@opentelemetry/sdk-trace-base"234+ ]235+ },236+ "@opentelemetry/otlp-exporter-base@0.216.0_@opentelemetry+api@1.9.1": {237+ "integrity": "sha512-sSnvb5f+FYa4mfYxj03rmmUh+aDwo3jok62dgIWUDw8ZCUPzEbgtv/YhZyKUSlKNNey7Uc5xmJgmtTLLIV6UDQ==",238+ "dependencies": [239+ "@opentelemetry/api",240+ "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",241+ "@opentelemetry/otlp-transformer"242+ ]243+ },244+ "@opentelemetry/otlp-transformer@0.216.0_@opentelemetry+api@1.9.1": {245+ "integrity": "sha512-g4Rb6sAsxQAo11eDjixfKxelruBsQFdJ8Wo23FCj7D6OXbidgXMu2xaRSYs4RdlomzAXSJuc86RcS3xmE8A6uA==",246+ "dependencies": [247+ "@opentelemetry/api",248+ "@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",251+ "@opentelemetry/sdk-logs",252+ "@opentelemetry/sdk-metrics",253+ "@opentelemetry/sdk-trace-base",254+ "protobufjs"255+ ]256+ },257+ "@opentelemetry/resources@2.7.1_@opentelemetry+api@1.9.1": {258+ "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==",259+ "dependencies": [260+ "@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",270+ "@opentelemetry/semantic-conventions"271+ ]272+ },273+ "@opentelemetry/sdk-logs@0.216.0_@opentelemetry+api@1.9.1": {274+ "integrity": "sha512-KB3rcwQuitq0JbbsCcNdqMhRJX3kArAYz/ovb0jGRaBQAIrt2roik3xQXuhYxS37zx0jSkUZcJu1z3Y2UCxbDA==",275+ "dependencies": [276+ "@opentelemetry/api",277+ "@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",280+ "@opentelemetry/semantic-conventions"281+ ]282+ },283+ "@opentelemetry/sdk-metrics@2.7.1_@opentelemetry+api@1.9.1": {284+ "integrity": "sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==",285+ "dependencies": [286+ "@opentelemetry/api",287+ "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",288+ "@opentelemetry/resources@2.7.1_@opentelemetry+api@1.9.1"289+ ]290+ },291+ "@opentelemetry/sdk-trace-base@2.7.1_@opentelemetry+api@1.9.1": {292+ "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==",293+ "dependencies": [294+ "@opentelemetry/api",295+ "@opentelemetry/core@2.7.1_@opentelemetry+api@1.9.1",296+ "@opentelemetry/resources@2.7.1_@opentelemetry+api@1.9.1",297+ "@opentelemetry/semantic-conventions"298+ ]299+ },300+ "@opentelemetry/semantic-conventions@1.43.0": {301+ "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg=="302+ },303+ "@oxc-project/types@0.120.0": {304+ "integrity": "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg=="305+ },306+ "@protobufjs/aspromise@1.1.2": {307+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="308+ },309+ "@protobufjs/base64@1.1.2": {310+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="311+ },312+ "@protobufjs/codegen@2.0.5": {313+ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="314+ },315+ "@protobufjs/eventemitter@1.1.1": {316+ "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg=="317+ },318+ "@protobufjs/fetch@1.1.1": {319+ "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==",320+ "dependencies": [321+ "@protobufjs/aspromise"322+ ]323+ },324+ "@protobufjs/float@1.0.2": {325+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="326+ },327+ "@protobufjs/inquire@1.1.2": {328+ "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw=="329+ },330+ "@protobufjs/path@1.1.2": {331+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="332+ },333+ "@protobufjs/pool@1.1.0": {334+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="335+ },336+ "@protobufjs/utf8@1.1.2": {337+ "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug=="338+ },339+ "@rolldown/binding-android-arm64@1.0.0-rc.10": {340+ "integrity": "sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg==",341+ "os": ["android"],342+ "cpu": ["arm64"]343+ },344+ "@rolldown/binding-darwin-arm64@1.0.0-rc.10": {345+ "integrity": "sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==",346+ "os": ["darwin"],347+ "cpu": ["arm64"]348+ },349+ "@rolldown/binding-darwin-x64@1.0.0-rc.10": {350+ "integrity": "sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==",351+ "os": ["darwin"],352+ "cpu": ["x64"]353+ },354+ "@rolldown/binding-freebsd-x64@1.0.0-rc.10": {355+ "integrity": "sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==",356+ "os": ["freebsd"],357+ "cpu": ["x64"]358+ },359+ "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10": {360+ "integrity": "sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==",361+ "os": ["linux"],362+ "cpu": ["arm"]363+ },364+ "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10": {365+ "integrity": "sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==",366+ "os": ["linux"],367+ "cpu": ["arm64"]368+ },369+ "@rolldown/binding-linux-arm64-musl@1.0.0-rc.10": {370+ "integrity": "sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==",371+ "os": ["linux"],372+ "cpu": ["arm64"]373+ },374+ "@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10": {375+ "integrity": "sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==",376+ "os": ["linux"],377+ "cpu": ["ppc64"]378+ },379+ "@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10": {380+ "integrity": "sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==",381+ "os": ["linux"],382+ "cpu": ["s390x"]383+ },384+ "@rolldown/binding-linux-x64-gnu@1.0.0-rc.10": {385+ "integrity": "sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==",386+ "os": ["linux"],387+ "cpu": ["x64"]388+ },389+ "@rolldown/binding-linux-x64-musl@1.0.0-rc.10": {390+ "integrity": "sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==",391+ "os": ["linux"],392+ "cpu": ["x64"]393+ },394+ "@rolldown/binding-openharmony-arm64@1.0.0-rc.10": {395+ "integrity": "sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==",396+ "os": ["openharmony"],397+ "cpu": ["arm64"]398+ },399+ "@rolldown/binding-wasm32-wasi@1.0.0-rc.10_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2": {400+ "integrity": "sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==",401+ "dependencies": [402+ "@napi-rs/wasm-runtime"403+ ],404+ "cpu": ["wasm32"]405+ },406+ "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10": {407+ "integrity": "sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==",408+ "os": ["win32"],409+ "cpu": ["arm64"]410+ },411+ "@rolldown/binding-win32-x64-msvc@1.0.0-rc.10": {412+ "integrity": "sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==",413+ "os": ["win32"],414+ "cpu": ["x64"]415+ },416+ "@rolldown/pluginutils@1.0.0-rc.10": {417+ "integrity": "sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg=="418+ },419+ "@scure/base@2.2.0": {420+ "integrity": "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="421+ },422+ "@scure/bip39@2.2.0": {423+ "integrity": "sha512-T/Bj/YvYMNkIPq6EENO6/rcs2e7qTNuyoUXf0KBFDmp0ZDu0H2X4Lq6yC3i0c8PcWkov5EbW+yQZZbdMmk154A==",424+ "dependencies": [425+ "@noble/hashes",426+ "@scure/base"427+ ]428+ },429+ "@standard-schema/spec@1.1.0": {430+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="431+ },432+ "@tybys/wasm-util@0.10.3": {433+ "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",434+ "dependencies": [435+ "tslib"436+ ]437+ },438+ "@types/node@25.6.0": {439+ "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==",440+ "dependencies": [441+ "undici-types"442+ ]443+ },444+ "detect-libc@2.1.2": {445+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="446+ },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": true479+ },480+ "fdir@6.5.0_picomatch@4.0.4": {481+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",482+ "dependencies": [483+ "picomatch"484+ ],485+ "optionalPeers": [486+ "picomatch"487+ ]488+ },489+ "fsevents@2.3.3": {490+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",491+ "os": ["darwin"],492+ "scripts": true493+ },494+ "jazz-napi@2.0.0-alpha.53": {495+ "integrity": "sha512-5+EEUoahaNA2d0IqvYDlmrx9bjhLjpvkbt5Nab+C09EeKGnJcz7JJbofC0xuJDe++9I7/8cnYps7YcAYjdK3Ug==",496+ "optionalDependencies": [497+ "@garden-co/jazz-napi-darwin-arm64",498+ "@garden-co/jazz-napi-darwin-x64",499+ "@garden-co/jazz-napi-linux-x64-gnu",500+ "@garden-co/jazz-napi-win32-x64-msvc"501+ ]502+ },503+ "jazz-tools@2.0.0-alpha.53": {504+ "integrity": "sha512-GSAt9axXPaZY3g0bZxEPeAmq/q4IWfJRdVMWmNYxLnaKzFHD3vYQf1y4VK9/ZAGCdabcxS8Im3dreISRHXkHSg==",505+ "dependencies": [506+ "@opentelemetry/api",507+ "@opentelemetry/exporter-logs-otlp-http",508+ "@opentelemetry/exporter-trace-otlp-http",509+ "@opentelemetry/resources@2.9.0_@opentelemetry+api@1.9.1",510+ "@opentelemetry/sdk-logs",511+ "@opentelemetry/sdk-trace-base",512+ "@scure/bip39",513+ "@standard-schema/spec",514+ "esbuild",515+ "jazz-wasm",516+ "jose",517+ "json-schema-to-ts",518+ "pluralize-esm",519+ "web-streams-polyfill"520+ ],521+ "optionalDependencies": [522+ "jazz-napi"523+ ],524+ "bin": true525+ },526+ "jazz-wasm@2.0.0-alpha.53": {527+ "integrity": "sha512-0Aqnldh3pPvH582g4H2TtbycoFujBpnMpL4dcS0uhMRsBzr8ycIIi3GCWMP43Gn2DG5X5cutqpGqNKMzZbY6BQ=="528+ },529+ "jose@6.2.3": {530+ "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw=="531+ },532+ "json-schema-to-ts@3.1.1": {533+ "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==",534+ "dependencies": [535+ "@babel/runtime",536+ "ts-algebra"537+ ]538+ },539+ "lightningcss-android-arm64@1.32.0": {540+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",541+ "os": ["android"],542+ "cpu": ["arm64"]543+ },544+ "lightningcss-darwin-arm64@1.32.0": {545+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",546+ "os": ["darwin"],547+ "cpu": ["arm64"]548+ },549+ "lightningcss-darwin-x64@1.32.0": {550+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",551+ "os": ["darwin"],552+ "cpu": ["x64"]553+ },554+ "lightningcss-freebsd-x64@1.32.0": {555+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",556+ "os": ["freebsd"],557+ "cpu": ["x64"]558+ },559+ "lightningcss-linux-arm-gnueabihf@1.32.0": {560+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",561+ "os": ["linux"],562+ "cpu": ["arm"]563+ },564+ "lightningcss-linux-arm64-gnu@1.32.0": {565+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",566+ "os": ["linux"],567+ "cpu": ["arm64"]568+ },569+ "lightningcss-linux-arm64-musl@1.32.0": {570+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",571+ "os": ["linux"],572+ "cpu": ["arm64"]573+ },574+ "lightningcss-linux-x64-gnu@1.32.0": {575+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",576+ "os": ["linux"],577+ "cpu": ["x64"]578+ },579+ "lightningcss-linux-x64-musl@1.32.0": {580+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",581+ "os": ["linux"],582+ "cpu": ["x64"]583+ },584+ "lightningcss-win32-arm64-msvc@1.32.0": {585+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",586+ "os": ["win32"],587+ "cpu": ["arm64"]588+ },589+ "lightningcss-win32-x64-msvc@1.32.0": {590+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",591+ "os": ["win32"],592+ "cpu": ["x64"]593+ },594+ "lightningcss@1.32.0": {595+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",596+ "dependencies": [597+ "detect-libc"598+ ],599+ "optionalDependencies": [600+ "lightningcss-android-arm64",601+ "lightningcss-darwin-arm64",602+ "lightningcss-darwin-x64",603+ "lightningcss-freebsd-x64",604+ "lightningcss-linux-arm-gnueabihf",605+ "lightningcss-linux-arm64-gnu",606+ "lightningcss-linux-arm64-musl",607+ "lightningcss-linux-x64-gnu",608+ "lightningcss-linux-x64-musl",609+ "lightningcss-win32-arm64-msvc",610+ "lightningcss-win32-x64-msvc"611+ ]612+ },613+ "long@5.3.2": {614+ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="615+ },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=="622+ },623+ "picomatch@4.0.4": {624+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="625+ },626+ "pluralize-esm@9.0.5": {627+ "integrity": "sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA=="628+ },629+ "postcss@8.5.10": {630+ "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==",631+ "dependencies": [632+ "nanoid",633+ "picocolors",634+ "source-map-js"635+ ]636+ },637+ "protobufjs@8.0.1": {638+ "integrity": "sha512-NWWCCscLjs+cOKF/s/XVNFRW7Yih0fdH+9brffR5NZCy8k42yRdl5KlWKMVXuI1vfCoy4o1z80XR/W/QUb3V3w==",639+ "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": true654+ },655+ "rolldown@1.0.0-rc.10_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2": {656+ "integrity": "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==",657+ "dependencies": [658+ "@oxc-project/types",659+ "@rolldown/pluginutils"660+ ],661+ "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"677+ ],678+ "bin": true679+ },680+ "source-map-js@1.2.1": {681+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="682+ },683+ "tinyglobby@0.2.16": {684+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",685+ "dependencies": [686+ "fdir",687+ "picomatch"688+ ]689+ },690+ "ts-algebra@2.0.0": {691+ "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw=="692+ },693+ "tslib@2.8.1": {694+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="695+ },696+ "undici-types@7.19.2": {697+ "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="698+ },699+ "vite@8.0.1_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2": {700+ "integrity": "sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw==",701+ "dependencies": [702+ "lightningcss",703+ "picomatch",704+ "postcss",705+ "rolldown",706+ "tinyglobby"707+ ],708+ "optionalDependencies": [709+ "fsevents"710+ ],711+ "bin": true712+ },713+ "web-streams-polyfill@4.3.0": {714+ "integrity": "sha512-/Gnggvj9oSrEvJbDyyPtAnxBt5fGQM2iWOKQNu7ie1OxDgK40iZpyV3TKaRiEzVj1oA1UxKnEy9XPXh6PW3eVw=="715+ }716+ },717+ "workspace": {718+ "dependencies": [719+ "npm:jazz-tools@2.0.0-alpha.53",720+ "npm:vite@8.0.1"721+ ]722+ }723+}@@ -0,0 +1,63 @@
1+# 0001: Graduate the Jazz 2.0.0-alpha.53 data path with lofi-owned edges2+3+Status: accepted for M1 integration\4+Date: 2026-07-15\5+Issue: #7\6+Evidence:7+[`spikes/jazz2-baseline/evidence/2026-07-15.md`](../../spikes/jazz2-baseline/evidence/2026-07-15.md)8+9+## Decision10+11+Use the relational Jazz 2 API from the exact `jazz-tools@2.0.0-alpha.53` npm pin for the M112+prototype:13+14+- declare the schema with `schema.table` and `schema.defineApp`;15+- create one browser `Db` with the persistent driver and a namespaced `BrowserAuthSecretStore`16+ identity;17+- render reactive state from `Db.subscribeAll`;18+- treat a write as locally retained only after `wait({ tier: "local" })`;19+- treat a cloud write as confirmed only after `wait({ tier: "global" })`; and20+- keep raw Jazz setup, worker configuration, and transport details behind lofi's runtime module.21+22+Keep `JAZZ_APP_ID` and `JAZZ_SERVER_URL` as lofi's public configuration names. The Deno/Vite edge23+maps the complete validated pair to Jazz's internal `VITE_JAZZ_*` names. `JAZZ_ADMIN_SECRET` and24+`BACKEND_SECRET` remain server-only and unprefixed.25+26+## Contract deltas27+28+- Revise `DX-OBS-01`: configuration proves only that sync is configured. This pin has no public live29+ connection-state or pending-operation-count API. lofi may report per-write local/global30+ confirmation and explicitly unavailable detail, but not fabricate “connected”.31+- Retain the persistent driver as the default for `DX-DUR-01`; unsupported browser capabilities fail32+ boot rather than silently selecting memory.33+- Validate the desktop/browser portion of `DX-LOCAL-01` and the vendor portion of `DX-SYNC-01`.34+ Integrated Astro/Preact ownership remains for #5/#6.35+- Confirm the lofi-owned environment names for `DX-ENV-01`; the final Astro build still has to pass36+ server-secret scanning.37+38+## Why39+40+The exact package passed local writes, subscription updates, reload retention, offline writes,41+multi-tab propagation, managed-cloud global durability, and a clean second-client download. Its42+relational API matches lofi's intended author model without inventing a second schema language.43+44+The package is alpha and its framework integration assumes a conventional npm layout. Keeping the45+edge lofi-owned lets the product absorb the required Deno/Vite filesystem allowance, first-run env46+pre-seeding, singleton lifecycle, and secret-safe command output without leaking those mechanics47+into product UI.48+49+## Rejected alternatives50+51+- **Use Jazz Classic 0.20 APIs from `init.md`:** those CoValue APIs do not describe this package.52+- **Wrap Jazz in a provider-neutral data abstraction now:** M1 has no second provider and would53+ merely create an untested shadow API.54+- **Report connection state from configuration:** a configured URL is not transport evidence.55+- **Fall back to memory automatically:** this violates retained-write and failure-honesty promises.56+- **Track the generated Vite-prefixed `.env`:** it makes vendor implementation names part of the57+ public contract and does not solve secret-safe cloud configuration.58+59+## Sources60+61+- [Exact npm package](https://www.npmjs.com/package/jazz-tools/v/2.0.0-alpha.53)62+- [Jazz source snapshot inspected for context](https://github.com/garden-co/jazz/tree/3384730e1c4509524b38c52fc9102fc6753411aa)63+- [Official TypeScript local-first starter at that snapshot](https://github.com/garden-co/jazz/tree/3384730e1c4509524b38c52fc9102fc6753411aa/starters/ts-localfirst)@@ -85,28 +85,28 @@ remains the only required global runtime for a generated application.
8585 8686 ## Measurable promises8787 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 | proposed |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. | Every state maps to documented vendor API or named lofi instrumentation. | #7 | yes | proposed |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 |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 |110110 111111 ## Canonical command surface and output contract112112 @@ -131,7 +131,7 @@ lofi dev
131131 Local: http://localhost:4321132132 Storage: OPFS durable133133 Identity: local-first; passkey backup not configured134-Sync: connected; durability detail unavailable134+Sync: configured; last write confirmed global; live connection detail unavailable135135 PWA: development service worker disabled136136 ```137137 @@ -190,13 +190,14 @@ change removes an author-facing concept.
190190 191191 ## Environment contract192192 193-The four current names are **spike inputs**, not graduated API. #7 must confirm, rename, or remove194-them before DX-ENV-01 can validate.193+The four names are lofi's configuration API. #7 confirmed that the complete public pair can be194+mapped at the Deno/Vite edge without projecting the server-only pair. The vendor's195+`VITE_JAZZ_APP_ID` and `VITE_JAZZ_SERVER_URL` names remain internal implementation details.195196 196197 | Name | Provisional classification | Contract |197198 | ------------------- | -------------------------- | ----------------------------------------------------------------------------- |198-| `JAZZ_APP_ID` | client-visible identifier | May enter client config only after validation. |199-| `JAZZ_SERVER_URL` | client-visible endpoint | May enter the named adapter; raw product-UI use is forbidden. |199+| `JAZZ_APP_ID` | client-visible identifier | Enters client config only as part of a validated complete public pair. |200+| `JAZZ_SERVER_URL` | client-visible endpoint | Enters the named adapter; raw product-UI use is forbidden. |200201 | `JAZZ_ADMIN_SECRET` | server-only secret | Never projected, logged, generated with a value, or built into client assets. |201202 | `BACKEND_SECRET` | server-only secret | Never projected, logged, generated with a value, or built into client assets. |202203 @@ -231,10 +232,10 @@ generator gets its own fixture inspection.
231232 232233 ## M1 acceptance checklist233234 234-- [ ] Optional `.env` and process precedence select the expected mode without printing values.235+- [x] Optional `.env` and process precedence select the expected mode without printing values.235236 - [ ] Exact Jazz alpha, Deno, Astro, Preact, browser, OS, and device versions are retained.236-- [ ] Vendor control proves local write, subscription, reload retention, and optional cloud sync.237-- [ ] Observability inventory maps each promised diagnostic to evidence or removes it.237+- [x] Vendor control proves local write, subscription, reload retention, and optional cloud sync.238+- [x] Observability inventory maps each promised diagnostic to evidence or removes it.238239 - [ ] Preact decision passes mount/update/unmount/recreate and five-cycle HMR checks.239240 - [ ] Two Astro islands share exactly one client and update each other.240241 - [ ] `deno task dev`, `check`, `test`, `build`, and `preview` work from the checkout.Binary file.
Binary file.
@@ -0,0 +1,27 @@
1+# Jazz 2 exact-version control2+3+This spike is intentionally a thin vendor control for GitHub issue #7. It pins4+`jazz-tools@2.0.0-alpha.53` at every import, asks for the persistent browser driver, and uses the5+vendor Vite plugin/local server without a lofi data abstraction.6+7+```sh8+deno task spike:jazz2:dev9+deno task spike:jazz2:cloud10+deno task spike:jazz2:build11+deno task spike:jazz2:preview12+```13+14+The UI distinguishes a requested OPFS driver from a locally confirmed write. It calls15+`WriteResult.wait({ tier: "local" })` before claiming local durability. “Sync configured” does not16+mean “connected”: this package pin has public disconnect/reconnect methods but no public live17+connection-state or pending-operation count signal.18+19+The development plugin starts a local Jazz server, injects `VITE_JAZZ_APP_ID` and20+`VITE_JAZZ_SERVER_URL`, and writes the generated app ID to this directory's ignored `.env`. The lofi21+task runner pre-seeds a stable local app ID in that internal file so Jazz does not trigger a22+mid-start Vite restart on the clean first run. The plugin's interactive TTY banner can print its23+generated admin secret, so the graduated lofi command must not expose that banner unchanged.24+25+The separate `cloud` task loads the ignored root `.env`, validates the public pair, and maps only26+`JAZZ_APP_ID` and `JAZZ_SERVER_URL` into Vite's client-visible namespace. Server credentials remain27+unprefixed for the plugin's schema publication and are covered by the repository leak scan.@@ -0,0 +1,167 @@
1+# Jazz 2.0.0-alpha.53 baseline evidence2+3+Date: 2026-07-15\4+Repository commit under test: uncommitted issue #7 spike on `3f91b41`\5+Host: macOS 26.5.1 (25F80), Apple silicon\6+Runtime: Deno 2.9.0, V8 14.9.207.2, TypeScript 6.0.3\7+Browser: Playwright Headless Chrome 150.0.0.0\8+Package: `jazz-tools@2.0.0-alpha.53`\9+Tarball SHA-1: `d8e6f902498c13234da9cf02e530880bab183c4e`\10+Tarball integrity:11+`sha512-GSAt9axXPaZY3g0bZxEPeAmq/q4IWfJRdVMWmNYxLnaKzFHD3vYQf1y4VK9/ZAGCdabcxS8Im3dreISRHXkHSg==`12+13+The npm tarball and `deno.lock` agree on version and integrity. The package does not publish a14+`gitHead`. Jazz's `main` branch at `3384730e1c4509524b38c52fc9102fc6753411aa` was inspected only for15+context and is not represented as the source commit for this package.16+17+## Repeatable commands18+19+```sh20+deno check spikes/jazz2-baseline/*.ts spikes/jazz2-baseline/src/*.ts21+deno task spike:jazz2:build22+deno task spike:jazz2:dev23+deno task spike:jazz2:cloud24+deno task check:secrets25+```26+27+Browser procedure (using `playwright-cli`; equivalent DevTools actions are acceptable):28+29+1. Start `deno task spike:jazz2:dev --port 4177 --strictPort`, open the printed URL, and snapshot.30+2. Add `retained-alpha53-control`; wait until the UI says `confirmed local`; reload and verify the31+ row remains.32+3. Get the row ID from `li[data-note-id]` and call33+ `globalThis.__LOFI_JAZZ2_PROBE__.update(id, "after-update")`; verify the subscribed list and34+ durability state change, then reload again.35+4. Open a second tab at the same origin, add `multitab-follower-write`, and verify it appears in36+ both tabs.37+5. Set the browser context offline, add `offline-local-write`, wait for local confirmation, restore38+ the network, and verify both tabs converge without reloading.39+6. Start `deno task spike:jazz2:cloud --port 4178 --strictPort`, add `cloud-global-alpha53`, and40+ wait until the UI says `global write confirmed`.41+7. Save browser storage state to ignored `.playwright-cli/cloud-identity-state.json`, load it in a42+ fresh browser context, open the cloud URL, and verify the cloud row downloads. The state file43+ contains the bearer identity and must never be committed or printed.44+45+The cloud task publishes the spike schema to the configured Jazz application. It projected only the46+public app ID and server URL to the client. The test retained one note in that application; no47+credential value is recorded here.48+49+## Results50+51+| Control | Result | Evidence |52+| ------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------- |53+| Deno type-check | pass | Exact npm pin resolved through `deno.json` and `deno.lock`. |54+| Deno production build | pass | Vite transformed 371 modules without a user-facing Node command. |55+| Persistent-driver boot | pass after compatibility fix | Chrome reported OPFS, SharedWorker, MessageChannel, and Web Locks; Jazz opened its persistent driver. |56+| Immediate local write | pass | Subscription rendered the row before network confirmation. |57+| Query and update | pass | `subscribeAll` returned the row; `Db.update` changed it, reached local durability, and survived reload. |58+| Local durability | pass | `WriteResult.wait({ tier: "local" })` resolved. |59+| Reload retention | pass | The row remained after a full page reload. |60+| Offline write | pass | Browser network state was offline; a row rendered and reached local durability. |61+| Multi-tab | pass | A second tab wrote through the follower path and both tabs received two rows. |62+| Managed-cloud durability | pass | `WriteResult.wait({ tier: "global" })` resolved against the configured Jazz server. |63+| Clean second cloud client | pass | A second browser context with the same restored identity and no copied OPFS data received the cloud row. |64+| Server-secret build scan | pass | 57 files, including 27 nested build artifacts, scanned against both available server secrets. |65+| Physical devices | not tested here | Owned by #4 and #8. |66+67+Screenshots:68+69+- [`output/playwright/jazz2-alpha53-local-offline-multitab.png`](../../../output/playwright/jazz2-alpha53-local-offline-multitab.png)70+- [`output/playwright/jazz2-alpha53-cloud-second-client.png`](../../../output/playwright/jazz2-alpha53-cloud-second-client.png)71+72+## Compatibility findings73+74+1. Deno's npm layout puts `jazz-wasm` under `node_modules/.deno`. Jazz resolves the WASM to an75+ absolute path, while Vite initially allows only the nested spike root. The browser received HTTP76+ 403 until the Vite configuration allowed the repository root. This fix is required for the nested77+ Astro prototype too.78+2. With the raw vendor command on a clean first local run, Jazz writes `VITE_JAZZ_APP_ID` into the79+ spike's ignored `.env`. Vite restarts while starting and Deno/Vite 8 failed with80+ `Listen method has been called more than81+ once without closing.` A rerun started in 102 ms. The82+ lofi task runner now pre-seeds a stable internal app ID; a clean wrapped first run started in 10383+ ms without a restart. The raw failure is retained because the integrated prototype must keep this84+ edge.85+3. A Vite configuration restart can change the generated local server URL while a persistent browser86+ broker is alive. Jazz then raised `IncompatibleBrowserBrokerConfigurationError` and required a87+ page reload. The prototype must keep the runtime singleton stable and make reload recovery88+ explicit.89+4. The plugin's TTY-only local server banner prints its generated admin secret. lofi cannot expose90+ that banner unchanged under DX-ENV-01.91+5. `BrowserAuthSecretStore` uses localStorage and documents a non-atomic check-then-write on the92+ first concurrent visit. First-run multi-tab identity creation needs lofi coordination or a93+ documented limitation.94+6. The browser console emitted Jazz WASM `CatalogueWriteDenied` warnings while both local and global95+ application-row waits succeeded. This is non-blocking for the baseline but must stay visible96+ during #5/#6; lofi must not suppress it without proving that it is harmless catalogue traffic.97+98+## Runtime topology and transport99+100+The exact tarball's persistent-browser path uses a SharedWorker broker to elect one leader tab. The101+leader owns the module worker that runs the persistent WASM/OPFS path; follower tabs attach through102+message ports. The upstream application-data transport is a Rust-owned WebSocket opened by the103+runtime. The package's `sync-transport.js` explicitly says the earlier HTTP/SSE path was removed.104+Schema publication by the development plugin remains an HTTP control-plane operation and is not the105+application-data sync transport.106+107+## Public API inventory108+109+| Area | Exact alpha.53 surface | M1 interpretation |110+| --------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |111+| Schema | `schema.table`, scalar/json/enum/ref/array columns, `defineSchema`, `defineApp` | Directly supported; keep the vendor schema in `schema.ts`. |112+| Query | typed `where`, `select`, `include`, `orderBy`, `limit`, `offset`, graph hops/gather; `Db.all`, `one`, `subscribeAll` | Directly supported; reactive binding must reconcile subscription deltas. |113+| Mutation | `insert`, `restore`, `upsert`, `update`, `delete`, batch, transaction, local/global `WriteHandle` waits | Directly supported; lofi adapts status/error presentation. |114+| Migration | typed `defineMigration`, add/drop/rename operations and tables; CLI create/push workflow | Supported but not exercised by this minimal schema; author workflow remains post-M1. |115+| Permissions | typed `definePermissions`, per-operation `always`/`never`/`where`, creator, relation, session and allowed-to conditions | Directly supported; the control scopes rows to the local-first identity. |116+| Identity | namespaced `BrowserAuthSecretStore`; local secret, JWT, cookie session; auth state/listener and local-first proof | Local-first identity directly supported; lofi owns first-run coordination and wording. |117+| Recovery phrase | `RecoveryPhrase.fromSecret` / `toSecret` with typed validation errors | Direct bearer-secret conversion; UX/security validation belongs to #8. |118+| Passkey backup | `BrowserPasskeyBackup.backup` / `restore`, explicit RP ID, typed errors | Direct backup/restore primitive, not conventional login; device validation belongs to #8. |119+| Persistence | persistent or memory driver, OPFS database name, local durability wait, storage deletion | Persistent path supported; capability/termination/device matrix belongs to #4. |120+| Sync control | server URL, per-write global wait, `disconnect` / `reconnect` | Core supported; connection-state claims remain unavailable. |121+122+## Desired lofi surface disposition123+124+| Desired lofi surface | Disposition | Basis |125+| ------------------------------------- | ------------------ | -------------------------------------------------------------------------- |126+| Application schema in `schema.ts` | directly supported | Jazz's typed relational schema is already concise. |127+| One runtime per browser realm | adapted | Cache one Jazz `Db` and own HMR disposal outside product UI. |128+| Reactive list/query binding | adapted | Wrap `subscribeAll` and reconcile deltas for framework identity stability. |129+| Local create/update/delete | directly supported | Synchronous mutations plus local durability waits. |130+| Retained/global write status | directly supported | `WriteHandle.wait` at `local` and `global` tiers. |131+| Storage capability and boot diagnosis | instrumented | Browser capability probes plus persistent-driver success/failure. |132+| Sync configured state | directly supported | Complete validated public configuration pair. |133+| Live sync connection state | unavailable | No public state/listener in this pin. |134+| Pending write count | unavailable | No public pending-operation API in this pin. |135+| Mutation rejection UX | adapted | `onMutationError` and rejected waits feed lofi diagnostics. |136+| Local-first recovery phrase | adapted | Direct primitive; lofi must provide bearer-secret warnings. |137+| Passkey backup/restore | adapted | Direct primitive; lofi must stabilize RP ID and device UX. |138+| PWA shell/update lifecycle | outside Jazz | Astro/service-worker layer owns application assets and updates. |139+140+## Observability inventory141+142+| Claim | Public alpha.53 evidence | Decision |143+| ---------------------------- | ----------------------------------------------- | ---------------------------------------------------------------------- |144+| Persistent storage requested | `DbConfig.driver: { type: "persistent" }` | Report requested mode and boot failure honestly. |145+| Local durability confirmed | `WriteHandle.wait({ tier: "local" })` | Report per-write confirmation. |146+| Cloud durability confirmed | `WriteHandle.wait({ tier: "global" })` | Report per-write confirmation. |147+| Sync configured | Presence of a validated server URL | Report `configured`, never infer `connected`. |148+| Manual offline control | Public `Db.disconnect()` / `Db.reconnect()` | Expose only for tests/diagnostics; follower restrictions require care. |149+| Auth state | `Db.getAuthState()` / `Db.onAuthChanged()` | Suitable for truthful identity wording. |150+| Mutation rejection | `Db.onMutationError()` and rejected write waits | Surface impact and action. |151+| Live transport connection | No public listener/state found | Do not claim connected/disconnected from configuration. |152+| Pending operation count | No public API found | State unavailable; do not estimate. |153+| Active subscriptions | Internal diagnostic API only | May guard development tests, not product UI. |154+155+## Bundle observation156+157+The control build emitted a 9,799.43 kB raw Jazz WASM asset (3,134.95 kB gzip). M1 does not set a158+bundle budget, but #4 must measure installed cold-start/offline behavior rather than assuming the159+asset is harmless.160+161+## Gate decision162+163+**Go** for the Preact and Astro/Deno integration spikes using this pin and the lofi-owned runtime164+edge. The edge already prevents the clean-first-run restart and preserves the Vite filesystem165+allowance. Do not graduate M1 until the integrated runtime owns singleton/HMR lifecycle and the166+public command avoids the vendor secret-printing banner. #4 and #8 remain independent gates for167+physical-device durability and recovery semantics.@@ -0,0 +1,15 @@
1+2+<html lang="en">3+ <head>4+ <meta charset="UTF-8" />5+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />6+ <meta name="theme-color" content="#11201b" />7+ <title>lofi Jazz 2 control</title>8+ </head>9+ <body>10+ <main id="app">11+ <p id="boot">Starting the exact-version Jazz 2 control…</p>12+ </main>13+ <script type="module" src="/src/main.ts"></script>14+ </body>15+</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,230 @@
1+import { BrowserAuthSecretStore, createDb, type Db, type DbConfig } from "jazz-tools";2+import { app } from "../schema.ts";3+import "./style.css";4+5+const BUILD_ONLY_APP_ID = "00000000-0000-0000-0000-00000000f153";6+const APP_ID = import.meta.env.VITE_JAZZ_APP_ID ?? BUILD_ONLY_APP_ID;7+const SERVER_URL = import.meta.env.VITE_JAZZ_SERVER_URL;8+9+type Note = {10+ id: string;11+ body: string;12+ createdAt: Date;13+};14+15+type Probe = {16+ appId: string;17+ serverConfigured: boolean;18+ storage: "opfs-requested";19+ identity: "local-first-secret";20+ ready: boolean;21+ activeSubscriptions: number;22+ lastDurability: "none" | "local" | "global" | "failed";23+};24+25+declare global {26+ interface Window {27+ __LOFI_JAZZ2_PROBE__?: {28+ snapshot(): Probe;29+ create(body: string): Promise<string>;30+ update(id: string, body: string): Promise<void>;31+ awaitGlobal(): Promise<boolean>;32+ disconnect(): Promise<void>;33+ reconnect(): Promise<void>;34+ shutdown(): Promise<void>;35+ };36+ }37+}38+39+function databaseConfig(secret: string): DbConfig {40+ return {41+ appId: APP_ID,42+ ...(SERVER_URL ? { serverUrl: SERVER_URL } : {}),43+ secret,44+ driver: { type: "persistent", dbName: `lofi-jazz2-alpha53-${APP_ID}` },45+ };46+}47+48+function capabilitySummary(): string {49+ const browserNavigator = navigator as Navigator & {50+ storage?: { getDirectory?: unknown };51+ locks?: { request?: unknown };52+ };53+ const browserGlobal = globalThis as typeof globalThis & { SharedWorker?: unknown };54+ const capabilities = {55+ opfs: typeof browserNavigator.storage?.getDirectory === "function",56+ sharedWorker: typeof browserGlobal.SharedWorker === "function",57+ messageChannel: typeof MessageChannel === "function",58+ webLocks: typeof browserNavigator.locks?.request === "function",59+ };60+ return Object.entries(capabilities)61+ .map(([name, available]) => `${name}=${available ? "yes" : "no"}`)62+ .join(", ");63+}64+65+function renderShell(root: HTMLElement) {66+ root.innerHTML = `67+ <header>68+ <p class="eyebrow">Exact vendor control</p>69+ <h1>Jazz 2.0.0-alpha.53</h1>70+ <p>This intentionally thin app measures the package without a lofi abstraction.</p>71+ </header>72+ <dl class="status">73+ <div><dt>Storage</dt><dd id="storage-state">persistent/OPFS requested</dd></div>74+ <div><dt>Identity</dt><dd>local-first secret</dd></div>75+ <div><dt>Sync</dt><dd id="sync-state">${76+ SERVER_URL ? "configured" : "not configured"77+ }</dd></div>78+ <div><dt>Capabilities</dt><dd id="capabilities"></dd></div>79+ <div><dt>Last write</dt><dd id="durability-state">none</dd></div>80+ </dl>81+ <form id="note-form">82+ <label for="note-body">Retained note</label>83+ <div class="composer">84+ <input id="note-body" name="body" autocomplete="off" required />85+ <button type="submit">Add locally</button>86+ </div>87+ </form>88+ <p id="message" role="status">Opening the durable database…</p>89+ <ul id="notes" aria-label="Retained notes"></ul>90+ `;91+ const capabilities = root.querySelector<HTMLElement>("#capabilities");92+ if (capabilities) capabilities.textContent = capabilitySummary();93+}94+95+function renderNotes(root: HTMLElement, notes: Note[]) {96+ const list = root.querySelector<HTMLUListElement>("#notes");97+ if (!list) return;98+ list.replaceChildren(99+ ...notes.map((note) => {100+ const item = document.createElement("li");101+ item.dataset.noteId = note.id;102+ item.textContent = note.body;103+ return item;104+ }),105+ );106+}107+108+function setText(root: HTMLElement, selector: string, text: string) {109+ const element = root.querySelector<HTMLElement>(selector);110+ if (element) element.textContent = text;111+}112+113+async function boot() {114+ const root = document.querySelector<HTMLElement>("#app");115+ if (!root) throw new Error("The #app mount point is missing.");116+ const mount = root;117+ renderShell(mount);118+119+ const secret = await BrowserAuthSecretStore.getOrCreateSecret({ appId: APP_ID });120+ let db: Db;121+ try {122+ db = await createDb(databaseConfig(secret));123+ setText(mount, "#storage-state", "persistent/OPFS driver opened");124+ } catch (error) {125+ setText(mount, "#storage-state", "unsupported");126+ setText(127+ mount,128+ "#message",129+ `Durable storage failed: ${error instanceof Error ? error.message : String(error)}`,130+ );131+ throw error;132+ }133+134+ let activeSubscriptions = 0;135+ let lastDurability: Probe["lastDurability"] = "none";136+ let lastGlobalConfirmation = Promise.resolve(false);137+ const unsubscribe = db.subscribeAll(app.notes, (delta) => {138+ renderNotes(mount, delta.all as Note[]);139+ setText(mount, "#message", `${delta.all.length} retained note(s)`);140+ });141+ activeSubscriptions += 1;142+143+ async function createNote(body: string): Promise<string> {144+ const write = db.insert(app.notes, { body, createdAt: new Date() });145+ lastDurability = "none";146+ setText(mount, "#durability-state", "local write visible; confirming OPFS…");147+ try {148+ const retained = await write.wait({ tier: "local" });149+ lastDurability = "local";150+ setText(mount, "#durability-state", "confirmed local");151+ if (SERVER_URL) {152+ lastGlobalConfirmation = write.wait({ tier: "global" }).then(153+ () => {154+ lastDurability = "global";155+ setText(mount, "#durability-state", "confirmed global");156+ setText(mount, "#sync-state", "global write confirmed");157+ return true;158+ },159+ (error) => {160+ setText(161+ mount,162+ "#sync-state",163+ `global confirmation failed: ${164+ error instanceof Error ? error.message : String(error)165+ }`,166+ );167+ return false;168+ },169+ );170+ }171+ return retained.id;172+ } catch (error) {173+ lastDurability = "failed";174+ setText(175+ mount,176+ "#durability-state",177+ `failed: ${error instanceof Error ? error.message : String(error)}`,178+ );179+ throw error;180+ }181+ }182+183+ async function updateNote(id: string, body: string): Promise<void> {184+ const write = db.update(app.notes, id, { body });185+ setText(mount, "#durability-state", "update visible; confirming OPFS…");186+ await write.wait({ tier: "local" });187+ lastDurability = "local";188+ setText(mount, "#durability-state", "update confirmed local");189+ }190+191+ const form = mount.querySelector<HTMLFormElement>("#note-form");192+ form?.addEventListener("submit", (event) => {193+ event.preventDefault();194+ const input = mount.querySelector<HTMLInputElement>("#note-body");195+ const body = input?.value.trim() ?? "";196+ if (!body) return;197+ if (input) input.value = "";198+ void createNote(body);199+ });200+201+ (globalThis as typeof globalThis & Window).__LOFI_JAZZ2_PROBE__ = {202+ snapshot: () => ({203+ appId: APP_ID,204+ serverConfigured: Boolean(SERVER_URL),205+ storage: "opfs-requested",206+ identity: "local-first-secret",207+ ready: true,208+ activeSubscriptions,209+ lastDurability,210+ }),211+ create: createNote,212+ update: updateNote,213+ awaitGlobal: () => lastGlobalConfirmation,214+ disconnect: async () => {215+ await db.disconnect();216+ setText(mount, "#sync-state", "manually disconnected");217+ },218+ reconnect: async () => {219+ await db.reconnect();220+ setText(mount, "#sync-state", "reconnected (transport signal unavailable)");221+ },222+ shutdown: async () => {223+ unsubscribe();224+ activeSubscriptions -= 1;225+ await db.shutdown();226+ },227+ };228+}229+230+void boot();@@ -0,0 +1,94 @@
1+:root {2+ color: #eaf3ee;3+ background: #11201b;4+ font-family: ui-sans-serif, system-ui, sans-serif;5+}6+7+body {8+ margin: 0;9+}10+11+main {12+ box-sizing: border-box;13+ margin: 0 auto;14+ max-width: 52rem;15+ min-height: 100vh;16+ padding: 4rem 1.5rem;17+}18+19+.eyebrow,20+dt {21+ color: #9fcbb6;22+ font-size: 0.75rem;23+ font-weight: 700;24+ letter-spacing: 0.08em;25+ text-transform: uppercase;26+}27+28+h1 {29+ font-size: clamp(2.25rem, 8vw, 5rem);30+ line-height: 0.95;31+ margin: 0.4rem 0 1rem;32+}33+34+.status {35+ display: grid;36+ gap: 1px;37+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));38+ margin: 2.5rem 0;39+ overflow: hidden;40+}41+42+.status div {43+ background: #1a3028;44+ padding: 1rem;45+}46+47+dd {48+ margin: 0.35rem 0 0;49+ overflow-wrap: anywhere;50+}51+52+label {53+ display: block;54+ font-weight: 700;55+ margin-bottom: 0.5rem;56+}57+58+.composer {59+ display: flex;60+ gap: 0.5rem;61+}62+63+input,64+button {65+ border: 1px solid #5c8974;66+ border-radius: 0.4rem;67+ font: inherit;68+ padding: 0.7rem 0.85rem;69+}70+71+input {72+ background: #edf5f0;73+ flex: 1;74+}75+76+button {77+ background: #8de2b9;78+ color: #11201b;79+ cursor: pointer;80+ font-weight: 800;81+}82+83+#notes {84+ display: grid;85+ gap: 0.5rem;86+ list-style: none;87+ padding: 0;88+}89+90+#notes li {91+ border-left: 3px solid #8de2b9;92+ background: #1a3028;93+ padding: 0.75rem 1rem;94+}@@ -0,0 +1,44 @@
1+import { fileURLToPath } from "node:url";2+import { jazzPlugin } from "jazz-tools/dev/vite";3+import { defineConfig } from "vite";4+5+const workspaceRoot = fileURLToPath(new URL("../../", import.meta.url));6+const cloudAppId = process.env.JAZZ_APP_ID?.trim();7+const cloudServerUrl = process.env.JAZZ_SERVER_URL?.trim();8+9+if (Boolean(cloudAppId) !== Boolean(cloudServerUrl)) {10+ throw new Error(11+ "Cloud mode requires both JAZZ_APP_ID and JAZZ_SERVER_URL; set the missing name or remove the partial pair.",12+ );13+}14+15+// Only the public pair is projected into Vite's client namespace. Jazz's16+// server credentials remain unprefixed for schema publication by the plugin.17+if (cloudAppId && cloudServerUrl) {18+ process.env.VITE_JAZZ_APP_ID = cloudAppId;19+ process.env.VITE_JAZZ_SERVER_URL = cloudServerUrl;20+}21+22+export default defineConfig({23+ plugins: [24+ jazzPlugin({25+ schemaDir: import.meta.dirname,26+ inspector: false,27+ server: {28+ allowLocalFirstAuth: true,29+ },30+ }),31+ ],32+ build: {33+ outDir: "dist",34+ emptyOutDir: true,35+ },36+ server: {37+ // Deno places npm packages under the workspace's hidden node_modules/.deno38+ // tree. Jazz resolves its WASM to that absolute path, so Vite must allow39+ // the workspace root rather than only this nested spike root.40+ fs: {41+ allow: [workspaceRoot],42+ },43+ },44+});@@ -0,0 +1,37 @@
1+const ignoredDirectoryNames = new Set([2+ ".git",3+ ".playwright-cli",4+ ".vite",5+ "node_modules",6+]);7+8+async function filesBelow(path: string): Promise<string[]> {9+ const files: string[] = [];10+ for await (const entry of Deno.readDir(path)) {11+ const child = `${path}/${entry.name}`;12+ if (entry.isDirectory) files.push(...await filesBelow(child));13+ else if (entry.isFile) files.push(child);14+ }15+ return files;16+}17+18+export async function collectBuildArtifactFiles(root = "."): Promise<string[]> {19+ const artifacts: string[] = [];20+21+ async function visit(path: string) {22+ for await (const entry of Deno.readDir(path)) {23+ if (!entry.isDirectory || ignoredDirectoryNames.has(entry.name)) continue;24+ const child = path === "." ? entry.name : `${path}/${entry.name}`;25+ if (entry.name === "dist") artifacts.push(...await filesBelow(child));26+ else await visit(child);27+ }28+ }29+30+ try {31+ await visit(root);32+ } catch (error) {33+ if (!(error instanceof Deno.errors.NotFound)) throw error;34+ }35+36+ return artifacts;37+}@@ -0,0 +1,21 @@
1+import { collectBuildArtifactFiles } from "./artifact_files.ts";2+3+function assertEquals<T>(actual: T, expected: T) {4+ if (actual !== expected) throw new Error(`expected ${expected}, received ${actual}`);5+}6+7+Deno.test("nested ignored dist artifacts remain visible to the secret scanner", async () => {8+ const root = await Deno.makeTempDir({ dir: ".", prefix: ".artifact-files-test-" });9+ try {10+ await Deno.mkdir(`${root}/apps/prototype/dist/assets`, { recursive: true });11+ await Deno.mkdir(`${root}/node_modules/vendor/dist`, { recursive: true });12+ await Deno.writeTextFile(`${root}/apps/prototype/dist/assets/client.js`, "built");13+ await Deno.writeTextFile(`${root}/node_modules/vendor/dist/vendor.js`, "ignored");14+15+ const artifacts = await collectBuildArtifactFiles(root);16+ assertEquals(artifacts.length, 1);17+ assertEquals(artifacts[0], `${root}/apps/prototype/dist/assets/client.js`);18+ } finally {19+ await Deno.remove(root, { recursive: true });20+ }21+});@@ -1,3 +1,4 @@
1+import { collectBuildArtifactFiles } from "./artifact_files.ts";12 import { serverEnvironmentNames } from "./env_contract.ts";23 import { loadNamedEnvironment } from "./load_env.ts";34 import { findSecretLeaks } from "./secret_scan.ts";@@ -11,26 +12,12 @@ async function sourceFiles(): Promise<string[]> {
1112 return new TextDecoder().decode(output.stdout).split("\0").filter(Boolean);1213 }1314 14-async function filesBelow(path: string): Promise<string[]> {15- try {16- const result: string[] = [];17- for await (const entry of Deno.readDir(path)) {18- const child = `${path}/${entry.name}`;19- if (entry.isDirectory) result.push(...await filesBelow(child));20- else if (entry.isFile) result.push(child);21- }22- return result;23- } catch (error) {24- if (error instanceof Deno.errors.NotFound) return [];25- throw error;26- }27-}28-2915 const environment = await loadNamedEnvironment(serverEnvironmentNames);3016 const secretValues = serverEnvironmentNames3117 .map((name) => ({ name, value: environment[name]?.trim() ?? "" }))3218 .filter(({ value }) => value.length > 0);33-const candidates = [...new Set([...await sourceFiles(), ...await filesBelow("dist")])];19+const buildArtifacts = await collectBuildArtifactFiles();20+const candidates = [...new Set([...await sourceFiles(), ...buildArtifacts])];3421 const files: Array<{ path: string; content: Uint8Array }> = [];3522 3623 for (const path of candidates) {@@ -49,5 +36,5 @@ if (leaks.length > 0) {
4936 }5037 5138 console.log(52- `secret leak check passed (${candidates.length} files, ${secretValues.length} available server secrets)`,39+ `secret leak check passed (${candidates.length} files including ${buildArtifacts.length} build artifacts, ${secretValues.length} available server secrets)`,5340 );@@ -0,0 +1,49 @@
1+const INTERNAL_ENV = "spikes/jazz2-baseline/.env";2+const LOCAL_APP_ID = "00000000-0000-0000-0000-00000000f153";3+4+async function ensureStableLocalAppId() {5+ let content = "";6+ try {7+ content = await Deno.readTextFile(INTERNAL_ENV);8+ } catch (error) {9+ if (!(error instanceof Deno.errors.NotFound)) throw error;10+ }11+12+ if (/^VITE_JAZZ_APP_ID=/m.test(content)) return;13+ const separator = content.length > 0 && !content.endsWith("\n") ? "\n" : "";14+ await Deno.writeTextFile(15+ INTERNAL_ENV,16+ `${content}${separator}VITE_JAZZ_APP_ID=${LOCAL_APP_ID}\n`,17+ );18+}19+20+const [mode, ...viteArgs] = Deno.args;21+if (mode !== "local" && mode !== "cloud") {22+ console.error("usage: run_jazz2_spike.ts <local|cloud> [vite options]");23+ Deno.exit(2);24+}25+26+await ensureStableLocalAppId();27+28+const args = [29+ "run",30+ ...(mode === "cloud" ? ["--env-file=.env"] : []),31+ "-A",32+ "npm:vite@8.0.1",33+ "spikes/jazz2-baseline",34+ "--config",35+ "spikes/jazz2-baseline/vite.config.ts",36+ "--host",37+ "127.0.0.1",38+ ...viteArgs,39+];40+41+const child = new Deno.Command(Deno.execPath(), {42+ args,43+ stdin: "inherit",44+ stdout: "inherit",45+ stderr: "inherit",46+}).spawn();47+48+const status = await child.status;49+Deno.exit(status.code);