From 2ab62914dccfdfa2c9b8792782412b18c78bf6b0 Mon Sep 17 00:00:00 2001
From: Haunted Supp
Date: Fri, 17 Jul 2026 03:26:30 +0900
Subject: [PATCH 01/54] fix: harden runtime boundaries and state handling
---
.github/workflows/ci.yml | 3 +
.github/workflows/release.yml | 4 +
.gitignore | 3 +
bun.lock | 288 ++-
drizzle/0016_scrub_backup_secrets.sql | 10 +
drizzle/0017_skinny_hobgoblin.sql | 16 +
drizzle/meta/0016_snapshot.json | 1315 ++++++++++++++
drizzle/meta/0017_snapshot.json | 1587 +++++++++++++++++
drizzle/meta/_journal.json | 16 +-
e2e/add-memory.spec.ts | 314 ++++
package.json | 17 +-
playwright.config.ts | 1 +
scripts/trauma-backup-failsafe.ts | 10 +-
.../backup/BackupFailsafeBanner.tsx | 87 +-
src/components/memories/MemoryBrowse.tsx | 44 +-
src/components/reader/MemoryReader.tsx | 342 +++-
src/components/reader/reader-generation.ts | 69 +
src/components/settings/SettingsPage.tsx | 182 +-
src/components/settings/action-state.ts | 44 +
src/entry-server.tsx | 41 +-
src/routes/api/backup/failsafe/request.ts | 48 +-
src/routes/api/categories.ts | 16 +-
src/routes/api/flashbacks.ts | 14 +-
src/routes/api/memories.ts | 21 +-
src/routes/api/memories/[memoryId].ts | 20 +-
src/routes/api/memories/categories.ts | 14 +-
src/routes/api/memories/read-status.ts | 14 +-
src/routes/api/memories/tags.ts | 16 +-
src/routes/api/moments.ts | 14 +-
src/routes/api/moments/[momentId].ts | 6 +
src/routes/api/reader-media.ts | 7 +
src/routes/api/settings/codex-auth.ts | 8 +-
.../api/settings/codex-auth/device-code.ts | 8 +-
.../settings/codex-auth/device-code/cancel.ts | 8 +-
src/routes/api/settings/openai-auth.ts | 17 +-
src/routes/api/settings/openai-auth/enable.ts | 8 +-
.../api/settings/translation-language.ts | 17 +-
src/routes/api/tags.ts | 16 +-
src/server/backup/environment.ts | 118 +-
src/server/backup/failsafe.ts | 12 +-
src/server/browse/filtered-page.ts | 47 +
src/server/db/bundled-migrations.ts | 12 +
src/server/db/repositories.ts | 340 ++--
src/server/db/schema.ts | 4 +
src/server/http/document-security.ts | 4 +
src/server/http/mutation-request.ts | 173 ++
src/server/importer/runtime.ts | 110 ++
src/server/media-policy.ts | 14 +-
src/server/memories/browse.ts | 60 +-
src/server/psychiatrist/bounded-cache.ts | 35 +
src/server/psychiatrist/jsonl.ts | 62 +-
src/server/psychiatrist/request.ts | 118 +-
src/server/psychiatrist/stream-store.ts | 3 +-
src/server/psychiatrist/thread-route.ts | 54 +-
src/server/psychiatrist/thread-store.ts | 25 +-
src/server/reader/markdown-renderer.ts | 22 +-
src/server/reader/media-proxy.ts | 316 ++++
src/server/settings/codex-auth.ts | 8 +-
src/server/settings/codex-model-routes.ts | 23 +-
.../translation/cancel-translation-route.ts | 6 +
src/server/translation/codex-app-server.ts | 128 +-
src/server/translation/events-route.ts | 33 +-
src/server/translation/runner.ts | 60 +-
.../translation/start-translation-route.ts | 20 +-
tests/components/backup-failsafe.test.ts | 29 +-
.../components/memory-browse-actions.test.ts | 15 +
.../components/memory-reader-actions.test.ts | 80 +-
tests/components/reader-generation.test.ts | 91 +
.../components/reader-moment-actions.test.ts | 7 +-
.../settings-action-tracker.test.ts | 39 +
tests/components/settings-page.test.ts | 45 +-
tests/scripts/runtime-command.test.ts | 8 +
.../server/backup/backup-environment.test.ts | 49 +-
tests/server/browse-loaders.test.ts | 20 +-
tests/server/browse/filtered-page.test.ts | 44 +
tests/server/db/repositories.test.ts | 240 ++-
tests/server/db/schema.test.ts | 137 ++
tests/server/entry-server.test.ts | 15 +
tests/server/http/mutation-request.test.ts | 181 ++
tests/server/importer/runtime.test.ts | 133 ++
tests/server/memories/delete-memory.test.ts | 18 +-
tests/server/psychiatrist/api-routes.test.ts | 32 +-
.../server/psychiatrist/bounded-cache.test.ts | 23 +
tests/server/reader/markdown-renderer.test.ts | 72 +-
tests/server/reader/media-proxy.test.ts | 302 ++++
.../server/routes/api-browser-import.test.ts | 4 +-
.../routes/api-flashbacks-toggle.test.ts | 5 +-
tests/server/routes/api-memories.test.ts | 7 +-
tests/server/routes/api-memory-delete.test.ts | 9 +-
tests/server/routes/api-settings.test.ts | 132 +-
tests/server/settings/codex-auth.test.ts | 33 +-
tests/server/translation/api-routes.test.ts | 51 +
.../translation/codex-app-server.test.ts | 152 +-
tests/server/translation/events-route.test.ts | 104 +-
.../translation/markdown-blocks.test.ts | 78 +-
tests/server/translation/runner.test.ts | 149 +-
.../translation-repositories.test.ts | 110 ++
97 files changed, 7970 insertions(+), 916 deletions(-)
create mode 100644 drizzle/0016_scrub_backup_secrets.sql
create mode 100644 drizzle/0017_skinny_hobgoblin.sql
create mode 100644 drizzle/meta/0016_snapshot.json
create mode 100644 drizzle/meta/0017_snapshot.json
create mode 100644 e2e/add-memory.spec.ts
create mode 100644 src/components/reader/reader-generation.ts
create mode 100644 src/components/settings/action-state.ts
create mode 100644 src/routes/api/reader-media.ts
create mode 100644 src/server/browse/filtered-page.ts
create mode 100644 src/server/http/document-security.ts
create mode 100644 src/server/http/mutation-request.ts
create mode 100644 src/server/importer/runtime.ts
create mode 100644 src/server/psychiatrist/bounded-cache.ts
create mode 100644 src/server/reader/media-proxy.ts
create mode 100644 tests/components/reader-generation.test.ts
create mode 100644 tests/components/settings-action-tracker.test.ts
create mode 100644 tests/server/browse/filtered-page.test.ts
create mode 100644 tests/server/entry-server.test.ts
create mode 100644 tests/server/http/mutation-request.test.ts
create mode 100644 tests/server/importer/runtime.test.ts
create mode 100644 tests/server/psychiatrist/bounded-cache.test.ts
create mode 100644 tests/server/reader/media-proxy.test.ts
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a017ddb4..ef7e3b74 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -68,6 +68,9 @@ jobs:
- name: Install dependencies
run: bun install --frozen-lockfile
+ - name: Audit production dependencies
+ run: bun run audit
+
- name: Run baseline verification
run: bun run verify
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 00fdbd19..53eadbd8 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -52,6 +52,10 @@ jobs:
if: steps.release_tag.outputs.valid == 'true'
run: bun install --frozen-lockfile
+ - name: Audit production dependencies
+ if: steps.release_tag.outputs.valid == 'true'
+ run: bun run audit
+
- name: Run baseline verification
if: steps.release_tag.outputs.valid == 'true'
run: bun run verify
diff --git a/.gitignore b/.gitignore
index 79a5be61..3f3e99f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,8 @@
.superpowers/
.eda/
+.tmp/
+app.config.timestamp_*.js
+.claude/settings.local.json
node_modules/
.vinxi/
.output/
diff --git a/bun.lock b/bun.lock
index e92f2644..d8544614 100644
--- a/bun.lock
+++ b/bun.lock
@@ -9,18 +9,18 @@
"@solidjs/router": "^0.15.0",
"@solidjs/start": "1.3.2",
"defuddle": "^0.18.0",
- "drizzle-orm": "^0.44.7",
+ "drizzle-orm": "^0.45.2",
"entities": "^7.0.1",
"highlight.js": "^11.11.1",
"ipaddr.js": "^2.4.0",
- "linkedom": "^0.18.12",
- "markdown-it": "^14.1.1",
- "markdown-it-anchor": "^9.2.0",
+ "linkedom": "^0.18.13",
+ "markdown-it": "^14.3.0",
+ "markdown-it-anchor": "^9.2.1",
"markdown-it-footnote": "^4.0.0",
"remark-gfm": "^4.0.1",
"remark-math": "^6.0.0",
"remark-parse": "^11.0.0",
- "sanitize-html": "^2.17.3",
+ "sanitize-html": "^2.17.6",
"solid-js": "^1.9.5",
"unified": "^11.0.5",
"unist-util-visit-parents": "^6.0.2",
@@ -44,22 +44,28 @@
},
},
},
+ "overrides": {
+ "@babel/core": "7.29.7",
+ "h3": "1.15.11",
+ "tar": "7.5.20",
+ "vite": "6.4.3",
+ },
"packages": {
"@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="],
- "@babel/compat-data": ["@babel/compat-data@7.29.3", "", {}, "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg=="],
+ "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="],
- "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@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" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="],
+ "@babel/core": ["@babel/core@7.29.7", "", { "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" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="],
- "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="],
+ "@babel/generator": ["@babel/generator@7.29.7", "", { "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" } }, "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ=="],
- "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="],
+ "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "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" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="],
"@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],
"@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="],
- "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="],
+ "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="],
"@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="],
@@ -67,9 +73,9 @@
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
- "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="],
+ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="],
- "@babel/helpers": ["@babel/helpers@7.29.2", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.29.0" } }, "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw=="],
+ "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="],
"@babel/parser": ["@babel/parser@7.29.3", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA=="],
@@ -93,6 +99,12 @@
"@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="],
+ "@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="],
+
+ "@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="],
+
+ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="],
+
"@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="],
"@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="],
@@ -171,12 +183,16 @@
"@mixmark-io/domino": ["@mixmark-io/domino@2.2.0", "", {}, "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw=="],
+ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="],
+
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
"@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
+ "@oxc-project/types": ["@oxc-project/types@0.139.0", "", {}, "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw=="],
+
"@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="],
"@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.6", "", { "os": "android", "cpu": "arm64" }, "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A=="],
@@ -217,6 +233,38 @@
"@poppinss/exception": ["@poppinss/exception@1.2.3", "", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="],
+ "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.1.5", "", { "os": "android", "cpu": "arm64" }, "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ=="],
+
+ "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.1.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw=="],
+
+ "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.1.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g=="],
+
+ "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.1.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA=="],
+
+ "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.1.5", "", { "os": "linux", "cpu": "arm" }, "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw=="],
+
+ "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.1.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q=="],
+
+ "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.1.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA=="],
+
+ "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.1.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg=="],
+
+ "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.1.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA=="],
+
+ "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.1.5", "", { "os": "linux", "cpu": "x64" }, "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ=="],
+
+ "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.1.5", "", { "os": "linux", "cpu": "x64" }, "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg=="],
+
+ "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.1.5", "", { "os": "none", "cpu": "arm64" }, "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw=="],
+
+ "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.1.5", "", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "^1.1.6" }, "cpu": "none" }, "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA=="],
+
+ "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.1.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw=="],
+
+ "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.1.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA=="],
+
+ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="],
+
"@rollup/plugin-alias": ["@rollup/plugin-alias@6.0.0", "", { "peerDependencies": { "rollup": ">=4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g=="],
"@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@29.0.2", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg=="],
@@ -349,6 +397,8 @@
"@tanstack/server-functions-plugin": ["@tanstack/server-functions-plugin@1.121.21", "", { "dependencies": { "@babel/code-frame": "7.26.2", "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/directive-functions-plugin": "1.121.21", "babel-dead-code-elimination": "^1.0.9", "tiny-invariant": "^1.3.3" } }, "sha512-a05fzK+jBGacsSAc1vE8an7lpBh4H0PyIEcivtEyHLomgSeElAJxm9E2It/0nYRZ5Lh23m0okbhzJNaYWZpAOg=="],
+ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="],
+
"@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
"@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
@@ -497,7 +547,7 @@
"bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="],
- "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
+ "boolbase": ["boolbase@2.0.0", "", {}, "sha512-DkVaaQHymRhpYEYo9x1oo7Q7B0Y6KJUsjm3c9eTyFDby4MHLBTwZ6ZDWBel5zrYxj1WsZgC5oLpiz+93MluXeA=="],
"boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="],
@@ -583,9 +633,9 @@
"crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="],
- "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="],
+ "css-select": ["css-select@7.0.0", "", { "dependencies": { "boolbase": "^2.0.0", "css-what": "^8.0.0", "domhandler": "^6.0.1", "domutils": "^4.0.2", "nth-check": "^3.0.1" } }, "sha512-snmjEVXy+1LnwXdxhYvTMj1d9tOh4HxkA1YmoayVBeeyR2C14Pum7fcxJIm4SswYspVy866eYNwlH6xC3/VH5g=="],
- "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
+ "css-what": ["css-what@8.0.0", "", {}, "sha512-DH0Bqq3DNp5tdOReuNyAA+Ev4Y2GS5FMbZpeTLP6C4CDi0h5nL0BmUPChXw3o/qbHLDWHl49sbNqQVY7bMSDdw=="],
"cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
@@ -595,6 +645,8 @@
"dax-sh": ["dax-sh@0.43.2", "", { "dependencies": { "@deno/shim-deno": "~0.19.0", "undici-types": "^5.26" } }, "sha512-uULa1sSIHgXKGCqJ/pA0zsnzbHlVnuq7g8O2fkHokWFNwEGIhh5lAJlxZa1POG5En5ba7AU4KcBAvGQWMMf8rg=="],
+ "dayjs": ["dayjs@1.11.21", "", {}, "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA=="],
+
"db0": ["db0@0.3.4", "", { "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", "better-sqlite3": "*", "drizzle-orm": "*", "mysql2": "*", "sqlite3": "*" }, "optionalPeers": ["@electric-sql/pglite", "@libsql/client", "better-sqlite3", "drizzle-orm", "mysql2", "sqlite3"] }, "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw=="],
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
@@ -643,7 +695,7 @@
"drizzle-kit": ["drizzle-kit@0.31.10", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "tsx": "^4.21.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw=="],
- "drizzle-orm": ["drizzle-orm@0.44.7", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ=="],
+ "drizzle-orm": ["drizzle-orm@0.45.2", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q=="],
"duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="],
@@ -747,7 +799,7 @@
"gzip-size": ["gzip-size@7.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA=="],
- "h3": ["h3@1.15.3", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.4", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.0", "radix3": "^1.1.2", "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ=="],
+ "h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="],
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
@@ -857,6 +909,8 @@
"knitwork": ["knitwork@1.3.0", "", {}, "sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw=="],
+ "launder": ["launder@1.7.1", "", { "dependencies": { "dayjs": "^1.11.7" } }, "sha512-mU6WRz5EusL9ZZuiZ5SO4Y6C0P9PAUR9iwdb6bzj4KDihm28DiHFw+/yk9DBH4f+Pv1wuzQ4e2jV3oQ7mkIqvw=="],
+
"lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="],
"lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
@@ -883,9 +937,9 @@
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
- "linkedom": ["linkedom@0.18.12", "", { "dependencies": { "css-select": "^5.1.0", "cssom": "^0.5.0", "html-escaper": "^3.0.3", "htmlparser2": "^10.0.0", "uhyphen": "^0.2.0" }, "peerDependencies": { "canvas": ">= 2" }, "optionalPeers": ["canvas"] }, "sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q=="],
+ "linkedom": ["linkedom@0.18.13", "", { "dependencies": { "css-select": "^7.0.0", "cssom": "^0.5.0", "html-escaper": "^3.0.3", "htmlparser2": "^10.1.0", "uhyphen": "^0.2.0" }, "peerDependencies": { "canvas": ">= 2" }, "optionalPeers": ["canvas"] }, "sha512-ES/o9qotMpzpN2MHs+Iq/JcVoOj8Fa5wiQYrTdFpvAnwXL0g66XHHUc9WUMk6nAlBtGsFQ24ne+SYnvnaQ2FSw=="],
- "linkify-it": ["linkify-it@5.0.0", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ=="],
+ "linkify-it": ["linkify-it@5.0.2", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q=="],
"listhen": ["listhen@1.10.0", "", { "dependencies": { "@parcel/watcher": "^2.5.6", "@parcel/watcher-wasm": "^2.5.6", "citty": "^0.2.2", "consola": "^3.4.2", "crossws": ">=0.2.0 <0.5.0", "defu": "^6.1.7", "get-port-please": "^3.2.0", "h3": "^1.15.11", "http-shutdown": "^1.2.2", "jiti": "^2.6.1", "mlly": "^1.8.2", "node-forge": "^1.4.0", "pathe": "^2.0.3", "std-env": "^4.1.0", "tinyclip": "^0.1.12", "ufo": "^1.6.4", "untun": "^0.1.3", "uqr": "^0.1.3" }, "bin": { "listen": "bin/listhen.mjs", "listhen": "bin/listhen.mjs" } }, "sha512-kfz4C0OrC6IpaVMtYDJtf6PFjurxe9NBBoDAh/o2p587INryFOO4DQ9OetbCdDrWFt1m1CJKvYrzkGsuPHw8nQ=="],
@@ -907,9 +961,9 @@
"make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="],
- "markdown-it": ["markdown-it@14.1.1", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA=="],
+ "markdown-it": ["markdown-it@14.3.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.5.0", "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw=="],
- "markdown-it-anchor": ["markdown-it-anchor@9.2.0", "", { "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg=="],
+ "markdown-it-anchor": ["markdown-it-anchor@9.2.1", "", { "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, "sha512-p6APiLJDFAW2GEvaavDvhIBn7jrX2jLv77NkBGgNacFTurbORYc4pyYySg/mI6mpR6cHQuAtzKtmqgQr4K8dsQ=="],
"markdown-it-footnote": ["markdown-it-footnote@4.0.0", "", {}, "sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ=="],
@@ -1053,7 +1107,7 @@
"npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="],
- "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
+ "nth-check": ["nth-check@3.0.1", "", { "dependencies": { "boolbase": "^2.0.0" } }, "sha512-GX0gsdbGVCgnRgbeGaubfjpBXyYRWOOCVeYh08bSQvDZqxz5ndXs1OTfAt/h36G1xvI94YIspsI0sVFqAV9+RQ=="],
"obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="],
@@ -1161,6 +1215,8 @@
"reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
+ "rolldown": ["rolldown@1.1.5", "", { "dependencies": { "@oxc-project/types": "=0.139.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.1.5", "@rolldown/binding-darwin-arm64": "1.1.5", "@rolldown/binding-darwin-x64": "1.1.5", "@rolldown/binding-freebsd-x64": "1.1.5", "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", "@rolldown/binding-linux-arm64-gnu": "1.1.5", "@rolldown/binding-linux-arm64-musl": "1.1.5", "@rolldown/binding-linux-ppc64-gnu": "1.1.5", "@rolldown/binding-linux-s390x-gnu": "1.1.5", "@rolldown/binding-linux-x64-gnu": "1.1.5", "@rolldown/binding-linux-x64-musl": "1.1.5", "@rolldown/binding-openharmony-arm64": "1.1.5", "@rolldown/binding-wasm32-wasi": "1.1.5", "@rolldown/binding-win32-arm64-msvc": "1.1.5", "@rolldown/binding-win32-x64-msvc": "1.1.5" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA=="],
+
"rollup": ["rollup@4.60.3", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.3", "@rollup/rollup-android-arm64": "4.60.3", "@rollup/rollup-darwin-arm64": "4.60.3", "@rollup/rollup-darwin-x64": "4.60.3", "@rollup/rollup-freebsd-arm64": "4.60.3", "@rollup/rollup-freebsd-x64": "4.60.3", "@rollup/rollup-linux-arm-gnueabihf": "4.60.3", "@rollup/rollup-linux-arm-musleabihf": "4.60.3", "@rollup/rollup-linux-arm64-gnu": "4.60.3", "@rollup/rollup-linux-arm64-musl": "4.60.3", "@rollup/rollup-linux-loong64-gnu": "4.60.3", "@rollup/rollup-linux-loong64-musl": "4.60.3", "@rollup/rollup-linux-ppc64-gnu": "4.60.3", "@rollup/rollup-linux-ppc64-musl": "4.60.3", "@rollup/rollup-linux-riscv64-gnu": "4.60.3", "@rollup/rollup-linux-riscv64-musl": "4.60.3", "@rollup/rollup-linux-s390x-gnu": "4.60.3", "@rollup/rollup-linux-x64-gnu": "4.60.3", "@rollup/rollup-linux-x64-musl": "4.60.3", "@rollup/rollup-openbsd-x64": "4.60.3", "@rollup/rollup-openharmony-arm64": "4.60.3", "@rollup/rollup-win32-arm64-msvc": "4.60.3", "@rollup/rollup-win32-ia32-msvc": "4.60.3", "@rollup/rollup-win32-x64-gnu": "4.60.3", "@rollup/rollup-win32-x64-msvc": "4.60.3", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A=="],
"rollup-plugin-visualizer": ["rollup-plugin-visualizer@7.0.1", "", { "dependencies": { "open": "^11.0.0", "picomatch": "^4.0.2", "source-map": "^0.7.4", "yargs": "^18.0.0" }, "peerDependencies": { "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc", "rollup": "2.x || 3.x || 4.x" }, "optionalPeers": ["rolldown", "rollup"], "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" } }, "sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg=="],
@@ -1171,7 +1227,7 @@
"safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
- "sanitize-html": ["sanitize-html@2.17.3", "", { "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", "htmlparser2": "^10.1.0", "is-plain-object": "^5.0.0", "parse-srcset": "^1.0.2", "postcss": "^8.3.11" } }, "sha512-Kn4srCAo2+wZyvCNKCSyB2g8RQ8IkX/gQs2uqoSRNu5t9I2qvUyAVvRDiFUVAiX3N3PNuwStY0eNr+ooBHVWEg=="],
+ "sanitize-html": ["sanitize-html@2.17.6", "", { "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", "htmlparser2": "^12.0.0", "is-plain-object": "^5.0.0", "launder": "^1.7.1", "parse-srcset": "^1.0.2", "postcss": "^8.3.11" } }, "sha512-M4bo9tfv1yfhQZZKkc6dL07ALrGJtfvNOuhX3hU9AVPR/uPQ+nKOJBqTYc7LfMQblTW04mtSWDJWEyLvygJsLA=="],
"scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="],
@@ -1259,7 +1315,7 @@
"tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
- "tar": ["tar@7.5.15", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ=="],
+ "tar": ["tar@7.5.20", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-9FcyK4PA6+WbzlTM9WhQm6vB5W7cP7dUiPsv1g7YDwEQnQ1CGpK3MGlKk/ITVWMk05kHZuBhmVhiv8LZoy/PFQ=="],
"tar-stream": ["tar-stream@3.2.0", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg=="],
@@ -1363,7 +1419,7 @@
"vinxi": ["vinxi@0.5.11", "", { "dependencies": { "@babel/core": "^7.22.11", "@babel/plugin-syntax-jsx": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.22.5", "@types/micromatch": "^4.0.2", "@vinxi/listhen": "^1.5.6", "boxen": "^8.0.1", "chokidar": "^4.0.3", "citty": "^0.1.6", "consola": "^3.4.2", "crossws": "^0.3.4", "dax-sh": "^0.43.0", "defu": "^6.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.25.3", "get-port-please": "^3.1.2", "h3": "1.15.3", "hookable": "^5.5.3", "http-proxy": "^1.18.1", "micromatch": "^4.0.8", "nitropack": "^2.11.10", "node-fetch-native": "^1.6.6", "path-to-regexp": "^6.2.1", "pathe": "^1.1.1", "radix3": "^1.1.2", "resolve": "^1.22.10", "serve-placeholder": "^2.0.1", "serve-static": "^1.15.0", "tinyglobby": "^0.2.14", "ufo": "^1.6.1", "unctx": "^2.4.1", "unenv": "^1.10.0", "unstorage": "^1.16.0", "vite": "^6.4.1", "zod": "^4.0.0" }, "bin": { "vinxi": "bin/cli.mjs" } }, "sha512-82Qm+EG/b2PRFBvXBbz1lgWBGcd9totIL6SJhnrZYfakjloTVG9+5l6gfO6dbCCtztm5pqWFzLY0qpZ3H3ww/w=="],
- "vite": ["vite@6.4.2", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ=="],
+ "vite": ["vite@6.4.3", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A=="],
"vite-plugin-solid": ["vite-plugin-solid@2.11.12", "", { "dependencies": { "@babel/core": "^7.23.3", "@types/babel__core": "^7.20.4", "babel-preset-solid": "^1.8.4", "merge-anything": "^5.1.7", "solid-refresh": "^0.6.3", "vitefu": "^1.0.4" }, "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["@testing-library/jest-dom"] }, "sha512-FgjPcx2OwX9h6f28jli7A4bG7PP3te8uyakE5iqsmpq3Jqi1TWLgSroC9N6cMfGRU2zXsl4Q6ISvTr2VL0QHpA=="],
@@ -1409,14 +1465,38 @@
"@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
- "@babel/core/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="],
+ "@babel/core/@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
+
+ "@babel/core/@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="],
+
+ "@babel/core/@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="],
+
+ "@babel/core/@babel/traverse": ["@babel/traverse@7.29.7", "", { "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" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="],
+
+ "@babel/core/@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="],
+
+ "@babel/generator/@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="],
+
+ "@babel/generator/@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="],
"@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
+ "@babel/helper-module-transforms/@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="],
+
+ "@babel/helper-module-transforms/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
+
+ "@babel/helper-module-transforms/@babel/traverse": ["@babel/traverse@7.29.7", "", { "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" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="],
+
+ "@babel/helpers/@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="],
+
+ "@babel/helpers/@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="],
+
"@babel/template/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="],
"@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="],
+ "@babel/traverse/@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="],
+
"@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="],
"@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
@@ -1449,9 +1529,9 @@
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
- "@vercel/nft/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
+ "@tanstack/router-utils/@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="],
- "@vinxi/listhen/h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="],
+ "@vercel/nft/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
"@vinxi/listhen/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
@@ -1479,8 +1559,14 @@
"cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+ "css-select/domhandler": ["domhandler@6.0.1", "", { "dependencies": { "domelementtype": "^3.0.0" } }, "sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg=="],
+
+ "css-select/domutils": ["domutils@4.0.2", "", { "dependencies": { "dom-serializer": "^3.0.0", "domelementtype": "^3.0.0", "domhandler": "^6.0.0" } }, "sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA=="],
+
"dax-sh/undici-types": ["undici-types@5.28.4", "", {}, "sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww=="],
+ "defuddle/linkedom": ["linkedom@0.18.12", "", { "dependencies": { "css-select": "^5.1.0", "cssom": "^0.5.0", "html-escaper": "^3.0.3", "htmlparser2": "^10.0.0", "uhyphen": "^0.2.0" }, "peerDependencies": { "canvas": ">= 2" }, "optionalPeers": ["canvas"] }, "sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q=="],
+
"dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
"dot-prop/type-fest": ["type-fest@5.6.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA=="],
@@ -1501,8 +1587,6 @@
"listhen/citty": ["citty@0.2.2", "", {}, "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w=="],
- "listhen/h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="],
-
"make-dir/semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="],
"markdown-it/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
@@ -1517,12 +1601,10 @@
"nitropack/citty": ["citty@0.2.2", "", {}, "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w=="],
- "nitropack/esbuild": ["esbuild@0.28.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.0", "@esbuild/android-arm": "0.28.0", "@esbuild/android-arm64": "0.28.0", "@esbuild/android-x64": "0.28.0", "@esbuild/darwin-arm64": "0.28.0", "@esbuild/darwin-x64": "0.28.0", "@esbuild/freebsd-arm64": "0.28.0", "@esbuild/freebsd-x64": "0.28.0", "@esbuild/linux-arm": "0.28.0", "@esbuild/linux-arm64": "0.28.0", "@esbuild/linux-ia32": "0.28.0", "@esbuild/linux-loong64": "0.28.0", "@esbuild/linux-mips64el": "0.28.0", "@esbuild/linux-ppc64": "0.28.0", "@esbuild/linux-riscv64": "0.28.0", "@esbuild/linux-s390x": "0.28.0", "@esbuild/linux-x64": "0.28.0", "@esbuild/netbsd-arm64": "0.28.0", "@esbuild/netbsd-x64": "0.28.0", "@esbuild/openbsd-arm64": "0.28.0", "@esbuild/openbsd-x64": "0.28.0", "@esbuild/openharmony-arm64": "0.28.0", "@esbuild/sunos-x64": "0.28.0", "@esbuild/win32-arm64": "0.28.0", "@esbuild/win32-ia32": "0.28.0", "@esbuild/win32-x64": "0.28.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw=="],
+ "nitropack/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="],
"nitropack/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
- "nitropack/h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="],
-
"nitropack/semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="],
"nitropack/serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="],
@@ -1539,10 +1621,14 @@
"rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+ "sanitize-html/htmlparser2": ["htmlparser2@12.0.0", "", { "dependencies": { "domelementtype": "^3.0.0", "domhandler": "^6.0.0", "domutils": "^4.0.2", "entities": "^8.0.0" } }, "sha512-Tz7u1i95/g2x2jz81+x0FBVhBhY5aRTvD3tXXdFaljuNdzDLJ8UGNRrTcj2cgQvAg3iW/h77Fz15nLW0L0CrZw=="],
+
"send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
"send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="],
+ "solid-refresh/@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="],
+
"source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
"string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
@@ -1571,8 +1657,6 @@
"unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
- "unstorage/h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="],
-
"untun/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="],
"vinxi/es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
@@ -1581,6 +1665,12 @@
"vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+ "vite/picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="],
+
+ "vite/postcss": ["postcss@8.5.19", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ=="],
+
+ "vite/tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
+
"wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
"wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
@@ -1589,8 +1679,40 @@
"youch/cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="],
+ "@babel/core/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
+
"@babel/core/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
+ "@babel/core/@babel/traverse/@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="],
+
+ "@babel/core/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
+
+ "@babel/core/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
+
+ "@babel/generator/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
+
+ "@babel/generator/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
+
+ "@babel/helper-module-transforms/@babel/helper-module-imports/@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="],
+
+ "@babel/helper-module-transforms/@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
+
+ "@babel/helper-module-transforms/@babel/traverse/@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="],
+
+ "@babel/helper-module-transforms/@babel/traverse/@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="],
+
+ "@babel/helper-module-transforms/@babel/traverse/@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="],
+
+ "@babel/helper-module-transforms/@babel/traverse/@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="],
+
+ "@babel/helpers/@babel/template/@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
+
+ "@babel/helpers/@babel/template/@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="],
+
+ "@babel/helpers/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
+
+ "@babel/helpers/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
+
"@babel/template/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
"@babel/traverse/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
@@ -1641,8 +1763,6 @@
"@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
- "@vinxi/listhen/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="],
-
"ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
"ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
@@ -1655,76 +1775,88 @@
"cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+ "css-select/domhandler/domelementtype": ["domelementtype@3.0.0", "", {}, "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg=="],
+
+ "css-select/domutils/dom-serializer": ["dom-serializer@3.1.1", "", { "dependencies": { "domelementtype": "^3.0.0", "domhandler": "^6.0.0", "entities": "^8.0.0" } }, "sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw=="],
+
+ "css-select/domutils/domelementtype": ["domelementtype@3.0.0", "", {}, "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg=="],
+
+ "defuddle/linkedom/css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="],
+
"lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
"lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
"listhen/@parcel/watcher-wasm/napi-wasm": ["napi-wasm@1.1.3", "", { "bundled": true }, "sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg=="],
- "listhen/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="],
-
"mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
"nitropack/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
- "nitropack/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA=="],
+ "nitropack/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="],
- "nitropack/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.0", "", { "os": "android", "cpu": "arm" }, "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ=="],
+ "nitropack/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="],
- "nitropack/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.0", "", { "os": "android", "cpu": "arm64" }, "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw=="],
+ "nitropack/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="],
- "nitropack/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.0", "", { "os": "android", "cpu": "x64" }, "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA=="],
+ "nitropack/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="],
- "nitropack/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q=="],
+ "nitropack/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="],
- "nitropack/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ=="],
+ "nitropack/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="],
- "nitropack/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q=="],
+ "nitropack/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="],
- "nitropack/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw=="],
+ "nitropack/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="],
- "nitropack/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw=="],
+ "nitropack/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="],
- "nitropack/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A=="],
+ "nitropack/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="],
- "nitropack/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ=="],
+ "nitropack/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="],
- "nitropack/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg=="],
+ "nitropack/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="],
- "nitropack/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w=="],
+ "nitropack/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="],
- "nitropack/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg=="],
+ "nitropack/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="],
- "nitropack/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ=="],
+ "nitropack/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="],
- "nitropack/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q=="],
+ "nitropack/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="],
- "nitropack/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.0", "", { "os": "linux", "cpu": "x64" }, "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ=="],
+ "nitropack/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="],
- "nitropack/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.0", "", { "os": "none", "cpu": "arm64" }, "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw=="],
+ "nitropack/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="],
- "nitropack/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.0", "", { "os": "none", "cpu": "x64" }, "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw=="],
+ "nitropack/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="],
- "nitropack/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g=="],
+ "nitropack/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="],
- "nitropack/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA=="],
+ "nitropack/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="],
- "nitropack/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.0", "", { "os": "none", "cpu": "arm64" }, "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w=="],
+ "nitropack/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="],
- "nitropack/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw=="],
+ "nitropack/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="],
- "nitropack/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA=="],
+ "nitropack/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="],
- "nitropack/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA=="],
+ "nitropack/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="],
- "nitropack/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw=="],
-
- "nitropack/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="],
+ "nitropack/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="],
"nitropack/serve-static/send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
"readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="],
+ "sanitize-html/htmlparser2/domelementtype": ["domelementtype@3.0.0", "", {}, "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg=="],
+
+ "sanitize-html/htmlparser2/domhandler": ["domhandler@6.0.1", "", { "dependencies": { "domelementtype": "^3.0.0" } }, "sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg=="],
+
+ "sanitize-html/htmlparser2/domutils": ["domutils@4.0.2", "", { "dependencies": { "dom-serializer": "^3.0.0", "domelementtype": "^3.0.0", "domhandler": "^6.0.0" } }, "sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA=="],
+
+ "sanitize-html/htmlparser2/entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="],
+
"send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
"string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
@@ -1783,22 +1915,40 @@
"unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
- "unstorage/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="],
-
"wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
"wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+ "@babel/helper-module-transforms/@babel/helper-module-imports/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
+
+ "@babel/helper-module-transforms/@babel/traverse/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
+
+ "@babel/helper-module-transforms/@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
+
+ "@babel/helpers/@babel/template/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
+
+ "@babel/helpers/@babel/template/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
+
"ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
"archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="],
"archiver-utils/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
+ "css-select/domutils/dom-serializer/entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="],
+
+ "defuddle/linkedom/css-select/boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
+
+ "defuddle/linkedom/css-select/css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
+
+ "defuddle/linkedom/css-select/nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
+
"nitropack/serve-static/send/fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
"readdir-glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+ "sanitize-html/htmlparser2/domutils/dom-serializer": ["dom-serializer@3.1.1", "", { "dependencies": { "domelementtype": "^3.0.0", "domhandler": "^6.0.0", "entities": "^8.0.0" } }, "sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw=="],
+
"archiver-utils/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
}
}
diff --git a/drizzle/0016_scrub_backup_secrets.sql b/drizzle/0016_scrub_backup_secrets.sql
new file mode 100644
index 00000000..d01ffafe
--- /dev/null
+++ b/drizzle/0016_scrub_backup_secrets.sql
@@ -0,0 +1,10 @@
+UPDATE `backup_environment_stamps`
+SET `git_remote_url` = 'redacted:migration-0016'
+WHERE `git_remote_url` IS NOT NULL;
+--> statement-breakpoint
+UPDATE `backup_failsafe_alerts`
+SET `git_remote_url` = NULL,
+ `error` = CASE
+ WHEN `kind` = 'backup_push_failed' THEN NULL
+ ELSE `error`
+ END;
diff --git a/drizzle/0017_skinny_hobgoblin.sql b/drizzle/0017_skinny_hobgoblin.sql
new file mode 100644
index 00000000..c718c3e8
--- /dev/null
+++ b/drizzle/0017_skinny_hobgoblin.sql
@@ -0,0 +1,16 @@
+DELETE FROM `moments`
+WHERE `id` IN (
+ SELECT `id`
+ FROM (
+ SELECT
+ `id`,
+ row_number() OVER (
+ PARTITION BY `memory_id`, `section_path`
+ ORDER BY `updated_at` DESC, `created_at` ASC, `id` ASC
+ ) AS `duplicate_rank`
+ FROM `moments`
+ )
+ WHERE `duplicate_rank` > 1
+);
+--> statement-breakpoint
+CREATE UNIQUE INDEX `moments_memory_section_path_unique` ON `moments` (`memory_id`,`section_path`);
diff --git a/drizzle/meta/0016_snapshot.json b/drizzle/meta/0016_snapshot.json
new file mode 100644
index 00000000..f1252ded
--- /dev/null
+++ b/drizzle/meta/0016_snapshot.json
@@ -0,0 +1,1315 @@
+{
+ "id": "90a2c452-09c0-4da5-bd6a-99f43c9154fc",
+ "prevId": "be79309e-03a0-4a21-9830-f2adf0db7659",
+ "version": "6",
+ "dialect": "sqlite",
+ "tables": {
+ "app_settings": {
+ "name": "app_settings",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "translation_target_language": {
+ "name": "translation_target_language",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false,
+ "default": "'ja-JP'"
+ },
+ "codex_translation_model": {
+ "name": "codex_translation_model",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "codex_translation_reasoning_effort": {
+ "name": "codex_translation_reasoning_effort",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "app_settings_id_check": {
+ "name": "app_settings_id_check",
+ "value": "\"app_settings\".\"id\" = 'default'"
+ },
+ "app_settings_translation_target_language_check": {
+ "name": "app_settings_translation_target_language_check",
+ "value": "\"app_settings\".\"translation_target_language\" in ('ja-JP', 'en-US', 'en-GB', 'ko-KR', 'zh-CN', 'zh-TW', 'fr-FR', 'de-DE', 'es-ES', 'pt-BR')"
+ },
+ "app_settings_codex_translation_reasoning_effort_check": {
+ "name": "app_settings_codex_translation_reasoning_effort_check",
+ "value": "\"app_settings\".\"codex_translation_reasoning_effort\" is null or \"app_settings\".\"codex_translation_reasoning_effort\" in ('none', 'minimal', 'low', 'medium', 'high', 'xhigh')"
+ }
+ }
+ },
+ "backup_environment_stamps": {
+ "name": "backup_environment_stamps",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "project_path": {
+ "name": "project_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "store_path": {
+ "name": "store_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "git_remote": {
+ "name": "git_remote",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "git_remote_url": {
+ "name": "git_remote_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "git_branch": {
+ "name": "git_branch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "backup_environment_stamps_id_check": {
+ "name": "backup_environment_stamps_id_check",
+ "value": "\"backup_environment_stamps\".\"id\" = 'default'"
+ }
+ }
+ },
+ "backup_failsafe_alerts": {
+ "name": "backup_failsafe_alerts",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "kind": {
+ "name": "kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "severity": {
+ "name": "severity",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "message": {
+ "name": "message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "previous_project_path": {
+ "name": "previous_project_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "previous_store_path": {
+ "name": "previous_store_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "current_project_path": {
+ "name": "current_project_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "current_store_path": {
+ "name": "current_store_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "git_remote": {
+ "name": "git_remote",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "git_remote_url": {
+ "name": "git_remote_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "git_branch": {
+ "name": "git_branch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "backup_failsafe_alerts_id_check": {
+ "name": "backup_failsafe_alerts_id_check",
+ "value": "\"backup_failsafe_alerts\".\"id\" = 'active'"
+ },
+ "backup_failsafe_alerts_kind_check": {
+ "name": "backup_failsafe_alerts_kind_check",
+ "value": "\"backup_failsafe_alerts\".\"kind\" in ('backup_path_drift', 'backup_content_inconsistent', 'backup_repository_missing', 'backup_push_failed')"
+ },
+ "backup_failsafe_alerts_severity_check": {
+ "name": "backup_failsafe_alerts_severity_check",
+ "value": "\"backup_failsafe_alerts\".\"severity\" in ('critical')"
+ }
+ }
+ },
+ "categories": {
+ "name": "categories",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "categories_name_unique": {
+ "name": "categories_name_unique",
+ "columns": [
+ "name"
+ ],
+ "isUnique": true
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {}
+ },
+ "flashbacks": {
+ "name": "flashbacks",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "memory_id": {
+ "name": "memory_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "text": {
+ "name": "text",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "prefix": {
+ "name": "prefix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "suffix": {
+ "name": "suffix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "start_offset": {
+ "name": "start_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "end_offset": {
+ "name": "end_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "content_hash": {
+ "name": "content_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "flashbacks_memory_id_idx": {
+ "name": "flashbacks_memory_id_idx",
+ "columns": [
+ "memory_id"
+ ],
+ "isUnique": false
+ },
+ "flashbacks_created_at_idx": {
+ "name": "flashbacks_created_at_idx",
+ "columns": [
+ "created_at"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "flashbacks_memory_id_memories_id_fk": {
+ "name": "flashbacks_memory_id_memories_id_fk",
+ "tableFrom": "flashbacks",
+ "columnsFrom": [
+ "memory_id"
+ ],
+ "tableTo": "memories",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "no action",
+ "onDelete": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "flashbacks_start_offset_check": {
+ "name": "flashbacks_start_offset_check",
+ "value": "\"flashbacks\".\"start_offset\" >= 0"
+ },
+ "flashbacks_end_offset_check": {
+ "name": "flashbacks_end_offset_check",
+ "value": "\"flashbacks\".\"end_offset\" > \"flashbacks\".\"start_offset\""
+ }
+ }
+ },
+ "memories": {
+ "name": "memories",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "url": {
+ "name": "url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "favicon_url": {
+ "name": "favicon_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "content_path": {
+ "name": "content_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "extraction_status": {
+ "name": "extraction_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "extraction_error": {
+ "name": "extraction_error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "read": {
+ "name": "read",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false,
+ "default": false
+ },
+ "backup_status": {
+ "name": "backup_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "last_backup_at": {
+ "name": "last_backup_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "last_backup_error": {
+ "name": "last_backup_error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "memories_url_idx": {
+ "name": "memories_url_idx",
+ "columns": [
+ "url"
+ ],
+ "isUnique": false
+ },
+ "memories_created_at_idx": {
+ "name": "memories_created_at_idx",
+ "columns": [
+ "created_at"
+ ],
+ "isUnique": false
+ },
+ "memories_extraction_status_idx": {
+ "name": "memories_extraction_status_idx",
+ "columns": [
+ "extraction_status"
+ ],
+ "isUnique": false
+ },
+ "memories_backup_status_idx": {
+ "name": "memories_backup_status_idx",
+ "columns": [
+ "backup_status"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "memories_extraction_status_check": {
+ "name": "memories_extraction_status_check",
+ "value": "\"memories\".\"extraction_status\" in ('pending', 'success', 'link_only', 'failed')"
+ },
+ "memories_backup_status_check": {
+ "name": "memories_backup_status_check",
+ "value": "\"memories\".\"backup_status\" in ('pending', 'queued', 'success', 'failed', 'disabled')"
+ }
+ }
+ },
+ "memory_categories": {
+ "name": "memory_categories",
+ "columns": {
+ "memory_id": {
+ "name": "memory_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "category_id": {
+ "name": "category_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "memory_categories_category_id_idx": {
+ "name": "memory_categories_category_id_idx",
+ "columns": [
+ "category_id"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "memory_categories_memory_id_memories_id_fk": {
+ "name": "memory_categories_memory_id_memories_id_fk",
+ "tableFrom": "memory_categories",
+ "columnsFrom": [
+ "memory_id"
+ ],
+ "tableTo": "memories",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "no action",
+ "onDelete": "cascade"
+ },
+ "memory_categories_category_id_categories_id_fk": {
+ "name": "memory_categories_category_id_categories_id_fk",
+ "tableFrom": "memory_categories",
+ "columnsFrom": [
+ "category_id"
+ ],
+ "tableTo": "categories",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "no action",
+ "onDelete": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {
+ "memory_categories_memory_id_category_id_pk": {
+ "columns": [
+ "memory_id",
+ "category_id"
+ ],
+ "name": "memory_categories_memory_id_category_id_pk"
+ }
+ },
+ "uniqueConstraints": {},
+ "checkConstraints": {}
+ },
+ "memory_tags": {
+ "name": "memory_tags",
+ "columns": {
+ "memory_id": {
+ "name": "memory_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "tag_id": {
+ "name": "tag_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "memory_tags_tag_id_idx": {
+ "name": "memory_tags_tag_id_idx",
+ "columns": [
+ "tag_id"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "memory_tags_memory_id_memories_id_fk": {
+ "name": "memory_tags_memory_id_memories_id_fk",
+ "tableFrom": "memory_tags",
+ "columnsFrom": [
+ "memory_id"
+ ],
+ "tableTo": "memories",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "no action",
+ "onDelete": "cascade"
+ },
+ "memory_tags_tag_id_tags_id_fk": {
+ "name": "memory_tags_tag_id_tags_id_fk",
+ "tableFrom": "memory_tags",
+ "columnsFrom": [
+ "tag_id"
+ ],
+ "tableTo": "tags",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "no action",
+ "onDelete": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {
+ "memory_tags_memory_id_tag_id_pk": {
+ "columns": [
+ "memory_id",
+ "tag_id"
+ ],
+ "name": "memory_tags_memory_id_tag_id_pk"
+ }
+ },
+ "uniqueConstraints": {},
+ "checkConstraints": {}
+ },
+ "moments": {
+ "name": "moments",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "memory_id": {
+ "name": "memory_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "section_anchor": {
+ "name": "section_anchor",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "section_title": {
+ "name": "section_title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "section_level": {
+ "name": "section_level",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "section_path": {
+ "name": "section_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "section_start_offset": {
+ "name": "section_start_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "section_end_offset": {
+ "name": "section_end_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "content_hash": {
+ "name": "content_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "moments_memory_section_anchor_unique": {
+ "name": "moments_memory_section_anchor_unique",
+ "columns": [
+ "memory_id",
+ "section_anchor"
+ ],
+ "isUnique": true
+ },
+ "moments_memory_id_idx": {
+ "name": "moments_memory_id_idx",
+ "columns": [
+ "memory_id"
+ ],
+ "isUnique": false
+ },
+ "moments_created_at_idx": {
+ "name": "moments_created_at_idx",
+ "columns": [
+ "created_at"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "moments_memory_id_memories_id_fk": {
+ "name": "moments_memory_id_memories_id_fk",
+ "tableFrom": "moments",
+ "columnsFrom": [
+ "memory_id"
+ ],
+ "tableTo": "memories",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "no action",
+ "onDelete": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "moments_section_anchor_check": {
+ "name": "moments_section_anchor_check",
+ "value": "length(\"moments\".\"section_anchor\") > 0"
+ },
+ "moments_section_title_check": {
+ "name": "moments_section_title_check",
+ "value": "length(\"moments\".\"section_title\") > 0"
+ },
+ "moments_section_level_check": {
+ "name": "moments_section_level_check",
+ "value": "\"moments\".\"section_level\" >= 1 and \"moments\".\"section_level\" <= 6"
+ },
+ "moments_section_offset_check": {
+ "name": "moments_section_offset_check",
+ "value": "(\"moments\".\"section_start_offset\" is null and \"moments\".\"section_end_offset\" is null) or (\"moments\".\"section_start_offset\" is not null and \"moments\".\"section_end_offset\" is not null and \"moments\".\"section_start_offset\" >= 0 and \"moments\".\"section_end_offset\" > \"moments\".\"section_start_offset\")"
+ }
+ }
+ },
+ "openai_auth_credentials": {
+ "name": "openai_auth_credentials",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "credential_reference": {
+ "name": "credential_reference",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "openai_auth_credentials_id_check": {
+ "name": "openai_auth_credentials_id_check",
+ "value": "\"openai_auth_credentials\".\"id\" = 'default'"
+ }
+ }
+ },
+ "tags": {
+ "name": "tags",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "tags_name_unique": {
+ "name": "tags_name_unique",
+ "columns": [
+ "name"
+ ],
+ "isUnique": true
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {}
+ },
+ "translation_chunks": {
+ "name": "translation_chunks",
+ "columns": {
+ "job_id": {
+ "name": "job_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "chunk_index": {
+ "name": "chunk_index",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "source_chunk_hash": {
+ "name": "source_chunk_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "block_ids_json": {
+ "name": "block_ids_json",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "retry_count": {
+ "name": "retry_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false,
+ "default": 0
+ },
+ "translated_markdown": {
+ "name": "translated_markdown",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "translated_hash": {
+ "name": "translated_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "translation_chunks_status_idx": {
+ "name": "translation_chunks_status_idx",
+ "columns": [
+ "job_id",
+ "status",
+ "chunk_index"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "translation_chunks_job_id_translation_jobs_job_id_fk": {
+ "name": "translation_chunks_job_id_translation_jobs_job_id_fk",
+ "tableFrom": "translation_chunks",
+ "columnsFrom": [
+ "job_id"
+ ],
+ "tableTo": "translation_jobs",
+ "columnsTo": [
+ "job_id"
+ ],
+ "onUpdate": "no action",
+ "onDelete": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {
+ "translation_chunks_job_id_chunk_index_pk": {
+ "columns": [
+ "job_id",
+ "chunk_index"
+ ],
+ "name": "translation_chunks_job_id_chunk_index_pk"
+ }
+ },
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "translation_chunks_status_check": {
+ "name": "translation_chunks_status_check",
+ "value": "\"translation_chunks\".\"status\" in ('pending', 'running', 'validating', 'retrying', 'complete', 'purged', 'failed')"
+ },
+ "translation_chunks_source_hash_check": {
+ "name": "translation_chunks_source_hash_check",
+ "value": "\"translation_chunks\".\"source_chunk_hash\" glob 'sha256:*'"
+ },
+ "translation_chunks_translated_hash_check": {
+ "name": "translation_chunks_translated_hash_check",
+ "value": "\"translation_chunks\".\"translated_hash\" is null or \"translation_chunks\".\"translated_hash\" glob 'sha256:*'"
+ },
+ "translation_chunks_retry_count_check": {
+ "name": "translation_chunks_retry_count_check",
+ "value": "\"translation_chunks\".\"retry_count\" >= 0"
+ },
+ "translation_chunks_index_check": {
+ "name": "translation_chunks_index_check",
+ "value": "\"translation_chunks\".\"chunk_index\" >= 0"
+ }
+ }
+ },
+ "translation_jobs": {
+ "name": "translation_jobs",
+ "columns": {
+ "job_id": {
+ "name": "job_id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "memory_id": {
+ "name": "memory_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "lang_code": {
+ "name": "lang_code",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "source_hash": {
+ "name": "source_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "model": {
+ "name": "model",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "reasoning_effort": {
+ "name": "reasoning_effort",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "prompt_policy_version": {
+ "name": "prompt_policy_version",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "chunker_version": {
+ "name": "chunker_version",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "chunk_count": {
+ "name": "chunk_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false,
+ "default": 0
+ },
+ "output_path": {
+ "name": "output_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "output_hash": {
+ "name": "output_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "completed_at": {
+ "name": "completed_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "translation_jobs_current_complete_idx": {
+ "name": "translation_jobs_current_complete_idx",
+ "columns": [
+ "memory_id",
+ "lang_code",
+ "source_hash"
+ ],
+ "where": "\"translation_jobs\".\"status\" = 'complete'",
+ "isUnique": true
+ },
+ "translation_jobs_active_idx": {
+ "name": "translation_jobs_active_idx",
+ "columns": [
+ "memory_id",
+ "lang_code",
+ "source_hash"
+ ],
+ "where": "\"translation_jobs\".\"status\" in ('pending', 'running', 'cancel_requested', 'stitching', 'committing')",
+ "isUnique": true
+ },
+ "translation_jobs_memory_lang_idx": {
+ "name": "translation_jobs_memory_lang_idx",
+ "columns": [
+ "memory_id",
+ "lang_code",
+ "updated_at"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "translation_jobs_memory_id_memories_id_fk": {
+ "name": "translation_jobs_memory_id_memories_id_fk",
+ "tableFrom": "translation_jobs",
+ "columnsFrom": [
+ "memory_id"
+ ],
+ "tableTo": "memories",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "no action",
+ "onDelete": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "translation_jobs_status_check": {
+ "name": "translation_jobs_status_check",
+ "value": "\"translation_jobs\".\"status\" in ('pending', 'running', 'stale', 'cancel_requested', 'canceled', 'unavailable', 'stitching', 'committing', 'complete', 'failed')"
+ },
+ "translation_jobs_source_hash_check": {
+ "name": "translation_jobs_source_hash_check",
+ "value": "\"translation_jobs\".\"source_hash\" glob 'sha256:*'"
+ },
+ "translation_jobs_output_hash_check": {
+ "name": "translation_jobs_output_hash_check",
+ "value": "\"translation_jobs\".\"output_hash\" is null or \"translation_jobs\".\"output_hash\" glob 'sha256:*'"
+ },
+ "translation_jobs_reasoning_effort_check": {
+ "name": "translation_jobs_reasoning_effort_check",
+ "value": "\"translation_jobs\".\"reasoning_effort\" is null or \"translation_jobs\".\"reasoning_effort\" in ('none', 'minimal', 'low', 'medium', 'high', 'xhigh')"
+ },
+ "translation_jobs_chunk_count_check": {
+ "name": "translation_jobs_chunk_count_check",
+ "value": "\"translation_jobs\".\"chunk_count\" >= 0"
+ }
+ }
+ }
+ },
+ "views": {},
+ "enums": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ },
+ "internal": {
+ "indexes": {}
+ }
+}
\ No newline at end of file
diff --git a/drizzle/meta/0017_snapshot.json b/drizzle/meta/0017_snapshot.json
new file mode 100644
index 00000000..0554500a
--- /dev/null
+++ b/drizzle/meta/0017_snapshot.json
@@ -0,0 +1,1587 @@
+{
+ "version": "6",
+ "dialect": "sqlite",
+ "id": "175d5eb2-7534-4024-aa67-c69066d56a66",
+ "prevId": "90a2c452-09c0-4da5-bd6a-99f43c9154fc",
+ "tables": {
+ "app_settings": {
+ "name": "app_settings",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "translation_target_language": {
+ "name": "translation_target_language",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false,
+ "default": "'ja-JP'"
+ },
+ "codex_translation_model": {
+ "name": "codex_translation_model",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "codex_translation_reasoning_effort": {
+ "name": "codex_translation_reasoning_effort",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "app_settings_id_check": {
+ "name": "app_settings_id_check",
+ "value": "\"app_settings\".\"id\" = 'default'"
+ },
+ "app_settings_translation_target_language_check": {
+ "name": "app_settings_translation_target_language_check",
+ "value": "\"app_settings\".\"translation_target_language\" in ('ja-JP', 'en-US', 'en-GB', 'ko-KR', 'zh-CN', 'zh-TW', 'fr-FR', 'de-DE', 'es-ES', 'pt-BR')"
+ },
+ "app_settings_codex_translation_reasoning_effort_check": {
+ "name": "app_settings_codex_translation_reasoning_effort_check",
+ "value": "\"app_settings\".\"codex_translation_reasoning_effort\" is null or \"app_settings\".\"codex_translation_reasoning_effort\" in ('none', 'minimal', 'low', 'medium', 'high', 'xhigh')"
+ }
+ }
+ },
+ "backup_environment_stamps": {
+ "name": "backup_environment_stamps",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "project_path": {
+ "name": "project_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "store_path": {
+ "name": "store_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "git_remote": {
+ "name": "git_remote",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "git_remote_url": {
+ "name": "git_remote_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "git_branch": {
+ "name": "git_branch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "backup_environment_stamps_id_check": {
+ "name": "backup_environment_stamps_id_check",
+ "value": "\"backup_environment_stamps\".\"id\" = 'default'"
+ }
+ }
+ },
+ "backup_failsafe_alerts": {
+ "name": "backup_failsafe_alerts",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "kind": {
+ "name": "kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "severity": {
+ "name": "severity",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "message": {
+ "name": "message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "previous_project_path": {
+ "name": "previous_project_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "previous_store_path": {
+ "name": "previous_store_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "current_project_path": {
+ "name": "current_project_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "current_store_path": {
+ "name": "current_store_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "git_remote": {
+ "name": "git_remote",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "git_remote_url": {
+ "name": "git_remote_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "git_branch": {
+ "name": "git_branch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "backup_failsafe_alerts_id_check": {
+ "name": "backup_failsafe_alerts_id_check",
+ "value": "\"backup_failsafe_alerts\".\"id\" = 'active'"
+ },
+ "backup_failsafe_alerts_kind_check": {
+ "name": "backup_failsafe_alerts_kind_check",
+ "value": "\"backup_failsafe_alerts\".\"kind\" in ('backup_path_drift', 'backup_content_inconsistent', 'backup_repository_missing', 'backup_push_failed')"
+ },
+ "backup_failsafe_alerts_severity_check": {
+ "name": "backup_failsafe_alerts_severity_check",
+ "value": "\"backup_failsafe_alerts\".\"severity\" in ('critical')"
+ }
+ }
+ },
+ "categories": {
+ "name": "categories",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "categories_name_unique": {
+ "name": "categories_name_unique",
+ "columns": [
+ "name"
+ ],
+ "isUnique": true
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {}
+ },
+ "flashbacks": {
+ "name": "flashbacks",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "memory_id": {
+ "name": "memory_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "variant_kind": {
+ "name": "variant_kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false,
+ "default": "'source'"
+ },
+ "lang_code": {
+ "name": "lang_code",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "translation_output_hash": {
+ "name": "translation_output_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "text": {
+ "name": "text",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "prefix": {
+ "name": "prefix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "suffix": {
+ "name": "suffix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "start_offset": {
+ "name": "start_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "end_offset": {
+ "name": "end_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "content_hash": {
+ "name": "content_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "flashbacks_memory_id_idx": {
+ "name": "flashbacks_memory_id_idx",
+ "columns": [
+ "memory_id"
+ ],
+ "isUnique": false
+ },
+ "flashbacks_created_at_idx": {
+ "name": "flashbacks_created_at_idx",
+ "columns": [
+ "created_at"
+ ],
+ "isUnique": false
+ },
+ "flashbacks_memory_variant_idx": {
+ "name": "flashbacks_memory_variant_idx",
+ "columns": [
+ "memory_id",
+ "variant_kind",
+ "lang_code",
+ "translation_output_hash",
+ "start_offset"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "flashbacks_memory_id_memories_id_fk": {
+ "name": "flashbacks_memory_id_memories_id_fk",
+ "tableFrom": "flashbacks",
+ "tableTo": "memories",
+ "columnsFrom": [
+ "memory_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "flashbacks_variant_kind_check": {
+ "name": "flashbacks_variant_kind_check",
+ "value": "\"flashbacks\".\"variant_kind\" in ('source', 'translation')"
+ },
+ "flashbacks_variant_scope_check": {
+ "name": "flashbacks_variant_scope_check",
+ "value": "(\"flashbacks\".\"variant_kind\" = 'source' and \"flashbacks\".\"lang_code\" is null and \"flashbacks\".\"translation_output_hash\" is null) or (\"flashbacks\".\"variant_kind\" = 'translation' and \"flashbacks\".\"lang_code\" is not null and \"flashbacks\".\"lang_code\" in ('ja-JP', 'en-US', 'en-GB', 'ko-KR', 'zh-CN', 'zh-TW', 'fr-FR', 'de-DE', 'es-ES', 'pt-BR') and \"flashbacks\".\"translation_output_hash\" is not null and \"flashbacks\".\"translation_output_hash\" glob 'sha256:*')"
+ },
+ "flashbacks_start_offset_check": {
+ "name": "flashbacks_start_offset_check",
+ "value": "\"flashbacks\".\"start_offset\" >= 0"
+ },
+ "flashbacks_end_offset_check": {
+ "name": "flashbacks_end_offset_check",
+ "value": "\"flashbacks\".\"end_offset\" > \"flashbacks\".\"start_offset\""
+ }
+ }
+ },
+ "memories": {
+ "name": "memories",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "url": {
+ "name": "url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "favicon_url": {
+ "name": "favicon_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "content_path": {
+ "name": "content_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "extraction_status": {
+ "name": "extraction_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "extraction_error": {
+ "name": "extraction_error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "read": {
+ "name": "read",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false,
+ "default": false
+ },
+ "backup_status": {
+ "name": "backup_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "last_backup_at": {
+ "name": "last_backup_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "last_backup_error": {
+ "name": "last_backup_error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "memories_url_idx": {
+ "name": "memories_url_idx",
+ "columns": [
+ "url"
+ ],
+ "isUnique": false
+ },
+ "memories_created_at_idx": {
+ "name": "memories_created_at_idx",
+ "columns": [
+ "created_at"
+ ],
+ "isUnique": false
+ },
+ "memories_created_at_id_idx": {
+ "name": "memories_created_at_id_idx",
+ "columns": [
+ "created_at",
+ "id"
+ ],
+ "isUnique": false
+ },
+ "memories_extraction_status_idx": {
+ "name": "memories_extraction_status_idx",
+ "columns": [
+ "extraction_status"
+ ],
+ "isUnique": false
+ },
+ "memories_backup_status_idx": {
+ "name": "memories_backup_status_idx",
+ "columns": [
+ "backup_status"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "memories_extraction_status_check": {
+ "name": "memories_extraction_status_check",
+ "value": "\"memories\".\"extraction_status\" in ('pending', 'success', 'link_only', 'failed')"
+ },
+ "memories_backup_status_check": {
+ "name": "memories_backup_status_check",
+ "value": "\"memories\".\"backup_status\" in ('pending', 'queued', 'success', 'failed', 'disabled')"
+ }
+ }
+ },
+ "memory_categories": {
+ "name": "memory_categories",
+ "columns": {
+ "memory_id": {
+ "name": "memory_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "category_id": {
+ "name": "category_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "memory_categories_category_id_idx": {
+ "name": "memory_categories_category_id_idx",
+ "columns": [
+ "category_id"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "memory_categories_memory_id_memories_id_fk": {
+ "name": "memory_categories_memory_id_memories_id_fk",
+ "tableFrom": "memory_categories",
+ "tableTo": "memories",
+ "columnsFrom": [
+ "memory_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "memory_categories_category_id_categories_id_fk": {
+ "name": "memory_categories_category_id_categories_id_fk",
+ "tableFrom": "memory_categories",
+ "tableTo": "categories",
+ "columnsFrom": [
+ "category_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "memory_categories_memory_id_category_id_pk": {
+ "columns": [
+ "memory_id",
+ "category_id"
+ ],
+ "name": "memory_categories_memory_id_category_id_pk"
+ }
+ },
+ "uniqueConstraints": {},
+ "checkConstraints": {}
+ },
+ "memory_tags": {
+ "name": "memory_tags",
+ "columns": {
+ "memory_id": {
+ "name": "memory_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "tag_id": {
+ "name": "tag_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "memory_tags_tag_id_idx": {
+ "name": "memory_tags_tag_id_idx",
+ "columns": [
+ "tag_id"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "memory_tags_memory_id_memories_id_fk": {
+ "name": "memory_tags_memory_id_memories_id_fk",
+ "tableFrom": "memory_tags",
+ "tableTo": "memories",
+ "columnsFrom": [
+ "memory_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "memory_tags_tag_id_tags_id_fk": {
+ "name": "memory_tags_tag_id_tags_id_fk",
+ "tableFrom": "memory_tags",
+ "tableTo": "tags",
+ "columnsFrom": [
+ "tag_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "memory_tags_memory_id_tag_id_pk": {
+ "columns": [
+ "memory_id",
+ "tag_id"
+ ],
+ "name": "memory_tags_memory_id_tag_id_pk"
+ }
+ },
+ "uniqueConstraints": {},
+ "checkConstraints": {}
+ },
+ "moments": {
+ "name": "moments",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "memory_id": {
+ "name": "memory_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "section_anchor": {
+ "name": "section_anchor",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "section_title": {
+ "name": "section_title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "section_level": {
+ "name": "section_level",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "section_path": {
+ "name": "section_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "section_start_offset": {
+ "name": "section_start_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "section_end_offset": {
+ "name": "section_end_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "content_hash": {
+ "name": "content_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "moments_memory_section_anchor_unique": {
+ "name": "moments_memory_section_anchor_unique",
+ "columns": [
+ "memory_id",
+ "section_anchor"
+ ],
+ "isUnique": true
+ },
+ "moments_memory_section_path_unique": {
+ "name": "moments_memory_section_path_unique",
+ "columns": [
+ "memory_id",
+ "section_path"
+ ],
+ "isUnique": true
+ },
+ "moments_memory_id_idx": {
+ "name": "moments_memory_id_idx",
+ "columns": [
+ "memory_id"
+ ],
+ "isUnique": false
+ },
+ "moments_created_at_idx": {
+ "name": "moments_created_at_idx",
+ "columns": [
+ "created_at"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "moments_memory_id_memories_id_fk": {
+ "name": "moments_memory_id_memories_id_fk",
+ "tableFrom": "moments",
+ "tableTo": "memories",
+ "columnsFrom": [
+ "memory_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "moments_section_anchor_check": {
+ "name": "moments_section_anchor_check",
+ "value": "length(\"moments\".\"section_anchor\") > 0"
+ },
+ "moments_section_title_check": {
+ "name": "moments_section_title_check",
+ "value": "length(\"moments\".\"section_title\") > 0"
+ },
+ "moments_section_level_check": {
+ "name": "moments_section_level_check",
+ "value": "\"moments\".\"section_level\" >= 1 and \"moments\".\"section_level\" <= 6"
+ },
+ "moments_section_offset_check": {
+ "name": "moments_section_offset_check",
+ "value": "(\"moments\".\"section_start_offset\" is null and \"moments\".\"section_end_offset\" is null) or (\"moments\".\"section_start_offset\" is not null and \"moments\".\"section_end_offset\" is not null and \"moments\".\"section_start_offset\" >= 0 and \"moments\".\"section_end_offset\" > \"moments\".\"section_start_offset\")"
+ }
+ }
+ },
+ "openai_auth_credentials": {
+ "name": "openai_auth_credentials",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "credential_reference": {
+ "name": "credential_reference",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "openai_auth_credentials_id_check": {
+ "name": "openai_auth_credentials_id_check",
+ "value": "\"openai_auth_credentials\".\"id\" = 'default'"
+ }
+ }
+ },
+ "tags": {
+ "name": "tags",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "tags_name_unique": {
+ "name": "tags_name_unique",
+ "columns": [
+ "name"
+ ],
+ "isUnique": true
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {}
+ },
+ "translation_chunks": {
+ "name": "translation_chunks",
+ "columns": {
+ "job_id": {
+ "name": "job_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "chunk_index": {
+ "name": "chunk_index",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "source_chunk_hash": {
+ "name": "source_chunk_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "block_ids_json": {
+ "name": "block_ids_json",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "retry_count": {
+ "name": "retry_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false,
+ "default": 0
+ },
+ "translated_markdown": {
+ "name": "translated_markdown",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "translated_hash": {
+ "name": "translated_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "projection_spans_json": {
+ "name": "projection_spans_json",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "translation_chunks_status_idx": {
+ "name": "translation_chunks_status_idx",
+ "columns": [
+ "job_id",
+ "status",
+ "chunk_index"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "translation_chunks_job_id_translation_jobs_job_id_fk": {
+ "name": "translation_chunks_job_id_translation_jobs_job_id_fk",
+ "tableFrom": "translation_chunks",
+ "tableTo": "translation_jobs",
+ "columnsFrom": [
+ "job_id"
+ ],
+ "columnsTo": [
+ "job_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "translation_chunks_job_id_chunk_index_pk": {
+ "columns": [
+ "job_id",
+ "chunk_index"
+ ],
+ "name": "translation_chunks_job_id_chunk_index_pk"
+ }
+ },
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "translation_chunks_status_check": {
+ "name": "translation_chunks_status_check",
+ "value": "\"translation_chunks\".\"status\" in ('pending', 'running', 'validating', 'retrying', 'complete', 'purged', 'failed')"
+ },
+ "translation_chunks_source_hash_check": {
+ "name": "translation_chunks_source_hash_check",
+ "value": "\"translation_chunks\".\"source_chunk_hash\" glob 'sha256:*'"
+ },
+ "translation_chunks_translated_hash_check": {
+ "name": "translation_chunks_translated_hash_check",
+ "value": "\"translation_chunks\".\"translated_hash\" is null or \"translation_chunks\".\"translated_hash\" glob 'sha256:*'"
+ },
+ "translation_chunks_retry_count_check": {
+ "name": "translation_chunks_retry_count_check",
+ "value": "\"translation_chunks\".\"retry_count\" >= 0"
+ },
+ "translation_chunks_index_check": {
+ "name": "translation_chunks_index_check",
+ "value": "\"translation_chunks\".\"chunk_index\" >= 0"
+ }
+ }
+ },
+ "translation_jobs": {
+ "name": "translation_jobs",
+ "columns": {
+ "job_id": {
+ "name": "job_id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "memory_id": {
+ "name": "memory_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "lang_code": {
+ "name": "lang_code",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "source_hash": {
+ "name": "source_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "model": {
+ "name": "model",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "reasoning_effort": {
+ "name": "reasoning_effort",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "prompt_policy_version": {
+ "name": "prompt_policy_version",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "chunker_version": {
+ "name": "chunker_version",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "chunk_count": {
+ "name": "chunk_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false,
+ "default": 0
+ },
+ "output_path": {
+ "name": "output_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "output_hash": {
+ "name": "output_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "completed_at": {
+ "name": "completed_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "translation_jobs_current_complete_idx": {
+ "name": "translation_jobs_current_complete_idx",
+ "columns": [
+ "memory_id",
+ "lang_code",
+ "source_hash"
+ ],
+ "isUnique": true,
+ "where": "\"translation_jobs\".\"status\" = 'complete'"
+ },
+ "translation_jobs_active_idx": {
+ "name": "translation_jobs_active_idx",
+ "columns": [
+ "memory_id",
+ "lang_code",
+ "source_hash"
+ ],
+ "isUnique": true,
+ "where": "\"translation_jobs\".\"status\" in ('pending', 'running', 'cancel_requested', 'stitching', 'committing')"
+ },
+ "translation_jobs_memory_lang_idx": {
+ "name": "translation_jobs_memory_lang_idx",
+ "columns": [
+ "memory_id",
+ "lang_code",
+ "updated_at"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "translation_jobs_memory_id_memories_id_fk": {
+ "name": "translation_jobs_memory_id_memories_id_fk",
+ "tableFrom": "translation_jobs",
+ "tableTo": "memories",
+ "columnsFrom": [
+ "memory_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "translation_jobs_status_check": {
+ "name": "translation_jobs_status_check",
+ "value": "\"translation_jobs\".\"status\" in ('pending', 'running', 'stale', 'cancel_requested', 'canceled', 'unavailable', 'stitching', 'committing', 'complete', 'failed')"
+ },
+ "translation_jobs_source_hash_check": {
+ "name": "translation_jobs_source_hash_check",
+ "value": "\"translation_jobs\".\"source_hash\" glob 'sha256:*'"
+ },
+ "translation_jobs_output_hash_check": {
+ "name": "translation_jobs_output_hash_check",
+ "value": "\"translation_jobs\".\"output_hash\" is null or \"translation_jobs\".\"output_hash\" glob 'sha256:*'"
+ },
+ "translation_jobs_reasoning_effort_check": {
+ "name": "translation_jobs_reasoning_effort_check",
+ "value": "\"translation_jobs\".\"reasoning_effort\" is null or \"translation_jobs\".\"reasoning_effort\" in ('none', 'minimal', 'low', 'medium', 'high', 'xhigh')"
+ },
+ "translation_jobs_chunk_count_check": {
+ "name": "translation_jobs_chunk_count_check",
+ "value": "\"translation_jobs\".\"chunk_count\" >= 0"
+ }
+ }
+ },
+ "translation_projection_spans": {
+ "name": "translation_projection_spans",
+ "columns": {
+ "job_id": {
+ "name": "job_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "span_index": {
+ "name": "span_index",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "memory_id": {
+ "name": "memory_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "lang_code": {
+ "name": "lang_code",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "source_hash": {
+ "name": "source_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "output_hash": {
+ "name": "output_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "segment_id": {
+ "name": "segment_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "block_id": {
+ "name": "block_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "source_markdown_start": {
+ "name": "source_markdown_start",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "source_markdown_end": {
+ "name": "source_markdown_end",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "translated_markdown_start": {
+ "name": "translated_markdown_start",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "translated_markdown_end": {
+ "name": "translated_markdown_end",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "source_reader_start": {
+ "name": "source_reader_start",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "source_reader_end": {
+ "name": "source_reader_end",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "translated_reader_start": {
+ "name": "translated_reader_start",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "translated_reader_end": {
+ "name": "translated_reader_end",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "autoincrement": false
+ }
+ },
+ "indexes": {
+ "translation_projection_current_idx": {
+ "name": "translation_projection_current_idx",
+ "columns": [
+ "memory_id",
+ "lang_code",
+ "source_hash",
+ "output_hash",
+ "span_index"
+ ],
+ "isUnique": false
+ }
+ },
+ "foreignKeys": {
+ "translation_projection_spans_job_id_translation_jobs_job_id_fk": {
+ "name": "translation_projection_spans_job_id_translation_jobs_job_id_fk",
+ "tableFrom": "translation_projection_spans",
+ "tableTo": "translation_jobs",
+ "columnsFrom": [
+ "job_id"
+ ],
+ "columnsTo": [
+ "job_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "translation_projection_spans_memory_id_memories_id_fk": {
+ "name": "translation_projection_spans_memory_id_memories_id_fk",
+ "tableFrom": "translation_projection_spans",
+ "tableTo": "memories",
+ "columnsFrom": [
+ "memory_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "translation_projection_spans_job_id_span_index_pk": {
+ "columns": [
+ "job_id",
+ "span_index"
+ ],
+ "name": "translation_projection_spans_job_id_span_index_pk"
+ }
+ },
+ "uniqueConstraints": {},
+ "checkConstraints": {
+ "translation_projection_source_hash_check": {
+ "name": "translation_projection_source_hash_check",
+ "value": "\"translation_projection_spans\".\"source_hash\" glob 'sha256:*'"
+ },
+ "translation_projection_output_hash_check": {
+ "name": "translation_projection_output_hash_check",
+ "value": "\"translation_projection_spans\".\"output_hash\" glob 'sha256:*'"
+ },
+ "translation_projection_source_markdown_range_check": {
+ "name": "translation_projection_source_markdown_range_check",
+ "value": "\"translation_projection_spans\".\"source_markdown_end\" > \"translation_projection_spans\".\"source_markdown_start\""
+ },
+ "translation_projection_translated_markdown_range_check": {
+ "name": "translation_projection_translated_markdown_range_check",
+ "value": "\"translation_projection_spans\".\"translated_markdown_end\" > \"translation_projection_spans\".\"translated_markdown_start\""
+ },
+ "translation_projection_source_reader_range_check": {
+ "name": "translation_projection_source_reader_range_check",
+ "value": "\"translation_projection_spans\".\"source_reader_end\" > \"translation_projection_spans\".\"source_reader_start\""
+ },
+ "translation_projection_translated_reader_range_check": {
+ "name": "translation_projection_translated_reader_range_check",
+ "value": "\"translation_projection_spans\".\"translated_reader_end\" > \"translation_projection_spans\".\"translated_reader_start\""
+ }
+ }
+ }
+ },
+ "views": {},
+ "enums": {},
+ "_meta": {
+ "schemas": {},
+ "tables": {},
+ "columns": {}
+ },
+ "internal": {
+ "indexes": {}
+ }
+}
\ No newline at end of file
diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json
index bef7904f..ba3009a1 100644
--- a/drizzle/meta/_journal.json
+++ b/drizzle/meta/_journal.json
@@ -113,6 +113,20 @@
"when": 1779955000000,
"tag": "0015_memory_browse_pagination",
"breakpoints": true
+ },
+ {
+ "idx": 16,
+ "version": "6",
+ "when": 1784221790920,
+ "tag": "0016_scrub_backup_secrets",
+ "breakpoints": true
+ },
+ {
+ "idx": 17,
+ "version": "6",
+ "when": 1784223792512,
+ "tag": "0017_skinny_hobgoblin",
+ "breakpoints": true
}
]
-}
+}
\ No newline at end of file
diff --git a/e2e/add-memory.spec.ts b/e2e/add-memory.spec.ts
new file mode 100644
index 00000000..dce7124c
--- /dev/null
+++ b/e2e/add-memory.spec.ts
@@ -0,0 +1,314 @@
+import { watch } from "node:fs/promises";
+import { join } from "node:path";
+
+import { expect, test, type Page } from "@playwright/test";
+
+import { runBunFixtureScript } from "./bun-fixture";
+
+const SUCCESS_URL = "https://success.import.trauma.invalid/article";
+const FALLBACK_URL = "https://fallback.import.trauma.invalid/unavailable";
+const E2E_ROOT = join(process.cwd(), ".trauma/e2e");
+
+test.describe.configure({ mode: "serial" });
+
+test("adds an extracted memory through the public composer and persists every store boundary", async ({
+ page,
+}) => {
+ resetAddMemoryFixture();
+
+ const memory = await addMemoryThroughComposer(page, SUCCESS_URL);
+
+ await expect(page).toHaveURL(new RegExp(`/memories/${memory.id}$`));
+ await expect(
+ page.getByRole("heading", { name: "Deterministic Import Article" }),
+ ).toBeVisible();
+ await expect(
+ page.getByText("Fixture extraction stays deterministic without external network access."),
+ ).toBeVisible();
+
+ const persisted = await waitForCompletedPersistence(memory.id);
+ expect(persisted).toMatchObject({
+ backupStatus: "success",
+ commitCount: 1,
+ extractionError: null,
+ extractionStatus: "success",
+ gitStatus: "",
+ id: memory.id,
+ title: "Deterministic Import Article",
+ url: SUCCESS_URL,
+ });
+ expect(persisted.commitMessage).toBe(`e2e created memory ${memory.id}`);
+ expect(persisted.fileContent).toContain('extraction_status: "success"');
+ expect(persisted.fileContent).toContain(
+ "Fixture extraction stays deterministic without external network access.",
+ );
+ expect(persisted.trackedContent).toBe(persisted.fileContent);
+});
+
+test("persists a link-only memory when the deterministic import response fails", async ({
+ page,
+}) => {
+ resetAddMemoryFixture();
+
+ const memory = await addMemoryThroughComposer(page, FALLBACK_URL);
+
+ await expect(page).toHaveURL(new RegExp(`/memories/${memory.id}$`));
+ await expect(
+ page.getByRole("heading", { name: "fallback.import.trauma.invalid" }),
+ ).toBeVisible();
+ await expect(
+ page.locator("[data-reader-content]").getByRole("link", { name: FALLBACK_URL }),
+ ).toBeVisible();
+
+ const persisted = await waitForCompletedPersistence(memory.id);
+ expect(persisted).toMatchObject({
+ backupStatus: "success",
+ commitCount: 1,
+ extractionError: "fetch failed: HTTP 503",
+ extractionStatus: "link_only",
+ gitStatus: "",
+ id: memory.id,
+ title: "fallback.import.trauma.invalid",
+ url: FALLBACK_URL,
+ });
+ expect(persisted.commitMessage).toBe(`e2e created memory ${memory.id}`);
+ expect(persisted.fileContent).toContain('extraction_status: "link_only"');
+ expect(persisted.fileContent).toContain(`[${FALLBACK_URL}](<${FALLBACK_URL}>)`);
+ expect(persisted.trackedContent).toBe(persisted.fileContent);
+});
+
+async function addMemoryThroughComposer(page: Page, url: string) {
+ await page.goto("/memories");
+ await page.getByRole("button", { name: "Add memory" }).click();
+
+ const composer = page.getByRole("dialog", { name: "Add memory" });
+ await expect(composer).toBeVisible();
+ await composer.getByLabel("URL").fill(url);
+
+ const responsePromise = page.waitForResponse(
+ (response) =>
+ response.url().endsWith("/api/memories") &&
+ response.request().method() === "POST",
+ );
+ await composer.getByLabel("URL").press("Enter");
+
+ const response = await responsePromise;
+ expect(response.status()).toBe(201);
+ return readCreatedMemory(await response.json());
+}
+
+function readCreatedMemory(payload: unknown): { id: string } {
+ if (
+ typeof payload !== "object" ||
+ payload === null ||
+ !("memory" in payload) ||
+ typeof payload.memory !== "object" ||
+ payload.memory === null ||
+ !("id" in payload.memory) ||
+ typeof payload.memory.id !== "string"
+ ) {
+ throw new Error("Add Memory response did not include a memory id");
+ }
+
+ return { id: payload.memory.id };
+}
+
+function resetAddMemoryFixture(): void {
+ runBunFixtureScript(`
+ import { execFileSync } from "node:child_process";
+ import { mkdir, rm, writeFile } from "node:fs/promises";
+ import { dirname, join } from "node:path";
+ import { initializeDatabase } from "./src/server/db/index.ts";
+
+ const root = join(process.cwd(), ".trauma/e2e");
+ const configPath = join(root, "trauma.config.json");
+ const projectPath = join(root, "project");
+ const config = {
+ storePath: "./project/store",
+ projectPath: "./project",
+ databasePath: "./runtime/trauma.sqlite",
+ backup: {
+ git: {
+ enabled: true,
+ remote: "origin",
+ branch: "main",
+ push: false,
+ commitMessageTemplate: "e2e {action} {memoryId}",
+ },
+ },
+ };
+ const resolvedConfig = {
+ configFilePath: configPath,
+ projectPath,
+ storePath: join(projectPath, "store"),
+ databasePath: join(root, "runtime/trauma.sqlite"),
+ backup: config.backup,
+ };
+ const gitEnv = { ...process.env };
+ delete gitEnv.GIT_DIR;
+ delete gitEnv.GIT_WORK_TREE;
+ delete gitEnv.GIT_INDEX_FILE;
+
+ await rm(root, { recursive: true, force: true });
+ await mkdir(dirname(configPath), { recursive: true });
+ await mkdir(resolvedConfig.storePath, { recursive: true });
+ await writeFile(configPath, JSON.stringify(config, null, 2), "utf8");
+ execFileSync("git", ["init", "--initial-branch=main"], {
+ cwd: projectPath,
+ env: gitEnv,
+ stdio: "ignore",
+ });
+ for (const [key, value] of [
+ ["user.name", "TRAUMA E2E"],
+ ["user.email", "trauma-e2e@example.invalid"],
+ ["commit.gpgSign", "false"],
+ ]) {
+ execFileSync("git", ["config", key, value], {
+ cwd: projectPath,
+ env: gitEnv,
+ stdio: "ignore",
+ });
+ }
+
+ const connection = initializeDatabase(resolvedConfig);
+ connection.close();
+ `);
+}
+
+async function waitForCompletedPersistence(memoryId: string) {
+ const controller = new AbortController();
+ const timeout = setTimeout(() => controller.abort(), 15_000);
+ const databaseChanges = watch(join(E2E_ROOT, "runtime"), {
+ signal: controller.signal,
+ });
+
+ try {
+ let state = readPersistenceState(memoryId);
+ if (isCompletedPersistence(state)) {
+ return state;
+ }
+
+ for await (const _event of databaseChanges) {
+ state = readPersistenceState(memoryId);
+ if (isCompletedPersistence(state)) {
+ return state;
+ }
+ }
+ } catch (error) {
+ if (controller.signal.aborted) {
+ throw new Error(`Timed out waiting for backup persistence for ${memoryId}`);
+ }
+ throw error;
+ } finally {
+ clearTimeout(timeout);
+ controller.abort();
+ }
+
+ throw new Error(`Backup persistence watcher ended before ${memoryId} completed`);
+}
+
+interface PersistenceState {
+ backupStatus: string | null;
+ commitCount: number;
+ commitMessage: string | null;
+ extractionError: string | null;
+ extractionStatus: string | null;
+ fileContent: string | null;
+ gitStatus: string | null;
+ id: string | null;
+ title: string | null;
+ trackedContent: string | null;
+ url: string | null;
+}
+
+function isCompletedPersistence(state: PersistenceState) {
+ return (
+ state.backupStatus === "success" &&
+ state.commitCount === 1 &&
+ state.fileContent !== null &&
+ state.fileContent === state.trackedContent &&
+ state.gitStatus === ""
+ );
+}
+
+function readPersistenceState(memoryId: string): PersistenceState {
+ const stdout = runBunFixtureScript(`
+ import { execFileSync } from "node:child_process";
+ import { readFileSync } from "node:fs";
+ import { join } from "node:path";
+ import { initializeDatabase } from "./src/server/db/index.ts";
+
+ const root = join(process.cwd(), ".trauma/e2e");
+ const projectPath = join(root, "project");
+ const memoryId = ${JSON.stringify(memoryId)};
+ const config = {
+ configFilePath: join(root, "trauma.config.json"),
+ projectPath,
+ storePath: join(projectPath, "store"),
+ databasePath: join(root, "runtime/trauma.sqlite"),
+ backup: {
+ git: {
+ enabled: true,
+ remote: "origin",
+ branch: "main",
+ push: false,
+ commitMessageTemplate: "e2e {action} {memoryId}",
+ },
+ },
+ };
+ const gitEnv = { ...process.env };
+ delete gitEnv.GIT_DIR;
+ delete gitEnv.GIT_WORK_TREE;
+ delete gitEnv.GIT_INDEX_FILE;
+ const runGit = (args) => execFileSync("git", args, {
+ cwd: projectPath,
+ encoding: "utf8",
+ env: gitEnv,
+ stdio: ["ignore", "pipe", "pipe"],
+ });
+
+ const connection = initializeDatabase(config);
+ let memory;
+ try {
+ memory = await connection.repositories.memories.findById(memoryId);
+ } finally {
+ connection.close();
+ }
+
+ let commitCount = 0;
+ let commitMessage = null;
+ let fileContent = null;
+ let gitStatus = null;
+ let trackedContent = null;
+ if (memory !== undefined) {
+ fileContent = readFileSync(join(config.storePath, memory.contentPath), "utf8");
+ try {
+ commitCount = Number.parseInt(runGit(["rev-list", "--count", "HEAD"]), 10);
+ commitMessage = runGit(["log", "-1", "--format=%s"]).trimEnd();
+ gitStatus = runGit(["status", "--porcelain", "--", "store"]).trimEnd();
+ trackedContent = runGit([
+ "show",
+ \`HEAD:store/\${memory.contentPath}\`,
+ ]);
+ } catch {
+ commitCount = 0;
+ }
+ }
+
+ process.stdout.write(JSON.stringify({
+ backupStatus: memory?.backupStatus ?? null,
+ commitCount,
+ commitMessage,
+ extractionError: memory?.extractionError ?? null,
+ extractionStatus: memory?.extractionStatus ?? null,
+ fileContent,
+ gitStatus,
+ id: memory?.id ?? null,
+ title: memory?.title ?? null,
+ trackedContent,
+ url: memory?.url ?? null,
+ }));
+ `);
+
+ return JSON.parse(stdout) as PersistenceState;
+}
diff --git a/package.json b/package.json
index 891151b8..4a4d2091 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
"build": "vinxi build",
"start": "HOST=${HOST:-127.0.0.1} bun --bun x vinxi start",
"preview": "HOST=${HOST:-127.0.0.1} bun --bun x vinxi preview",
+ "audit": "bun audit --ignore GHSA-67mh-4wv8-2f99 --ignore GHSA-g7r4-m6w7-qqqr",
"typecheck": "tsc --noEmit",
"test": "bun --bun x vitest run",
"test:watch": "bun --bun x vitest",
@@ -23,18 +24,18 @@
"@solidjs/router": "^0.15.0",
"@solidjs/start": "1.3.2",
"defuddle": "^0.18.0",
- "drizzle-orm": "^0.44.7",
+ "drizzle-orm": "^0.45.2",
"entities": "^7.0.1",
"highlight.js": "^11.11.1",
"ipaddr.js": "^2.4.0",
- "linkedom": "^0.18.12",
- "markdown-it": "^14.1.1",
- "markdown-it-anchor": "^9.2.0",
+ "linkedom": "^0.18.13",
+ "markdown-it": "^14.3.0",
+ "markdown-it-anchor": "^9.2.1",
"markdown-it-footnote": "^4.0.0",
"remark-gfm": "^4.0.1",
"remark-math": "^6.0.0",
"remark-parse": "^11.0.0",
- "sanitize-html": "^2.17.3",
+ "sanitize-html": "^2.17.6",
"solid-js": "^1.9.5",
"unified": "^11.0.5",
"unist-util-visit-parents": "^6.0.2",
@@ -59,5 +60,11 @@
"typescript": "^5.9.3",
"vitest": "^4.0.15"
},
+ "overrides": {
+ "@babel/core": "7.29.7",
+ "h3": "1.15.11",
+ "tar": "7.5.20",
+ "vite": "6.4.3"
+ },
"packageManager": "bun@1.3.13"
}
diff --git a/playwright.config.ts b/playwright.config.ts
index 68f95855..81b6b377 100644
--- a/playwright.config.ts
+++ b/playwright.config.ts
@@ -19,6 +19,7 @@ export default defineConfig({
PORT: String(port),
TRAUMA_BROWSE_FIXTURES: "1",
TRAUMA_CONFIG_PATH: ".trauma/e2e/trauma.config.json",
+ TRAUMA_E2E_IMPORT_FIXTURES: "1",
TRAUMA_HMR_PORT: String(hmrBasePort),
},
reuseExistingServer: !process.env.CI,
diff --git a/scripts/trauma-backup-failsafe.ts b/scripts/trauma-backup-failsafe.ts
index 42db3f03..dd27c150 100644
--- a/scripts/trauma-backup-failsafe.ts
+++ b/scripts/trauma-backup-failsafe.ts
@@ -6,7 +6,6 @@ import {
readActiveBackupFailsafeAlert,
revertBackupFailsafeConfig,
} from "../src/server/backup/failsafe";
-import { getBackupFailsafeStatus } from "../src/server/backup/environment";
type Command = "status" | "revert" | "migrate" | "delete-missing-record";
@@ -16,13 +15,10 @@ export async function runBackupFailsafeCli(args: readonly string[]) {
const connection = initializeDatabase(config);
try {
if (parsed.command === "status") {
- const status = await getBackupFailsafeStatus({
- config,
- db: connection.db,
- });
- return status.alert === null
+ const alert = await readActiveBackupFailsafeAlert(connection.db);
+ return alert === null
? "No active backup failsafe alert.\n"
- : `${JSON.stringify(status.alert, null, 2)}\n`;
+ : `${JSON.stringify(alert, null, 2)}\n`;
}
if (parsed.command === "revert") {
diff --git a/src/components/backup/BackupFailsafeBanner.tsx b/src/components/backup/BackupFailsafeBanner.tsx
index a0250aa3..c9b749c7 100644
--- a/src/components/backup/BackupFailsafeBanner.tsx
+++ b/src/components/backup/BackupFailsafeBanner.tsx
@@ -46,48 +46,9 @@ export function BackupFailsafeBanner(props: BackupFailsafeBannerProps) {
{describeBackupFailsafeAlert(props.alert)}
-
-
- {(path) => (
-
-
- Previous project path:
- - {path()}
-
- )}
-
-
- {(path) => (
-
-
- Previous store path:
- - {path()}
-
- )}
-
-
-
- Current project path:
- - {props.alert.currentProjectPath}
-
-
-
- Current store path:
- - {props.alert.currentStorePath}
-
-
- {(message) => (
-
-
- Error:
- - {message()}
-
- )}
-
-
-
+
-
+
-
-
-
-
-
-
+
+
+
-
+
-
-
-
-
-
- {loadNextPageError()}
-
-
-
-
-
+
+
+
+
+
+ {loadNextPageError()}
+
+
+
+
+
);
}
diff --git a/src/components/reader/MemoryReader.tsx b/src/components/reader/MemoryReader.tsx
index 652c6584..b61a4c31 100644
--- a/src/components/reader/MemoryReader.tsx
+++ b/src/components/reader/MemoryReader.tsx
@@ -97,6 +97,10 @@ import {
submitReadCodexModels,
} from "../settings/settings-submit";
import { revalidateSettingsState } from "../settings/settings-loader";
+import {
+ createReaderGenerationGuard,
+ type ReaderGenerationSnapshot,
+} from "./reader-generation";
interface MemoryReaderProps {
categoryOptions?: readonly BrowseTaxonomySummaryItem[];
@@ -213,6 +217,21 @@ function ReadyMemoryReader(props: {
let sectionMenuRef: ReaderMenuElement;
let sectionLongPressTimer: number | undefined;
const navigate = props.navigate ?? useNavigate();
+ const readerGenerationGuard = createReaderGenerationGuard({
+ langCode: props.result.content.langCode,
+ memoryId: props.result.memory.id,
+ });
+ const captureReaderGeneration = (): ReaderGenerationSnapshot =>
+ readerGenerationGuard.activate({
+ langCode: props.result.content.langCode,
+ memoryId: props.result.memory.id,
+ });
+ const isCurrentReaderGeneration = (
+ snapshot: ReaderGenerationSnapshot,
+ ): boolean =>
+ readerGenerationGuard.isCurrent(snapshot) &&
+ props.result.memory.id === snapshot.memoryId &&
+ props.result.content.langCode === snapshot.langCode;
const sourceUrl = () => props.result.memory.url;
const sourceHref = () => toSafeReaderSourceHref(sourceUrl());
const readerContent = createMemo(() =>
@@ -297,7 +316,10 @@ function ReadyMemoryReader(props: {
}
});
createEffect(() => {
- props.result.memory.id;
+ readerGenerationGuard.activate({
+ langCode: props.result.content.langCode,
+ memoryId: props.result.memory.id,
+ });
setCategories([...props.result.memory.categories]);
setTags([...props.result.memory.tags]);
setMoments([...props.result.memory.moments]);
@@ -306,8 +328,9 @@ function ReadyMemoryReader(props: {
setPendingSelectionKey("");
setErrorMessage("");
setTranslationProgress(undefined);
- translationEventSource?.close();
+ const activeTranslationEventSource = translationEventSource;
translationEventSource = undefined;
+ activeTranslationEventSource?.close();
closeReaderMenus();
});
createEffect(() => {
@@ -327,7 +350,10 @@ function ReadyMemoryReader(props: {
});
onCleanup(() => {
- translationEventSource?.close();
+ readerGenerationGuard.invalidate();
+ const activeTranslationEventSource = translationEventSource;
+ translationEventSource = undefined;
+ activeTranslationEventSource?.close();
setRightRailContent(undefined);
});
@@ -404,15 +430,22 @@ function ReadyMemoryReader(props: {
};
const commitSelectionMenu = () => {
const menu = selectionMenu();
- if (menu === undefined || bodyContentRef === undefined) {
+ const container = bodyContentRef;
+ const readerGeneration = captureReaderGeneration();
+ if (
+ menu === undefined ||
+ container === undefined ||
+ !isCurrentReaderGeneration(readerGeneration)
+ ) {
return;
}
closeSelectionMenu();
void toggleReaderSelection({
- container: bodyContentRef,
- langCode: props.result.content.langCode,
- memoryId: props.result.memory.id,
+ container,
+ isCurrent: () => isCurrentReaderGeneration(readerGeneration),
+ langCode: readerGeneration.langCode,
+ memoryId: readerGeneration.memoryId,
pendingSelectionKey: pendingSelectionKey(),
selection: menu.selection,
setErrorMessage,
@@ -420,8 +453,8 @@ function ReadyMemoryReader(props: {
onFlashbacksChanged: setCurrentFlashbacks,
onSuccess: () =>
revalidateAfterFlashbackToggle(
- props.result.memory.id,
- props.result.content.langCode,
+ readerGeneration.memoryId,
+ readerGeneration.langCode,
),
});
};
@@ -452,55 +485,131 @@ function ReadyMemoryReader(props: {
openSelectionMenu();
};
const deleteMemory = async (memoryId: string): Promise => {
- await deleteReaderMemory({
- langCode: props.result.content.langCode,
- memoryId,
- navigate,
- });
+ const readerGeneration = captureReaderGeneration();
+ if (
+ memoryId !== readerGeneration.memoryId ||
+ !isCurrentReaderGeneration(readerGeneration)
+ ) {
+ return;
+ }
+
+ try {
+ await deleteReaderMemory({
+ isCurrent: () => isCurrentReaderGeneration(readerGeneration),
+ langCode: readerGeneration.langCode,
+ memoryId: readerGeneration.memoryId,
+ navigate: (path) => {
+ if (isCurrentReaderGeneration(readerGeneration)) {
+ navigate(path);
+ }
+ },
+ revalidate: async (deletedMemoryId, langCode) => {
+ if (
+ !isCurrentReaderGeneration(readerGeneration) ||
+ deletedMemoryId !== readerGeneration.memoryId ||
+ langCode !== readerGeneration.langCode
+ ) {
+ return;
+ }
+
+ await revalidateAfterMemoryDeletion(deletedMemoryId, langCode);
+ },
+ });
+ } catch (error) {
+ if (isCurrentReaderGeneration(readerGeneration)) {
+ throw error;
+ }
+ }
};
const attachCategory = async (input: {
memoryId: string;
name: string;
}): Promise => {
- const category = await attachReaderCategoryByName(input);
- setCategories((current) => mergeReaderTaxonomyItem(current, category));
- void Promise.all([
- revalidateBrowseMemoryWorkspace(),
- revalidateReaderMemory(input.memoryId, props.result.content.langCode),
- ]);
+ const readerGeneration = captureReaderGeneration();
+ if (
+ input.memoryId !== readerGeneration.memoryId ||
+ !isCurrentReaderGeneration(readerGeneration)
+ ) {
+ return;
+ }
+
+ try {
+ const category = await attachReaderCategoryByName({
+ memoryId: readerGeneration.memoryId,
+ name: input.name,
+ });
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+
+ setCategories((current) => mergeReaderTaxonomyItem(current, category));
+ void Promise.all([
+ revalidateBrowseMemoryWorkspace(),
+ revalidateReaderMemory(
+ readerGeneration.memoryId,
+ readerGeneration.langCode,
+ ),
+ ]);
+ } catch (error) {
+ if (isCurrentReaderGeneration(readerGeneration)) {
+ throw error;
+ }
+ }
};
const attachTag = async (name: string): Promise => {
+ const readerGeneration = captureReaderGeneration();
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+
setErrorMessage("");
try {
const tag = await attachReaderTagByName({
- memoryId: props.result.memory.id,
+ memoryId: readerGeneration.memoryId,
name,
});
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+
setTags((current) => mergeReaderTaxonomyItem(current, tag));
void revalidateAfterReaderTaxonomyChange(
- props.result.memory.id,
- props.result.content.langCode,
+ readerGeneration.memoryId,
+ readerGeneration.langCode,
);
} catch (error) {
- setErrorMessage("Failed to add tag.");
- throw error;
+ if (isCurrentReaderGeneration(readerGeneration)) {
+ setErrorMessage("Failed to add tag.");
+ throw error;
+ }
}
};
const detachTag = async (name: string): Promise => {
+ const readerGeneration = captureReaderGeneration();
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+
setErrorMessage("");
try {
const tag = await detachReaderTagByName({
- memoryId: props.result.memory.id,
+ memoryId: readerGeneration.memoryId,
name,
});
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+
setTags((current) => current.filter((item) => item.id !== tag.id));
void revalidateAfterReaderTaxonomyChange(
- props.result.memory.id,
- props.result.content.langCode,
+ readerGeneration.memoryId,
+ readerGeneration.langCode,
);
} catch (error) {
- setErrorMessage("Failed to remove tag.");
- throw error;
+ if (isCurrentReaderGeneration(readerGeneration)) {
+ setErrorMessage("Failed to remove tag.");
+ throw error;
+ }
}
};
const isTranslatedReader = () => props.result.content.langCode !== undefined;
@@ -543,16 +652,27 @@ function ReadyMemoryReader(props: {
?.supportedReasoningEfforts ?? [];
});
const refreshTranslationCatalog = async (): Promise => {
+ const readerGeneration = captureReaderGeneration();
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+
setTranslationCatalogError("");
try {
const catalog = await submitReadCodexModels();
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+
setTranslationCatalogModels(catalog.models);
} catch (error) {
- setTranslationCatalogError(
- error instanceof Error
- ? error.message
- : "Codex model catalog is unavailable.",
- );
+ if (isCurrentReaderGeneration(readerGeneration)) {
+ setTranslationCatalogError(
+ error instanceof Error
+ ? error.message
+ : "Codex model catalog is unavailable.",
+ );
+ }
}
};
const handleTranslationPopoverOpenChange = (open: boolean): void => {
@@ -567,11 +687,28 @@ function ReadyMemoryReader(props: {
void refreshTranslationCatalog();
}
};
- const connectTranslationProgress = (eventUrl: string, jobId: string) => {
- translationEventSource?.close();
+ const connectTranslationProgress = (
+ eventUrl: string,
+ jobId: string,
+ readerGeneration: ReaderGenerationSnapshot,
+ ) => {
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+
+ const previousEventSource = translationEventSource;
+ translationEventSource = undefined;
+ previousEventSource?.close();
const eventSource = new EventSource(eventUrl);
translationEventSource = eventSource;
+ const isCurrentTranslationEventSource = (): boolean =>
+ translationEventSource === eventSource &&
+ isCurrentReaderGeneration(readerGeneration);
const onProgress = (event: MessageEvent) => {
+ if (!isCurrentTranslationEventSource()) {
+ return;
+ }
+
const envelope = parseTranslationEventEnvelope(event.data);
if (envelope === undefined) {
return;
@@ -592,14 +729,14 @@ function ReadyMemoryReader(props: {
if (isCompletedTranslationEnvelope(envelope)) {
const readerUrl = readTranslationReaderUrl(envelope);
- eventSource.close();
translationEventSource = undefined;
+ eventSource.close();
if (readerUrl !== undefined) {
navigate(readerUrl);
}
} else if (isTerminalTranslationEnvelope(envelope)) {
- eventSource.close();
translationEventSource = undefined;
+ eventSource.close();
}
};
@@ -607,9 +744,13 @@ function ReadyMemoryReader(props: {
eventSource.addEventListener(eventName, onProgress);
}
eventSource.onerror = () => {
+ if (!isCurrentTranslationEventSource()) {
+ return;
+ }
+
if (eventSource.readyState === EventSource.CLOSED) {
- eventSource.close();
translationEventSource = undefined;
+ eventSource.close();
setTranslationProgress({
eventUrl,
jobId,
@@ -652,8 +793,13 @@ function ReadyMemoryReader(props: {
model: string | null;
reasoningEffort: CodexReasoningEffort | null;
}): Promise => {
+ const readerGeneration = captureReaderGeneration();
const langCode = input.langCode;
- if (langCode === undefined || !canStartTranslation(langCode)) {
+ if (
+ langCode === undefined ||
+ !canStartTranslation(langCode) ||
+ !isCurrentReaderGeneration(readerGeneration)
+ ) {
return;
}
@@ -670,6 +816,10 @@ function ReadyMemoryReader(props: {
model: input.model,
reasoningEffort: input.reasoningEffort,
});
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+
const persistedModel = settings.codexTranslationModel;
const persistedReasoningEffort = settings.codexTranslationReasoningEffort;
setTranslationDefaultLanguage(input.langCode);
@@ -678,10 +828,20 @@ function ReadyMemoryReader(props: {
void revalidateSettingsState();
const result = await startReaderTranslation({
langCode,
- memoryId: props.result.memory.id,
+ memoryId: readerGeneration.memoryId,
model: persistedModel,
reasoningEffort: persistedReasoningEffort,
});
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+ if (
+ result.memory_id !== readerGeneration.memoryId ||
+ result.lang_code !== langCode
+ ) {
+ throw new Error("Translation response did not match the active reader.");
+ }
+
if (result.status === "current") {
setTranslationProgress(undefined);
input.close();
@@ -699,15 +859,21 @@ function ReadyMemoryReader(props: {
status: "running",
});
input.close();
- connectTranslationProgress(result.event_url, result.job_id);
+ connectTranslationProgress(
+ result.event_url,
+ result.job_id,
+ readerGeneration,
+ );
} catch (error) {
- setTranslationProgress({
- eventUrl: "",
- jobId: "",
- message: error instanceof Error ? error.message : "Translation failed.",
- preview: "",
- status: "failed",
- });
+ if (isCurrentReaderGeneration(readerGeneration)) {
+ setTranslationProgress({
+ eventUrl: "",
+ jobId: "",
+ message: error instanceof Error ? error.message : "Translation failed.",
+ preview: "",
+ status: "failed",
+ });
+ }
}
};
createEffect(() => {
@@ -772,53 +938,70 @@ function ReadyMemoryReader(props: {
const toggleMoment = async (
section: ReaderMomentSection,
): Promise => {
+ const readerGeneration = captureReaderGeneration();
const sectionKey = getReaderMomentKey(section);
- if (pendingMomentKey().length > 0) {
+ if (
+ pendingMomentKey().length > 0 ||
+ !isCurrentReaderGeneration(readerGeneration)
+ ) {
return;
}
+ const readerToc = props.result.rendered.toc;
setErrorMessage("");
setPendingMomentKey(sectionKey);
try {
const existingMoment = findReaderMomentForSection(
moments(),
- props.result.rendered.toc,
+ readerToc,
section,
);
if (existingMoment !== undefined) {
await deleteMomentById({ momentId: existingMoment.id });
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+
setMoments((current) =>
current.filter((moment) => moment.id !== existingMoment.id),
);
await Promise.all([
revalidateMomentBrowseRows(),
revalidateReaderMemory(
- props.result.memory.id,
- props.result.content.langCode,
+ readerGeneration.memoryId,
+ readerGeneration.langCode,
),
]);
return;
}
const result = await createMomentForSection({
- langCode: props.result.content.langCode,
- memoryId: props.result.memory.id,
+ langCode: readerGeneration.langCode,
+ memoryId: readerGeneration.memoryId,
section,
});
+ if (!isCurrentReaderGeneration(readerGeneration)) {
+ return;
+ }
+
setMoments((current) =>
mergeReaderMomentItem(current, result.moment),
);
await Promise.all([
revalidateMomentBrowseRows(),
revalidateReaderMemory(
- props.result.memory.id,
- props.result.content.langCode,
+ readerGeneration.memoryId,
+ readerGeneration.langCode,
),
]);
} catch (error) {
- setErrorMessage(error instanceof Error ? error.message : "Moment failed");
+ if (isCurrentReaderGeneration(readerGeneration)) {
+ setErrorMessage(error instanceof Error ? error.message : "Moment failed");
+ }
} finally {
- setPendingMomentKey("");
+ if (isCurrentReaderGeneration(readerGeneration)) {
+ setPendingMomentKey("");
+ }
}
};
const handleReaderContentClick = (event: MouseEvent) => {
@@ -1703,6 +1886,7 @@ function messageForTranslationError(
export async function deleteReaderMemory(input: {
fetch?: FetchFunction;
+ isCurrent?: () => boolean;
langCode?: SupportedLanguageCode;
memoryId: string;
navigate: (path: string) => void;
@@ -1717,16 +1901,23 @@ export async function deleteReaderMemory(input: {
fetch: input.fetch,
});
} catch (error) {
- if (isBackupFailsafeMemoryActionError(error)) {
+ if (
+ isBackupFailsafeMemoryActionError(error) &&
+ (input.isCurrent?.() ?? true)
+ ) {
void revalidateBackupFailsafeAlert();
}
throw error;
}
+ if (!(input.isCurrent?.() ?? true)) {
+ return;
+ }
+
+ input.navigate("/memories");
await (input.revalidate ?? revalidateAfterMemoryDeletion)(
input.memoryId,
input.langCode,
);
- input.navigate("/memories");
}
export async function attachReaderCategoryByName(input: {
@@ -2539,6 +2730,7 @@ function ReaderTocEntryRow(props: {
async function toggleReaderSelection(input: {
container: HTMLDivElement;
+ isCurrent: () => boolean;
langCode?: SupportedLanguageCode;
memoryId: string;
onFlashbacksChanged: (flashbacks: ReaderFlashbackItem[]) => void;
@@ -2548,7 +2740,10 @@ async function toggleReaderSelection(input: {
setErrorMessage: (message: string) => void;
setPendingSelectionKey: (key: string) => void;
}) {
- if (!canStartFlashbackToggle(input.pendingSelectionKey)) {
+ if (
+ !canStartFlashbackToggle(input.pendingSelectionKey) ||
+ !input.isCurrent()
+ ) {
return;
}
@@ -2583,8 +2778,15 @@ async function toggleReaderSelection(input: {
selection: toPayload(selection),
}),
});
+ if (!input.isCurrent()) {
+ return;
+ }
const failure = await readFlashbackFailure(response);
+ if (!input.isCurrent()) {
+ return;
+ }
+
if (failure !== undefined) {
if (shouldRevalidateBackupFailsafeAfterFlashbackFailure(failure)) {
void revalidateBackupFailsafeAlert();
@@ -2593,6 +2795,10 @@ async function toggleReaderSelection(input: {
throw new Error(failure.message);
}
const payload = await readFlashbackToggleSuccess(response);
+ if (!input.isCurrent()) {
+ return;
+ }
+
if (optimisticFlashbackId !== undefined) {
syncOptimisticFlashbackMark({
container: input.container,
@@ -2606,10 +2812,14 @@ async function toggleReaderSelection(input: {
input.onFlashbacksChanged(payload.result.flashbacks);
void Promise.resolve(input.onSuccess()).catch(() => undefined);
} catch {
- input.container.innerHTML = previousHtml;
- input.setErrorMessage("Flashback failed");
+ if (input.isCurrent()) {
+ input.container.innerHTML = previousHtml;
+ input.setErrorMessage("Flashback failed");
+ }
} finally {
- input.setPendingSelectionKey("");
+ if (input.isCurrent()) {
+ input.setPendingSelectionKey("");
+ }
}
}
diff --git a/src/components/reader/reader-generation.ts b/src/components/reader/reader-generation.ts
new file mode 100644
index 00000000..57e7dee4
--- /dev/null
+++ b/src/components/reader/reader-generation.ts
@@ -0,0 +1,69 @@
+import type { SupportedLanguageCode } from "../../settings/languages";
+
+export interface ReaderGenerationIdentity {
+ readonly langCode?: SupportedLanguageCode;
+ readonly memoryId: string;
+}
+
+export interface ReaderGenerationSnapshot extends ReaderGenerationIdentity {
+ readonly generation: number;
+}
+
+export interface ReaderGenerationGuard {
+ activate: (identity: ReaderGenerationIdentity) => ReaderGenerationSnapshot;
+ capture: () => ReaderGenerationSnapshot;
+ invalidate: () => void;
+ isCurrent: (snapshot: ReaderGenerationSnapshot) => boolean;
+}
+
+export function createReaderGenerationGuard(
+ initialIdentity: ReaderGenerationIdentity,
+): ReaderGenerationGuard {
+ let active = true;
+ let generation = 1;
+ let identity = copyReaderGenerationIdentity(initialIdentity);
+
+ const capture = (): ReaderGenerationSnapshot => ({
+ ...identity,
+ generation,
+ });
+
+ return {
+ activate(nextIdentity) {
+ if (active && isSameReaderGenerationIdentity(identity, nextIdentity)) {
+ return capture();
+ }
+
+ active = true;
+ generation += 1;
+ identity = copyReaderGenerationIdentity(nextIdentity);
+ return capture();
+ },
+ capture,
+ invalidate() {
+ active = false;
+ generation += 1;
+ },
+ isCurrent(snapshot) {
+ return active &&
+ snapshot.generation === generation &&
+ isSameReaderGenerationIdentity(identity, snapshot);
+ },
+ };
+}
+
+function copyReaderGenerationIdentity(
+ identity: ReaderGenerationIdentity,
+): ReaderGenerationIdentity {
+ return {
+ langCode: identity.langCode,
+ memoryId: identity.memoryId,
+ };
+}
+
+function isSameReaderGenerationIdentity(
+ left: ReaderGenerationIdentity,
+ right: ReaderGenerationIdentity,
+): boolean {
+ return left.memoryId === right.memoryId && left.langCode === right.langCode;
+}
diff --git a/src/components/settings/SettingsPage.tsx b/src/components/settings/SettingsPage.tsx
index 8406c326..41ca4f30 100644
--- a/src/components/settings/SettingsPage.tsx
+++ b/src/components/settings/SettingsPage.tsx
@@ -24,6 +24,10 @@ import {
submitTranslationTargetLanguage,
} from "./settings-submit";
import { revalidateSettingsState } from "./settings-loader";
+import {
+ createAsyncActionTracker,
+ type AsyncActionToken,
+} from "./action-state";
import { RouteHeader } from "../layout/RouteHeader";
export interface SettingsPageProps {
@@ -36,6 +40,12 @@ type PendingCodexAuth = Extract<
{ status: "login_started" }
>;
+type SettingsAction =
+ | "language"
+ | "codex-defaults"
+ | "openai-auth"
+ | "openai-auth-poll";
+
const pageFrame =
"trauma-route-surface trauma-mobile-stable-viewport w-full bg-trauma-bg-surface";
const contentClass = "trauma-fluid-route-padding grid gap-5 py-7";
@@ -71,10 +81,44 @@ export function SettingsPage(props: SettingsPageProps) {
codexAuth().status === "login_started"
? codexAuth() as PendingCodexAuth
: undefined;
- const [pending, setPending] = createSignal("");
+ const [pendingActions, setPendingActions] = createSignal<
+ ReadonlySet
+ >(new Set());
const [message, setMessage] = createSignal("");
const [error, setError] = createSignal("");
const authPollControllers = new Set();
+ const actionTracker = createAsyncActionTracker(
+ setPendingActions,
+ );
+ const isPending = (action: SettingsAction): boolean =>
+ pendingActions().has(action);
+ const beginAction = (
+ action: SettingsAction,
+ options: { clearFeedback?: boolean } = {},
+ ): AsyncActionToken => {
+ const token = actionTracker.begin(action);
+ if (options.clearFeedback !== false) {
+ setError("");
+ setMessage("");
+ }
+ return token;
+ };
+ const setActionMessage = (
+ token: AsyncActionToken,
+ value: string,
+ ): void => {
+ if (actionTracker.isCurrent(token) && actionTracker.isLatestFeedback(token)) {
+ setMessage(value);
+ }
+ };
+ const setActionError = (
+ token: AsyncActionToken,
+ value: string,
+ ): void => {
+ if (actionTracker.isCurrent(token) && actionTracker.isLatestFeedback(token)) {
+ setError(value);
+ }
+ };
onCleanup(() => {
for (const controller of authPollControllers) {
@@ -112,20 +156,21 @@ export function SettingsPage(props: SettingsPageProps) {
};
const updateLanguage = async (): Promise => {
- setPending("language");
- setError("");
- setMessage("");
+ const action = beginAction("language");
try {
const settings = await submitTranslationTargetLanguage({
language: language(),
});
+ if (!actionTracker.isCurrent(action)) {
+ return;
+ }
setLanguage(settings.translationTargetLanguage);
- setMessage("Translation target language saved.");
+ setActionMessage(action, "Translation target language saved.");
void revalidateSettingsState();
} catch {
- setError("Failed to update translation target language.");
+ setActionError(action, "Failed to update translation target language.");
} finally {
- setPending("");
+ actionTracker.finish(action);
}
};
@@ -151,96 +196,112 @@ export function SettingsPage(props: SettingsPageProps) {
};
const updateCodexDefaults = async (): Promise => {
- setPending("codex-defaults");
- setError("");
- setMessage("");
+ const action = beginAction("codex-defaults");
try {
const selectedEffort = codexEffort();
const settings = await submitCodexTranslationDefaults({
model: codexModel() === "" ? null : codexModel(),
reasoningEffort: selectedEffort === "" ? null : selectedEffort,
});
+ if (!actionTracker.isCurrent(action)) {
+ return;
+ }
setCodexModel(settings.codexTranslationModel ?? "");
setCodexEffort(settings.codexTranslationReasoningEffort ?? "");
- setMessage("Codex translation defaults saved.");
+ setActionMessage(action, "Codex translation defaults saved.");
void revalidateSettingsState();
} catch (error) {
- setError(
+ setActionError(
+ action,
error instanceof Error
? error.message
: "Failed to update Codex translation defaults.",
);
} finally {
- setPending("");
+ actionTracker.finish(action);
}
};
const enableOpenAiAuth = async (): Promise => {
- setPending("openai-auth");
- setError("");
- setMessage("");
+ const action = beginAction("openai-auth");
try {
const response = await submitEnableOpenAiAuth();
+ if (!actionTracker.isCurrent(action)) {
+ return;
+ }
if (response.status === "enabled") {
setCodexAuth(response);
- setMessage(response.message);
+ setActionMessage(action, response.message);
void revalidateSettingsState();
} else if (response.status === "login_started") {
setCodexAuth(response);
- setMessage("Codex device-code setup started.");
+ setActionMessage(action, "Codex device-code setup started.");
void refreshCodexAuthAfterLogin();
} else if (response.status === "failed") {
- setError(response.error);
+ setActionError(action, response.error);
} else {
setCodexAuth(response);
- setMessage("Codex auth setup state refreshed.");
+ setActionMessage(action, "Codex auth setup state refreshed.");
void revalidateSettingsState();
}
} catch (error) {
- setError(error instanceof Error ? error.message : "Failed to enable OpenAI auth.");
+ setActionError(
+ action,
+ error instanceof Error ? error.message : "Failed to enable OpenAI auth.",
+ );
} finally {
- setPending("");
+ actionTracker.finish(action);
}
};
const refreshCodexAuthAfterLogin = async (): Promise => {
+ const action = beginAction("openai-auth-poll", { clearFeedback: false });
const controller = new AbortController();
authPollControllers.add(controller);
try {
const response = await pollCodexAuthSetup({
signal: controller.signal,
});
- if (response === undefined || controller.signal.aborted) {
+ if (
+ response === undefined ||
+ controller.signal.aborted ||
+ !actionTracker.isCurrent(action)
+ ) {
return;
}
setCodexAuth(response);
if (response.status === "enabled") {
- setMessage(response.message);
+ setActionMessage(action, response.message);
void revalidateSettingsState();
} else if (response.status === "error") {
- setError(response.error);
+ setActionError(action, response.error);
} else {
- setMessage("Codex auth setup state refreshed.");
+ setActionMessage(action, "Codex auth setup state refreshed.");
void revalidateSettingsState();
}
} catch (error) {
if (!controller.signal.aborted) {
- setError(error instanceof Error ? error.message : "Failed to refresh Codex auth.");
+ setActionError(
+ action,
+ error instanceof Error ? error.message : "Failed to refresh Codex auth.",
+ );
}
} finally {
authPollControllers.delete(controller);
+ actionTracker.finish(action);
}
};
const deleteOpenAiAuth = async (): Promise => {
- setPending("openai-auth");
- setError("");
- setMessage("");
+ const action = beginAction("openai-auth");
try {
const response = await submitDeleteOpenAiAuth({
confirm: (text) =>
typeof window === "undefined" ? false : window.confirm(text),
});
+ if (!actionTracker.isCurrent(action)) {
+ return;
+ }
if (response !== undefined) {
if (response.status === "unsupported") {
setCodexAuth({
@@ -248,7 +309,10 @@ export function SettingsPage(props: SettingsPageProps) {
provider: "codex",
message: response.message,
});
- setMessage(response.message ?? "Codex auth logout is unsupported.");
+ setActionMessage(
+ action,
+ response.message ?? "Codex auth logout is unsupported.",
+ );
void revalidateSettingsState();
return;
}
@@ -257,13 +321,13 @@ export function SettingsPage(props: SettingsPageProps) {
provider: "codex",
reason: "logged_out",
});
- setMessage("Codex auth was deleted.");
+ setActionMessage(action, "Codex auth was deleted.");
void revalidateSettingsState();
}
} catch {
- setError("Failed to delete OpenAI auth.");
+ setActionError(action, "Failed to delete OpenAI auth.");
} finally {
- setPending("");
+ actionTracker.finish(action);
}
};
@@ -281,7 +345,7 @@ export function SettingsPage(props: SettingsPageProps) {
Translation target language