From 07547ccf426b08fe9955c68492e335350d53bf13 Mon Sep 17 00:00:00 2001 From: Cameron Pfiffer Date: Sat, 11 Jul 2026 19:19:35 -0700 Subject: [PATCH] Make Charter a Jazz-native distributed runtime. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the process-local CoValue/JSON bootstrap with persistent Jazz 2 tables, and define the source, worker, permission, and Git boundaries needed for distributed coordination. 👾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta Code --- README.md | 22 +- package-lock.json | 4459 ++++++++------------------------- package.json | 4 +- spec/consumer-agents.md | 2 + spec/context-subscriptions.md | 218 ++ spec/data-model.md | 4 +- spec/experience.md | 44 +- spec/folder-contract.md | 44 +- spec/importer.md | 96 +- spec/index.md | 5 +- spec/jazz-git-boundary.md | 32 + spec/jazz-mapping.md | 75 +- spec/product-vision.md | 31 +- spec/runtime-architecture.md | 75 + spec/work-queue.md | 26 +- src/agent-harness.ts | 2 +- src/changes.ts | 2 +- src/cli.ts | 43 +- src/db/jazz.ts | 685 +++-- src/jazz/index.ts | 2 +- src/jazz/materialize.ts | 241 -- src/jazz/permissions.ts | 25 + src/jazz/schema.ts | 347 +-- src/server.ts | 4 +- src/status.ts | 257 ++ src/types.ts | 4 +- test/jazz-db.test.ts | 116 +- test/status.test.ts | 110 + 28 files changed, 2550 insertions(+), 4425 deletions(-) create mode 100644 spec/context-subscriptions.md create mode 100644 spec/jazz-git-boundary.md create mode 100644 spec/runtime-architecture.md delete mode 100644 src/jazz/materialize.ts create mode 100644 src/jazz/permissions.ts create mode 100644 src/status.ts create mode 100644 test/status.test.ts diff --git a/README.md b/README.md index 1032ff3..a44f6a2 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,12 @@ This repo's `spec/` directory is Charter's own local Markdown projection. The da - `spec/` - local filesystem projection of Charter's product spec. - `src/markdown.ts` - Markdown/frontmatter parser. - `src/spec-files.ts` - `spec/**/*.md` scanner and import-plan builder. -- `src/db/jazz.ts` - default Charter database adapter; mutates Jazz CoValues and saves a local projection mirror. +- `src/db/jazz.ts` - default Charter database adapter; persistent Jazz 2 tables with optional sync-server participation. - `src/db/json.ts` - local JSON projection adapter for tests/fallback (`CHARTER_DB_ADAPTER=json`). -- `src/jazz/schema.ts` - Jazz CoValue schema for the currently implemented database mapping. +- `src/jazz/schema.ts` - Jazz 2 schema for projects, sources, documents, work, workers, leases, packets, and runs. - `src/server.ts` - shared runtime/watch helpers plus optional local HTTP inspection API/status page. -- `src/cli.ts` - CLI with `watch`, `serve`, `start`, `frontend`, `scan`, `index`, `search`, `changes`, `events`, `work`, `agent`, `queue`, `report`, `requests`, and `sync` commands. +- `src/status.ts` - truthful project-state summary over projection drift, database durability, events, work, consumers, packets, and requests. +- `src/cli.ts` - CLI with `watch`, `status`, `serve`, `start`, `frontend`, `scan`, `index`, `search`, `changes`, `events`, `work`, `agent`, `queue`, `report`, `requests`, and `sync` commands. ## Target product @@ -42,6 +43,7 @@ A browser/editor UI is optional future surface. It is not the product center rig ```bash npm install npm run watch +npm run status npm run scan npm run index npm run search -- agent runtime @@ -53,7 +55,7 @@ npm run report -- --request --status done --message "Implemented an npm run requests npm run sync -- --dry-run npm run sync -npm run sync -- --jazz-values +npm run sync -- --jazz-runtime npm run check npm test ``` @@ -65,9 +67,11 @@ npm run build node dist/src/cli.js scan ``` -`npm run watch` starts the local runtime and emits structured JSONL logs while it ingests spec file changes. `npm run serve` is only an optional local HTTP inspection API/status page over the same state. `npm run sync` writes through the configured `CharterDatabase`. The CLI now defaults to `JazzCharterDatabase`: document rows, versions, project events, work items, registered consumers, and agent requests are mutated through Jazz CoValues. `.spec/state/spec-db.json` is a local projection mirror used for process bootstrap/debugging, not the active database adapter. `npm run sync -- --jazz-values` prints the active CoValue ids and writes `.spec/state/jazz-values.json` for inspection. `npm run index` writes `.spec/state/index.json` as a disposable local cache. `npm run work` lists durable work items derived from project events. `npm run agent` creates and optionally executes an agent request row from queued work items. `npm run report` is the agent-facing completion hook. `npm run requests` inspects request status, reports, exit codes, and captured output. Prompt files are only temporary runner compatibility exports when `{promptFile}` is used. +`npm run watch` starts the local controller and emits structured JSONL logs while it ingests selected files. `npm run serve` is an optional local inspection surface, not the distributed runtime boundary. `npm run sync` writes native Jazz 2 rows. `.spec/state/jazz.sqlite` is the durable local Jazz replica; `.spec/state/jazz-runtime.json` is an inspection receipt, not a bootstrap mirror. Set `JAZZ_SERVER_URL` plus backend identity configuration to join distributed sync. `npm run sync -- --jazz-runtime` prints the active Jazz row ids and durability mode. `npm run index` writes a disposable lexical cache. Work, consumer, packet, request, and report commands operate on the configured database rather than a controller-owned HTTP API. -State files are ignored by git because they are adapter/cache artifacts, not the canonical coordination object. +`npm run status` is the first answer to “what is happening?” It reports the configured database shape and its actual durability limit, filesystem/database drift, event count, queue state, registered consumers, packet/request state, recent activity, and structural warnings. Runtime-process presence is currently reported as unknown rather than inferred from a state file; Charter does not yet persist a watch-process heartbeat. + +Local replica, path-mapping, secret-reference, and cache files are ignored by Git. The Jazz project is shared coordination truth; each controller's replica and filesystem mapping remain machine-local. ## Project spec @@ -96,7 +100,7 @@ The current default loop is: 1. run `charter watch` or `npm run watch`. 2. edit spec documents in Zed, Obsidian, or another filesystem editor. 3. watch the runtime ingest changes and emit JSONL events. -4. inspect projection changes, events, queue state, registered consumers, requests, and packets with CLI commands. +4. run `charter status` to inspect projection drift, database durability, queue state, registered consumers, packets, requests, and recent activity. 5. create and run a consumer-scoped request packet with `charter agent next --exec ...` when a subordinate runner should execute. The manual CLI loop is still available: @@ -161,6 +165,6 @@ npm run requests -- --request ## Jazz status -The executable CLI path now uses `JazzCharterDatabase` by default. It upserts the same row shapes into `CharterProject.documents`, creates `SpecDocumentVersion` CoMaps, appends `ProjectEvent` entries into the `CharterProject.events` CoFeed, syncs mutable `WorkItem` CoMaps through `CharterProject.workItems`, and syncs `AgentRequest` CoMaps through `CharterProject.requests`. +The executable path uses Jazz 2 alpha and `jazz-napi` by default. Native rows persist across independent CLI processes; tests exercise shutdown, restart, and row-id continuity without `.spec/state/spec-db.json`. With no sync server, status honestly reports `native-jazz-local`. With `JAZZ_SERVER_URL`, app id, and backend identity configured, it uses edge durability and reports `native-jazz-synced`. -The remaining gap is cross-process Jazz durability: this adapter starts an in-process Jazz account and uses the JSON projection mirror to bootstrap the next CLI process. The next step is wiring a worker account/sync server/storage configuration so the same `CharterProject` CoValue graph loads durably across processes and devices without the projection mirror doing bootstrap duty. +Distributed identity provisioning and production project-role policies remain deployment work. The schema already represents project membership, sources, workers, capabilities, leases, packets, manifests, and runs so that work does not require another data-model reset. See `spec/runtime-architecture.md` and `spec/jazz-git-boundary.md` for the contract. diff --git a/package-lock.json b/package-lock.json index ba29e71..6ce2ab4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "dependencies": { "fast-glob": "^3.3.3", "gray-matter": "^4.0.3", - "jazz-tools": "^0.20.19" + "jazz-napi": "2.0.0-alpha.53", + "jazz-tools": "2.0.0-alpha.53" }, "bin": { "charter": "dist/src/cli.js" @@ -25,272 +26,11 @@ "node": ">=20" } }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/runtime": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, "engines": { "node": ">=6.9.0" } @@ -737,114 +477,72 @@ "node": ">=18" } }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@garden-co/jazz-napi-darwin-arm64": { + "version": "2.0.0-alpha.53", + "resolved": "https://registry.npmjs.org/@garden-co/jazz-napi-darwin-arm64/-/jazz-napi-darwin-arm64-2.0.0-alpha.53.tgz", + "integrity": "sha512-CqDtWl9+coVdCvMfhA5vQR8ZiqCztLj0QLG9NKg96nqZ/ZTB7Pt4JPT4ipfUf3COtzzkPY5MU6lv5zk92Kdp4Q==", + "cpu": [ + "arm64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "node_modules/@garden-co/jazz-napi-darwin-x64": { + "version": "2.0.0-alpha.53", + "resolved": "https://registry.npmjs.org/@garden-co/jazz-napi-darwin-x64/-/jazz-napi-darwin-x64-2.0.0-alpha.53.tgz", + "integrity": "sha512-WpFZq5nBOAuL8chWTSzqqcYfcjki57ngmgN0+TrFHbARNtX+BFl5HepIsHceJaDxV6iid9XWu0lGzBMZ+5osYw==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@garden-co/jazz-napi-linux-x64-gnu": { + "version": "2.0.0-alpha.53", + "resolved": "https://registry.npmjs.org/@garden-co/jazz-napi-linux-x64-gnu/-/jazz-napi-linux-x64-gnu-2.0.0-alpha.53.tgz", + "integrity": "sha512-4hnSynKd5nOhwoV3W4KfQ5BRcqLaiBghDZQJG5187QdUOBvoOssJaBdO8cvvEAKPW4/c1jShwk1WSO1aCI8rtQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.0.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "node_modules/@garden-co/jazz-napi-win32-x64-msvc": { + "version": "2.0.0-alpha.53", + "resolved": "https://registry.npmjs.org/@garden-co/jazz-napi-win32-x64-msvc/-/jazz-napi-win32-x64-msvc-2.0.0-alpha.53.tgz", + "integrity": "sha512-TNPa9uHA29eq3q5LgaBP61D5ukLaSjcFGxcsMSMuFff5spXTMSFyo9YSeBe9DaLVQgdtmzjLgptOnZIVRXK0lw==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, "license": "MIT" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", "license": "MIT", "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -894,172 +592,411 @@ "node": ">=8.0.0" } }, - "node_modules/@react-native/assets-registry": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.86.0.tgz", - "integrity": "sha512-nIaXbm2jX1OTYp0qbviJ3O6KZivoE8z3BnhUQ2LsqfZSWRoOK/n1qsiAr6oALiNKWnXY3j2KPwtYORnZzp8xew==", - "license": "MIT", - "peer": true, + "node_modules/@opentelemetry/api-logs": { + "version": "0.216.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.216.0.tgz", + "integrity": "sha512-KmGTgvxTJ0J01d4mOeX1wMV5NUTNf9HebIuOOGDfIn0a/IrnXIQbOnlylDyl9tkDv4h0DUpdI/GqCdLzfTkUXg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=8.0.0" } }, - "node_modules/@react-native/codegen": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.86.0.tgz", - "integrity": "sha512-uTs9DBo3+/lUqinsGZK0FKJRBVClrwMXoZToaDxE1Q2SL2e55vs2GwyZfIKzPl5uJnbu4PfFMIp0/mLXLWUMuA==", - "license": "MIT", - "peer": true, + "node_modules/@opentelemetry/core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", + "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "license": "Apache-2.0", "dependencies": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.29.0", - "hermes-parser": "0.36.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "tinyglobby": "^0.2.15", - "yargs": "^17.6.2" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@babel/core": "*" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.86.0.tgz", - "integrity": "sha512-Jv8p1ebEPfTzs8gmrjsdT2XMXFfeAg45Pman+XPLFGaSeGAZkutRFRyX9Cs9aGTSOyIA9YPJ6vDNb1ayTf1FKQ==", - "license": "MIT", - "peer": true, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.216.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.216.0.tgz", + "integrity": "sha512-8SUzQY/aExKkz6Ab3vOf6gu690Xk4wHH90dGwXinejQzazn5HCIRR7yPVU/2fEuiZ73R92MU4qI3djHfYP7NJg==", + "license": "Apache-2.0", "dependencies": { - "@react-native/dev-middleware": "0.86.0", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "metro": "^0.84.3", - "metro-config": "^0.84.3", - "metro-core": "^0.84.3", - "semver": "^7.1.3" + "@opentelemetry/api-logs": "0.216.0", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.216.0", + "@opentelemetry/otlp-transformer": "0.216.0", + "@opentelemetry/sdk-logs": "0.216.0" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@react-native-community/cli": "*", - "@react-native/metro-config": "0.86.0" - }, - "peerDependenciesMeta": { - "@react-native-community/cli": { - "optional": true - }, - "@react-native/metro-config": { - "optional": true - } + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.86.0.tgz", - "integrity": "sha512-7Mb3nDfyJeys+ELF75Ageu7VKERlnIMoO+aNPoXqTXvz+b41L6l2CqMyLpDHxkBSlenij6gEepPNgaIyWHbJZw==", - "license": "BSD-3-Clause", - "peer": true, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.216.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.216.0.tgz", + "integrity": "sha512-DhWjvj0PUPFwFnhOEivpum8sJzj6FTuyx88zff+oHVLUhfd6cLyw4AIai/F4j0PZqYZBFuMT/OTMUd9wdXnBEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.216.0", + "@opentelemetry/otlp-transformer": "0.216.0", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-trace-base": "2.7.1" + }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@react-native/debugger-shell": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.86.0.tgz", - "integrity": "sha512-Y0zEkZzLz8ou6o/VLml1A31X/rMgc6DRjwxwzPMa94qRTMY070WeBCNTITQo4kKTBAUgbxh07oXPQqp0Tpja8w==", - "license": "MIT", - "peer": true, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", "dependencies": { - "cross-spawn": "^7.0.6", - "debug": "^4.4.0", - "fb-dotslash": "0.5.8" + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@react-native/dev-middleware": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.86.0.tgz", - "integrity": "sha512-20pTO6yTybmvXvro520H6C7jydIQnLKOl5qFtVEcHSdFrY63r3OGei+Rx9bILgSRmH6jgnfEcijcMx7pwWuQtw==", - "license": "MIT", - "peer": true, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz", + "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==", + "license": "Apache-2.0", "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.86.0", - "@react-native/debugger-shell": "0.86.0", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.3.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^7.5.10" + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.86.0.tgz", - "integrity": "sha512-a1RcfaEDqWExCGfCwadIxt4l8FvKYgFqeMf2uzeKyAOnb+vTGNIeCvifFL2MqvgaeYxlER437HbMIajGcuJ1pQ==", - "license": "MIT", - "peer": true, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.216.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.216.0.tgz", + "integrity": "sha512-sSnvb5f+FYa4mfYxj03rmmUh+aDwo3jok62dgIWUDw8ZCUPzEbgtv/YhZyKUSlKNNey7Uc5xmJgmtTLLIV6UDQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-transformer": "0.216.0" + }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@react-native/js-polyfills": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.86.0.tgz", - "integrity": "sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==", - "license": "MIT", - "peer": true, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.216.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.216.0.tgz", + "integrity": "sha512-g4Rb6sAsxQAo11eDjixfKxelruBsQFdJ8Wo23FCj7D6OXbidgXMu2xaRSYs4RdlomzAXSJuc86RcS3xmE8A6uA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.216.0", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-logs": "0.216.0", + "@opentelemetry/sdk-metrics": "2.7.1", + "@opentelemetry/sdk-trace-base": "2.7.1", + "protobufjs": "8.0.1" + }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@react-native/normalize-colors": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.86.0.tgz", - "integrity": "sha512-kG0wfCGghUKlfxkJyyHCDVutWVYWK7/DG58ojA/4v9EfulgF+osuSQmlbNb3rcKX58qutm7JcldSeVLgGFha9g==", - "license": "MIT", - "peer": true + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.86.0.tgz", - "integrity": "sha512-4/ZLXdf/OSpPDVO0AsQ1SJdRIzt5t9BNQ46QwGgxvX7/cirYR5k8KXctNGGgW8lQo2gZChEfY2zFCZg9nM/jiw==", - "license": "MIT", - "peer": true, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz", + "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==", + "license": "Apache-2.0", "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@types/react": "^19.2.0", - "react": "*", - "react-native": "0.86.0" + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.9.0.tgz", + "integrity": "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.9.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.9.0.tgz", + "integrity": "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.216.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.216.0.tgz", + "integrity": "sha512-KB3rcwQuitq0JbbsCcNdqMhRJX3kArAYz/ovb0jGRaBQAIrt2roik3xQXuhYxS37zx0jSkUZcJu1z3Y2UCxbDA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.216.0", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.1.tgz", + "integrity": "sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.9.0.tgz", + "integrity": "sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.9.0", + "@opentelemetry/resources": "2.9.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.9.0.tgz", + "integrity": "sha512-cp9zmTl62R8PJrpvFcmc8N2JQU/xfa0S+61q511Nji+QxCfZ8Ifvg7H27G8cANe4crg4RTrWsVvanHiXjSp6ag==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.9.0", + "@opentelemetry/resources": "2.9.0", + "@opentelemetry/sdk-trace": "2.9.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.9.0.tgz", + "integrity": "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace/node_modules/@opentelemetry/core": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.9.0.tgz", + "integrity": "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", + "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", + "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", + "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", + "license": "BSD-3-Clause" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", "cpu": [ "arm" @@ -1149,9 +1086,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1166,9 +1100,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1183,9 +1114,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1200,9 +1128,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1217,9 +1142,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1234,9 +1156,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1251,9 +1170,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1268,9 +1184,6 @@ "ppc64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1285,9 +1198,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1302,9 +1212,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1319,9 +1226,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1336,9 +1240,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1353,9 +1254,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1447,80 +1345,32 @@ ] }, "node_modules/@scure/base": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.1.tgz", - "integrity": "sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.2.0.tgz", + "integrity": "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg==", "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", - "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-2.2.0.tgz", + "integrity": "sha512-T/Bj/YvYMNkIPq6EENO6/rcs2e7qTNuyoUXf0KBFDmp0ZDu0H2X4Lq6yC3i0c8PcWkov5EbW+yQZZbdMmk154A==", "license": "MIT", "dependencies": { - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" + "@noble/hashes": "2.2.0", + "@scure/base": "2.2.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@scure/bip39/node_modules/@scure/base": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", - "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", - "license": "MIT", - "peer": true - }, - "node_modules/@tiptap/core": { - "version": "3.27.3", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.27.3.tgz", - "integrity": "sha512-TJj5929M96C1KlH796wS8MywfHDh49RhmakOyzyMMc9pFmRj9UXi1gj0TCXgsZtjEOG7B+m/DRvNOvnuvR9kmg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/pm": "3.27.3" - } - }, - "node_modules/@tiptap/pm": { - "version": "3.27.3", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.27.3.tgz", - "integrity": "sha512-ppiG57RxM3HSHHgcHT0hP6Ib4P56Sd5itxdV4w0hIGHKPGyLLKiAkYp+htIHa9T7IvjMdaqxIlsfyV3ZKsS1sw==", - "license": "MIT", - "dependencies": { - "prosemirror-changeset": "^2.4.1", - "prosemirror-commands": "^1.7.1", - "prosemirror-dropcursor": "^1.8.2", - "prosemirror-gapcursor": "^1.4.1", - "prosemirror-history": "^1.5.0", - "prosemirror-inputrules": "^1.5.1", - "prosemirror-keymap": "^1.2.3", - "prosemirror-model": "^1.25.9", - "prosemirror-schema-list": "^1.5.1", - "prosemirror-state": "^1.4.4", - "prosemirror-tables": "^1.8.5", - "prosemirror-transform": "^1.12.0", - "prosemirror-view": "^1.41.9" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.9", @@ -1529,33 +1379,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, "node_modules/@types/node": { "version": "22.20.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", @@ -1565,23 +1388,6 @@ "undici-types": "~6.21.0" } }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT", - "peer": true - }, "node_modules/@vitest/expect": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", @@ -1695,774 +1501,108 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", - "peer": true, "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" + "sprintf-js": "~1.0.2" } }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "fill-range": "^7.1.1" }, "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=8" + "node": ">= 16" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "ms": "^2.1.3" }, "engines": { - "node": ">=8" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" + "engines": { + "node": ">=6" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT", - "peer": true - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.36.0.tgz", - "integrity": "sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-parser": "0.36.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.42", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", - "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz", - "integrity": "sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "baseline-browser-mapping": "^2.10.42", - "caniuse-lite": "^1.0.30001800", - "electron-to-chromium": "^1.5.387", - "node-releases": "^2.0.50", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT", - "peer": true - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001803", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", - "integrity": "sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0", - "peer": true - }, - "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/check-error": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", - "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chromium-edge-launcher": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.3.0.tgz", - "integrity": "sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "license": "MIT", - "peer": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cojson": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson/-/cojson-0.20.19.tgz", - "integrity": "sha512-dkHfws4iN+4hS+9uuAj5lLk++TLKfxt2AeHKYEz/dxSrkL+NGiaaWydXoqBcUNcbcaoYLAjv/hGaCZ12e6tKVg==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.8.0", - "@opentelemetry/api": "^1.9.0", - "@scure/base": "1.2.1", - "cojson-core-napi": "0.20.19", - "cojson-core-rn": "0.20.19", - "cojson-core-wasm": "0.20.19", - "unicode-segmenter": "^0.12.0" - } - }, - "node_modules/cojson-core-napi": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-core-napi/-/cojson-core-napi-0.20.19.tgz", - "integrity": "sha512-AsFRvg3fz/u5MIlXwtfI8J7KQuHS/JCs/UUygb+8nb9/xTuw81u3s2krXnJdUdYp2gMY3cqDY6q1olq72I57xg==", - "license": "MIT", - "engines": { - "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" - }, - "optionalDependencies": { - "cojson-core-napi-darwin-arm64": "0.20.19", - "cojson-core-napi-darwin-x64": "0.20.19", - "cojson-core-napi-linux-arm-gnueabihf": "0.20.19", - "cojson-core-napi-linux-arm64-gnu": "0.20.19", - "cojson-core-napi-linux-arm64-musl": "0.20.19", - "cojson-core-napi-linux-x64-gnu": "0.20.19", - "cojson-core-napi-linux-x64-musl": "0.20.19" - } - }, - "node_modules/cojson-core-napi-darwin-arm64": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-core-napi-darwin-arm64/-/cojson-core-napi-darwin-arm64-0.20.19.tgz", - "integrity": "sha512-QSJTiSvi2p2gKbhp9h/AtxOKaWLWFvrRkk2W1Ziz4NSMwXsg+hjvwrhEzAD6th2aZXVk/vUr9ClsycWF7zcksg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" - } - }, - "node_modules/cojson-core-napi-darwin-x64": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-core-napi-darwin-x64/-/cojson-core-napi-darwin-x64-0.20.19.tgz", - "integrity": "sha512-EDvIG3M37qeIUAarRlGOiMnTz1HAyVx/OD2zAw8UF19TOj2i+y2kmvxr5/4mNBOY2NMdo/V1JNMqj8c4jhvHDg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" - } - }, - "node_modules/cojson-core-napi-linux-arm-gnueabihf": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-core-napi-linux-arm-gnueabihf/-/cojson-core-napi-linux-arm-gnueabihf-0.20.19.tgz", - "integrity": "sha512-/VK49qjuX8gGzYCd0SbMNyomluutIaYRF++Edeys42hfGiof1s+3c1JW4sxxu7l24uP6bDXitUzmFtUHi5GgQg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" - } - }, - "node_modules/cojson-core-napi-linux-arm64-gnu": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-core-napi-linux-arm64-gnu/-/cojson-core-napi-linux-arm64-gnu-0.20.19.tgz", - "integrity": "sha512-pR1SMLn3FPExnNOHlOEuP+blNNoAxwmjGq4j5H8vkEGArgQjAdAMGs326eL10Y6R/IDhx5mQ9zdwv2KrzyO4hw==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" - } - }, - "node_modules/cojson-core-napi-linux-arm64-musl": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-core-napi-linux-arm64-musl/-/cojson-core-napi-linux-arm64-musl-0.20.19.tgz", - "integrity": "sha512-Dk0Are7wMMUiGY11SZfR0oVM+cFea3sL1+TuWmP99ofhlTJrdCCjX0KPl1Er1AxHGImIAeRnz5FkvMVAjZN42g==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" - } - }, - "node_modules/cojson-core-napi-linux-x64-gnu": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-core-napi-linux-x64-gnu/-/cojson-core-napi-linux-x64-gnu-0.20.19.tgz", - "integrity": "sha512-/m+ajnTQpCJGHZtcNE70WKPuBr42S29VhM4b0KbbKk6tC/Qvcd9wYzh8MHCftdt4Yjbnfz59r3n0IPNCmxxzdQ==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" - } - }, - "node_modules/cojson-core-napi-linux-x64-musl": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-core-napi-linux-x64-musl/-/cojson-core-napi-linux-x64-musl-0.20.19.tgz", - "integrity": "sha512-ZyVj+cCCpV1koiLzyPdX+QJROaBRMfcuPR5Juz75zatlGgctsv/UNCOnBD0pqz2qoFbAv7AjnpGS/Jer0dBqdw==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" - } - }, - "node_modules/cojson-core-rn": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-core-rn/-/cojson-core-rn-0.20.19.tgz", - "integrity": "sha512-gGYXoQrow/KVBrg9Ibd5uPwOiP+KQffGAE5f5Bcq+Pzm7skpObhqRW/+RNilJ1FwMhay3j6Ow1FrcDWc0NinUw==", - "license": "MIT", - "dependencies": { - "uniffi-bindgen-react-native": "0.29.3-1" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/cojson-core-wasm": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-core-wasm/-/cojson-core-wasm-0.20.19.tgz", - "integrity": "sha512-cegwFx6C/DNUf7piQ0K3ctuAutBzeuvVq7lx+sDkTNUry6XZBlbU0exsmKCe1HBDLH4zPvX13aqiOdX6wLTRFw==" - }, - "node_modules/cojson-storage-indexeddb": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-storage-indexeddb/-/cojson-storage-indexeddb-0.20.19.tgz", - "integrity": "sha512-Tyjq313EHLWup8IPUNH8pMslK8IlNpsJSALJvaLcjDtkltjrQBNCndGdMOKZnFrEpZPyAHgdbXki/eLxVYL/pA==", - "license": "MIT", - "dependencies": { - "cojson": "0.20.19" - } - }, - "node_modules/cojson-transport-ws": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/cojson-transport-ws/-/cojson-transport-ws-0.20.19.tgz", - "integrity": "sha512-4wKbgHLIpl3jKP+VEHmQu/Lab610AnQQ28QQ8oskaM4dr3bVZqxDPycRtLpBJY5vGNtQcYZAVt0rgR9WiiIS5A==", - "license": "MIT", - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "cojson": "0.20.19" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT", - "peer": true - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT", - "peer": true - }, - "node_modules/crelt": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", - "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==", - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "peer": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT", - "peer": true - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true - }, - "node_modules/electron-to-chromium": { - "version": "1.5.389", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", - "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==", - "license": "ISC", - "peer": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" }, "node_modules/esbuild": { "version": "0.28.1", @@ -2506,36 +1646,6 @@ "@esbuild/win32-x64": "0.28.1" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -2559,26 +1669,6 @@ "@types/estree": "^1.0.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/expect-type": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", @@ -2589,13 +1679,6 @@ "node": ">=12.0.0" } }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -2624,12 +1707,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-myers-diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fast-myers-diff/-/fast-myers-diff-3.2.0.tgz", - "integrity": "sha512-DxNm4a3gnV35AluvqjeAV3Zx3CAySs0tsaDjnex5JhnJAa2rxEUVCwmaL2gpz42ea1B+IJorlo7XLThXUaTQog==", - "license": "MIT" - }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -2639,29 +1716,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fb-dotslash": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", - "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "license": "(MIT OR Apache-2.0)", - "peer": true, - "bin": { - "dotslash": "bin/dotslash" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "bser": "2.1.1" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -2674,59 +1728,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true - }, - "node_modules/flow-enums-runtime": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", - "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "license": "MIT", - "peer": true - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2742,26 +1743,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "peer": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -2769,168 +1750,24 @@ "license": "ISC", "dependencies": { "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/goober": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.19.tgz", - "integrity": "sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==", - "license": "MIT", - "peerDependencies": { - "csstype": "^3.0.10" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC", - "peer": true - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "license": "MIT", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hermes-compiler": { - "version": "250829098.0.14", - "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.14.tgz", - "integrity": "sha512-5meXwsZxgiqFaJjNzwjzI9IyUkuGGBisu+z9BvQWmGVpjH6nz11hgqkyxe4dl8UAdyIV4lTbz91+Dlnjz0VxqA==", - "license": "MIT", - "peer": true - }, - "node_modules/hermes-estree": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.0.tgz", - "integrity": "sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==", - "license": "MIT", - "peer": true - }, - "node_modules/hermes-parser": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.0.tgz", - "integrity": "sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==", - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.36.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/image-size": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", - "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", - "license": "MIT", - "peer": true, - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC", - "peer": true - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.0.0" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", "license": "MIT", - "peer": true, - "bin": { - "is-docker": "cli.js" + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.0" } }, "node_modules/is-extendable": { @@ -2951,16 +1788,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2982,897 +1809,669 @@ "node": ">=0.12.0" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/jazz-napi": { + "version": "2.0.0-alpha.53", + "resolved": "https://registry.npmjs.org/jazz-napi/-/jazz-napi-2.0.0-alpha.53.tgz", + "integrity": "sha512-5+EEUoahaNA2d0IqvYDlmrx9bjhLjpvkbt5Nab+C09EeKGnJcz7JJbofC0xuJDe++9I7/8cnYps7YcAYjdK3Ug==", "license": "MIT", - "peer": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" + "optionalDependencies": { + "@garden-co/jazz-napi-darwin-arm64": "2.0.0-alpha.53", + "@garden-co/jazz-napi-darwin-x64": "2.0.0-alpha.53", + "@garden-co/jazz-napi-linux-x64-gnu": "2.0.0-alpha.53", + "@garden-co/jazz-napi-win32-x64-msvc": "2.0.0-alpha.53" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC", - "peer": true - }, "node_modules/jazz-tools": { - "version": "0.20.19", - "resolved": "https://registry.npmjs.org/jazz-tools/-/jazz-tools-0.20.19.tgz", - "integrity": "sha512-Bf3s9JQL7Xc9gUWPO3v5JO3JzUMUUYEHlxzKfcKGBDJ/ENHAYl8DxAZVOJcGyr+MqrE8cmwVmFqU8MtOsQ7+uw==", - "license": "MIT", - "dependencies": { - "@scure/base": "1.2.1", - "@scure/bip39": "^1.3.0", - "@tiptap/core": "^3.19.0", - "@tiptap/pm": "^3.19.0", - "clsx": "^2.0.0", - "cojson": "0.20.19", - "cojson-storage-indexeddb": "0.20.19", - "cojson-transport-ws": "0.20.19", - "fast-myers-diff": "^3.2.0", - "goober": "^2.1.18", - "prosemirror-example-setup": "^1.2.2", - "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.21.1", - "prosemirror-schema-basic": "^1.2.2", - "prosemirror-state": "^1.4.3", - "prosemirror-transform": "^1.9.0", - "use-sync-external-store": "^1.5.0", - "zod": "4.1.11" + "version": "2.0.0-alpha.53", + "resolved": "https://registry.npmjs.org/jazz-tools/-/jazz-tools-2.0.0-alpha.53.tgz", + "integrity": "sha512-GSAt9axXPaZY3g0bZxEPeAmq/q4IWfJRdVMWmNYxLnaKzFHD3vYQf1y4VK9/ZAGCdabcxS8Im3dreISRHXkHSg==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/exporter-logs-otlp-http": "^0.216.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.216.0", + "@opentelemetry/resources": "^2.7.1", + "@opentelemetry/sdk-logs": "^0.216.0", + "@opentelemetry/sdk-trace-base": "^2.7.1", + "@scure/bip39": "^2.0.1", + "@standard-schema/spec": "^1.1.0", + "esbuild": "^0.27.0", + "jazz-wasm": "2.0.0-alpha.53", + "jose": "^6.2.1", + "json-schema-to-ts": "^3.1.1", + "pluralize-esm": "^9.0.5", + "web-streams-polyfill": "^4.2.0" + }, + "bin": { + "jazz-tools": "bin/jazz-tools.js" + }, + "engines": { + "node": ">=22.12" + }, + "optionalDependencies": { + "jazz-napi": "2.0.0-alpha.53" }, "peerDependencies": { - "@bam.tech/react-native-image-resizer": "*", - "@op-engineering/op-sqlite": "*", - "@react-native-community/netinfo": "*", - "better-auth": "^1.4.7", - "expo-file-system": "*", - "expo-image-manipulator": "*", - "expo-secure-store": "*", - "expo-sqlite": "*", - "react": "*", - "react-dom": "*", - "react-native": "*", - "react-native-fast-encoder": "^0.3.1", - "react-native-mmkv": "^3.3.0", - "react-native-nitro-modules": "^0.26.4", - "react-native-passkey": "^3.0.0", - "sharp": "^0.33.5", - "svelte": "^5.0.0" + "better-auth": "^1.5.5", + "expo": ">=54", + "expo-crypto": ">=14.0.0", + "expo-secure-store": ">=14.0.0", + "jazz-rn": "2.0.0-alpha.53", + "react": ">=19", + "react-native": ">=0.76", + "solid-js": ">=1.9.13", + "svelte": "^5.0.0", + "vue": "^3.5.0" }, "peerDependenciesMeta": { - "@bam.tech/react-native-image-resizer": { - "optional": true - }, - "@op-engineering/op-sqlite": { - "optional": true - }, - "@react-native-community/netinfo": { - "optional": true - }, "better-auth": { "optional": true }, - "expo-file-system": { + "expo": { "optional": true }, - "expo-image-manipulator": { + "expo-crypto": { "optional": true }, "expo-secure-store": { "optional": true }, - "expo-sqlite": { + "jazz-rn": { "optional": true }, "react": { "optional": true }, - "react-dom": { - "optional": true - }, "react-native": { "optional": true }, - "react-native-fast-encoder": { - "optional": true - }, - "react-native-mmkv": { - "optional": true - }, - "react-native-nitro-modules": { - "optional": true - }, - "react-native-passkey": { + "solid-js": { "optional": true }, - "sharp": { + "svelte": { "optional": true }, - "svelte": { + "vue": { "optional": true } } }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } + "node_modules/jazz-tools/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" ], "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "node_modules/jazz-tools/node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/jazz-tools/node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true - }, - "node_modules/js-yaml": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", - "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": ">=18" } }, - "node_modules/jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "license": "0BSD", - "peer": true - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "node_modules/jazz-tools/node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/jazz-tools/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "peer": true, - "bin": { - "json5": "lib/cli.js" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/jazz-tools/node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "node_modules/jazz-tools/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6" - } - }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "license": "MIT", - "peer": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "tmpl": "1.0.5" + "node": ">=18" } }, - "node_modules/marky": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", - "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT", - "peer": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT", - "peer": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/jazz-tools/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/metro": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.84.4.tgz", - "integrity": "sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==", + "node_modules/jazz-tools/node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.29.1", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "accepts": "^2.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.35.0", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.84.4", - "metro-cache": "0.84.4", - "metro-cache-key": "0.84.4", - "metro-config": "0.84.4", - "metro-core": "0.84.4", - "metro-file-map": "0.84.4", - "metro-resolver": "0.84.4", - "metro-runtime": "0.84.4", - "metro-source-map": "0.84.4", - "metro-symbolicate": "0.84.4", - "metro-transform-plugins": "0.84.4", - "metro-transform-worker": "0.84.4", - "mime-types": "^3.0.1", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-babel-transformer": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.84.4.tgz", - "integrity": "sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==", + "node_modules/jazz-tools/node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.35.0", - "metro-cache-key": "0.84.4", - "nullthrows": "^1.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" - } - }, - "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", - "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", - "license": "MIT", - "peer": true - }, - "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", - "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.35.0" + "node": ">=18" } }, - "node_modules/metro-cache": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.84.4.tgz", - "integrity": "sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==", + "node_modules/jazz-tools/node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], "license": "MIT", - "peer": true, - "dependencies": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "https-proxy-agent": "^7.0.5", - "metro-core": "0.84.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-cache-key": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.84.4.tgz", - "integrity": "sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==", + "node_modules/jazz-tools/node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-config": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.84.4.tgz", - "integrity": "sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==", + "node_modules/jazz-tools/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], "license": "MIT", - "peer": true, - "dependencies": { - "connect": "^3.6.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.7.0", - "metro": "0.84.4", - "metro-cache": "0.84.4", - "metro-core": "0.84.4", - "metro-runtime": "0.84.4", - "yaml": "^2.6.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-core": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.84.4.tgz", - "integrity": "sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==", + "node_modules/jazz-tools/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.84.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-file-map": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.84.4.tgz", - "integrity": "sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==", + "node_modules/jazz-tools/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.4.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-minify-terser": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.84.4.tgz", - "integrity": "sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==", + "node_modules/jazz-tools/node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-resolver": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.84.4.tgz", - "integrity": "sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==", + "node_modules/jazz-tools/node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-runtime": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.84.4.tgz", - "integrity": "sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==", + "node_modules/jazz-tools/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-source-map": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.84.4.tgz", - "integrity": "sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==", + "node_modules/jazz-tools/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.84.4", - "nullthrows": "^1.1.1", - "ob1": "0.84.4", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-symbolicate": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.84.4.tgz", - "integrity": "sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==", + "node_modules/jazz-tools/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.84.4", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-transform-plugins": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.84.4.tgz", - "integrity": "sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==", + "node_modules/jazz-tools/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.29.1", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro-transform-worker": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.84.4.tgz", - "integrity": "sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==", + "node_modules/jazz-tools/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.29.1", - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "flow-enums-runtime": "^0.0.6", - "metro": "0.84.4", - "metro-babel-transformer": "0.84.4", - "metro-cache": "0.84.4", - "metro-cache-key": "0.84.4", - "metro-minify-terser": "0.84.4", - "metro-source-map": "0.84.4", - "metro-transform-plugins": "0.84.4", - "nullthrows": "^1.1.1" - }, + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": ">=18" } }, - "node_modules/metro/node_modules/hermes-estree": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", - "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", - "license": "MIT", - "peer": true - }, - "node_modules/metro/node_modules/hermes-parser": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", - "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", + "node_modules/jazz-tools/node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.35.0" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/jazz-tools/node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8.6" + "node": ">=18" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/jazz-tools/node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], "license": "MIT", - "peer": true, - "bin": { - "mime": "cli.js" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "node_modules/jazz-tools/node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "node_modules/jazz-tools/node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "hasInstallScript": true, "license": "MIT", - "peer": true, - "dependencies": { - "mime-db": "^1.54.0" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { "node": ">=18" }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/jazz-wasm": { + "version": "2.0.0-alpha.53", + "resolved": "https://registry.npmjs.org/jazz-wasm/-/jazz-wasm-2.0.0-alpha.53.tgz", + "integrity": "sha512-0Aqnldh3pPvH582g4H2TtbycoFujBpnMpL4dcS0uhMRsBzr8ycIIi3GCWMP43Gn2DG5X5cutqpGqNKMzZbY6BQ==", + "license": "MIT" + }, + "node_modules/jose": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", + "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/panva" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/js-yaml": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", + "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", "license": "MIT", - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=10" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/json-schema-to-ts": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", + "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "@babel/runtime": "^7.18.3", + "ts-algebra": "^2.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=16" } }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "license": "MIT", - "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "license": "MIT", - "peer": true - }, - "node_modules/node-releases": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", - "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "license": "MIT", - "peer": true + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" }, - "node_modules/ob1": { - "version": "0.84.4", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.84.4.tgz", - "integrity": "sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==", + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, "engines": { - "node": ">= 0.8" + "node": ">= 8" } }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", - "peer": true, "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.6" } }, - "node_modules/orderedmap": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", - "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/pathe": { @@ -3896,6 +2495,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -3910,6 +2510,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pluralize-esm": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/pluralize-esm/-/pluralize-esm-9.0.5.tgz", + "integrity": "sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/postcss": { "version": "8.5.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", @@ -3939,229 +2548,28 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", - "peer": true, + "node_modules/protobufjs": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.1.tgz", + "integrity": "sha512-NWWCCscLjs+cOKF/s/XVNFRW7Yih0fdH+9brffR5NZCy8k42yRdl5KlWKMVXuI1vfCoy4o1z80XR/W/QUb3V3w==", + "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "license": "MIT", - "peer": true, - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prosemirror-changeset": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.1.tgz", - "integrity": "sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==", - "license": "MIT", - "dependencies": { - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-commands": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", - "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.10.2" - } - }, - "node_modules/prosemirror-dropcursor": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.3.tgz", - "integrity": "sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "node_modules/prosemirror-example-setup": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/prosemirror-example-setup/-/prosemirror-example-setup-1.2.3.tgz", - "integrity": "sha512-+hXZi8+xbFvYM465zZH3rdZ9w7EguVKmUYwYLZjIJIjPK+I0nPTwn8j0ByW2avchVczRwZmOJGNvehblyIerSQ==", - "license": "MIT", - "dependencies": { - "prosemirror-commands": "^1.0.0", - "prosemirror-dropcursor": "^1.0.0", - "prosemirror-gapcursor": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-inputrules": "^1.0.0", - "prosemirror-keymap": "^1.0.0", - "prosemirror-menu": "^1.0.0", - "prosemirror-schema-list": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-gapcursor": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz", - "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==", - "license": "MIT", - "dependencies": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "node_modules/prosemirror-history": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", - "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.31.0", - "rope-sequence": "^1.3.0" - } - }, - "node_modules/prosemirror-inputrules": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz", - "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-keymap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", - "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } - }, - "node_modules/prosemirror-menu": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.3.2.tgz", - "integrity": "sha512-6VgUJTYod0nMBlCaYJGhXGLu7Gt4AvcwcOq0YfJCY/6Uh+3S7UsWhpy6rJFCBFOmonq1hD8KyWOtZhkppd4YPg==", - "license": "MIT", - "dependencies": { - "crelt": "^1.0.0", - "prosemirror-commands": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-model": { - "version": "1.25.10", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.10.tgz", - "integrity": "sha512-9n6rH4DbJU1eH4SxLt6Y0HhJIo6cZsb7DJ/30uob1hOKPeO6TAaMWI2tc7kwR92BjfPOU2fFHWbZLovLi3XQfA==", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-schema-basic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz", - "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.25.0" - } - }, - "node_modules/prosemirror-schema-list": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", - "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.7.3" - } - }, - "node_modules/prosemirror-state": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", - "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.27.0" - } - }, - "node_modules/prosemirror-tables": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", - "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", - "license": "MIT", - "dependencies": { - "prosemirror-keymap": "^1.2.3", - "prosemirror-model": "^1.25.4", - "prosemirror-state": "^1.4.4", - "prosemirror-transform": "^1.10.5", - "prosemirror-view": "^1.41.4" - } - }, - "node_modules/prosemirror-transform": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz", - "integrity": "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.21.0" - } - }, - "node_modules/prosemirror-view": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.42.0.tgz", - "integrity": "sha512-N54DF3OXNWDuP81G1kbfCys8ZzIjuL1VnvJ2mk5STSu/fNxWIcX/EutQLA3s9KR/2wVhgDi4hzBB/1fINVxk0A==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.25.8", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "~2.0.3" + "node": ">=12.0.0" } }, "node_modules/queue-microtask": { @@ -4184,131 +2592,6 @@ ], "license": "MIT" }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-devtools-core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", - "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", - "license": "MIT", - "peer": true, - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT", - "peer": true - }, - "node_modules/react-native": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.86.0.tgz", - "integrity": "sha512-17ALh/dd6AO4pgOVmOO5Axll5PbErEo3XFyLokyzW6usyi+OShIEPwUW26wLPlhVifgSOIfECCH0WN+0IqtJ1w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-native/assets-registry": "0.86.0", - "@react-native/codegen": "0.86.0", - "@react-native/community-cli-plugin": "0.86.0", - "@react-native/gradle-plugin": "0.86.0", - "@react-native/js-polyfills": "0.86.0", - "@react-native/normalize-colors": "0.86.0", - "@react-native/virtualized-lists": "0.86.0", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-plugin-syntax-hermes-parser": "0.36.0", - "base64-js": "^1.5.1", - "commander": "^12.0.0", - "flow-enums-runtime": "^0.0.6", - "hermes-compiler": "250829098.0.14", - "invariant": "^2.2.4", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.84.3", - "metro-source-map": "^0.84.3", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^6.1.5", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.27.0", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "tinyglobby": "^0.2.15", - "whatwg-fetch": "^3.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" - }, - "peerDependencies": { - "@react-native/jest-preset": "0.86.0", - "@types/react": "^19.1.1", - "react": "^19.2.3" - }, - "peerDependenciesMeta": { - "@react-native/jest-preset": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT", - "peer": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -4354,230 +2637,50 @@ "@rollup/rollup-linux-riscv64-musl": "4.62.2", "@rollup/rollup-linux-s390x-gnu": "4.62.2", "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/rope-sequence": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", - "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", - "license": "MIT" - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT", - "peer": true - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true - }, - "node_modules/send/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "license": "MIT", - "peer": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" } }, - "node_modules/setprototypeof": { + "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "peer": true, "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "queue-microtask": "^1.2.2" } }, - "node_modules/shell-quote": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", - "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, "node_modules/siginfo": { @@ -4587,16 +2690,6 @@ "dev": true, "license": "ISC" }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4607,27 +2700,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -4641,36 +2713,6 @@ "dev": true, "license": "MIT" }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT", - "peer": true - }, - "node_modules/stacktrace-parser": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", - "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", - "license": "MIT", - "peer": true, - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/std-env": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", @@ -4678,34 +2720,6 @@ "dev": true, "license": "MIT" }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -4715,55 +2729,6 @@ "node": ">=0.10.0" } }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", - "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT", - "peer": true - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "license": "MIT", - "peer": true - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -4778,54 +2743,6 @@ "dev": true, "license": "MIT" }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "license": "MIT", - "peer": true, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tinypool": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", @@ -4856,13 +2773,6 @@ "node": ">=14.0.0" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "license": "BSD-3-Clause", - "peer": true - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4875,15 +2785,11 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.6" - } + "node_modules/ts-algebra": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", + "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", + "license": "MIT" }, "node_modules/tsx": { "version": "4.23.0", @@ -4904,16 +2810,6 @@ "fsevents": "~2.3.3" } }, - "node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "license": "(MIT OR CC0-1.0)", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -4934,82 +2830,6 @@ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, - "node_modules/unicode-segmenter": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/unicode-segmenter/-/unicode-segmenter-0.12.0.tgz", - "integrity": "sha512-PK6M1A1tt3ky6cFAJW/JOO9ml/sbEvim+SL75FM8slck08ACbF0TZj+tdUd3Mh8Tk5XieqUDPwmLjiyRQvb4pw==", - "license": "MIT" - }, - "node_modules/uniffi-bindgen-react-native": { - "version": "0.29.3-1", - "resolved": "https://registry.npmjs.org/uniffi-bindgen-react-native/-/uniffi-bindgen-react-native-0.29.3-1.tgz", - "integrity": "sha512-o6gXZsAh55yuvhwF2WSFdIHV4phyfWcCmg4DuyfJWJ7CvUz1UcIz2S4u9SmXAz1jsuqvu6Xc9hexrRBB0a5osg==", - "license": "MPL-2.0", - "bin": { - "ubrn": "bin/cli.cjs", - "uniffi-bindgen-react-native": "bin/cli.cjs" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/vite": { "version": "5.4.21", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", @@ -5589,48 +3409,16 @@ } } }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "license": "MIT", - "peer": true - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT" - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "node_modules/web-streams-polyfill": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.3.0.tgz", + "integrity": "sha512-/Gnggvj9oSrEvJbDyyPtAnxBt5fGQM2iWOKQNu7ie1OxDgK40iZpyV3TKaRiEzVj1oA1UxKnEy9XPXh6PW3eVw==", "license": "MIT", - "peer": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "workspaces": [ + "test/benchmark-test", + "test/rollup-test", + "test/webpack-test" + ], "engines": { "node": ">= 8" } @@ -5651,117 +3439,6 @@ "engines": { "node": ">=8" } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/ws": { - "version": "7.5.11", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", - "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC", - "peer": true - }, - "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "license": "ISC", - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yargs": { - "version": "17.7.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", - "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", - "license": "MIT", - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/zod": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", - "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/package.json b/package.json index 580c2e9..8de615a 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "scan": "tsx src/cli.ts scan", "index": "tsx src/cli.ts index", "search": "tsx src/cli.ts search", + "status": "tsx src/cli.ts status", "changes": "tsx src/cli.ts changes", "events": "tsx src/cli.ts events", "sync": "tsx src/cli.ts sync", @@ -28,7 +29,8 @@ "dependencies": { "fast-glob": "^3.3.3", "gray-matter": "^4.0.3", - "jazz-tools": "^0.20.19" + "jazz-napi": "2.0.0-alpha.53", + "jazz-tools": "2.0.0-alpha.53" }, "devDependencies": { "@types/node": "^22.10.2", diff --git a/spec/consumer-agents.md b/spec/consumer-agents.md index 078586d..cea2c63 100644 --- a/spec/consumer-agents.md +++ b/spec/consumer-agents.md @@ -79,6 +79,8 @@ Later subscriptions can become query-shaped, but the first version should stay i A work packet is the consumable unit handed to an agent. +The proposed context-subscription model separates subscription, packet inclusion, and prompt residency so this contract remains usable across heterogeneous runners. See `context-subscriptions.md`. + A packet should include: - packet id. diff --git a/spec/context-subscriptions.md b/spec/context-subscriptions.md new file mode 100644 index 0000000..7f9d4e6 --- /dev/null +++ b/spec/context-subscriptions.md @@ -0,0 +1,218 @@ +--- +id: context-subscriptions +kind: architecture +title: Context Subscriptions and Freshness +status: proposed +depends_on: + - axioms + - consumer-agents + - agent-runtime + - agent-harness + - data-model + - work-queue +--- + +# Context Subscriptions and Freshness + +Charter should let heterogeneous agents operate against a shared, live project model without pretending every runner exposes the same context-window controls. + +The product problem is visible in multi-agent projects: several capable agents can read the same repository and still walk over one another because each run starts from a private, aging picture of the project. More agents increase execution capacity while making coordination harder to reconstruct. + +Charter's answer should be a shared document graph, explicit subscriptions, versioned context packets, and freshness enforcement at write boundaries. + +## Product claim + +Charter owns **context state and freshness**. Runner adapters own **context transport**. + +The core system should know: + +- which documents and event classes a consumer subscribes to; +- which document versions and events a run received; +- which prompt and context documents were mandatory for that run; +- which relevant documents changed while the run was active; +- whether the run's assumptions or proposed writes are stale; +- what refresh, rebase, rejection, or conflict occurred before effects were accepted. + +Charter should not require every runner to support live prompt mutation. Letta, Codex, Claude Code, Cursor, local scripts, CI workers, and future harnesses expose different context and interruption surfaces. Heterogeneous agents remain first-class. + +## Three separate relationships + +An agent's relationship to a document has at least three independent dimensions. + +### Subscription + +The consumer should be informed when a matching document or event changes. Subscription creates a cursor and freshness obligation. It does not imply that the full document is permanently present in the model prompt. + +### Packet inclusion + +The document's current version, a selected span, or a change summary is included in a bounded context packet for a particular run. + +### Prompt residency + +A capable adapter may keep the document or a projection of it resident in an agent's persistent prompt or memory surface. This is an adapter capability, not a Charter correctness requirement. + +Keeping these dimensions separate avoids turning `subscribed` into a euphemism for “consume tokens forever.” + +## Context manifest + +Every agent run should bind to an inspectable context manifest. + +The manifest should include: + +- consumer id and runner adapter; +- source work item and event ids; +- prompt document ids and exact versions; +- attached context document ids and exact versions; +- subscription cursors used to assemble the packet; +- mandatory documents required by project or consumer policy; +- omitted, summarized, or truncated context with reasons; +- packet token or byte budget when known; +- packet hash and creation timestamp. + +This manifest is the receipt for what Charter supplied. It does not claim that an opaque model attended to every token. It makes the selection and transport boundary inspectable. + +## Transport modes + +Runner adapters can support different delivery modes while preserving the same Charter contract. + +### Task-boundary packet + +Charter renders a complete packet when the run starts and supplies it through stdin, a temporary file, environment references, an API, or another stable runner interface. + +This is the universal baseline and matches the current pluggable runner design. + +### Pull context + +Charter exposes document versions, events, and manifests through files, CLI, API, MCP, or a Jazz-native client. The agent retrieves additional context during the run. + +### Between-step updates + +When the harness controls repeated model/tool cycles, the adapter can inject subscribed deltas before the next model step. Letta-like runtimes can use this to approximate live project memory. + +### Prompt-resident projection + +When the harness supports persistent system memory or pinned instructions, the adapter can materialize selected documents into that surface and update them according to its own context-window semantics. + +Live delivery is a better experience when available. It is not the foundation of correctness. + +## Freshness and write coordination + +Shared awareness alone does not prevent collisions. Agents can watch each other overwrite the same surface with exquisite real-time provenance. + +Every mutating run should declare the document versions and work scopes it acted against. Before Charter accepts a proposal, write, report, or completion effect, it should compare those base versions with current state. + +Possible outcomes: + +- **fresh**: relevant base versions still match; +- **stale but non-conflicting**: subscribed context changed outside the run's write/read scope; +- **refresh required**: a relevant assumption changed and the adapter can resume with a delta; +- **rebase required**: the proposal may still be valid but must be reconciled against current state; +- **conflict**: another accepted run changed the same protected scope; +- **rejected**: authority, lease, or freshness policy forbids applying the effect. + +Version checks, work claims, write scopes, and conflict receipts provide correctness even when a runner cannot be interrupted. + +## Change delivery + +Charter should not prepend an unbounded stream of raw diffs to every turn. + +A change packet should prefer: + +- document id and old/new version ids; +- semantic event type such as `spec.document.updated`, `decision.superseded`, or `work.claimed`; +- concise change summary when available; +- affected heading, span, field, or work scope; +- exact diff or event reference; +- authority and provenance; +- current full document when the consumer is too far behind for useful delta replay. + +Each consumer maintains a cursor. Delivery advances the cursor only when the packet or update is durably recorded. Lagging consumers receive a checkpoint or fresh snapshot rather than historical confetti. + +## Centralized harness mode + +Charter may also provide a first-party managed harness that supports prompt-resident documents and between-step updates directly. + +That mode is strategically useful: it can demonstrate the strongest experience, reduce adapter variance, and make shared working memory tangible. It should coexist with the heterogeneous runner contract rather than replace it. + +The product split is: + +- **Charter core**: documents, versions, subscriptions, cursors, manifests, packets, claims, freshness, and conflict state; +- **Charter managed runtime**: a first-party implementation with live injection and context-budget management; +- **external adapters**: progressively capable integrations for existing agent harnesses. + +This lets Charter own the coordination layer without requiring the market to replace every agent tool before the first useful run. + +## Initial data-model additions + +### ContextSubscription + +- `id` +- `consumerId` +- `documentSelector` +- `eventTypes` +- `deliveryMode`: task-boundary, pull, between-step, prompt-resident +- `required`: whether project policy prevents omission +- `cursor` +- `contextBudgetHint` +- `createdAt` / `updatedAt` + +The first implementation may keep simple subscriptions on `AgentConsumer`, but the durable target should permit per-subscription cursors and delivery policy. + +### ContextManifest + +- `id` +- `consumerId` +- `requestId` / `packetId` +- `documentVersions` +- `promptDocumentVersions` +- `subscriptionCursors` +- `omissions` / `summaries` +- `budget` +- `manifestSha256` +- `createdAt` + +### RunFreshness + +- `requestId` +- `baseManifestId` +- `checkedAt` +- `currentDocumentVersions` +- `changedRelevantDocuments` +- `status`: fresh, stale, refresh-required, rebase-required, conflict, rejected +- `resolutionEventId` + +## First implementation slice + +Do not begin with arbitrary mid-process injection. + +The first useful slice is: + +1. Add exact document version maps and subscription cursors to durable packets. +2. Persist a context manifest for every request. +3. Record each request's declared read/write scope. +4. Re-check relevant versions when the run reports or proposes an effect. +5. Mark stale/conflicting runs visibly rather than accepting their completion state as current truth. +6. Expose the manifest and freshness result through CLI and API inspection. +7. Add one richer adapter later, likely a managed Letta runner, that can deliver between-step deltas. + +This slice improves coordination for every runner before Charter attempts context-window management for any one of them. + +## Acceptance criteria + +1. A user can inspect exactly which document versions a run started with. +2. A consumer can subscribe to project documents without requiring prompt residency. +3. A runner with only stdin/file input can participate fully at task boundaries. +4. A runner with live context controls can receive deltas through an adapter without changing the core subscription model. +5. Charter detects when a relevant document changed during a run. +6. A stale run cannot silently overwrite a newer accepted change. +7. Context omissions and budget decisions are visible in the run manifest. +8. A user can answer “what does this agent currently know, what changed since it started, and is its result still safe to apply?” from Charter state rather than terminal archaeology. + +## Open questions + +- Which freshness changes should merely annotate a run, and which should block completion? +- Are read/write scopes declared by consumers, inferred from work items, or refined during execution? +- How should a managed runtime allocate finite prompt residency across required, pinned, and recently changed documents? +- Can Jazz subscriptions provide a durable cursor primitive directly, or should Charter store semantic event cursors per subscription? +- What is the minimum adapter contract for resuming a run with a delta rather than starting a replacement run? +- Should project-level documents be mandatory for every consumer even when an external runner has a very small context window? diff --git a/spec/data-model.md b/spec/data-model.md index b66000e..2a25b70 100644 --- a/spec/data-model.md +++ b/spec/data-model.md @@ -126,7 +126,7 @@ Authority values: - `charter.agent`: agent request lifecycle activity. - `charter.system`: system classification, packet construction, or queue transition. -A project event should carry source pointers: document id, span id, comment id, work item id, request id, source CoValue id, and source field/path when available. +A project event should carry source pointers: document id, span id, comment id, work item id, request id, source Jazz row id, and source field/path when available. ## WorkItem @@ -142,7 +142,7 @@ Fields: - `spanId` / `commentId` when applicable. - `matchedConsumerIds`: consumers eligible to handle the work. - `attachedDocumentIds`: spec documents supplied as agent context. -- `sourceCoValueId` / `sourceField`: Jazz provenance pointer when available. +- `sourceJazzRowId` / `sourceField`: Jazz provenance pointer when available. - `claimedBy` / `claimedAt`: worker claim metadata. - `requestId`: linked `AgentRequest` once running. - `resultText`: optional completion summary. diff --git a/spec/experience.md b/spec/experience.md index 95f6a20..6cda636 100644 --- a/spec/experience.md +++ b/spec/experience.md @@ -35,6 +35,29 @@ The product should never require the user to reconstruct state from hidden proce ## Default surfaces +### Status + +The user can ask Charter for a compact, truthful summary of the project machinery before inspecting any one ledger. + +```bash +charter status +``` + +Status should report: + +- configured database adapter and its actual durability boundary; +- filesystem document count, materialized document count, and projection drift; +- project event and work-item counts; +- work grouped by queued, claimed, running, done, ignored, failed, and blocked; +- registered consumers, subscription selectors, and cursor state; +- packets and requests grouped by lifecycle state; +- recent events and requests; +- structural warnings such as stale running work or non-shared database state. + +Charter must not infer a running watch process from the mere existence of state files. Until runtime presence has a durable heartbeat or lease, status should say that process presence is unknown. A legibility feature that hallucinates the daemon would be unusually efficient self-parody. + +The user-facing question is: "What is happening in this project right now, and which parts of that answer are actually known?" + ### Spec The user can browse, search, create, edit, link, rename, archive, and delete spec documents as Markdown files. Documents include product specs, architecture, prompts, documentation, examples, contracts, and notes. @@ -85,6 +108,7 @@ The CLI and runtime logs are the first development and automation interface. The ```bash charter watch +charter status charter changes charter sync charter events @@ -98,6 +122,7 @@ Package-script equivalents are acceptable in a local checkout: ```bash npm run watch +npm run status npm run changes npm run sync npm run events @@ -153,15 +178,16 @@ The product should not pretend failure is exceptional. Failure is one of the nor The experience contract is satisfied when: 1. A user can start watch mode with one command. -2. A user can edit one spec document in an external editor and see the ingestion state. -3. A user can see exactly which event was created by the edit. -4. A user can see whether the event produced work or was classified as non-actionable. -5. A user can inspect the consumer subscription that matched the event. -6. A user can inspect the exact packet for a planned or executed run. -7. A user can observe one work item transition through execution. -8. A failed run produces an actionable record with evidence and linked state. -9. A user can distinguish clean queue, queued work, running work, failed work, blocked work, ignored work, done work, and stale historical claims. -10. The same state can be represented through API, CLI, watch logs, filesystem projection, future UI, or Jazz-native subscription without changing the product contract. +2. A user can run one command to see database durability, projection drift, event/work counts, consumers, packets, requests, recent activity, and warnings. +3. A user can edit one spec document in an external editor and see the ingestion state. +4. A user can see exactly which event was created by the edit. +5. A user can see whether the event produced work or was classified as non-actionable. +6. A user can inspect the consumer subscription that matched the event. +7. A user can inspect the exact packet for a planned or executed run. +8. A user can observe one work item transition through execution. +9. A failed run produces an actionable record with evidence and linked state. +10. A user can distinguish clean queue, queued work, running work, failed work, blocked work, ignored work, done work, and stale historical claims. +11. The same state can be represented through API, CLI, watch logs, filesystem projection, future UI, or Jazz-native subscription without changing the product contract. ## Non-goals diff --git a/spec/folder-contract.md b/spec/folder-contract.md index b7fd893..3ea0b53 100644 --- a/spec/folder-contract.md +++ b/spec/folder-contract.md @@ -1,19 +1,30 @@ --- id: folder-contract kind: architecture -title: Spec Folder Contract +title: Source Projection Contract status: active --- -# Spec Folder Contract +# Source Projection Contract -Every Charter project has a repository-root `spec/` directory. Every Markdown file under `spec/**/*.md` is part of the project spec unless a future ignore rule explicitly excludes it. +A Charter project is not equivalent to one local repository or one `spec/` directory. A local controller selects any number of files, folders, or repositories and maps them into stable project sources. -The folder can be nested. Nested structure is for human navigation and coarse ownership, not for database identity unless a document omits a pinned id. +`./spec/**/*.md` is the useful zero-configuration default for Charter's own repository. It is not the runtime boundary. + +Examples: + +```text +charter source add ./spec --include '**/*.md' +charter source add ../product-docs --include 'architecture/**/*.md' +charter source add ~/notes/decision.md +charter source add ~/code/service-a --include 'README.md' --include 'docs/**/*.md' +``` + +Selections and absolute paths are machine-local controller state. Shared Jazz rows contain a stable source id, portable display name, source kind, relative projection path, normalized content, and provenance. Another controller may map the same source ids to entirely different local paths or choose not to materialize them. ## Frontmatter -A spec document may include YAML frontmatter: +A Markdown source document may include YAML frontmatter: ```yaml --- @@ -24,27 +35,32 @@ status: draft | active | accepted | archived --- ``` -Required by policy: +Known fields: - `id`: stable document identity. - `title`: human-readable title. - `kind`: broad document category. - `status`: lifecycle state. - -Allowed but not load-bearing yet: - - `owners`: people or agents responsible for the document. -- `depends_on`: other spec document ids. +- `depends_on`: other document ids. - `supersedes`: prior document ids. ## Identity -The importer uses `frontmatter.id` when present. If `id` is missing, it derives identity from the relative path without `.md`. +The importer uses `frontmatter.id` when present. If `id` is missing, it derives identity from the stable source id plus the path relative to that source root. + +Path-derived ids are convenient for scratch documents but bad for stable specs. A rename can become a delete plus create unless content identity or source-adapter metadata establishes continuity. Stable documents should pin `id` before meaningful work depends on them. -Path-derived ids are convenient for scratch documents but bad for stable specs. A rename becomes a delete plus create. Stable documents should pin `id` before meaningful work depends on them. +Absolute paths never define shared identity. ## Human authority -Markdown is one human-editable projection. Database/Jazz objects are the durable coordination surface. +Markdown is one human-editable projection. Jazz rows are the durable coordination surface. + +Agents may propose changes, annotate documents, and execute accepted work. They should not silently become the author of record for product intent. If an agent writes back through a local source projection, the resulting event must carry agent provenance and the local controller must confirm that the write still targets the selected source version. + +## Source adapters + +The first adapter is filesystem Markdown. The source contract also permits Git worktrees, API-backed documents, and future rich editors. -Agents may propose changes, annotate documents, and execute accepted work. They should not silently become the author of record for product intent. If an agent writes back into `spec/`, the resulting event must carry agent provenance. +Adapters own transport and source-specific operations. Charter owns selection, stable identity, normalized content, versions, freshness, packets, and provenance. A Git adapter may inspect commits, refs, diffs, and working-tree state through Git; those are not silently promoted into Jazz branch semantics. diff --git a/spec/importer.md b/spec/importer.md index f90f1ac..1f42d2d 100644 --- a/spec/importer.md +++ b/spec/importer.md @@ -1,87 +1,59 @@ --- id: importer kind: architecture -title: Importer Behavior +title: Source Importer Behavior status: active +depends_on: + - folder-contract + - runtime-architecture --- -# Importer Behavior +# Source Importer Behavior -The importer maps an editable projection into database state. It should be deterministic, boring, and hard to accidentally make clever. +An importer maps one local source selection into normalized shared project rows. It should be deterministic, boring, and hard to accidentally make clever. -## Scan +## Local selection -Inputs: +A local controller owns source roots, individual files, include/exclude globs, watches, materialization paths, and absolute path mappings. Those machine facts do not enter shared Jazz rows. -- project root -- spec directory, default `spec` -- glob `**/*.md` +The current filesystem adapter accepts one root and defaults to `spec/**/*.md`. This is the first source adapter, not the project boundary. The controller model permits multiple selections and other adapters without changing shared document identity. -For each file, the scanner records: +## Scan and normalize -- relative path -- raw Markdown -- YAML frontmatter -- Markdown body -- heading outline -- content hash -- byte size -- filesystem mtime +For each selected Markdown file, the scanner records relative projection path, raw Markdown, YAML frontmatter, body, heading outline, content hash, byte size, filesystem mtime, and import timestamp. -The scanner sorts by relative path so output is stable across runs. +Normalization rules: -## Normalize +1. Use `frontmatter.id` when present; otherwise derive identity from stable source id plus relative path. +2. Use `frontmatter.title`, then first H1, then filename title case. +3. Preserve unknown frontmatter in `frontmatterJson`. +4. Hash raw content, including frontmatter. +5. Sort by source id and relative path for deterministic output. -Normalization produces `SpecMarkdownDocument` values. - -Rules: - -1. Use `frontmatter.id` if present, else derive id from path. -2. Use `frontmatter.title` if present, else first H1, else filename title case. -3. Use known `kind` values, otherwise `unknown`. -4. Preserve unrecognized frontmatter in `frontmatterJson`. -5. Hash raw file contents, including frontmatter. +Absolute local paths never define shared identity. ## Sync -Sync writes through the `CharterDatabase` interface. The target is `CharterProject.documents`, the `CharterProject.events` CoFeed, `CharterProject.workItems`, and eventually `CharterProject.versions`. - -The filesystem path is one importer source, not the destination. A Notion-like client can write the same rows directly without ever producing Markdown files. - -Sync behavior today: - -1. Build import plan from scanned files. -2. Upsert each document row by id. -3. Delete materialized documents whose source files are no longer present. -4. Append `spec.document.upserted` and `spec.document.deleted` entries to the project event feed. -5. Create queued work items for actionable project events. -6. Ask the configured database adapter to persist/sync the snapshot. - -The current CLI defaults to `JazzCharterDatabase`. Writes mutate Jazz CoValues through `CharterProject.documents`, `CharterProject.versions`, `CharterProject.events`, `CharterProject.workItems`, and `CharterProject.requests`. `.spec/state/spec-db.json` is now a local projection mirror for process bootstrap and debugging; it is not the active runtime adapter. - -Other `.spec/state` files are local projection/cache/debug artifacts unless a spec says otherwise: - -- `spec-db.json`: local projection mirror of the Jazz-backed adapter state: documents, events, work items, requests, packets, reports, and captured runner output. -- `jazz-values.json`: inspection manifest of the active Jazz CoValue ids from the last saved CLI run. -- `index.json`: disposable lexical index cache produced by `charter index`. -- `agent-request-*.md`: prompt/packet exports from earlier or debug runner flows; useful for inspection, not canonical state. -- any legacy scratch files: disposable unless promoted into the database model or documented adapter contract. +Sync writes through `CharterDatabase` into native Jazz 2 tables: -Jazz does not use these JSON files as native storage. The in-process adapter's conceptual state lives in CoValues: `CharterProject`, `SpecDocument`, `SpecDocumentVersion`, `ProjectEvent` feed entries, `WorkItem` maps, and `AgentRequest` maps. The JSON mirror remains only because durable worker credentials, sync, and storage are not wired yet. +1. Upsert normalized document rows by portable key. +2. Retain immutable semantic document-version rows keyed by document id and content hash. +3. Delete current document rows removed from the selected projection while retaining version history. +4. Write semantic `spec.document.upserted` and `spec.document.deleted` events. +5. Create queued work items for actionable events. +6. Wait for the runtime's configured durability tier. -Needed next: +Jazz is authoritative. `.spec/state/jazz.sqlite` is its native local store. `.spec/state/jazz-runtime.json` is an inspection receipt. `.spec/state/index.json` is a disposable lexical cache. None is a JSON bootstrap mirror of shared project state. -- detect unchanged rows and emit `spec.document.unchanged` or no event. -- load the same `CharterProject` across processes through `jazz-tools/worker` credentials, sync server, and storage instead of bootstrapping from the JSON mirror. -- wait for Jazz sync before CLI exit once worker sync is configured. +`CHARTER_DB_ADAPTER=json` selects a separate local fallback/test adapter and writes `.spec/state/spec-db.json`. JSON mode has no Jazz runtime to inspect. ## CLI -Commands: +- `charter scan`: parse the current filesystem selection and print normalized ids. +- `charter sync`: ingest the selection into the configured runtime. +- `charter sync --dry-run`: print planned changes without writing. +- `charter sync --jazz-runtime`: print native Jazz row ids and durability configuration. +- `charter events`: query semantic project events. +- `charter work`: query durable work items. -- `charter scan`: parse `spec/**/*.md` and print normalized document ids. -- `charter sync`: upsert parsed docs into the configured database. -- `charter sync --dry-run`: print planned writes. -- `charter sync --jazz-values`: print the active Jazz CoValue ids and write `.spec/state/jazz-values.json`. -- `charter events`: read the `CharterProject.events` feed through the configured database adapter. -- `charter work`: read durable `CharterProject.workItems` through the configured database adapter. +The next importer milestone is to make source add/list/remove and multi-source watch use the local controller mapping directly rather than passing one `--spec-dir` through every command. diff --git a/spec/index.md b/spec/index.md index bdf6205..16469d4 100644 --- a/spec/index.md +++ b/spec/index.md @@ -51,13 +51,16 @@ Charter gives humans, filesystem editors, API clients, workers, and agents the s - `product-vision.md`: the product center of gravity and Jazz collaboration pitch. - `axioms.md`: design invariants, including the requirement that Charter is built as a real product with real backends rather than product theater. - `folder-contract.md`: what counts as a spec document and how identity works. -- `data-model.md`: database objects, Jazz CoValues, and target model additions. +- `runtime-architecture.md`: shared Jazz project plane, machine-local controller plane, distributed worker plane, identities, and leases. +- `data-model.md`: shared database objects, identities, provenance, and lifecycle state. - `document-interactions.md`: rich Markdown, span anchors, comments, documentation-as-contract, and follow-the-run chains. - `frontend.md`: local watch runtime, event-stream observability, subordinate process shape, and optional API surface. - `work-queue.md`: central event stream and durable work queue. - `consumer-agents.md`: database-registered agent consumers, subscriptions, packets, outcomes, and cascades. - `agent-runtime.md`: how consumers run against the spec graph. +- `context-subscriptions.md`: proposed shared project working memory, context manifests, runner-specific delivery, and freshness enforcement across heterogeneous agents. - `jazz-mapping.md`: durable Jazz mapping and permission shape. +- `jazz-git-boundary.md`: which Jazz history/branch capabilities Charter uses and where Git remains a separate source adapter. - `importer.md`: scanner, normalization, filesystem sync, and deletion behavior. - `indexing.md`: local lexical index and search behavior. - `agent-harness.md`: pluggable runner request/execution contract. diff --git a/spec/jazz-git-boundary.md b/spec/jazz-git-boundary.md new file mode 100644 index 0000000..f74227e --- /dev/null +++ b/spec/jazz-git-boundary.md @@ -0,0 +1,32 @@ +--- +id: jazz-git-boundary +kind: architecture +title: Jazz and Git Boundary +status: active +depends_on: + - jazz-mapping + - runtime-architecture +--- + +# Jazz and Git Boundary + +Jazz 2 has several properties that resemble a version-control substrate: + +- every row write creates a retained row version; +- row versions record ancestry and can form a graph under concurrent edits; +- losing concurrent values remain in history even when last-writer-wins selects the visible field value; +- every row version belongs to an environment, schema-hash, and user branch; +- schema versions are related through bidirectional migration lenses; +- user and environment branches provide hard isolation; +- edit authorship and timestamps are queryable; +- clients synchronize local persistent state and can wait for named durability tiers. + +Those properties are useful for Charter's document history, provenance, offline work, drafts, and reproducible context manifests. + +They do not make Jazz a Git implementation. + +Jazz user branches are fully isolated and are not merged at query time. Jazz does not expose Git's repository object model of blobs, trees, commits, refs, patches, index, and three-way repository merges. Charter must not translate `userBranch` into “Git branch” in its product language. + +When a selected source is a Git repository, the source adapter may record portable Git observations such as repository identity, remote, ref, head commit, dirty state, and diff hash. Git remains the authority for Git operations. Jazz remains the authority for Charter coordination state. + +Charter-level proposals and approvals should be modeled explicitly as rows and immutable manifests. They should not be smuggled into Jazz user branches as if isolation were review workflow. diff --git a/spec/jazz-mapping.md b/spec/jazz-mapping.md index 2ef811a..757f03a 100644 --- a/spec/jazz-mapping.md +++ b/spec/jazz-mapping.md @@ -3,67 +3,58 @@ id: jazz-mapping kind: architecture title: Jazz Mapping status: active +depends_on: + - runtime-architecture + - jazz-git-boundary --- # Jazz Mapping -Jazz is Charter's durable sync substrate. The filesystem is one place people can edit intent. Jazz is where clients, workers, and agents coordinate around that intent. +Jazz 2 is Charter's durable local-first database and synchronization substrate. The filesystem is one adapter through which people edit intent. Controllers, workers, future UI, and APIs coordinate through the same typed tables. -## Current code +## Current implementation -The first pass includes: +- `src/jazz/schema.ts` defines projects, membership, sources, documents, versions, events, work, workers, leases, consumers, context manifests, packets, and requests. +- `src/jazz/permissions.ts` makes the development policy explicit. It is intentionally permissive until authenticated project principals are provisioned; project-role rows already exist for the real policy boundary. +- `src/db/jazz.ts` uses the Jazz 2 persistent Node runtime and SQLite-backed `jazz-napi` driver. +- `.spec/state/jazz.sqlite` is the native local Jazz store. The adapter survives shutdown/restart without reading `.spec/state/spec-db.json`. +- `JAZZ_SERVER_URL`, `JAZZ_APP_ID`, and a backend/admin identity configure sync-server participation. Without a server, the same database remains durably local and useful offline. +- `.spec/state/jazz-runtime.json` is an inspection receipt containing app/project/table row ids and the durability configuration. It is not a state mirror. +- `src/db/json.ts` is an explicit fallback/test adapter selected with `CHARTER_DB_ADAPTER=json`. -- `src/jazz/schema.ts`: CoValue definitions for `CharterProject`, `SpecDocument`, `SpecDocumentVersion`, `ProjectEvent`, `ProjectEventFeed`, `WorkItem`, and `AgentRequest`. -- `src/jazz/materialize.ts`: in-memory Jazz materialization of an import plan. -- `src/db/jazz.ts`: the default CLI database adapter. It mutates the Jazz CoValue graph and writes a JSON projection mirror for process bootstrap/debugging. -- `src/db/json.ts`: local JSON adapter used for repeatable tests and explicit fallback via `CHARTER_DB_ADAPTER=json`. +## Identities -The JSON projection mirror exists because the worker-account/sync-server/storage bootstrap is not wired yet. It is not a second source of truth. Runtime writes go through the Jazz CoValues first, then the mirror is saved so the next local CLI process can reconstruct the graph. +Jazz row ids and Charter application ids are separate. -## Target durable adapter +Jazz owns durable row identity, version ancestry, edit authorship, environment, user branch, and durability metadata. Charter stores stable portable keys in explicit columns so documents, sources, workers, packets, and work items can retain application identity across imports and projections. -`JazzCharterDatabase` currently: +Every distributed participant should use its own Jazz identity. A worker is represented by both a Jazz principal and a `workers` registration row containing capabilities, selectors, endpoint metadata, presence, and non-secret configuration. Secrets and local filesystem paths remain local. -1. Starts an in-process Jazz account. -2. Creates the project root as a `CharterProject` CoMap. -3. Upsert `SpecDocument` rows into `CharterProject.documents`. -4. Create immutable `SpecDocumentVersion` rows keyed by `documentId:sha256`. -5. Append `ProjectEvent` entries into the `CharterProject.events` CoFeed with `$jazz.push(...)`. -6. Upsert mutable `WorkItem` CoMaps into `CharterProject.workItems`. -7. Upsert `AgentRequest` CoMaps into `CharterProject.requests`. -8. Writes `.spec/state/jazz-values.json` as an inspection manifest and `.spec/state/spec-db.json` as a local projection mirror. +## Reads and writes -The remaining durable-sync work is: +The adapter queries project-scoped tables directly. Mutations wait for the tier the runtime can honestly claim: -1. Start or receive a Jazz worker account from real configuration. -2. Load or create the project root with `CharterProject.getOrCreateUnique({ unique: ["charter-project", projectId], ... })`. -3. Configure worker sync/storage so the same project graph survives process boundaries without relying on the JSON mirror. -4. Wait for sync before process exit in CLI mode. +- `local` without a sync server; +- `edge` when a sync server is configured. -## Jazz primitives to prefer +CLI shutdown flushes the native runtime. Status must report whether distributed sync is actually configured rather than inferring it from the fact that Jazz is installed. -Use the Jazz primitive directly when it matches the job: +Workers and interfaces should use subscriptions over project-scoped queries. They must not poll controller-owned JSON snapshots or require a controller's HTTP process to be alive. -- `co.map` for mutable documents, work items, requests, and project roots. -- `co.record` for keyed collections on the project root. -- `co.feed` for append-only project events. -- `$jazz.getEdits()` for raw per-field provenance instead of copying Jazz history into Charter rows. -- `$jazz.subscribe()` / schema `subscribe` for workers and UI refresh. -- `getOrCreateUnique` for stable project roots and shared singleton collections. +## Version and branch boundary -Charter-specific code should add semantics on top of those primitives, not replace them. +Charter uses Jazz's retained row versions, ancestry, authorship, local-first reconciliation, user/environment isolation, and schema migrations. Those capabilities are described precisely in `jazz-git-boundary.md`. -## Permissions +Jazz branches are not Git refs. Repository commits, trees, patches, remotes, and merge operations remain the responsibility of a Git source adapter. -The first useful permission model is simple: +## Permission migration -- project owners can edit all rows. -- importer worker can write materialized documents, append project events, and create work items. -- read-only agents can subscribe to documents and the event feed. -- proposal agents can write request/proposal rows once that table exists. +The development policy currently grants explicit read/insert/update/delete access to all Charter tables. That is acceptable for a local specimen and unacceptable as the final network policy. -The worker should not have magical access to user data. Jazz forces explicit sharing, which is annoying in the exact way databases should be annoying when authority is real. +The next permission step is not an ad hoc ACL beside Jazz. It is a Jazz policy derived from project membership and worker role, with tests proving: -## Open design question - -Spec docs are row-shaped today. Collaborative editing may eventually want richer text CoValues or Yjs/Jazz interop. That should not block the first durable adapter. The current row model is enough for agents to read, diff, subscribe, and act. +- owners can administer membership and all project rows; +- controllers can ingest only into joined projects; +- workers can read matching project context, claim work, and write reports/proposals; +- read-only participants cannot mutate coordination state; +- revoked or expired worker authority stops working. diff --git a/spec/product-vision.md b/spec/product-vision.md index 565b63d..c9bfbfc 100644 --- a/spec/product-vision.md +++ b/spec/product-vision.md @@ -19,10 +19,14 @@ Charter is a Jazz-native workspace where the spec is the product surface and age The first real product moment should be simple: ```bash +charter project join +charter source add ./spec --include '**/*.md' charter watch ``` -That command starts a local runtime that watches the project spec, ingests filesystem edits, manages the database/event/work machinery, and writes an inspectable terminal event stream. The first product loop should feel like editing real files while Charter handles consequence tracking, not like using a half-finished Notion clone with agent wallpaper. +Those commands attach one local controller to a durable Jazz project, map arbitrary local material into that project, and keep the projection synchronized. The first product loop should feel like editing real files while Charter handles consequence tracking, not like using a half-finished Notion clone with agent wallpaper. + +The controller is local. The project is not. A Charter project can be joined by several humans, controllers, and workers on different machines. Each participant has a distinct identity and permissions. A remote worker registers where it lives and consumes Jazz state without needing the controller's filesystem. ## Build the whole thing @@ -41,9 +45,24 @@ The first version can be small. It cannot be fake. If the user edits a spec file Mockups are useful only as scaffolding. Any UI element that claims a backend behavior exists should either call the real backend path or clearly say that the behavior is not implemented yet. Charter is specifically about making coordination state explicit; shipping pretend coordination state would be a little too on the nose. +## The project graph is the runtime + +Charter is a runtime built around Jazz, not a repository CLI that happens to write database rows. + +Jazz owns the shared project graph: projects, members, normalized sources, documents, retained versions, semantic events, work, workers, leases, packets, manifests, runs, and reports. Every controller and worker opens the same project through its own Jazz identity. The local filesystem is one adapter into that graph. + +The local controller owns machine-local facts: + +- which files, folders, or repositories are selected on this machine; +- how local paths map to stable project source and document identities; +- which projections are materialized locally; +- which local runner adapters and secret references are available. + +Those facts must not leak absolute paths or credentials into shared project state. The shared graph stores portable source identity and normalized content. The local controller stores how this machine reaches it. + ## The spec is the magic object -A Charter project is a set of documents that describe what should be true. Those documents may include product specs, architecture notes, prompts, documentation, contracts, examples, procedures, or design decisions. +A Charter project is a selected set of documents that describe what should be true. Those documents may come from several folders or repositories and may include product specs, architecture notes, prompts, documentation, contracts, examples, procedures, or design decisions. Documentation is part of the spec because documentation is a contract with users. Changing a line of documentation can imply product work. Charter should notice that, create a semantic event, and make the resulting work inspectable. @@ -59,13 +78,17 @@ Jazz should be the sync engine and database substrate. Markdown files are a loca Required shape: -- spec documents live as Jazz CoValues. +- project and coordination objects live as Jazz rows with stable application identities. - filesystem Markdown edits ingest into the same graph. - rich document edits can come later when there is a reason to own an editor surface. - events, work items, agent requests, comments, spans, and run reports all share stable database identity. - the CLI, terminal logs, optional API, and future UI subscribe to the same state as agents and workers. +- local persistent Jazz runtimes remain useful offline and synchronize when connectivity returns. +- Jazz row history, edit authorship, subscriptions, durability tiers, and permissions are used directly rather than reimplemented beside it. + +The target is not a Markdown app with an agent bolted on. The target is a shared project runtime where Markdown files, APIs, logs, future UI, controllers, and distributed workers are peers. -The target is not a Markdown app with an agent bolted on. The target is a shared spec database where Markdown files, APIs, logs, future UI, and agents are peers. +Jazz is not Git. Jazz 2 retains a row-version graph and supports isolated user branches, but user branches are not Git refs and are not merged at query time. Charter can ingest Git metadata and invoke Git through a source adapter when a selected source is a repository. It must not claim that Jazz supplies repository commits, trees, patches, or merge semantics. ## Central event stream diff --git a/spec/runtime-architecture.md b/spec/runtime-architecture.md new file mode 100644 index 0000000..ddf4b77 --- /dev/null +++ b/spec/runtime-architecture.md @@ -0,0 +1,75 @@ +--- +id: runtime-architecture +kind: architecture +title: Distributed Runtime Architecture +status: active +depends_on: + - charter + - data-model + - jazz-mapping + - folder-contract +--- + +# Distributed Runtime Architecture + +Charter is a local control surface over a Jazz-native distributed project runtime. + +## Shared plane + +The Jazz project graph is shared and authoritative for portable coordination state: + +- projects and membership; +- stable source and document identities; +- normalized document content and semantic versions; +- events and work items; +- worker registrations, capabilities, presence, and leases; +- context manifests and packets; +- requests, runs, reports, and provenance. + +Each human, controller, and worker uses a distinct Jazz identity. Permissions are granted through project membership and role rows. A worker does not inherit the controller's identity merely because the controller launched or configured it. + +## Local controller plane + +A controller owns machine-local configuration: + +- project ids it has joined; +- local source selections and include/exclude rules; +- mapping from shared source ids to local absolute paths; +- local materialization targets; +- runner adapter configuration and secret references; +- local process state. + +This state is not a JSON copy of the project graph. It is a local routing table into the shared graph. It may be stored in a small controller config beside the local Jazz database. + +## Worker plane + +A worker can run anywhere. It joins the project under its own identity and registers: + +- worker id and display name; +- capabilities and accepted work selectors; +- runner/adapter kind; +- endpoint or wake-up metadata when applicable; +- current presence and lease expiry; +- non-secret configuration metadata. + +Workers subscribe to matching Jazz queries, claim work with a bounded lease, receive immutable context manifests, and report results into the same project graph. Direct access to a controller's filesystem is optional and adapter-specific, never assumed. + +## Data flow + +1. A controller joins or creates a stable Jazz project. +2. The user selects local sources. +3. Source adapters normalize selected material into shared document rows. +4. Jazz records the writes, authorship, row versions, and durability state. +5. Charter classifies meaningful changes into semantic events and work. +6. Eligible workers observe work through Jazz subscriptions. +7. One worker claims work with a lease. +8. Charter freezes a context manifest naming exact document/version identities. +9. The worker executes through its local adapter. +10. Reports, evidence, proposals, and resulting events return to Jazz. +11. Controllers and other workers observe the same state without polling a controller-owned HTTP server. + +## Process boundaries + +The CLI, optional HTTP inspector, future UI, and workers are clients of the runtime. No one long-lived `charter watch` process is the project's metaphysical center. A controller may be offline while another participant continues work from already-synchronized state. + +Durability claims must name the tier actually reached: local, edge, or global. “Saved” without a tier is not a useful statement in a local-first system. diff --git a/spec/work-queue.md b/spec/work-queue.md index a4dfa03..2d65811 100644 --- a/spec/work-queue.md +++ b/spec/work-queue.md @@ -13,19 +13,19 @@ The central event stream is the semantic spine. The work queue is one projection ## Layers -### 1. Jazz edit history +### 1. Jazz row-version history -Jazz already records edit history for CoValues. A loaded CoValue exposes field-level history through `$jazz.getEdits()`, plus metadata such as `$jazz.createdAt`, `$jazz.lastUpdatedAt`, and `$jazz.createdBy`. +Jazz 2 retains row versions with ancestry, authorship, timestamps, schema hash, environment, and user branch. Concurrent edits can produce multiple ancestors even though last-writer-wins selects the visible scalar value. -This is the raw provenance layer. It answers: who changed this CoValue field, and when? +This is the raw provenance layer. It answers: who changed this row, along which ancestry, and when? -Charter should not copy this into a second canonical history table. When raw history is needed, query Jazz history on the relevant CoValue. +Charter should not copy raw storage history into a second canonical history table. Semantic `documentVersions` exist for reproducible context and content-addressed project meaning, not as a counterfeit copy of Jazz internals. ### 2. Project event stream Charter adds semantic project events when raw edits become meaningful to agents or UI. -In Jazz, `CharterProject.events` is a CoFeed of `ProjectEvent` entries. CoFeed is the right shape because events are append-only and multi-session by design. +In Jazz, semantic events are immutable rows in the project-scoped `projectEvents` table. Queries and subscriptions provide the shared stream. Initial event sources: @@ -48,12 +48,12 @@ A project event should carry: - affected document id and path. - span id or comment id when applicable. - work item id or request id when applicable. -- source CoValue id when known. +- source Jazz row id when known. - source field/path when known. - timestamp. - authority/source. -The current Jazz adapter serializes a projection mirror of this feed into `.spec/state/spec-db.json` during local development. That file is a bootstrap/debug projection, not the event system. +The current Jazz adapter persists these rows natively. `.spec/state/jazz-runtime.json` is only an inspection receipt. ### 3. Event classification @@ -72,7 +72,7 @@ The classification should be visible. Hidden classification is where small autom ### 4. Durable work items -`CharterProject.workItems` is a record of mutable `WorkItem` CoMaps keyed by work item id. Work items are separate from feed entries because they need claim/status mutation. +`workItems` contains mutable project-scoped rows. Work items are separate from event rows because they need claim/status mutation and bounded leases. Work item lifecycle: @@ -91,7 +91,7 @@ A work item should carry: - affected span/comment when applicable. - matched consumer ids. - attached document ids. -- source CoValue id / field when known. +- source Jazz row id / field when known. - claim owner and claim timestamp. - linked packet id. - linked agent request id. @@ -105,13 +105,13 @@ Workers and agents should subscribe to the project root and event stream rather Expected shape: -1. Load `CharterProject`. -2. Load registered `AgentConsumer` rows. -3. Subscribe to `CharterProject.events` for semantic events. +1. Join a project with a distinct Jazz identity. +2. Query registered consumer and worker rows. +3. Subscribe to project-scoped semantic events and matching work. 4. Match events against consumer subscriptions. 5. Create or update corresponding `WorkItem` records. 6. Build a durable `WorkPacket` / `AgentPacket` for selected work. -7. Claim work by updating the `WorkItem` CoMap only when execution starts. +7. Claim work with a bounded `workerLeases` row only when execution starts. 8. Link the packet and request. 9. Mark packet, request, and work done, failed, blocked, ignored, or seen through the same report path. 10. Emit follow-up events when the result itself matters. diff --git a/src/agent-harness.ts b/src/agent-harness.ts index e781c7c..c372c05 100644 --- a/src/agent-harness.ts +++ b/src/agent-harness.ts @@ -199,7 +199,7 @@ Report: } function formatWorkItem(item: WorkItemRow): string { - const source = item.sourceCoValueId ? ` source=${item.sourceCoValueId}` : ""; + const source = item.sourceJazzRowId ? ` source=${item.sourceJazzRowId}` : ""; const field = item.sourceField ? ` field=${item.sourceField}` : ""; return `- ${item.id}: ${item.kind} ${item.status} event=${item.eventId} document=${item.documentId} path=${item.path}${source}${field}`; } diff --git a/src/changes.ts b/src/changes.ts index bc3a65c..c5ddb36 100644 --- a/src/changes.ts +++ b/src/changes.ts @@ -132,7 +132,7 @@ export function buildWorkItemsFromEvents( attachedDocumentIds: [event.documentId], matchedConsumerIds: matchingConsumersForEvent(event, consumers).map((consumer) => consumer.id), }; - if (event.sourceCoValueId !== undefined) row.sourceCoValueId = event.sourceCoValueId; + if (event.sourceJazzRowId !== undefined) row.sourceJazzRowId = event.sourceJazzRowId; if (event.sourceField !== undefined) row.sourceField = event.sourceField; return row; }); diff --git a/src/cli.ts b/src/cli.ts index fc995ac..30925dc 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -12,6 +12,7 @@ import { } from "./changes.js"; import { buildSpecIndex, saveSpecIndex, searchSpecIndex } from "./indexer.js"; import { buildAgentPacket, buildAgentRequest, runAgentCommand } from "./agent-harness.js"; +import { buildProjectStatus, formatProjectStatus } from "./status.js"; import type { AgentConsumerRow, AgentPacketStatus, AgentReportStatus, AgentRequestStatus, CharterDatabaseSnapshot, SpecChange, SpecImportPlan, WorkItemStatus } from "./types.js"; import type { CharterListenOptions, ServerContext } from "./server.js"; @@ -25,7 +26,7 @@ interface ParsedArgs { port: number; json: boolean; dryRun: boolean; - jazzMemory: boolean; + jazzRuntime: boolean; all: boolean; watch: boolean; watchIntervalMs?: number; @@ -170,6 +171,22 @@ async function main(): Promise { return; } + if (args.command === "status") { + const { plan, snapshot, changes } = await loadCurrentChanges(args); + const adapter = process.env.CHARTER_DB_ADAPTER === "json" ? "json" : "jazz"; + const status = buildProjectStatus({ + projectRoot: plan.projectRoot, + specRoot: plan.specRoot, + filesystemDocumentCount: plan.rows.length, + adapter, + snapshot, + changes, + jazzServerConfigured: Boolean(process.env.JAZZ_SERVER_URL), + }); + console.log(args.json ? JSON.stringify(status, null, 2) : formatProjectStatus(status)); + return; + } + if (args.command === "events") { const db = createCharterDatabase({ projectRoot: args.root, projectId: "charter" }); const snapshot = await db.loadSnapshot(); @@ -189,7 +206,7 @@ async function main(): Promise { return; } for (const event of events) { - const source = event.sourceCoValueId ? ` source=${event.sourceCoValueId}` : ""; + const source = event.sourceJazzRowId ? ` source=${event.sourceJazzRowId}` : ""; const field = event.sourceField ? ` field=${event.sourceField}` : ""; console.log(`- ${event.occurredAt} ${event.type} ${event.documentId} ${event.path} sha=${event.sha256?.slice(0, 12) ?? "none"}${source}${field}`); } @@ -243,13 +260,11 @@ async function main(): Promise { for (const item of workItems) await db.upsertWorkItem(item); await db.saveSnapshot(); - if (args.jazzMemory) { + if (args.jazzRuntime) { if (db instanceof JazzCharterDatabase) { console.log(JSON.stringify(await db.jazzManifest(), null, 2)); } else { - const { materializePlanInJazz } = await import("./jazz/materialize.js"); - const result = await materializePlanInJazz({ ...plan, events }, await db.loadSnapshot()); - console.log(JSON.stringify(result, null, 2)); + throw new Error("--jazz-runtime requires the Jazz adapter; JSON mode has no Jazz runtime to inspect"); } return; } @@ -268,8 +283,8 @@ async function main(): Promise { const previouslyMaterialized = Object.keys(snapshot.documents).length; console.log(`Synced ${plan.rows.length} spec documents into the configured database (${changedText}; ${previouslyMaterialized} previously materialized)`); console.log(`Queued ${workItems.length} durable work item${workItems.length === 1 ? "" : "s"} from project events.`); - console.log("Default adapter: src/db/jazz.ts (Jazz CoValues, with .spec/state/spec-db.json as a local projection mirror)"); - console.log("Use --jazz-values to print the active Jazz CoValue IDs."); + console.log("Default adapter: native Jazz 2 tables with persistent local storage and optional server sync."); + console.log("Use --jazz-runtime to print Jazz row IDs and durability configuration."); return; } @@ -440,7 +455,7 @@ function parseArgs(argv: string[]): ParsedArgs { let port = 4173; let json = false; let dryRun = false; - let jazzMemory = false; + let jazzRuntime = false; let all = false; let watch = false; let watchIntervalMs: number | undefined; @@ -541,8 +556,8 @@ function parseArgs(argv: string[]): ParsedArgs { json = true; } else if (value === "--dry-run") { dryRun = true; - } else if (value === "--jazz-values" || value === "--jazz-memory") { - jazzMemory = true; + } else if (value === "--jazz-runtime") { + jazzRuntime = true; } else if (value === "--all") { all = true; } else if (value === "--watch") { @@ -563,7 +578,7 @@ function parseArgs(argv: string[]): ParsedArgs { } } - const parsed: ParsedArgs = { command, positionals, help, root, specDir, host, port, json, dryRun, jazzMemory, all, watch, next, execAgent }; + const parsed: ParsedArgs = { command, positionals, help, root, specDir, host, port, json, dryRun, jazzRuntime, all, watch, next, execAgent }; if (agentCommand !== undefined) parsed.agentCommand = agentCommand; if (eventType !== undefined) parsed.eventType = eventType; if (documentId !== undefined) parsed.documentId = documentId; @@ -711,6 +726,7 @@ function printHelp(): void { Commands: watch Start the local Charter runtime: watch spec files, ingest changes, emit JSONL logs + status Summarize database truth, projection drift, queue, consumers, packets, requests, and warnings serve Start the optional local Charter HTTP inspection API/status page start Alias for serve frontend Alias for serve @@ -736,8 +752,7 @@ Options: --json Print JSON output. --dry-run For sync/index: show or build without writing state. --all Include unchanged docs in change output. - --jazz-values For sync: print the active Jazz CoValue IDs. - --jazz-memory Alias for --jazz-values. + --jazz-runtime For sync: print Jazz row IDs and durability configuration. --event-type For events: filter by event type. --document For events/work/agent: filter by document id. --status For work/queue/report: queued, claimed, running, done, ignored, failed, blocked. diff --git a/src/db/jazz.ts b/src/db/jazz.ts index 3d1cf46..e25e78e 100644 --- a/src/db/jazz.ts +++ b/src/db/jazz.ts @@ -1,26 +1,17 @@ import fs from "node:fs/promises"; +import { mkdirSync } from "node:fs"; import path from "node:path"; -import { Account, Group, setDefaultValidationMode } from "jazz-tools"; -import { WasmCrypto } from "cojson/crypto/WasmCrypto"; +import type { Db } from "jazz-tools"; +import { createJazzContext, type JazzContext } from "jazz-tools/backend"; import type { CharterDatabase } from "./adapter.js"; -import { JsonCharterDatabase } from "./json.js"; -import { - AgentConsumer, - AgentPacket, - AgentRequest, - CharterProject, - ProjectEvent, - ProjectEventFeed, - SpecDocument, - SpecDocumentVersion, - WorkItem, -} from "../jazz/schema.js"; +import { charterApp } from "../jazz/schema.js"; +import charterPermissions from "../jazz/permissions.js"; import type { + AgentConsumerRow, AgentPacketRow, AgentPacketStatus, AgentRequestRow, AgentRequestStatus, - AgentConsumerRow, CharterDatabaseSnapshot, ProjectEventRow, SpecDocumentRow, @@ -28,466 +19,380 @@ import type { WorkItemStatus, } from "../types.js"; -interface JazzRuntime { - accountId: string; - owner: ReturnType; - project: ReturnType; - snapshot: CharterDatabaseSnapshot; - documents: Record>; - versions: Record>; - workItems: Record>; - consumers: Record>; - packets: Record>; - requests: Record>; - eventIds: Set; -} - export interface JazzCharterDatabaseOptions { projectRoot: string; projectId?: string; - statePath?: string; + dataPath?: string; manifestPath?: string; + appId?: string; + serverUrl?: string; + backendSecret?: string; + adminSecret?: string; } +type JazzTable = { where(input: Record): { limit(count: number): unknown } }; + /** - * Jazz-backed Charter database adapter. + * Persistent Jazz 2 table adapter. * - * The adapter now uses the Jazz schema as the live mutation surface: document, - * event, work-item, and request writes update CoValues first, then a JSON mirror - * is saved as a local bootstrap/debug snapshot. That mirror is not the runtime - * database. It is the compatibility layer until a worker account/sync-server - * bootstrap can load the same project root durably across processes. + * There is deliberately no JSON snapshot bootstrap here. Jazz's native local + * store is the database and can synchronize with a configured Jazz server. + * JSON files are permitted as explicit imports/exports, never as hidden runtime + * authority. */ export class JazzCharterDatabase implements CharterDatabase { - private readonly mirror: JsonCharterDatabase; - private runtime: JazzRuntime | undefined; + private readonly projectKey: string; + private readonly context: JazzContext; + private readonly db: Db; + private readonly durabilityTier: "local" | "edge"; constructor(private readonly options: JazzCharterDatabaseOptions) { - this.mirror = new JsonCharterDatabase(options); + this.projectKey = options.projectId ?? "charter"; + const serverUrl = options.serverUrl ?? process.env.JAZZ_SERVER_URL; + const backendSecret = options.backendSecret ?? process.env.JAZZ_BACKEND_SECRET; + const adminSecret = options.adminSecret ?? process.env.JAZZ_ADMIN_SECRET; + this.durabilityTier = serverUrl ? "edge" : "local"; + + const dataPath = options.dataPath ?? path.join(options.projectRoot, ".spec", "state", "jazz.sqlite"); + mkdirSync(path.dirname(dataPath), { recursive: true }); + const config = { + appId: options.appId ?? process.env.JAZZ_APP_ID ?? `charter-${this.projectKey}`, + app: charterApp, + permissions: charterPermissions, + driver: { + type: "persistent" as const, + dataPath, + }, + env: process.env.JAZZ_ENV ?? "dev", + userBranch: process.env.JAZZ_USER_BRANCH ?? "main", + ...(serverUrl ? { serverUrl } : {}), + ...(backendSecret ? { backendSecret } : {}), + ...(adminSecret ? { adminSecret } : {}), + }; + + this.context = createJazzContext(config); + this.db = serverUrl ? this.context.asBackend() : this.context.db(); + this.db.onMutationError((error) => { + console.error("Charter Jazz mutation rejected", error); + }); } async loadSnapshot(): Promise { - return (await this.ensureRuntime()).snapshot; + await this.ensureProject(); + const [projects, documents, events, workItems, consumers, packets, requests] = await Promise.all([ + this.db.all(charterApp.projects.where({ key: this.projectKey })), + this.db.all(charterApp.documents.where({ projectKey: this.projectKey })), + this.db.all(charterApp.projectEvents.where({ projectKey: this.projectKey })), + this.db.all(charterApp.workItems.where({ projectKey: this.projectKey })), + this.db.all(charterApp.consumers.where({ projectKey: this.projectKey })), + this.db.all(charterApp.packets.where({ projectKey: this.projectKey })), + this.db.all(charterApp.requests.where({ projectKey: this.projectKey })), + ]); + + const project = projects[0]; + const documentRows: Record = Object.fromEntries(documents.map((row) => [row.key, documentFromJazz(row)])); + return { + projectId: this.projectKey, + updatedAt: project?.updatedAt ?? new Date(0).toISOString(), + documents: documentRows, + pathIndex: Object.fromEntries(Object.values(documentRows).map((row) => [row.path, row.id])), + events: events.map(eventFromJazz).sort((a, b) => a.occurredAt.localeCompare(b.occurredAt) || a.id.localeCompare(b.id)), + workItems: Object.fromEntries(workItems.map((row) => [row.key, workItemFromJazz(row)])), + consumers: Object.fromEntries(consumers.map((row) => [row.key, consumerFromJazz(row)])), + packets: Object.fromEntries(packets.map((row) => [row.key, packetFromJazz(row)])), + requests: Object.fromEntries(requests.map((row) => [row.key, requestFromJazz(row)])), + }; } async upsertDocument(row: SpecDocumentRow): Promise { - const runtime = await this.ensureRuntime(); - const previous = runtime.snapshot.documents[row.id]; - if (previous && previous.path !== row.path) { - delete runtime.snapshot.pathIndex[previous.path]; - } - - runtime.snapshot.documents[row.id] = row; - runtime.snapshot.pathIndex[row.path] = row.id; - this.touch(runtime); - - let document = runtime.documents[row.id]; - if (!document) { - document = SpecDocument.create(row, runtime.owner); - runtime.documents[row.id] = document; - runtime.project.documents.$jazz.set(row.id, document); - } else { - setCoMapFields(document, row); - } + await this.ensureProject(); + await this.upsertRow(charterApp.documents, row.id, { + key: row.id, + projectKey: this.projectKey, + sourceKey: "local:spec", + path: row.path, + title: row.title, + kind: row.kind, + status: row.status, + body: row.body, + frontmatterJson: row.frontmatterJson, + headingsJson: row.headingsJson, + sha256: row.sha256, + sizeBytes: row.sizeBytes, + mtimeMs: row.mtimeMs, + importedAt: row.importedAt, + }); - const versionId = `${row.id}:${row.sha256}`; - if (!runtime.versions[versionId]) { - const version = SpecDocumentVersion.create(specVersionInit(row, versionId), runtime.owner); - runtime.versions[versionId] = version; - runtime.project.versions.$jazz.set(versionId, version); - } - runtime.project.$jazz.set("updatedAt", runtime.snapshot.updatedAt); + const versionKey = `${row.id}:${row.sha256}`; + await this.upsertRow(charterApp.documentVersions, versionKey, { + key: versionKey, + projectKey: this.projectKey, + documentKey: row.id, + sourceKey: "local:spec", + path: row.path, + sha256: row.sha256, + body: row.body, + frontmatterJson: row.frontmatterJson, + headingsJson: row.headingsJson, + importedAt: row.importedAt, + }); + await this.touchProject(); } async deleteDocument(documentId: string): Promise { - const runtime = await this.ensureRuntime(); - const existing = runtime.snapshot.documents[documentId]; - if (existing) delete runtime.snapshot.pathIndex[existing.path]; - delete runtime.snapshot.documents[documentId]; - this.touch(runtime); - - if (runtime.documents[documentId]) { - runtime.project.documents.$jazz.delete(documentId); - delete runtime.documents[documentId]; - } - runtime.project.$jazz.set("updatedAt", runtime.snapshot.updatedAt); + await this.deleteRow(charterApp.documents, documentId); + await this.touchProject(); } async appendEvent(event: ProjectEventRow): Promise { - const runtime = await this.ensureRuntime(); - if (runtime.eventIds.has(event.id)) return; - - runtime.snapshot.events.push(event); - runtime.eventIds.add(event.id); - this.touch(runtime); - - runtime.project.events.$jazz.push(projectEventInit(event)); - runtime.project.$jazz.set("updatedAt", runtime.snapshot.updatedAt); + await this.upsertRow(charterApp.projectEvents, event.id, { + key: event.id, + projectKey: this.projectKey, + type: event.type, + documentKey: event.documentId, + path: event.path, + sha256: event.sha256 ?? "", + occurredAt: event.occurredAt, + authority: event.authority, + sourceJazzRowId: event.sourceJazzRowId ?? "", + sourceField: event.sourceField ?? "", + }); + await this.touchProject(); } async upsertWorkItem(row: WorkItemRow): Promise { - const runtime = await this.ensureRuntime(); - runtime.snapshot.workItems[row.id] = row; - this.touch(runtime); - - const fields = workItemInit(row); - const existing = runtime.workItems[row.id]; - if (existing) { - setCoMapFields(existing, fields); - } else { - const workItem = WorkItem.create(fields, runtime.owner); - runtime.workItems[row.id] = workItem; - runtime.project.workItems.$jazz.set(row.id, workItem); - } - runtime.project.$jazz.set("updatedAt", runtime.snapshot.updatedAt); + await this.upsertRow(charterApp.workItems, row.id, workItemToJazz(this.projectKey, row)); + await this.touchProject(); } async updateWorkItemStatus(id: string, status: WorkItemStatus, fields: Partial = {}): Promise { - const runtime = await this.ensureRuntime(); - const item = runtime.snapshot.workItems[id]; - if (!item) throw new Error(`Unknown work item: ${id}`); - const next: WorkItemRow = { - ...item, - ...fields, - status, - updatedAt: new Date().toISOString(), - }; - await this.upsertWorkItem(next); + const current = (await this.loadSnapshot()).workItems[id]; + if (!current) throw new Error(`Unknown work item: ${id}`); + await this.upsertWorkItem({ ...current, ...fields, status, updatedAt: new Date().toISOString() }); } async upsertAgentConsumer(row: AgentConsumerRow): Promise { - const runtime = await this.ensureRuntime(); - runtime.snapshot.consumers[row.id] = row; - this.touch(runtime); - - const fields = agentConsumerInit(row); - const existing = runtime.consumers[row.id]; - if (existing) { - setCoMapFields(existing, fields); - } else { - const consumer = AgentConsumer.create(fields, runtime.owner); - runtime.consumers[row.id] = consumer; - runtime.project.consumers.$jazz.set(row.id, consumer); - } - runtime.project.$jazz.set("updatedAt", runtime.snapshot.updatedAt); + await this.upsertRow(charterApp.consumers, row.id, consumerToJazz(this.projectKey, row)); + await this.touchProject(); } async upsertAgentPacket(row: AgentPacketRow): Promise { - const runtime = await this.ensureRuntime(); - runtime.snapshot.packets[row.id] = row; - this.touch(runtime); - - const fields = agentPacketInit(row); - const existing = runtime.packets[row.id]; - if (existing) { - setCoMapFields(existing, fields); - } else { - const packet = AgentPacket.create(fields, runtime.owner); - runtime.packets[row.id] = packet; - runtime.project.packets.$jazz.set(row.id, packet); - } - runtime.project.$jazz.set("updatedAt", runtime.snapshot.updatedAt); + await this.upsertRow(charterApp.packets, row.id, packetToJazz(this.projectKey, row)); + await this.touchProject(); } async updateAgentPacketStatus(id: string, status: AgentPacketStatus, fields: Partial = {}): Promise { - const runtime = await this.ensureRuntime(); - const packet = runtime.snapshot.packets[id]; - if (!packet) throw new Error(`Unknown agent packet: ${id}`); - const next: AgentPacketRow = { - ...packet, - ...fields, - status, - updatedAt: new Date().toISOString(), - }; - await this.upsertAgentPacket(next); + const current = (await this.loadSnapshot()).packets[id]; + if (!current) throw new Error(`Unknown agent packet: ${id}`); + await this.upsertAgentPacket({ ...current, ...fields, status, updatedAt: new Date().toISOString() }); } async upsertAgentRequest(row: AgentRequestRow): Promise { - const runtime = await this.ensureRuntime(); - runtime.snapshot.requests[row.id] = row; - this.touch(runtime); - - const fields = agentRequestInit(row); - const existing = runtime.requests[row.id]; - if (existing) { - setCoMapFields(existing, fields); - } else { - const request = AgentRequest.create(fields, runtime.owner); - runtime.requests[row.id] = request; - runtime.project.requests.$jazz.set(row.id, request); - } - runtime.project.$jazz.set("updatedAt", runtime.snapshot.updatedAt); + await this.upsertRow(charterApp.requests, row.id, requestToJazz(this.projectKey, row)); + await this.touchProject(); } async updateAgentRequestStatus(id: string, status: AgentRequestStatus, fields: Partial = {}): Promise { - const runtime = await this.ensureRuntime(); - const request = runtime.snapshot.requests[id]; - if (!request) throw new Error(`Unknown agent request: ${id}`); - const next: AgentRequestRow = { - ...request, - ...fields, - status, - updatedAt: new Date().toISOString(), - }; - await this.upsertAgentRequest(next); + const current = (await this.loadSnapshot()).requests[id]; + if (!current) throw new Error(`Unknown agent request: ${id}`); + await this.upsertAgentRequest({ ...current, ...fields, status, updatedAt: new Date().toISOString() }); } async saveSnapshot(): Promise { - const runtime = await this.ensureRuntime(); - await this.mirror.saveSnapshot(); - await this.writeManifest(runtime); + this.context.flush(); + await this.writeManifest(); + } + + async close(): Promise { + await this.context.shutdown(); } async jazzManifest(): Promise { - return this.buildManifest(await this.ensureRuntime()); + const [projects, documents, versions, events, workItems, consumers, packets, requests, workers, leases] = await Promise.all([ + this.db.all(charterApp.projects.where({ key: this.projectKey })), + this.db.all(charterApp.documents.where({ projectKey: this.projectKey })), + this.db.all(charterApp.documentVersions.where({ projectKey: this.projectKey })), + this.db.all(charterApp.projectEvents.where({ projectKey: this.projectKey })), + this.db.all(charterApp.workItems.where({ projectKey: this.projectKey })), + this.db.all(charterApp.consumers.where({ projectKey: this.projectKey })), + this.db.all(charterApp.packets.where({ projectKey: this.projectKey })), + this.db.all(charterApp.requests.where({ projectKey: this.projectKey })), + this.db.all(charterApp.workers.where({ projectKey: this.projectKey })), + this.db.all(charterApp.workerLeases.where({ projectKey: this.projectKey })), + ]); + return { + adapter: "jazz-2", + appId: this.options.appId ?? process.env.JAZZ_APP_ID ?? `charter-${this.projectKey}`, + projectKey: this.projectKey, + durabilityTier: this.durabilityTier, + dataPath: this.options.dataPath ?? path.join(this.options.projectRoot, ".spec", "state", "jazz.sqlite"), + serverUrlConfigured: Boolean(this.options.serverUrl ?? process.env.JAZZ_SERVER_URL), + projectRowId: projects[0]?.id ?? "", + documentRowIds: keyedIds(documents), + versionRowIds: keyedIds(versions), + eventRowIds: keyedIds(events), + workItemRowIds: keyedIds(workItems), + consumerRowIds: keyedIds(consumers), + packetRowIds: keyedIds(packets), + requestRowIds: keyedIds(requests), + workerRowIds: keyedIds(workers), + leaseRowIds: keyedIds(leases), + }; } - private async ensureRuntime(): Promise { - if (this.runtime) return this.runtime; + private async ensureProject(): Promise { + const existing = await this.db.one(charterApp.projects.where({ key: this.projectKey }).limit(1)); + if (existing) return; + const now = new Date().toISOString(); + await this.wait(this.db.insert(charterApp.projects, { + key: this.projectKey, + name: this.projectKey, + createdAt: now, + updatedAt: now, + })); + } - setDefaultValidationMode("strict"); - const snapshot = await this.mirror.loadSnapshot(); - const crypto = await WasmCrypto.create(); - const account = await Account.create({ - creationProps: { name: `charter ${snapshot.projectId} adapter` }, - crypto, - }); - const owner = Group.create({ owner: account }); - - const documents = Object.fromEntries( - Object.values(snapshot.documents).map((row) => [row.id, SpecDocument.create(row, owner)]), - ); - const versions = Object.fromEntries( - Object.values(snapshot.documents).map((row) => { - const versionId = `${row.id}:${row.sha256}`; - return [versionId, SpecDocumentVersion.create(specVersionInit(row, versionId), owner)]; - }), - ); - const events = ProjectEventFeed.create(snapshot.events.map(projectEventInit), owner); - const workItems = Object.fromEntries( - Object.values(snapshot.workItems).map((row) => [row.id, WorkItem.create(workItemInit(row), owner)]), - ); - const consumers = Object.fromEntries( - Object.values(snapshot.consumers).map((row) => [row.id, AgentConsumer.create(agentConsumerInit(row), owner)]), - ); - const packets = Object.fromEntries( - Object.values(snapshot.packets).map((row) => [row.id, AgentPacket.create(agentPacketInit(row), owner)]), - ); - const requests = Object.fromEntries( - Object.values(snapshot.requests).map((row) => [row.id, AgentRequest.create(agentRequestInit(row), owner)]), - ); - - const project = CharterProject.create( - { - projectId: snapshot.projectId, - name: this.options.projectId ?? snapshot.projectId, - documents, - versions, - events, - workItems, - consumers, - packets, - requests, - updatedAt: snapshot.updatedAt, - }, - owner, - ); - - this.runtime = { - accountId: account.$jazz.id, - owner, - project, - snapshot, - documents, - versions, - workItems, - consumers, - packets, - requests, - eventIds: new Set(snapshot.events.map((event) => event.id)), - }; - return this.runtime; + private async touchProject(): Promise { + const project = await this.db.one(charterApp.projects.where({ key: this.projectKey }).limit(1)); + if (!project) return this.ensureProject(); + await this.wait(this.db.update(charterApp.projects, project.id, { updatedAt: new Date().toISOString() })); } - private touch(runtime: JazzRuntime): void { - runtime.snapshot.updatedAt = new Date().toISOString(); + private async upsertRow(table: JazzTable, key: string, data: Record): Promise { + const typedTable = table as never; + const query = table + .where({ key, projectKey: this.projectKey }) + .limit(1); + const existing = await this.db.one(query as never); + if (existing && typeof existing === "object" && "id" in existing) { + await this.wait(this.db.update(typedTable, String(existing.id), data)); + return; + } + await this.wait(this.db.insert(typedTable, data)); } - private manifestPath(): string { - return this.options.manifestPath ?? path.join(this.options.projectRoot, ".spec", "state", "jazz-values.json"); + private async deleteRow(table: JazzTable, key: string): Promise { + const typedTable = table as never; + const query = table + .where({ key, projectKey: this.projectKey }) + .limit(1); + const existing = await this.db.one(query as never); + if (existing && typeof existing === "object" && "id" in existing) { + await this.wait(this.db.delete(typedTable, String(existing.id))); + } } - private async writeManifest(runtime: JazzRuntime): Promise { - const manifestPath = this.manifestPath(); - await fs.mkdir(path.dirname(manifestPath), { recursive: true }); - await fs.writeFile(manifestPath, `${JSON.stringify(this.buildManifest(runtime), null, 2)}\n`, "utf8"); + private async wait(write: { wait(options: { tier: "local" | "edge" }): Promise }): Promise { + await write.wait({ tier: this.durabilityTier }); } - private buildManifest(runtime: JazzRuntime): JazzDatabaseManifest { - return { - adapter: "jazz", - note: "Runtime state is mutated through Jazz CoValues. spec-db.json is a local bootstrap/debug projection mirror, not the active adapter.", - accountId: runtime.accountId, - projectCoValueId: runtime.project.$jazz.id, - eventsFeedCoValueId: runtime.project.events.$jazz.id, - documentCoValueIds: Object.fromEntries( - Object.entries(runtime.documents).map(([id, document]) => [id, document.$jazz.id]), - ), - versionCoValueIds: Object.fromEntries( - Object.entries(runtime.versions).map(([id, version]) => [id, version.$jazz.id]), - ), - workItemCoValueIds: Object.fromEntries( - Object.entries(runtime.workItems).map(([id, item]) => [id, item.$jazz.id]), - ), - consumerCoValueIds: Object.fromEntries( - Object.entries(runtime.consumers).map(([id, consumer]) => [id, consumer.$jazz.id]), - ), - packetCoValueIds: Object.fromEntries( - Object.entries(runtime.packets).map(([id, packet]) => [id, packet.$jazz.id]), - ), - requestCoValueIds: Object.fromEntries( - Object.entries(runtime.requests).map(([id, request]) => [id, request.$jazz.id]), - ), - }; + private async writeManifest(): Promise { + const manifestPath = this.options.manifestPath ?? path.join(this.options.projectRoot, ".spec", "state", "jazz-runtime.json"); + await fs.mkdir(path.dirname(manifestPath), { recursive: true }); + await fs.writeFile(manifestPath, `${JSON.stringify(await this.jazzManifest(), null, 2)}\n`, "utf8"); } } export interface JazzDatabaseManifest { - adapter: "jazz"; - note: string; - accountId: string; - projectCoValueId: string; - eventsFeedCoValueId: string; - documentCoValueIds: Record; - versionCoValueIds: Record; - workItemCoValueIds: Record; - consumerCoValueIds: Record; - packetCoValueIds: Record; - requestCoValueIds: Record; + adapter: "jazz-2"; + appId: string; + projectKey: string; + durabilityTier: "local" | "edge"; + dataPath: string; + serverUrlConfigured: boolean; + projectRowId: string; + documentRowIds: Record; + versionRowIds: Record; + eventRowIds: Record; + workItemRowIds: Record; + consumerRowIds: Record; + packetRowIds: Record; + requestRowIds: Record; + workerRowIds: Record; + leaseRowIds: Record; } -function specVersionInit(row: SpecDocumentRow, versionId: string) { - return { - id: versionId, - documentId: row.id, - path: row.path, - sha256: row.sha256, - body: row.body, - frontmatterJson: row.frontmatterJson, - headingsJson: row.headingsJson, - importedAt: row.importedAt, - }; +function keyedIds(rows: Array>): Record { + return Object.fromEntries(rows.map((row) => [String(row.key), String(row.id)])); } -function projectEventInit(event: ProjectEventRow) { +function documentFromJazz(row: Record): SpecDocumentRow { return { - id: event.id, - type: event.type, - documentId: event.documentId, - path: event.path, - sha256: event.sha256 ?? "", - occurredAt: event.occurredAt, - authority: event.authority, - sourceCoValueId: event.sourceCoValueId ?? "", - sourceField: event.sourceField ?? "", + id: String(row.key), path: String(row.path), title: String(row.title), kind: String(row.kind) as SpecDocumentRow["kind"], + status: String(row.status), body: String(row.body), frontmatterJson: String(row.frontmatterJson), + headingsJson: String(row.headingsJson), sha256: String(row.sha256), sizeBytes: Number(row.sizeBytes), + mtimeMs: Number(row.mtimeMs), importedAt: String(row.importedAt), }; } -function workItemInit(item: WorkItemRow) { +function eventFromJazz(row: Record): ProjectEventRow { + const source = String(row.sourceJazzRowId ?? ""); + const field = String(row.sourceField ?? ""); return { - id: item.id, - kind: item.kind, - status: item.status, - eventId: item.eventId, - documentId: item.documentId, - path: item.path, - title: item.title, - createdAt: item.createdAt, - updatedAt: item.updatedAt, - authority: item.authority, - attachedDocumentIdsJson: JSON.stringify(item.attachedDocumentIds), - matchedConsumerIdsJson: JSON.stringify(item.matchedConsumerIds), - sourceCoValueId: item.sourceCoValueId ?? "", - sourceField: item.sourceField ?? "", - claimedBy: item.claimedBy ?? "", - claimedAt: item.claimedAt ?? "", - requestId: item.requestId ?? "", - resultText: item.resultText ?? "", - reportedAt: item.reportedAt ?? "", + id: String(row.key), type: String(row.type) as ProjectEventRow["type"], documentId: String(row.documentKey), + path: String(row.path), occurredAt: String(row.occurredAt), authority: String(row.authority) as ProjectEventRow["authority"], + ...(String(row.sha256 ?? "") ? { sha256: String(row.sha256) } : {}), + ...(source ? { sourceJazzRowId: source } : {}), ...(field ? { sourceField: field } : {}), }; } -function agentConsumerInit(consumer: AgentConsumerRow) { +function workItemToJazz(projectKey: string, row: WorkItemRow): Record { return { - id: consumer.id, - name: consumer.name, - status: consumer.status, - runnerKind: consumer.runnerKind, - runnerCommand: consumer.runnerCommand ?? "", - runnerConfigJson: consumer.runnerConfigJson, - eventTypesJson: JSON.stringify(consumer.eventTypes), - documentSelectorsJson: JSON.stringify(consumer.documentSelectors), - promptDocumentIdsJson: JSON.stringify(consumer.promptDocumentIds), - defaultContextDocumentIdsJson: JSON.stringify(consumer.defaultContextDocumentIds), - cursorJson: consumer.cursorJson, - createdAt: consumer.createdAt, - updatedAt: consumer.updatedAt, + key: row.id, projectKey, kind: row.kind, status: row.status, eventKey: row.eventId, documentKey: row.documentId, + path: row.path, title: row.title, createdAt: row.createdAt, updatedAt: row.updatedAt, authority: row.authority, + attachedDocumentIdsJson: JSON.stringify(row.attachedDocumentIds), matchedConsumerIdsJson: JSON.stringify(row.matchedConsumerIds), + sourceJazzRowId: row.sourceJazzRowId ?? "", sourceField: row.sourceField ?? "", claimedBy: row.claimedBy ?? "", + claimedAt: row.claimedAt ?? "", leaseKey: "", requestKey: row.requestId ?? "", resultText: row.resultText ?? "", + reportedAt: row.reportedAt ?? "", }; } -function agentPacketInit(packet: AgentPacketRow) { - return { - id: packet.id, - status: packet.status, - createdAt: packet.createdAt, - updatedAt: packet.updatedAt, - consumerId: packet.consumerId ?? "", - requestId: packet.requestId ?? "", - command: packet.command, - workItemIdsJson: JSON.stringify(packet.workItemIds), - eventIdsJson: JSON.stringify(packet.eventIds), - affectedDocumentIdsJson: JSON.stringify(packet.affectedDocumentIds), - promptDocumentIdsJson: JSON.stringify(packet.promptDocumentIds), - attachedDocumentIdsJson: JSON.stringify(packet.attachedDocumentIds), - documentVersionIdsJson: JSON.stringify(packet.documentVersionIds), - prompt: packet.prompt, - promptSha256: packet.promptSha256, - outputContract: packet.outputContract, - resultText: packet.resultText ?? "", - stdoutText: packet.stdoutText ?? "", - stderrText: packet.stderrText ?? "", - outputText: packet.outputText ?? "", - reportStatus: packet.reportStatus ?? "", - reportedAt: packet.reportedAt ?? "", - exitCode: packet.exitCode ?? 0, - }; +function workItemFromJazz(row: Record): WorkItemRow { + return optionalFields({ + id: String(row.key), kind: String(row.kind) as WorkItemRow["kind"], status: String(row.status) as WorkItemStatus, + eventId: String(row.eventKey), documentId: String(row.documentKey), path: String(row.path), title: String(row.title), + createdAt: String(row.createdAt), updatedAt: String(row.updatedAt), authority: String(row.authority) as WorkItemRow["authority"], + attachedDocumentIds: parseStringArray(row.attachedDocumentIdsJson), matchedConsumerIds: parseStringArray(row.matchedConsumerIdsJson), + }, row, { sourceJazzRowId: "sourceJazzRowId", sourceField: "sourceField", claimedBy: "claimedBy", claimedAt: "claimedAt", requestId: "requestKey", resultText: "resultText", reportedAt: "reportedAt" }); } -function agentRequestInit(request: AgentRequestRow) { - return { - id: request.id, - status: request.status, - createdAt: request.createdAt, - updatedAt: request.updatedAt, - requestedBy: request.requestedBy, - consumerId: request.consumerId ?? "", - packetId: request.packetId ?? "", - command: request.command, - changeIdsJson: JSON.stringify(request.changeIds), - workItemIdsJson: JSON.stringify(request.workItemIds), - attachedDocumentIdsJson: JSON.stringify(request.attachedDocumentIds), - prompt: request.prompt, - promptSha256: request.promptSha256, - resultText: request.resultText ?? "", - stdoutText: request.stdoutText ?? "", - stderrText: request.stderrText ?? "", - outputText: request.outputText ?? "", - reportStatus: request.reportStatus ?? "", - reportedAt: request.reportedAt ?? "", - exitCode: request.exitCode ?? 0, - }; +function consumerToJazz(projectKey: string, row: AgentConsumerRow): Record { + return { key: row.id, projectKey, name: row.name, status: row.status, runnerKind: row.runnerKind, runnerCommand: row.runnerCommand ?? "", runnerConfigJson: row.runnerConfigJson, eventTypesJson: JSON.stringify(row.eventTypes), documentSelectorsJson: JSON.stringify(row.documentSelectors), promptDocumentIdsJson: JSON.stringify(row.promptDocumentIds), defaultContextDocumentIdsJson: JSON.stringify(row.defaultContextDocumentIds), cursorJson: row.cursorJson, createdAt: row.createdAt, updatedAt: row.updatedAt }; +} + +function consumerFromJazz(row: Record): AgentConsumerRow { + return optionalFields({ id: String(row.key), name: String(row.name), status: String(row.status) as AgentConsumerRow["status"], runnerKind: String(row.runnerKind) as AgentConsumerRow["runnerKind"], runnerConfigJson: String(row.runnerConfigJson), eventTypes: parseStringArray(row.eventTypesJson), documentSelectors: parseStringArray(row.documentSelectorsJson), promptDocumentIds: parseStringArray(row.promptDocumentIdsJson), defaultContextDocumentIds: parseStringArray(row.defaultContextDocumentIdsJson), cursorJson: String(row.cursorJson), createdAt: String(row.createdAt), updatedAt: String(row.updatedAt) }, row, { runnerCommand: "runnerCommand" }); +} + +function packetToJazz(projectKey: string, row: AgentPacketRow): Record { + return { key: row.id, projectKey, status: row.status, createdAt: row.createdAt, updatedAt: row.updatedAt, consumerKey: row.consumerId ?? "", requestKey: row.requestId ?? "", command: row.command, workItemIdsJson: JSON.stringify(row.workItemIds), eventIdsJson: JSON.stringify(row.eventIds), affectedDocumentIdsJson: JSON.stringify(row.affectedDocumentIds), promptDocumentIdsJson: JSON.stringify(row.promptDocumentIds), attachedDocumentIdsJson: JSON.stringify(row.attachedDocumentIds), documentVersionIdsJson: JSON.stringify(row.documentVersionIds), prompt: row.prompt, promptSha256: row.promptSha256, outputContract: row.outputContract, resultText: row.resultText ?? "", stdoutText: row.stdoutText ?? "", stderrText: row.stderrText ?? "", outputText: row.outputText ?? "", reportStatus: row.reportStatus ?? "", reportedAt: row.reportedAt ?? "", exitCode: row.exitCode ?? 0 }; +} + +function packetFromJazz(row: Record): AgentPacketRow { + return optionalFields({ id: String(row.key), status: String(row.status) as AgentPacketRow["status"], createdAt: String(row.createdAt), updatedAt: String(row.updatedAt), command: String(row.command), workItemIds: parseStringArray(row.workItemIdsJson), eventIds: parseStringArray(row.eventIdsJson), affectedDocumentIds: parseStringArray(row.affectedDocumentIdsJson), promptDocumentIds: parseStringArray(row.promptDocumentIdsJson), attachedDocumentIds: parseStringArray(row.attachedDocumentIdsJson), documentVersionIds: parseStringRecord(row.documentVersionIdsJson), prompt: String(row.prompt), promptSha256: String(row.promptSha256), outputContract: String(row.outputContract) }, row, { consumerId: "consumerKey", requestId: "requestKey", resultText: "resultText", stdoutText: "stdoutText", stderrText: "stderrText", outputText: "outputText", reportStatus: "reportStatus", reportedAt: "reportedAt", exitCode: "exitCode" }); +} + +function requestToJazz(projectKey: string, row: AgentRequestRow): Record { + return { key: row.id, projectKey, status: row.status, createdAt: row.createdAt, updatedAt: row.updatedAt, requestedBy: row.requestedBy, consumerKey: row.consumerId ?? "", packetKey: row.packetId ?? "", command: row.command, changeIdsJson: JSON.stringify(row.changeIds), workItemIdsJson: JSON.stringify(row.workItemIds), attachedDocumentIdsJson: JSON.stringify(row.attachedDocumentIds), prompt: row.prompt, promptSha256: row.promptSha256, resultText: row.resultText ?? "", stdoutText: row.stdoutText ?? "", stderrText: row.stderrText ?? "", outputText: row.outputText ?? "", reportStatus: row.reportStatus ?? "", reportedAt: row.reportedAt ?? "", exitCode: row.exitCode ?? 0 }; +} + +function requestFromJazz(row: Record): AgentRequestRow { + return optionalFields({ id: String(row.key), status: String(row.status) as AgentRequestRow["status"], createdAt: String(row.createdAt), updatedAt: String(row.updatedAt), requestedBy: String(row.requestedBy) as AgentRequestRow["requestedBy"], command: String(row.command), changeIds: parseStringArray(row.changeIdsJson), workItemIds: parseStringArray(row.workItemIdsJson), attachedDocumentIds: parseStringArray(row.attachedDocumentIdsJson), prompt: String(row.prompt), promptSha256: String(row.promptSha256) }, row, { consumerId: "consumerKey", packetId: "packetKey", resultText: "resultText", stdoutText: "stdoutText", stderrText: "stderrText", outputText: "outputText", reportStatus: "reportStatus", reportedAt: "reportedAt", exitCode: "exitCode" }); +} + +function optionalFields(base: T, source: Record, mapping: Record): T { + const output = { ...base } as T & Record; + for (const [target, key] of Object.entries(mapping)) { + const value = source[key]; + if (value !== "" && value !== undefined && value !== null) (output as Record)[target] = value; + } + return output; +} + +function parseStringArray(value: unknown): string[] { + try { const parsed: unknown = JSON.parse(String(value)); return Array.isArray(parsed) ? parsed.map(String) : []; } catch { return []; } } -function setCoMapFields(coValue: { $jazz: { set(key: string, value: unknown): void } }, fields: object): void { - for (const [key, value] of Object.entries(fields)) coValue.$jazz.set(key, value); +function parseStringRecord(value: unknown): Record { + try { const parsed: unknown = JSON.parse(String(value)); return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? Object.fromEntries(Object.entries(parsed).map(([key, item]) => [key, String(item)])) : {}; } catch { return {}; } } diff --git a/src/jazz/index.ts b/src/jazz/index.ts index 8f04131..c34f679 100644 --- a/src/jazz/index.ts +++ b/src/jazz/index.ts @@ -1,2 +1,2 @@ export * from "./schema.js"; -export * from "./materialize.js"; +export * from "./permissions.js"; diff --git a/src/jazz/materialize.ts b/src/jazz/materialize.ts deleted file mode 100644 index 5fd27ae..0000000 --- a/src/jazz/materialize.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { Account, Group, setDefaultValidationMode } from "jazz-tools"; -import { WasmCrypto } from "cojson/crypto/WasmCrypto"; -import { - AgentConsumer, - AgentPacket, - AgentRequest, - CharterProject, - ProjectEventFeed, - SpecDocument, - SpecDocumentVersion, - WorkItem, -} from "./schema.js"; -import type { AgentConsumerRow, AgentPacketRow, AgentRequestRow, CharterDatabaseSnapshot, ProjectEventRow, SpecImportPlan, WorkItemRow } from "../types.js"; - -export interface JazzMaterializationResult { - accountId: string; - projectCoValueId: string; - documentCoValueIds: Record; - eventsFeedCoValueId: string; - workItemCoValueIds: Record; - consumerCoValueIds: Record; - packetCoValueIds: Record; - requestCoValueIds: Record; -} - -/** - * Materialize an import plan into real Jazz CoValues in memory. - * - * This proves the Markdown -> Jazz shape without requiring persistent worker - * credentials or a sync server. The resulting IDs are useful for inspection, - * but the data is not durable until wired through `jazz-tools/worker` storage. - */ -export async function materializePlanInJazz(plan: SpecImportPlan, snapshot?: CharterDatabaseSnapshot): Promise { - setDefaultValidationMode("strict"); - const crypto = await WasmCrypto.create(); - const account = await Account.create({ - creationProps: { name: "charter importer" }, - crypto, - }); - const owner = Group.create({ owner: account }); - - const documents = Object.fromEntries( - plan.rows.map((row) => [row.id, SpecDocument.create(row, owner)]), - ); - - const versions = Object.fromEntries( - plan.rows.map((row) => [ - `${row.id}:${row.sha256}`, - SpecDocumentVersion.create( - { - id: `${row.id}:${row.sha256}`, - documentId: row.id, - path: row.path, - sha256: row.sha256, - body: row.body, - frontmatterJson: row.frontmatterJson, - headingsJson: row.headingsJson, - importedAt: row.importedAt, - }, - owner, - ), - ]), - ); - - const eventRows = snapshot?.events ?? plan.events; - const events = ProjectEventFeed.create(eventRows.map(projectEventInit), owner); - - const workItems = Object.fromEntries( - Object.values(snapshot?.workItems ?? {}).map((item) => [ - item.id, - WorkItem.create(workItemInit(item), owner), - ]), - ); - - const consumers = Object.fromEntries( - Object.values(snapshot?.consumers ?? {}).map((consumer) => [ - consumer.id, - AgentConsumer.create(agentConsumerInit(consumer), owner), - ]), - ); - - const packets = Object.fromEntries( - Object.values(snapshot?.packets ?? {}).map((packet) => [ - packet.id, - AgentPacket.create(agentPacketInit(packet), owner), - ]), - ); - - const requests = Object.fromEntries( - Object.values(snapshot?.requests ?? {}).map((request) => [ - request.id, - AgentRequest.create(agentRequestInit(request), owner), - ]), - ); - - const project = CharterProject.create( - { - projectId: snapshot?.projectId ?? "local-charter-project", - name: "charter", - documents, - versions, - events, - workItems, - consumers, - packets, - requests, - updatedAt: snapshot?.updatedAt ?? plan.generatedAt, - }, - owner, - ); - - return { - accountId: account.$jazz.id, - projectCoValueId: project.$jazz.id, - documentCoValueIds: Object.fromEntries( - Object.entries(documents).map(([id, document]) => [id, document.$jazz.id]), - ), - eventsFeedCoValueId: events.$jazz.id, - workItemCoValueIds: Object.fromEntries( - Object.entries(workItems).map(([id, item]) => [id, item.$jazz.id]), - ), - consumerCoValueIds: Object.fromEntries( - Object.entries(consumers).map(([id, consumer]) => [id, consumer.$jazz.id]), - ), - packetCoValueIds: Object.fromEntries( - Object.entries(packets).map(([id, packet]) => [id, packet.$jazz.id]), - ), - requestCoValueIds: Object.fromEntries( - Object.entries(requests).map(([id, request]) => [id, request.$jazz.id]), - ), - }; -} - -function agentConsumerInit(consumer: AgentConsumerRow) { - return { - id: consumer.id, - name: consumer.name, - status: consumer.status, - runnerKind: consumer.runnerKind, - runnerCommand: consumer.runnerCommand ?? "", - runnerConfigJson: consumer.runnerConfigJson, - eventTypesJson: JSON.stringify(consumer.eventTypes), - documentSelectorsJson: JSON.stringify(consumer.documentSelectors), - promptDocumentIdsJson: JSON.stringify(consumer.promptDocumentIds), - defaultContextDocumentIdsJson: JSON.stringify(consumer.defaultContextDocumentIds), - cursorJson: consumer.cursorJson, - createdAt: consumer.createdAt, - updatedAt: consumer.updatedAt, - }; -} - -function projectEventInit(event: ProjectEventRow) { - return { - id: event.id, - type: event.type, - documentId: event.documentId, - path: event.path, - sha256: event.sha256 ?? "", - occurredAt: event.occurredAt, - authority: event.authority, - sourceCoValueId: event.sourceCoValueId ?? "", - sourceField: event.sourceField ?? "", - }; -} - -function workItemInit(item: WorkItemRow) { - return { - id: item.id, - kind: item.kind, - status: item.status, - eventId: item.eventId, - documentId: item.documentId, - path: item.path, - title: item.title, - createdAt: item.createdAt, - updatedAt: item.updatedAt, - authority: item.authority, - attachedDocumentIdsJson: JSON.stringify(item.attachedDocumentIds), - matchedConsumerIdsJson: JSON.stringify(item.matchedConsumerIds), - sourceCoValueId: item.sourceCoValueId ?? "", - sourceField: item.sourceField ?? "", - claimedBy: item.claimedBy ?? "", - claimedAt: item.claimedAt ?? "", - requestId: item.requestId ?? "", - resultText: item.resultText ?? "", - reportedAt: item.reportedAt ?? "", - }; -} - -function agentPacketInit(packet: AgentPacketRow) { - return { - id: packet.id, - status: packet.status, - createdAt: packet.createdAt, - updatedAt: packet.updatedAt, - consumerId: packet.consumerId ?? "", - requestId: packet.requestId ?? "", - command: packet.command, - workItemIdsJson: JSON.stringify(packet.workItemIds), - eventIdsJson: JSON.stringify(packet.eventIds), - affectedDocumentIdsJson: JSON.stringify(packet.affectedDocumentIds), - promptDocumentIdsJson: JSON.stringify(packet.promptDocumentIds), - attachedDocumentIdsJson: JSON.stringify(packet.attachedDocumentIds), - documentVersionIdsJson: JSON.stringify(packet.documentVersionIds), - prompt: packet.prompt, - promptSha256: packet.promptSha256, - outputContract: packet.outputContract, - resultText: packet.resultText ?? "", - stdoutText: packet.stdoutText ?? "", - stderrText: packet.stderrText ?? "", - outputText: packet.outputText ?? "", - reportStatus: packet.reportStatus ?? "", - reportedAt: packet.reportedAt ?? "", - exitCode: packet.exitCode ?? 0, - }; -} - -function agentRequestInit(request: AgentRequestRow) { - return { - id: request.id, - status: request.status, - createdAt: request.createdAt, - updatedAt: request.updatedAt, - requestedBy: request.requestedBy, - consumerId: request.consumerId ?? "", - packetId: request.packetId ?? "", - command: request.command, - changeIdsJson: JSON.stringify(request.changeIds), - workItemIdsJson: JSON.stringify(request.workItemIds), - attachedDocumentIdsJson: JSON.stringify(request.attachedDocumentIds), - prompt: request.prompt, - promptSha256: request.promptSha256, - resultText: request.resultText ?? "", - stdoutText: request.stdoutText ?? "", - stderrText: request.stderrText ?? "", - outputText: request.outputText ?? "", - reportStatus: request.reportStatus ?? "", - reportedAt: request.reportedAt ?? "", - exitCode: request.exitCode ?? 0, - }; -} diff --git a/src/jazz/permissions.ts b/src/jazz/permissions.ts new file mode 100644 index 0000000..00273bf --- /dev/null +++ b/src/jazz/permissions.ts @@ -0,0 +1,25 @@ +import { schema as s } from "jazz-tools"; +import { charterApp } from "./schema.js"; + +/** + * Development policy. Project-role enforcement is represented in the schema + * and becomes the next policy boundary once authenticated project principals + * are provisioned. Keeping explicit grants here means Jazz actually runs the + * policy engine instead of relying on its policy-free local permissive mode. + */ +export const charterPermissions = s.definePermissions(charterApp, ({ policy }) => { + const tables = [ + policy.projects, policy.projectMembers, policy.sources, policy.documents, + policy.documentVersions, policy.projectEvents, policy.workItems, + policy.workers, policy.workerLeases, policy.consumers, + policy.contextManifests, policy.packets, policy.requests, + ]; + for (const table of tables) { + table.allowRead.always(); + table.allowInsert.always(); + table.allowUpdate.always(); + table.allowDelete.always(); + } +}); + +export default charterPermissions; diff --git a/src/jazz/schema.ts b/src/jazz/schema.ts index 6a6165b..1580559 100644 --- a/src/jazz/schema.ts +++ b/src/jazz/schema.ts @@ -1,158 +1,199 @@ -import { co, z } from "jazz-tools"; +import { schema as s } from "jazz-tools"; /** - * Jazz target shape for Charter. + * Charter's shared Jazz 2 schema. * - * Bias: use Jazz primitives directly instead of rebuilding database machinery next - * to Jazz. Documents are collaborative maps in records. Events are a CoFeed. - * Work items are collaborative maps because they need mutable claim/status state. - * A filesystem client can project Markdown into these values, but it is only one - * client of the same Jazz graph. + * Application keys are explicit columns instead of Jazz row ids. This keeps + * Charter identities portable across imports while Jazz retains its own row + * identity, version graph, authorship, branches, and durability metadata. */ -export const SpecDocument = co.map({ - id: z.string(), - path: z.string(), - title: z.string(), - kind: z.string(), - status: z.string(), - body: z.string(), - frontmatterJson: z.string(), - headingsJson: z.string(), - sha256: z.string(), - sizeBytes: z.number(), - mtimeMs: z.number(), - importedAt: z.string(), -}); +const schema = { + projects: s.table({ + key: s.string(), + name: s.string(), + createdAt: s.string(), + updatedAt: s.string(), + }), + projectMembers: s.table({ + key: s.string(), + projectKey: s.string(), + principalId: s.string(), + role: s.string(), + status: s.string(), + createdAt: s.string(), + updatedAt: s.string(), + }), + sources: s.table({ + key: s.string(), + projectKey: s.string(), + name: s.string(), + kind: s.string(), + portableLocatorJson: s.string(), + createdAt: s.string(), + updatedAt: s.string(), + }), + documents: s.table({ + key: s.string(), + projectKey: s.string(), + sourceKey: s.string(), + path: s.string(), + title: s.string(), + kind: s.string(), + status: s.string(), + body: s.string(), + frontmatterJson: s.string(), + headingsJson: s.string(), + sha256: s.string(), + sizeBytes: s.int(), + mtimeMs: s.float(), + importedAt: s.string(), + }), + documentVersions: s.table({ + key: s.string(), + projectKey: s.string(), + documentKey: s.string(), + sourceKey: s.string(), + path: s.string(), + sha256: s.string(), + body: s.string(), + frontmatterJson: s.string(), + headingsJson: s.string(), + importedAt: s.string(), + }), + projectEvents: s.table({ + key: s.string(), + projectKey: s.string(), + type: s.string(), + documentKey: s.string(), + path: s.string(), + sha256: s.string(), + occurredAt: s.string(), + authority: s.string(), + sourceJazzRowId: s.string(), + sourceField: s.string(), + }), + workItems: s.table({ + key: s.string(), + projectKey: s.string(), + kind: s.string(), + status: s.string(), + eventKey: s.string(), + documentKey: s.string(), + path: s.string(), + title: s.string(), + createdAt: s.string(), + updatedAt: s.string(), + authority: s.string(), + attachedDocumentIdsJson: s.string(), + matchedConsumerIdsJson: s.string(), + sourceJazzRowId: s.string(), + sourceField: s.string(), + claimedBy: s.string(), + claimedAt: s.string(), + leaseKey: s.string(), + requestKey: s.string(), + resultText: s.string(), + reportedAt: s.string(), + }), + workers: s.table({ + key: s.string(), + projectKey: s.string(), + principalId: s.string(), + name: s.string(), + status: s.string(), + runnerKind: s.string(), + capabilitiesJson: s.string(), + selectorsJson: s.string(), + endpointJson: s.string(), + configJson: s.string(), + createdAt: s.string(), + updatedAt: s.string(), + lastSeenAt: s.string(), + }), + workerLeases: s.table({ + key: s.string(), + projectKey: s.string(), + workerKey: s.string(), + workItemKey: s.string(), + acquiredAt: s.string(), + expiresAt: s.string(), + releasedAt: s.string(), + status: s.string(), + }), + consumers: s.table({ + key: s.string(), + projectKey: s.string(), + name: s.string(), + status: s.string(), + runnerKind: s.string(), + runnerCommand: s.string(), + runnerConfigJson: s.string(), + eventTypesJson: s.string(), + documentSelectorsJson: s.string(), + promptDocumentIdsJson: s.string(), + defaultContextDocumentIdsJson: s.string(), + cursorJson: s.string(), + createdAt: s.string(), + updatedAt: s.string(), + }), + contextManifests: s.table({ + key: s.string(), + projectKey: s.string(), + consumerKey: s.string(), + workItemIdsJson: s.string(), + documentVersionIdsJson: s.string(), + freshnessJson: s.string(), + createdAt: s.string(), + }), + packets: s.table({ + key: s.string(), + projectKey: s.string(), + status: s.string(), + createdAt: s.string(), + updatedAt: s.string(), + consumerKey: s.string(), + requestKey: s.string(), + command: s.string(), + workItemIdsJson: s.string(), + eventIdsJson: s.string(), + affectedDocumentIdsJson: s.string(), + promptDocumentIdsJson: s.string(), + attachedDocumentIdsJson: s.string(), + documentVersionIdsJson: s.string(), + prompt: s.string(), + promptSha256: s.string(), + outputContract: s.string(), + resultText: s.string(), + stdoutText: s.string(), + stderrText: s.string(), + outputText: s.string(), + reportStatus: s.string(), + reportedAt: s.string(), + exitCode: s.int(), + }), + requests: s.table({ + key: s.string(), + projectKey: s.string(), + status: s.string(), + createdAt: s.string(), + updatedAt: s.string(), + requestedBy: s.string(), + consumerKey: s.string(), + packetKey: s.string(), + command: s.string(), + changeIdsJson: s.string(), + workItemIdsJson: s.string(), + attachedDocumentIdsJson: s.string(), + prompt: s.string(), + promptSha256: s.string(), + resultText: s.string(), + stdoutText: s.string(), + stderrText: s.string(), + outputText: s.string(), + reportStatus: s.string(), + reportedAt: s.string(), + exitCode: s.int(), + }), +}; -export const SpecDocumentVersion = co.map({ - id: z.string(), - documentId: z.string(), - path: z.string(), - sha256: z.string(), - body: z.string(), - frontmatterJson: z.string(), - headingsJson: z.string(), - importedAt: z.string(), -}); - -export const ProjectEvent = co.map({ - id: z.string(), - type: z.string(), - documentId: z.string(), - path: z.string(), - sha256: z.string(), - occurredAt: z.string(), - authority: z.string(), - sourceCoValueId: z.string(), - sourceField: z.string(), -}); - -export const ProjectEventFeed = co.feed(ProjectEvent); - -export const WorkItem = co.map({ - id: z.string(), - kind: z.string(), - status: z.string(), - eventId: z.string(), - documentId: z.string(), - path: z.string(), - title: z.string(), - createdAt: z.string(), - updatedAt: z.string(), - authority: z.string(), - attachedDocumentIdsJson: z.string(), - matchedConsumerIdsJson: z.string(), - sourceCoValueId: z.string(), - sourceField: z.string(), - claimedBy: z.string(), - claimedAt: z.string(), - requestId: z.string(), - resultText: z.string(), - reportedAt: z.string(), -}); - -export const AgentConsumer = co.map({ - id: z.string(), - name: z.string(), - status: z.string(), - runnerKind: z.string(), - runnerCommand: z.string(), - runnerConfigJson: z.string(), - eventTypesJson: z.string(), - documentSelectorsJson: z.string(), - promptDocumentIdsJson: z.string(), - defaultContextDocumentIdsJson: z.string(), - cursorJson: z.string(), - createdAt: z.string(), - updatedAt: z.string(), -}); - -export const AgentPacket = co.map({ - id: z.string(), - status: z.string(), - createdAt: z.string(), - updatedAt: z.string(), - consumerId: z.string(), - requestId: z.string(), - command: z.string(), - workItemIdsJson: z.string(), - eventIdsJson: z.string(), - affectedDocumentIdsJson: z.string(), - promptDocumentIdsJson: z.string(), - attachedDocumentIdsJson: z.string(), - documentVersionIdsJson: z.string(), - prompt: z.string(), - promptSha256: z.string(), - outputContract: z.string(), - resultText: z.string(), - stdoutText: z.string(), - stderrText: z.string(), - outputText: z.string(), - reportStatus: z.string(), - reportedAt: z.string(), - exitCode: z.number(), -}); - -export const AgentRequest = co.map({ - id: z.string(), - status: z.string(), - createdAt: z.string(), - updatedAt: z.string(), - requestedBy: z.string(), - consumerId: z.string(), - packetId: z.string(), - command: z.string(), - changeIdsJson: z.string(), - workItemIdsJson: z.string(), - attachedDocumentIdsJson: z.string(), - prompt: z.string(), - promptSha256: z.string(), - resultText: z.string(), - stdoutText: z.string(), - stderrText: z.string(), - outputText: z.string(), - reportStatus: z.string(), - reportedAt: z.string(), - exitCode: z.number(), -}); - -export const CharterProject = co.map({ - projectId: z.string(), - name: z.string(), - documents: co.record(z.string(), SpecDocument), - versions: co.record(z.string(), SpecDocumentVersion), - events: ProjectEventFeed, - workItems: co.record(z.string(), WorkItem), - consumers: co.record(z.string(), AgentConsumer), - packets: co.record(z.string(), AgentPacket), - requests: co.record(z.string(), AgentRequest), - updatedAt: z.string(), -}); - -export type SpecDocumentCoValue = ReturnType; -export type ProjectEventFeedCoValue = ReturnType; -export type WorkItemCoValue = ReturnType; -export type AgentConsumerCoValue = ReturnType; -export type AgentPacketCoValue = ReturnType; -export type AgentRequestCoValue = ReturnType; -export type CharterProjectCoValue = ReturnType; +export const charterApp = s.defineApp(schema); diff --git a/src/server.ts b/src/server.ts index 06b8de9..e94e819 100644 --- a/src/server.ts +++ b/src/server.ts @@ -514,8 +514,8 @@ async function syncProjection(context: ServerContext, options: { authority?: Pro matchedConsumerIds: item.matchedConsumerIds, } : item; - if (item.sourceCoValueId !== undefined) merged.sourceCoValueId = item.sourceCoValueId; - else delete merged.sourceCoValueId; + if (item.sourceJazzRowId !== undefined) merged.sourceJazzRowId = item.sourceJazzRowId; + else delete merged.sourceJazzRowId; if (item.sourceField !== undefined) merged.sourceField = item.sourceField; else delete merged.sourceField; await db.upsertWorkItem(merged); diff --git a/src/status.ts b/src/status.ts new file mode 100644 index 0000000..7f6ba7c --- /dev/null +++ b/src/status.ts @@ -0,0 +1,257 @@ +import type { + AgentConsumerStatus, + AgentPacketStatus, + AgentRequestStatus, + CharterDatabaseSnapshot, + ProjectEventRow, + SpecChange, + WorkItemStatus, +} from "./types.js"; + +export type CharterDatabaseKind = "jazz" | "json"; + +export interface CharterProjectStatus { + schemaVersion: 1; + generatedAt: string; + project: { + id: string; + root: string; + specRoot: string; + snapshotUpdatedAt: string; + }; + database: { + adapter: CharterDatabaseKind; + persistentAcrossProcesses: boolean; + distributedSyncConfigured: boolean; + state: "native-jazz-local" | "native-jazz-synced" | "local-json-file"; + projectionMirror: string | null; + note: string; + }; + runtime: { + watchProcess: "unknown"; + note: string; + }; + documents: { + filesystem: number; + materialized: number; + drift: Record; + }; + events: { + total: number; + recent: ProjectEventRow[]; + }; + workItems: { + total: number; + byStatus: Record; + }; + consumers: { + total: number; + byStatus: Record; + registered: Array<{ + id: string; + name: string; + status: AgentConsumerStatus; + runnerKind: string; + eventTypes: string[]; + documentSelectors: string[]; + cursorJson: string; + }>; + }; + packets: { + total: number; + byStatus: Record; + }; + requests: { + total: number; + byStatus: Record; + recent: Array<{ + id: string; + status: AgentRequestStatus; + consumerId?: string; + updatedAt: string; + reportStatus?: string; + exitCode?: number; + }>; + }; + warnings: string[]; +} + +export function buildProjectStatus(options: { + projectRoot: string; + specRoot: string; + filesystemDocumentCount: number; + adapter: CharterDatabaseKind; + snapshot: CharterDatabaseSnapshot; + changes: SpecChange[]; + generatedAt?: string; + jazzServerConfigured?: boolean; +}): CharterProjectStatus { + const workItems = Object.values(options.snapshot.workItems); + const consumers = Object.values(options.snapshot.consumers); + const packets = Object.values(options.snapshot.packets); + const requests = Object.values(options.snapshot.requests); + const drift = countValues(options.changes, ["added", "modified", "deleted", "unchanged"] as const, (change) => change.type); + const warnings: string[] = []; + const actionableDrift = drift.added + drift.modified + drift.deleted; + + if (options.adapter === "json") { + warnings.push("The JSON database adapter is a local fallback/test surface, not shared coordination state."); + } else if (!options.jazzServerConfigured) { + warnings.push("Jazz is durably local on this machine; no sync server is configured for distributed participants."); + } + if (actionableDrift > 0) { + warnings.push(`${actionableDrift} filesystem spec change${actionableDrift === 1 ? " is" : "s are"} not materialized in the configured database.`); + } + if (workItems.some((item) => item.status === "running") && !requests.some((request) => request.status === "executing")) { + warnings.push("At least one work item is running without an executing request in the current snapshot."); + } + if (requests.some((request) => request.status === "executing") && !workItems.some((item) => item.status === "running")) { + warnings.push("At least one request is executing without a running work item in the current snapshot."); + } + + return { + schemaVersion: 1, + generatedAt: options.generatedAt ?? new Date().toISOString(), + project: { + id: options.snapshot.projectId, + root: options.projectRoot, + specRoot: options.specRoot, + snapshotUpdatedAt: options.snapshot.updatedAt, + }, + database: databaseStatus(options.adapter, options.jazzServerConfigured ?? false), + runtime: { + watchProcess: "unknown", + note: "Charter does not yet persist runtime-process presence, so status reports coordination state without claiming that watch mode is running.", + }, + documents: { + filesystem: options.filesystemDocumentCount, + materialized: Object.keys(options.snapshot.documents).length, + drift, + }, + events: { + total: options.snapshot.events.length, + recent: [...options.snapshot.events] + .sort((left, right) => right.occurredAt.localeCompare(left.occurredAt) || right.id.localeCompare(left.id)) + .slice(0, 5), + }, + workItems: { + total: workItems.length, + byStatus: countValues(workItems, ["queued", "claimed", "running", "done", "ignored", "failed", "blocked"] as const, (item) => item.status), + }, + consumers: { + total: consumers.length, + byStatus: countValues(consumers, ["active", "paused", "archived"] as const, (consumer) => consumer.status), + registered: [...consumers] + .sort((left, right) => left.id.localeCompare(right.id)) + .map((consumer) => ({ + id: consumer.id, + name: consumer.name, + status: consumer.status, + runnerKind: consumer.runnerKind, + eventTypes: consumer.eventTypes, + documentSelectors: consumer.documentSelectors, + cursorJson: consumer.cursorJson, + })), + }, + packets: { + total: packets.length, + byStatus: countValues(packets, ["planned", "executing", "executed", "failed", "blocked", "ignored"] as const, (packet) => packet.status), + }, + requests: { + total: requests.length, + byStatus: countValues(requests, ["planned", "executing", "executed", "failed", "blocked"] as const, (request) => request.status), + recent: [...requests] + .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt) || right.id.localeCompare(left.id)) + .slice(0, 5) + .map((request) => ({ + id: request.id, + status: request.status, + ...(request.consumerId === undefined ? {} : { consumerId: request.consumerId }), + updatedAt: request.updatedAt, + ...(request.reportStatus === undefined ? {} : { reportStatus: request.reportStatus }), + ...(request.exitCode === undefined ? {} : { exitCode: request.exitCode }), + })), + }, + warnings, + }; +} + +export function formatProjectStatus(status: CharterProjectStatus): string { + const lines = [ + "Charter status", + `Project: ${status.project.id} root=${status.project.root}`, + `Database: ${status.database.adapter} state=${status.database.state} persistentAcrossProcesses=${status.database.persistentAcrossProcesses} distributedSync=${status.database.distributedSyncConfigured}`, + `Runtime: watch=${status.runtime.watchProcess}`, + `Documents: filesystem=${status.documents.filesystem} materialized=${status.documents.materialized} drift=${formatCounts(status.documents.drift)}`, + `Events: total=${status.events.total}`, + `Work: total=${status.workItems.total} ${formatCounts(status.workItems.byStatus)}`, + `Consumers: total=${status.consumers.total} ${formatCounts(status.consumers.byStatus)}`, + `Packets: total=${status.packets.total} ${formatCounts(status.packets.byStatus)}`, + `Requests: total=${status.requests.total} ${formatCounts(status.requests.byStatus)}`, + ]; + + if (status.consumers.registered.length > 0) { + lines.push("", "Registered consumers:"); + for (const consumer of status.consumers.registered) { + const selectors = consumer.documentSelectors.length > 0 ? consumer.documentSelectors.join(",") : "all"; + lines.push(`- ${consumer.id} ${consumer.status} runner=${consumer.runnerKind} selectors=${selectors}`); + } + } + + if (status.requests.recent.length > 0) { + lines.push("", "Recent requests:"); + for (const request of status.requests.recent) { + const consumer = request.consumerId ? ` consumer=${request.consumerId}` : ""; + const report = request.reportStatus ? ` report=${request.reportStatus}` : ""; + const exit = request.exitCode === undefined ? "" : ` exit=${request.exitCode}`; + lines.push(`- ${request.updatedAt} ${request.status} ${request.id}${consumer}${report}${exit}`); + } + } + + if (status.events.recent.length > 0) { + lines.push("", "Recent events:"); + for (const event of status.events.recent) { + lines.push(`- ${event.occurredAt} ${event.type} ${event.documentId}`); + } + } + + if (status.warnings.length > 0) { + lines.push("", "Warnings:"); + for (const warning of status.warnings) lines.push(`- ${warning}`); + } + + return lines.join("\n"); +} + +function databaseStatus(adapter: CharterDatabaseKind, jazzServerConfigured: boolean): CharterProjectStatus["database"] { + if (adapter === "json") { + return { + adapter, + persistentAcrossProcesses: true, + distributedSyncConfigured: false, + state: "local-json-file", + projectionMirror: ".spec/state/spec-db.json", + note: "Local JSON fallback/test adapter.", + }; + } + return { + adapter, + persistentAcrossProcesses: true, + distributedSyncConfigured: jazzServerConfigured, + state: jazzServerConfigured ? "native-jazz-synced" : "native-jazz-local", + projectionMirror: null, + note: jazzServerConfigured + ? "Native persistent Jazz rows with sync-server coordination." + : "Native persistent Jazz rows in the local runtime; configure JAZZ_SERVER_URL and backend identity for distributed sync.", + }; +} + +function countValues(items: Item[], keys: readonly Key[], keyOf: (item: Item) => Key): Record { + const counts = Object.fromEntries(keys.map((key) => [key, 0])) as Record; + for (const item of items) counts[keyOf(item)] += 1; + return counts; +} + +function formatCounts(counts: Record): string { + return Object.entries(counts).map(([key, value]) => `${key}=${value}`).join(" "); +} diff --git a/src/types.ts b/src/types.ts index 27dfbf3..30ad78c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -72,7 +72,7 @@ export interface ProjectEventRow { sha256?: string; occurredAt: string; authority: "importer.sync" | "human.file" | "human.ui" | "agent.proposal" | "agent.applied" | "charter.agent" | "charter.system"; - sourceCoValueId?: string; + sourceJazzRowId?: string; sourceField?: string; } @@ -94,7 +94,7 @@ export interface WorkItemRow { authority: ProjectEventRow["authority"]; attachedDocumentIds: string[]; matchedConsumerIds: string[]; - sourceCoValueId?: string; + sourceJazzRowId?: string; sourceField?: string; claimedBy?: string; claimedAt?: string; diff --git a/test/jazz-db.test.ts b/test/jazz-db.test.ts index c7d2d27..5ad9b97 100644 --- a/test/jazz-db.test.ts +++ b/test/jazz-db.test.ts @@ -3,96 +3,68 @@ import os from "node:os"; import path from "node:path"; import { describe, expect, test } from "vitest"; import { JazzCharterDatabase } from "../src/db/jazz.js"; -import { JsonCharterDatabase } from "../src/db/json.js"; import type { ProjectEventRow, SpecDocumentRow, WorkItemRow } from "../src/types.js"; const baseRow: SpecDocumentRow = { - id: "overview", - path: "README.md", - title: "Overview", - kind: "architecture", - status: "draft", - body: "# Overview", - frontmatterJson: "{}", - headingsJson: "[]", - sha256: "abc", - sizeBytes: 10, - mtimeMs: 1, - importedAt: "2026-01-01T00:00:00.000Z", + id: "overview", path: "README.md", title: "Overview", kind: "architecture", status: "draft", + body: "# Overview", frontmatterJson: "{}", headingsJson: "[]", sha256: "abc", + sizeBytes: 10, mtimeMs: 1, importedAt: "2026-01-01T00:00:00.000Z", }; const baseEvent: ProjectEventRow = { - id: "event-1", - type: "spec.document.upserted", - documentId: "overview", - path: "README.md", - sha256: "abc", - occurredAt: "2026-01-01T00:00:00.000Z", - authority: "importer.sync", + id: "event-1", type: "spec.document.upserted", documentId: "overview", path: "README.md", + sha256: "abc", occurredAt: "2026-01-01T00:00:00.000Z", authority: "importer.sync", }; const baseWorkItem: WorkItemRow = { - id: "work-1", - kind: "spec-change", - status: "queued", - eventId: "event-1", - documentId: "overview", - path: "README.md", - title: "Overview", - createdAt: "2026-01-01T00:00:00.000Z", - updatedAt: "2026-01-01T00:00:00.000Z", - authority: "importer.sync", - attachedDocumentIds: ["overview"], - matchedConsumerIds: [], + id: "work-1", kind: "spec-change", status: "queued", eventId: "event-1", documentId: "overview", + path: "README.md", title: "Overview", createdAt: "2026-01-01T00:00:00.000Z", + updatedAt: "2026-01-01T00:00:00.000Z", authority: "importer.sync", + attachedDocumentIds: ["overview"], matchedConsumerIds: [], }; describe("JazzCharterDatabase", () => { - test("uses Jazz CoValues as the live mutation surface and saves a JSON projection mirror", async () => { + test("persists native Jazz rows across process-style shutdown and restart", async () => { const root = await fs.mkdtemp(path.join(os.tmpdir(), "charter-jazz-db-")); - const db = new JazzCharterDatabase({ projectRoot: root, projectId: "test" }); + const options = { projectRoot: root, projectId: "test" }; + const first = new JazzCharterDatabase(options); - await db.upsertDocument(baseRow); - await db.appendEvent(baseEvent); - await db.appendEvent(baseEvent); - await db.upsertWorkItem(baseWorkItem); - await db.saveSnapshot(); + await first.upsertDocument(baseRow); + await first.appendEvent(baseEvent); + await first.appendEvent(baseEvent); + await first.upsertWorkItem(baseWorkItem); - const firstManifest = await db.jazzManifest(); - expect(firstManifest.adapter).toBe("jazz"); - expect(firstManifest.projectCoValueId).toMatch(/^co_/); - expect(firstManifest.documentCoValueIds.overview).toMatch(/^co_/); - expect(firstManifest.workItemCoValueIds["work-1"]).toMatch(/^co_/); - expect(firstManifest.versionCoValueIds["overview:abc"]).toMatch(/^co_/); - - const movedRow: SpecDocumentRow = { - ...baseRow, - path: "guide.md", - sha256: "def", - body: "# Guide", - }; - await db.upsertDocument(movedRow); - await db.updateWorkItemStatus("work-1", "running", { - claimedBy: "charter.agent", - claimedAt: "2026-01-01T00:00:01.000Z", + const movedRow = { ...baseRow, path: "guide.md", sha256: "def", body: "# Guide" }; + await first.upsertDocument(movedRow); + await first.updateWorkItemStatus("work-1", "running", { + claimedBy: "charter.agent", claimedAt: "2026-01-01T00:00:01.000Z", }); - await db.saveSnapshot(); + await first.saveSnapshot(); + + const firstManifest = await first.jazzManifest(); + expect(firstManifest.adapter).toBe("jazz-2"); + expect(firstManifest.projectRowId).not.toBe(""); + expect(firstManifest.documentRowIds.overview).not.toBe(""); + expect(firstManifest.versionRowIds["overview:abc"]).not.toBe(""); + expect(firstManifest.versionRowIds["overview:def"]).not.toBe(""); + await first.close(); - const secondManifest = await db.jazzManifest(); - expect(secondManifest.documentCoValueIds.overview).toBe(firstManifest.documentCoValueIds.overview); - expect(secondManifest.workItemCoValueIds["work-1"]).toBe(firstManifest.workItemCoValueIds["work-1"]); - expect(secondManifest.versionCoValueIds["overview:def"]).toMatch(/^co_/); + const second = new JazzCharterDatabase(options); + const snapshot = await second.loadSnapshot(); + const secondManifest = await second.jazzManifest(); - const mirror = await new JsonCharterDatabase({ projectRoot: root }).loadSnapshot(); - expect(mirror.documents.overview?.path).toBe("guide.md"); - expect(mirror.pathIndex["README.md"]).toBeUndefined(); - expect(mirror.pathIndex["guide.md"]).toBe("overview"); - expect(mirror.events).toHaveLength(1); - expect(mirror.workItems["work-1"]?.status).toBe("running"); - expect(mirror.workItems["work-1"]?.claimedBy).toBe("charter.agent"); + expect(snapshot.documents.overview?.path).toBe("guide.md"); + expect(snapshot.pathIndex["README.md"]).toBeUndefined(); + expect(snapshot.pathIndex["guide.md"]).toBe("overview"); + expect(snapshot.events).toHaveLength(1); + expect(snapshot.workItems["work-1"]?.status).toBe("running"); + expect(snapshot.workItems["work-1"]?.claimedBy).toBe("charter.agent"); + expect(secondManifest.projectRowId).toBe(firstManifest.projectRowId); + expect(secondManifest.documentRowIds.overview).toBe(firstManifest.documentRowIds.overview); + await expect(fs.access(path.join(root, ".spec", "state", "spec-db.json"))).rejects.toThrow(); - const manifestFile = JSON.parse( - await fs.readFile(path.join(root, ".spec", "state", "jazz-values.json"), "utf8"), - ); - expect(manifestFile.projectCoValueId).toBe(secondManifest.projectCoValueId); + const manifestFile = JSON.parse(await fs.readFile(path.join(root, ".spec", "state", "jazz-runtime.json"), "utf8")); + expect(manifestFile.projectRowId).toBe(firstManifest.projectRowId); + await second.close(); }); }); diff --git a/test/status.test.ts b/test/status.test.ts new file mode 100644 index 0000000..2bca16e --- /dev/null +++ b/test/status.test.ts @@ -0,0 +1,110 @@ +import { describe, expect, test } from "vitest"; +import { buildProjectStatus, formatProjectStatus } from "../src/status.js"; +import type { CharterDatabaseSnapshot, SpecChange } from "../src/types.js"; + +function snapshot(): CharterDatabaseSnapshot { + return { + projectId: "misaligned", + updatedAt: "2026-07-12T00:00:00.000Z", + documents: {}, + pathIndex: {}, + events: [ + { + id: "event-1", + type: "spec.document.upserted", + documentId: "operations", + path: "operations.md", + occurredAt: "2026-07-12T00:00:01.000Z", + authority: "human.file", + }, + ], + workItems: { + work1: { + id: "work1", + kind: "spec-change", + status: "running", + eventId: "event-1", + documentId: "operations", + path: "operations.md", + title: "Operations", + createdAt: "2026-07-12T00:00:01.000Z", + updatedAt: "2026-07-12T00:00:02.000Z", + authority: "human.file", + attachedDocumentIds: ["operations"], + matchedConsumerIds: ["implementer"], + }, + }, + consumers: { + implementer: { + id: "implementer", + name: "Implementer", + status: "active", + runnerKind: "codex", + runnerConfigJson: "{}", + eventTypes: ["spec.document.upserted"], + documentSelectors: ["operations"], + promptDocumentIds: [], + defaultContextDocumentIds: ["operations"], + cursorJson: "{}", + createdAt: "2026-07-12T00:00:00.000Z", + updatedAt: "2026-07-12T00:00:00.000Z", + }, + }, + packets: {}, + requests: {}, + }; +} + +describe("project status", () => { + test("reports native local Jazz durability without pretending distributed sync is configured", () => { + const changes: SpecChange[] = [ + { + type: "added", + documentId: "operations", + path: "operations.md", + title: "Operations", + currentSha256: "abc123", + }, + ]; + const status = buildProjectStatus({ + projectRoot: "/tmp/misaligned", + specRoot: "/tmp/misaligned/spec", + filesystemDocumentCount: 1, + adapter: "jazz", + snapshot: snapshot(), + changes, + generatedAt: "2026-07-12T00:00:03.000Z", + }); + + expect(status.database).toMatchObject({ + adapter: "jazz", + persistentAcrossProcesses: true, + distributedSyncConfigured: false, + state: "native-jazz-local", + }); + expect(status.documents).toMatchObject({ filesystem: 1, materialized: 0, drift: { added: 1, modified: 0, deleted: 0, unchanged: 0 } }); + expect(status.workItems.byStatus.running).toBe(1); + expect(status.consumers.registered[0]).toMatchObject({ id: "implementer", runnerKind: "codex" }); + expect(status.warnings).toContain("At least one work item is running without an executing request in the current snapshot."); + + const output = formatProjectStatus(status); + expect(output).toContain("Charter status"); + expect(output).toContain("persistentAcrossProcesses=true"); + expect(output).toContain("Registered consumers:"); + expect(output).toContain("1 filesystem spec change is not materialized"); + }); + + test("reports the JSON adapter as a local fallback", () => { + const status = buildProjectStatus({ + projectRoot: "/tmp/misaligned", + specRoot: "/tmp/misaligned/spec", + filesystemDocumentCount: 0, + adapter: "json", + snapshot: snapshot(), + changes: [], + }); + + expect(status.database.state).toBe("local-json-file"); + expect(status.warnings[0]).toContain("local fallback/test surface"); + }); +}); -- 2.51.2