@xrkseek/harness 0.6.23 → 0.7.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/node_modules/@xrkseek/a2a/README.md +45 -45
- package/node_modules/@xrkseek/attachment/README.md +23 -23
- package/node_modules/@xrkseek/attachment-local/README.md +6 -6
- package/node_modules/@xrkseek/attachment-local/package.json +26 -26
- package/node_modules/@xrkseek/checkpoint/README.md +90 -90
- package/node_modules/@xrkseek/checkpoint/dist/process-git.d.ts +5 -0
- package/node_modules/@xrkseek/checkpoint/dist/process-git.d.ts.map +1 -1
- package/node_modules/@xrkseek/checkpoint/dist/process-git.js +59 -2
- package/node_modules/@xrkseek/checkpoint/dist/process-git.js.map +1 -1
- package/node_modules/@xrkseek/checkpoint/dist/store.d.ts +45 -0
- package/node_modules/@xrkseek/checkpoint/dist/store.d.ts.map +1 -1
- package/node_modules/@xrkseek/checkpoint/dist/store.js +221 -60
- package/node_modules/@xrkseek/checkpoint/dist/store.js.map +1 -1
- package/node_modules/@xrkseek/checkpoint/package.json +26 -26
- package/node_modules/@xrkseek/claude-code-mods/README.md +152 -0
- package/node_modules/@xrkseek/claude-code-mods/README.zh.md +172 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/api.d.ts +36 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/api.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/api.js +215 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/api.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/attach.d.ts +92 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/attach.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/attach.js +106 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/attach.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/chain.d.ts +105 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/chain.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/chain.js +324 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/chain.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/define-mod.d.ts +39 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/define-mod.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/define-mod.js +39 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/define-mod.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/elements.d.ts +96 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/elements.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/elements.js +171 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/elements.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/engine.d.ts +155 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/engine.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/engine.js +356 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/engine.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/host-ops.d.ts +72 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/host-ops.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/host-ops.js +603 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/host-ops.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/index.d.ts +112 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/index.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/index.js +654 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/index.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/matcher.d.ts +45 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/matcher.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/matcher.js +195 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/matcher.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/module.d.ts +74 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/module.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/module.js +167 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/module.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/native-import.d.ts +31 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/native-import.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/native-import.js +32 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/native-import.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/plugin-dir.d.ts +70 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/plugin-dir.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/plugin-dir.js +167 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/plugin-dir.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/product-agent.d.ts +57 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/product-agent.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/product-agent.js +85 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/product-agent.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/runtime.d.ts +117 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/runtime.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/runtime.js +252 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/runtime.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/storage-domain.d.ts +68 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/storage-domain.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/storage-domain.js +104 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/storage-domain.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/surfaces.d.ts +82 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/surfaces.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/surfaces.js +243 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/surfaces.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/testing.d.ts +157 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/testing.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/testing.js +266 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/testing.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/tool-names.d.ts +21 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/tool-names.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/tool-names.js +37 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/tool-names.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/types.d.ts +592 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/types.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/types.js +10 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/types.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/values.d.ts +58 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/values.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/values.js +75 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/values.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/working-directory.d.ts +45 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/working-directory.d.ts.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/working-directory.js +29 -0
- package/node_modules/@xrkseek/claude-code-mods/dist/working-directory.js.map +1 -0
- package/node_modules/@xrkseek/claude-code-mods/package.json +47 -0
- package/node_modules/@xrkseek/code-runtime/README.md +20 -20
- package/node_modules/@xrkseek/core-agent/dist/index.d.ts +87 -0
- package/node_modules/@xrkseek/core-agent/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-agent/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/index.js +62 -32
- package/node_modules/@xrkseek/core-agent-loop/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/package.json +42 -42
- package/node_modules/@xrkseek/core-session/README.md +35 -35
- package/node_modules/@xrkseek/core-session/dist/compaction.d.ts +46 -2
- package/node_modules/@xrkseek/core-session/dist/compaction.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/compaction.js +124 -49
- package/node_modules/@xrkseek/core-session/dist/compaction.js.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/freeze.d.ts +6 -0
- package/node_modules/@xrkseek/core-session/dist/freeze.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/freeze.js +9 -0
- package/node_modules/@xrkseek/core-session/dist/freeze.js.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/index.d.ts +20 -4
- package/node_modules/@xrkseek/core-session/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/index.js +55 -14
- package/node_modules/@xrkseek/core-session/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/list-hints.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/list-hints.js +14 -4
- package/node_modules/@xrkseek/core-session/dist/list-hints.js.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/repair-open-turn.d.ts +8 -1
- package/node_modules/@xrkseek/core-session/dist/repair-open-turn.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/repair-open-turn.js +14 -4
- package/node_modules/@xrkseek/core-session/dist/repair-open-turn.js.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/sqlite-store.d.ts +55 -0
- package/node_modules/@xrkseek/core-session/dist/sqlite-store.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/sqlite-store.js +670 -92
- package/node_modules/@xrkseek/core-session/dist/sqlite-store.js.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/store.d.ts +38 -0
- package/node_modules/@xrkseek/core-session/dist/store.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/surface-estimate.d.ts +6 -0
- package/node_modules/@xrkseek/core-session/dist/surface-estimate.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/surface-estimate.js +23 -0
- package/node_modules/@xrkseek/core-session/dist/surface-estimate.js.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/surface-fold.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/surface-fold.js +5 -7
- package/node_modules/@xrkseek/core-session/dist/surface-fold.js.map +1 -1
- package/node_modules/@xrkseek/core-session/package.json +34 -34
- package/node_modules/@xrkseek/core-system-prompt/README.md +14 -14
- package/node_modules/@xrkseek/core-tools/dist/session-query-prompt.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-tools/dist/session-query-prompt.js +3 -2
- package/node_modules/@xrkseek/core-tools/dist/session-query-prompt.js.map +1 -1
- package/node_modules/@xrkseek/core-tools/dist/std-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-tools/dist/std-tools.js +1 -13
- package/node_modules/@xrkseek/core-tools/dist/std-tools.js.map +1 -1
- package/node_modules/@xrkseek/exec-computer-use/README.md +14 -14
- package/node_modules/@xrkseek/exec-computer-use/dist/windows-uia.js +402 -402
- package/node_modules/@xrkseek/exec-computer-use/package.json +26 -26
- package/node_modules/@xrkseek/exec-fs/README.md +12 -12
- package/node_modules/@xrkseek/exec-fs/dist/read-image.d.ts +7 -0
- package/node_modules/@xrkseek/exec-fs/dist/read-image.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-fs/dist/read-image.js +33 -15
- package/node_modules/@xrkseek/exec-fs/dist/read-image.js.map +1 -1
- package/node_modules/@xrkseek/exec-fs/dist/routing-prompt.js +1 -1
- package/node_modules/@xrkseek/exec-fs/dist/routing-prompt.js.map +1 -1
- package/node_modules/@xrkseek/exec-image-gen/README.md +13 -13
- package/node_modules/@xrkseek/exec-image-gen/package.json +28 -28
- package/node_modules/@xrkseek/exec-memory/README.md +14 -14
- package/node_modules/@xrkseek/exec-memory/dist/live-fragment.d.ts +11 -0
- package/node_modules/@xrkseek/exec-memory/dist/live-fragment.d.ts.map +1 -0
- package/node_modules/@xrkseek/exec-memory/dist/live-fragment.js +40 -0
- package/node_modules/@xrkseek/exec-memory/dist/live-fragment.js.map +1 -0
- package/node_modules/@xrkseek/exec-memory/package.json +28 -28
- package/node_modules/@xrkseek/exec-sandbox/README.md +15 -15
- package/node_modules/@xrkseek/exec-ssh/README.md +19 -19
- package/node_modules/@xrkseek/exec-subprocess/README.md +10 -10
- package/node_modules/@xrkseek/exec-video-analyze/README.md +11 -11
- package/node_modules/@xrkseek/exec-video-analyze/package.json +26 -26
- package/node_modules/@xrkseek/exec-video-gen/README.md +26 -26
- package/node_modules/@xrkseek/exec-voice/README.md +25 -25
- package/node_modules/@xrkseek/exec-web/README.md +11 -11
- package/node_modules/@xrkseek/exec-web/dist/fetch-http.d.ts +8 -0
- package/node_modules/@xrkseek/exec-web/dist/fetch-http.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/fetch-http.js +5 -1
- package/node_modules/@xrkseek/exec-web/dist/fetch-http.js.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/format.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/format.js +1 -0
- package/node_modules/@xrkseek/exec-web/dist/format.js.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/index.d.ts +2 -2
- package/node_modules/@xrkseek/exec-web/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/index.js +2 -2
- package/node_modules/@xrkseek/exec-web/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/search-duckduckgo.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/search-duckduckgo.js +15 -8
- package/node_modules/@xrkseek/exec-web/dist/search-duckduckgo.js.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/search-parallel-free.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/search-parallel-free.js +21 -13
- package/node_modules/@xrkseek/exec-web/dist/search-parallel-free.js.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/search-providers.d.ts +16 -3
- package/node_modules/@xrkseek/exec-web/dist/search-providers.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/search-providers.js +113 -7
- package/node_modules/@xrkseek/exec-web/dist/search-providers.js.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/tools.js +15 -2
- package/node_modules/@xrkseek/exec-web/dist/tools.js.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/types.d.ts +6 -0
- package/node_modules/@xrkseek/exec-web/dist/types.d.ts.map +1 -1
- package/node_modules/@xrkseek/llm-deepseek/README.md +22 -22
- package/node_modules/@xrkseek/llm-deepseek/package.json +30 -30
- package/node_modules/@xrkseek/llm-registry/dist/index.d.ts +2 -2
- package/node_modules/@xrkseek/llm-registry/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/llm-registry/dist/index.js +1 -1
- package/node_modules/@xrkseek/llm-registry/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/llm-registry/dist/models-dev-catalog.d.ts.map +1 -1
- package/node_modules/@xrkseek/llm-registry/dist/models-dev-catalog.js +13 -2
- package/node_modules/@xrkseek/llm-registry/dist/models-dev-catalog.js.map +1 -1
- package/node_modules/@xrkseek/llm-registry/dist/registry.d.ts +6 -0
- package/node_modules/@xrkseek/llm-registry/dist/registry.d.ts.map +1 -1
- package/node_modules/@xrkseek/llm-registry/dist/registry.js +6 -0
- package/node_modules/@xrkseek/llm-registry/dist/registry.js.map +1 -1
- package/node_modules/@xrkseek/llm-registry/dist/types.d.ts +29 -0
- package/node_modules/@xrkseek/llm-registry/dist/types.d.ts.map +1 -1
- package/node_modules/@xrkseek/llm-registry/dist/types.js +21 -0
- package/node_modules/@xrkseek/llm-registry/dist/types.js.map +1 -1
- package/node_modules/@xrkseek/mcp/README.md +78 -78
- package/node_modules/@xrkseek/policy/README.md +18 -18
- package/node_modules/@xrkseek/policy/package.json +31 -31
- package/node_modules/@xrkseek/preset-harness/README.md +7 -7
- package/node_modules/@xrkseek/preset-harness/dist/mods.d.ts +68 -0
- package/node_modules/@xrkseek/preset-harness/dist/mods.d.ts.map +1 -0
- package/node_modules/@xrkseek/preset-harness/dist/mods.js +510 -0
- package/node_modules/@xrkseek/preset-harness/dist/mods.js.map +1 -0
- package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts +12 -1
- package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts.map +1 -1
- package/node_modules/@xrkseek/preset-harness/dist/preset.js +73 -26
- package/node_modules/@xrkseek/preset-harness/dist/preset.js.map +1 -1
- package/node_modules/@xrkseek/preset-harness/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@xrkseek/preset-harness/package.json +9 -8
- package/node_modules/@xrkseek/preset-minimal/README.md +6 -6
- package/node_modules/@xrkseek/preset-minimal/dist/preset.d.ts.map +1 -1
- package/node_modules/@xrkseek/preset-minimal/dist/preset.js +9 -3
- package/node_modules/@xrkseek/preset-minimal/dist/preset.js.map +1 -1
- package/node_modules/@xrkseek/preset-minimal/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@xrkseek/preset-server/README.md +4 -4
- package/node_modules/@xrkseek/preset-server/dist/preset.d.ts.map +1 -1
- package/node_modules/@xrkseek/preset-server/dist/preset.js +2 -1
- package/node_modules/@xrkseek/preset-server/dist/preset.js.map +1 -1
- package/node_modules/@xrkseek/preset-server/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@xrkseek/protocol/README.md +34 -34
- package/node_modules/@xrkseek/protocol/dist/content.d.ts.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/content.js +6 -1
- package/node_modules/@xrkseek/protocol/dist/content.js.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/index.d.ts +3 -2
- package/node_modules/@xrkseek/protocol/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/index.js +1 -0
- package/node_modules/@xrkseek/protocol/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/json-schema.d.ts +12 -0
- package/node_modules/@xrkseek/protocol/dist/json-schema.d.ts.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/json-schema.js +9 -0
- package/node_modules/@xrkseek/protocol/dist/json-schema.js.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/json-value.d.ts +25 -0
- package/node_modules/@xrkseek/protocol/dist/json-value.d.ts.map +1 -0
- package/node_modules/@xrkseek/protocol/dist/json-value.js +181 -0
- package/node_modules/@xrkseek/protocol/dist/json-value.js.map +1 -0
- package/node_modules/@xrkseek/protocol/dist/session-events.d.ts +21 -1
- package/node_modules/@xrkseek/protocol/dist/session-events.d.ts.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/session-events.js +1 -0
- package/node_modules/@xrkseek/protocol/dist/session-events.js.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/validate.d.ts +4 -1
- package/node_modules/@xrkseek/protocol/dist/validate.d.ts.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/validate.js +28 -2
- package/node_modules/@xrkseek/protocol/dist/validate.js.map +1 -1
- package/node_modules/@xrkseek/schemastery/lib/index.cjs +597 -597
- package/node_modules/@xrkseek/schemastery/lib/index.mjs +597 -597
- package/node_modules/@xrkseek/schemastery/lib/types/index.d.ts +203 -203
- package/node_modules/@xrkseek/schemastery/src/index.d.ts +203 -203
- package/node_modules/@xrkseek/schemastery/src/index.ts +906 -906
- package/node_modules/@xrkseek/server-config/package.json +28 -28
- package/node_modules/@xrkseek/server-cron/README.md +12 -12
- package/node_modules/@xrkseek/server-cron/package.json +26 -26
- package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.d.ts +22 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.js +40 -3
- package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.js +2 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.d.ts +1 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.js +2 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.d.ts +5 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.js +7 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-home-boundary.d.ts +31 -0
- package/node_modules/@xrkseek/server-face/dist/agent-home-boundary.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/agent-home-boundary.js +71 -0
- package/node_modules/@xrkseek/server-face/dist/agent-home-boundary.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/agent-home.d.ts +18 -0
- package/node_modules/@xrkseek/server-face/dist/agent-home.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/agent-home.js +64 -0
- package/node_modules/@xrkseek/server-face/dist/agent-home.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.d.ts +41 -2
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js +200 -28
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-team-roles.js +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-team-roles.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/attach-http.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/attach-http.js +9 -0
- package/node_modules/@xrkseek/server-face/dist/attach-http.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/boss-status-broadcast.d.ts +55 -0
- package/node_modules/@xrkseek/server-face/dist/boss-status-broadcast.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/boss-status-broadcast.js +167 -0
- package/node_modules/@xrkseek/server-face/dist/boss-status-broadcast.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/collab-board.d.ts +12 -0
- package/node_modules/@xrkseek/server-face/dist/collab-board.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/collab-board.js +101 -19
- package/node_modules/@xrkseek/server-face/dist/collab-board.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/community-llm-sync.d.ts +2 -2
- package/node_modules/@xrkseek/server-face/dist/community-llm-sync.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/community-llm-sync.js +19 -7
- package/node_modules/@xrkseek/server-face/dist/community-llm-sync.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/context.d.ts +29 -0
- package/node_modules/@xrkseek/server-face/dist/context.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/dispatch.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/dispatch.js +4 -1
- package/node_modules/@xrkseek/server-face/dist/dispatch.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/face-schema.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/face-schema.js +2 -1
- package/node_modules/@xrkseek/server-face/dist/face-schema.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/fork-cut.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/fork-cut.js +15 -3
- package/node_modules/@xrkseek/server-face/dist/fork-cut.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/fork-lineage.d.ts +7 -0
- package/node_modules/@xrkseek/server-face/dist/fork-lineage.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/fork-lineage.js +23 -8
- package/node_modules/@xrkseek/server-face/dist/fork-lineage.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/band.d.ts +7 -0
- package/node_modules/@xrkseek/server-face/dist/handlers/band.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/handlers/band.js +40 -0
- package/node_modules/@xrkseek/server-face/dist/handlers/band.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/handlers/checkpoint.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/checkpoint.js +81 -3
- package/node_modules/@xrkseek/server-face/dist/handlers/checkpoint.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/remotes.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/remotes.js +20 -7
- package/node_modules/@xrkseek/server-face/dist/handlers/remotes.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/session.d.ts +2 -0
- package/node_modules/@xrkseek/server-face/dist/handlers/session.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/session.js +236 -62
- package/node_modules/@xrkseek/server-face/dist/handlers/session.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/team.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/team.js +100 -9
- package/node_modules/@xrkseek/server-face/dist/handlers/team.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/host-open-in-app.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/host-open-in-app.js +9 -0
- package/node_modules/@xrkseek/server-face/dist/host-open-in-app.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/host-open-path.d.ts +8 -3
- package/node_modules/@xrkseek/server-face/dist/host-open-path.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/host-open-path.js +61 -19
- package/node_modules/@xrkseek/server-face/dist/host-open-path.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/host-pick-directory.d.ts +2 -1
- package/node_modules/@xrkseek/server-face/dist/host-pick-directory.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/host-pick-directory.js +12 -2
- package/node_modules/@xrkseek/server-face/dist/host-pick-directory.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/index.d.ts +6 -2
- package/node_modules/@xrkseek/server-face/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/index.js +6 -2
- package/node_modules/@xrkseek/server-face/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/instruction-authority-fragment.d.ts +19 -0
- package/node_modules/@xrkseek/server-face/dist/instruction-authority-fragment.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/instruction-authority-fragment.js +28 -0
- package/node_modules/@xrkseek/server-face/dist/instruction-authority-fragment.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/log-cut-reset.d.ts +3 -0
- package/node_modules/@xrkseek/server-face/dist/log-cut-reset.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/log-cut-reset.js +22 -0
- package/node_modules/@xrkseek/server-face/dist/log-cut-reset.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/model-catalog.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/model-catalog.js +60 -5
- package/node_modules/@xrkseek/server-face/dist/model-catalog.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/index.d.ts +2 -2
- package/node_modules/@xrkseek/server-face/dist/projections/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/index.js +2 -2
- package/node_modules/@xrkseek/server-face/dist/projections/index.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/list-checkpoint-cache.d.ts +50 -4
- package/node_modules/@xrkseek/server-face/dist/projections/list-checkpoint-cache.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/list-checkpoint-cache.js +167 -19
- package/node_modules/@xrkseek/server-face/dist/projections/list-checkpoint-cache.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/snapshot-keys.d.ts +21 -1
- package/node_modules/@xrkseek/server-face/dist/projections/snapshot-keys.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/snapshot-keys.js +21 -1
- package/node_modules/@xrkseek/server-face/dist/projections/snapshot-keys.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/context-pressure.d.ts +8 -4
- package/node_modules/@xrkseek/server-face/dist/projections/units/context-pressure.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/context-pressure.js +2 -7
- package/node_modules/@xrkseek/server-face/dist/projections/units/context-pressure.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/context-timeline.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/context-timeline.js +58 -0
- package/node_modules/@xrkseek/server-face/dist/projections/units/context-timeline.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/cost-usage.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/cost-usage.js +85 -0
- package/node_modules/@xrkseek/server-face/dist/projections/units/cost-usage.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/session-list-metadata.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/session-list-metadata.js +14 -0
- package/node_modules/@xrkseek/server-face/dist/projections/units/session-list-metadata.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/title.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/title.js +14 -0
- package/node_modules/@xrkseek/server-face/dist/projections/units/title.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.js +24 -0
- package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/runtime.d.ts +11 -1
- package/node_modules/@xrkseek/server-face/dist/runtime.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/runtime.js +118 -15
- package/node_modules/@xrkseek/server-face/dist/runtime.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/seat-identity.d.ts +26 -0
- package/node_modules/@xrkseek/server-face/dist/seat-identity.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/seat-identity.js +137 -0
- package/node_modules/@xrkseek/server-face/dist/seat-identity.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/seat-titles.d.ts +29 -0
- package/node_modules/@xrkseek/server-face/dist/seat-titles.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/seat-titles.js +74 -0
- package/node_modules/@xrkseek/server-face/dist/seat-titles.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-capability.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-capability.js +9 -6
- package/node_modules/@xrkseek/server-face/dist/session-capability.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-event-window.d.ts +37 -0
- package/node_modules/@xrkseek/server-face/dist/session-event-window.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-event-window.js +88 -0
- package/node_modules/@xrkseek/server-face/dist/session-event-window.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-identity-store.d.ts +20 -0
- package/node_modules/@xrkseek/server-face/dist/session-identity-store.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-identity-store.js +82 -0
- package/node_modules/@xrkseek/server-face/dist/session-identity-store.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-posture.d.ts +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-posture.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-posture.js +20 -5
- package/node_modules/@xrkseek/server-face/dist/session-posture.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-query-tools.d.ts +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-query-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-query-tools.js +172 -25
- package/node_modules/@xrkseek/server-face/dist/session-query-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-search.d.ts +20 -2
- package/node_modules/@xrkseek/server-face/dist/session-search.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-search.js +125 -19
- package/node_modules/@xrkseek/server-face/dist/session-search.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-status.d.ts +6 -0
- package/node_modules/@xrkseek/server-face/dist/session-status.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-status.js +161 -21
- package/node_modules/@xrkseek/server-face/dist/session-status.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-thread-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js +5 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-tool-copy.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-tool-copy.js +2 -1
- package/node_modules/@xrkseek/server-face/dist/session-tool-copy.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-credentials.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-credentials.js +43 -3
- package/node_modules/@xrkseek/server-face/dist/settings-credentials.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-document.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-document.js +4 -0
- package/node_modules/@xrkseek/server-face/dist/settings-document.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-schemas.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-schemas.js +76 -11
- package/node_modules/@xrkseek/server-face/dist/settings-schemas.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/skill-documents.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/skill-documents.js +14 -4
- package/node_modules/@xrkseek/server-face/dist/skill-documents.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/skill-list.d.ts +4 -2
- package/node_modules/@xrkseek/server-face/dist/skill-list.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/skill-list.js +10 -4
- package/node_modules/@xrkseek/server-face/dist/skill-list.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/skill-read.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/skill-read.js +9 -2
- package/node_modules/@xrkseek/server-face/dist/skill-read.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/skill-source.d.ts +2 -1
- package/node_modules/@xrkseek/server-face/dist/skill-source.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/skill-source.js +12 -2
- package/node_modules/@xrkseek/server-face/dist/skill-source.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/slash.d.ts +10 -1
- package/node_modules/@xrkseek/server-face/dist/slash.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/slash.js +118 -26
- package/node_modules/@xrkseek/server-face/dist/slash.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/status-snapshot-cache.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/status-snapshot-cache.js +53 -0
- package/node_modules/@xrkseek/server-face/dist/status-snapshot-cache.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/subagent-tools.js +7 -2
- package/node_modules/@xrkseek/server-face/dist/subagent-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/types.d.ts +23 -0
- package/node_modules/@xrkseek/server-face/dist/types.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-checkpoint.d.ts +17 -2
- package/node_modules/@xrkseek/server-face/dist/workspace-checkpoint.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-checkpoint.js +111 -10
- package/node_modules/@xrkseek/server-face/dist/workspace-checkpoint.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-face.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-face.js +19 -14
- package/node_modules/@xrkseek/server-face/dist/workspace-face.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-member-look.d.ts +22 -0
- package/node_modules/@xrkseek/server-face/dist/workspace-member-look.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/workspace-member-look.js +35 -0
- package/node_modules/@xrkseek/server-face/dist/workspace-member-look.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.d.ts +3 -2
- package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.js +74 -57
- package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-registry.d.ts +31 -0
- package/node_modules/@xrkseek/server-face/dist/workspace-registry.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-registry.js +109 -0
- package/node_modules/@xrkseek/server-face/dist/workspace-registry.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-store.d.ts +2 -0
- package/node_modules/@xrkseek/server-face/dist/workspace-store.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-store.js +7 -0
- package/node_modules/@xrkseek/server-face/dist/workspace-store.js.map +1 -1
- package/node_modules/@xrkseek/server-face/package.json +60 -60
- package/node_modules/@xrkseek/server-host/dist/index.d.ts +37 -6
- package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/index.js +182 -28
- package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/log.d.ts +6 -0
- package/node_modules/@xrkseek/server-host/dist/log.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.js +17 -2
- package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.js.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/standing-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/standing-tools.js +3 -3
- package/node_modules/@xrkseek/server-host/dist/standing-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-host/package.json +75 -75
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/adapter-types.d.ts +5 -0
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/adapter-types.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/auto-review-tool-pre.d.ts +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/auto-review-tool-pre.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/genui-browser-runtime.js +188 -188
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.d.ts +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.js +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.js.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-auth.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-auth.js +292 -24
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-auth.js.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-gate.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-gate.js +12 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-gate.js.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.d.ts +16 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.js +47 -2
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.js.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/skin-center.d.ts +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/token-usage-stats-dash.js +53 -53
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.d.ts +9 -4
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.js +39 -20
- package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.js.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/index.d.ts +2 -1
- package/node_modules/@xrkseek/server-http/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/index.js +2 -1
- package/node_modules/@xrkseek/server-http/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/sunflower-free/ensure.d.ts +55 -0
- package/node_modules/@xrkseek/server-http/dist/sunflower-free/ensure.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-http/dist/sunflower-free/ensure.js +176 -0
- package/node_modules/@xrkseek/server-http/dist/sunflower-free/ensure.js.map +1 -0
- package/node_modules/@xrkseek/server-http/dist/xrk/plugin-mutate.d.ts +2 -0
- package/node_modules/@xrkseek/server-http/dist/xrk/plugin-mutate.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/xrk/plugin-mutate.js +7 -3
- package/node_modules/@xrkseek/server-http/dist/xrk/plugin-mutate.js.map +1 -1
- package/node_modules/@xrkseek/server-http/package.json +72 -72
- package/node_modules/@xrkseek/server-loader/dist/load.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-loader/dist/load.js +132 -0
- package/node_modules/@xrkseek/server-loader/dist/load.js.map +1 -1
- package/node_modules/@xrkseek/session-projection/README.md +26 -26
- package/node_modules/@xrkseek/session-projection/dist/index.d.ts +31 -2
- package/node_modules/@xrkseek/session-projection/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/session-projection/dist/index.js +135 -19
- package/node_modules/@xrkseek/session-projection/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/session-telemetry/README.md +11 -11
- package/node_modules/@xrkseek/session-telemetry/dist/index.d.ts +1 -0
- package/node_modules/@xrkseek/session-telemetry/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/session-telemetry/dist/index.js +1 -0
- package/node_modules/@xrkseek/session-telemetry/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/session-telemetry/dist/redact.d.ts +14 -0
- package/node_modules/@xrkseek/session-telemetry/dist/redact.d.ts.map +1 -0
- package/node_modules/@xrkseek/session-telemetry/dist/redact.js +58 -0
- package/node_modules/@xrkseek/session-telemetry/dist/redact.js.map +1 -0
- package/node_modules/@xrkseek/session-telemetry/dist/wrap-store.d.ts +7 -0
- package/node_modules/@xrkseek/session-telemetry/dist/wrap-store.d.ts.map +1 -1
- package/node_modules/@xrkseek/session-telemetry/dist/wrap-store.js +43 -12
- package/node_modules/@xrkseek/session-telemetry/dist/wrap-store.js.map +1 -1
- package/node_modules/@xrkseek/session-telemetry/package.json +27 -27
- package/node_modules/@xrkseek/workspace/dist/durable-inject.d.ts +13 -0
- package/node_modules/@xrkseek/workspace/dist/durable-inject.d.ts.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/durable-inject.js +40 -4
- package/node_modules/@xrkseek/workspace/dist/durable-inject.js.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.d.ts +10 -9
- package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.d.ts.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.js +67 -19
- package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.js.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/index.d.ts +19 -20
- package/node_modules/@xrkseek/workspace/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/index.js +43 -20
- package/node_modules/@xrkseek/workspace/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/inject-fingerprint.d.ts +2 -0
- package/node_modules/@xrkseek/workspace/dist/inject-fingerprint.d.ts.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/inject-fingerprint.js +23 -12
- package/node_modules/@xrkseek/workspace/dist/inject-fingerprint.js.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/inject-sources.d.ts +7 -4
- package/node_modules/@xrkseek/workspace/dist/inject-sources.d.ts.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/inject-sources.js +10 -0
- package/node_modules/@xrkseek/workspace/dist/inject-sources.js.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/instruction-authority.d.ts +27 -0
- package/node_modules/@xrkseek/workspace/dist/instruction-authority.d.ts.map +1 -0
- package/node_modules/@xrkseek/workspace/dist/instruction-authority.js +78 -0
- package/node_modules/@xrkseek/workspace/dist/instruction-authority.js.map +1 -0
- package/node_modules/@xrkseek/workspace/dist/skill-dirs.d.ts +7 -0
- package/node_modules/@xrkseek/workspace/dist/skill-dirs.d.ts.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/skill-dirs.js +4 -2
- package/node_modules/@xrkseek/workspace/dist/skill-dirs.js.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/skill-tools.js +1 -1
- package/node_modules/@xrkseek/workspace/dist/skill-tools.js.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/skills.d.ts +13 -1
- package/node_modules/@xrkseek/workspace/dist/skills.d.ts.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/skills.js +45 -5
- package/node_modules/@xrkseek/workspace/dist/skills.js.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/standing-skill-dirs.d.ts +26 -0
- package/node_modules/@xrkseek/workspace/dist/standing-skill-dirs.d.ts.map +1 -0
- package/node_modules/@xrkseek/workspace/dist/standing-skill-dirs.js +80 -0
- package/node_modules/@xrkseek/workspace/dist/standing-skill-dirs.js.map +1 -0
- package/node_modules/@xrkseek/workspace/dist/workspace-anchor.d.ts +7 -1
- package/node_modules/@xrkseek/workspace/dist/workspace-anchor.d.ts.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/workspace-anchor.js +21 -1
- package/node_modules/@xrkseek/workspace/dist/workspace-anchor.js.map +1 -1
- package/node_modules/@xrkseek/workspace/package.json +28 -28
- package/node_modules/@xrkseek/xrk-agent/lib/index.js +1 -793
- package/node_modules/@xrkseek/xrk-agent/lib/invariant.js +1 -23
- package/node_modules/@xrkseek/xrk-attachment/lib/index.js +1 -1
- package/node_modules/@xrkseek/xrk-attachment/lib/invariant.js +1 -0
- package/node_modules/@xrkseek/xrk-attachment/lib/types/brand.js +10 -0
- package/node_modules/@xrkseek/xrk-attachment/lib/types/error.js +48 -0
- package/node_modules/@xrkseek/xrk-attachment/lib/types/index.js +42 -0
- package/node_modules/@xrkseek/xrk-attachment/lib/types/invariant.js +16 -0
- package/node_modules/@xrkseek/xrk-attachment/lib/types/types.d.ts +6 -0
- package/node_modules/@xrkseek/xrk-attachment/lib/types/types.js +3 -0
- package/node_modules/@xrkseek/xrk-attachment/package.json +1 -0
- package/node_modules/@xrkseek/xrk-brand/lib/index.js +1 -1
- package/node_modules/@xrkseek/xrk-brand/lib/invariant.js +1 -0
- package/node_modules/@xrkseek/xrk-brand/lib/types/index.js +24 -0
- package/node_modules/@xrkseek/xrk-brand/lib/types/invariant.js +22 -0
- package/node_modules/@xrkseek/xrk-brand/package.json +1 -0
- package/node_modules/@xrkseek/xrk-commands/lib/index.js +1 -1
- package/node_modules/@xrkseek/xrk-commands/lib/invariant.js +1 -0
- package/node_modules/@xrkseek/xrk-file-reference-local/README.md +46 -46
- package/node_modules/@xrkseek/xrk-file-reference-local/README.zh.md +46 -46
- package/node_modules/@xrkseek/xrk-file-reference-local/package.json +30 -30
- package/node_modules/@xrkseek/xrk-invariants/lib/index.js +1 -1
- package/node_modules/@xrkseek/xrk-invariants/lib/invariant.js +1 -0
- package/node_modules/@xrkseek/xrk-invariants/lib/types/index.js +148 -0
- package/node_modules/@xrkseek/xrk-invariants/lib/types/invariant.js +22 -0
- package/node_modules/@xrkseek/xrk-invariants/package.json +1 -0
- package/node_modules/@xrkseek/xrk-llm/lib/index.js +1 -1
- package/node_modules/@xrkseek/xrk-llm/lib/invariant.js +1 -0
- package/node_modules/@xrkseek/xrk-llm/lib/types/index.js +4 -0
- package/node_modules/@xrkseek/xrk-llm/lib/types/types.d.ts +11 -0
- package/node_modules/@xrkseek/xrk-permission-presets/lib/index.js +1 -1
- package/node_modules/@xrkseek/xrk-permission-presets/lib/invariant.js +1 -0
- package/node_modules/@xrkseek/xrk-scope/lib/index.js +1 -0
- package/node_modules/@xrkseek/xrk-scope/lib/types/index.d.ts +129 -0
- package/node_modules/@xrkseek/xrk-scope/lib/types/index.js +243 -0
- package/node_modules/@xrkseek/xrk-scope/package.json +34 -0
- package/node_modules/@xrkseek/xrk-session/lib/index.js +1 -1
- package/node_modules/@xrkseek/xrk-session/lib/invariant.js +1 -0
- package/node_modules/@xrkseek/xrk-session-projection/lib/index.js +1 -1
- package/node_modules/@xrkseek/xrk-session-projection/lib/invariant.js +1 -0
- package/node_modules/@xrkseek/xrk-session-reference/README.md +50 -50
- package/node_modules/@xrkseek/xrk-session-reference/README.zh.md +50 -50
- package/node_modules/@xrkseek/xrk-session-reference/dist/prepare-face.js +13 -13
- package/node_modules/@xrkseek/xrk-session-reference/dist/spill.js +2 -2
- package/node_modules/@xrkseek/xrk-session-reference/package.json +56 -56
- package/node_modules/@xrkseek/xrk-settings/lib/index.js +1 -638
- package/node_modules/@xrkseek/xrk-settings/lib/invariant.js +1 -67
- package/node_modules/@xrkseek/xrk-system-prompt/package.json +15 -15
- package/node_modules/@xrkseek/xrk-system-prompt/src/index.ts +144 -144
- package/node_modules/@xrkseek/xrk-token-meter/README.i18n.yaml +6 -0
- package/node_modules/@xrkseek/xrk-token-meter/README.md +68 -0
- package/node_modules/@xrkseek/xrk-token-meter/README.zh.md +68 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/index.js +1 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/invariant.js +1 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/breakdown-projection.d.ts +29 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/breakdown-projection.js +56 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/client.d.ts +9 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/client.js +7 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/estimate.d.ts +42 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/estimate.js +79 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/index.d.ts +62 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/index.js +250 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/invariant.d.ts +16 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/invariant.js +30 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/projection.d.ts +74 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/projection.js +7 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/surface-fold.d.ts +38 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/surface-fold.js +47 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/surface-projection.d.ts +59 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/surface-projection.js +66 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/turn-usage.d.ts +33 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/turn-usage.js +247 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/types.d.ts +44 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/types.js +7 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/usage-projection.d.ts +64 -0
- package/node_modules/@xrkseek/xrk-token-meter/lib/types/usage-projection.js +161 -0
- package/node_modules/@xrkseek/xrk-token-meter/package.json +57 -0
- package/node_modules/@xrkseek/xrk-tools/lib/index.js +1 -1
- package/node_modules/@xrkseek/xrk-tools/lib/invariant.js +1 -1
- package/node_modules/@xrkseek/xrk-tools/src/presentation.ts +39 -39
- package/node_modules/@xrkseek/xrk-typert-protocol/lib/index.js +1 -1
- package/node_modules/@xrkseek/xrk-typert-protocol/lib/invariant.js +1 -0
- package/node_modules/@xrkseek/xrk-workflow/README.md +73 -73
- package/node_modules/@xrkseek/xrk-workflow/README.zh.md +72 -72
- package/node_modules/@xrkseek/xrk-workflow/lib/types/index.js +118 -118
- package/package.json +7 -1
- package/node_modules/@xrkseek/llm/dist/reasoning-effort.d.ts +0 -14
- package/node_modules/@xrkseek/llm/dist/reasoning-effort.d.ts.map +0 -1
- package/node_modules/@xrkseek/llm/dist/reasoning-effort.js +0 -21
- package/node_modules/@xrkseek/llm/dist/reasoning-effort.js.map +0 -1
- package/node_modules/@xrkseek/server-face/dist/index.d.mts +0 -3734
- package/node_modules/@xrkseek/server-face/dist/index.d.mts.map +0 -1
- package/node_modules/@xrkseek/server-face/dist/index.mjs +0 -22085
- package/node_modules/@xrkseek/server-face/dist/index.mjs.map +0 -1
- package/node_modules/@xrkseek/server-face/dist/model-reasoning.d.ts +0 -51
- package/node_modules/@xrkseek/server-face/dist/model-reasoning.d.ts.map +0 -1
- package/node_modules/@xrkseek/server-face/dist/model-reasoning.js +0 -104
- package/node_modules/@xrkseek/server-face/dist/model-reasoning.js.map +0 -1
- package/node_modules/@xrkseek/server-host/dist/sidebar-pty-agent.d.ts +0 -2
- package/node_modules/@xrkseek/server-host/dist/sidebar-pty-agent.d.ts.map +0 -1
- package/node_modules/@xrkseek/server-host/dist/sidebar-pty-agent.js +0 -98
- package/node_modules/@xrkseek/server-host/dist/sidebar-pty-agent.js.map +0 -1
- package/node_modules/@xrkseek/server-host/dist/sidebar-pty-worker.d.ts +0 -18
- package/node_modules/@xrkseek/server-host/dist/sidebar-pty-worker.d.ts.map +0 -1
- package/node_modules/@xrkseek/server-host/dist/sidebar-pty-worker.js +0 -141
- package/node_modules/@xrkseek/server-host/dist/sidebar-pty-worker.js.map +0 -1
- package/node_modules/@xrkseek/server-host/dist/win-fd-inherit.d.ts +0 -30
- package/node_modules/@xrkseek/server-host/dist/win-fd-inherit.d.ts.map +0 -1
- package/node_modules/@xrkseek/server-host/dist/win-fd-inherit.js +0 -96
- package/node_modules/@xrkseek/server-host/dist/win-fd-inherit.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { mkdirSync, statSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { assertSessionEvent } from "@xrkseek/protocol";
|
|
3
|
+
import { assertSessionEvent, SessionEventParseError, } from "@xrkseek/protocol";
|
|
4
4
|
import { expandPackedStorageRecords, isPackedChunkRow, isTextChunkRow, isToolCallChunkRow, packChunkRunsForExport, } from "./chunk-pack.js";
|
|
5
|
-
import {
|
|
5
|
+
import { freezeSessionEvent, newSessionId } from "./freeze.js";
|
|
6
6
|
import { repairOpenTurnEvents, sessionHasOpenTurn, } from "./repair-open-turn.js";
|
|
7
7
|
import { extractEventSearchText } from "./search-text.js";
|
|
8
8
|
import { snapshotEvents } from "./seq.js";
|
|
@@ -21,6 +21,11 @@ const ID_RE = /^[A-Za-z0-9._-]+$/;
|
|
|
21
21
|
const DEBUG_WAL_CHECKPOINT = Boolean(process.env.XRK_DEBUG_WAL);
|
|
22
22
|
/** Physical schema v3: durable rows may be packed chunk rows (expanded on load). */
|
|
23
23
|
const SCHEMA_VERSION = SQLITE_SCHEMA_CURRENT;
|
|
24
|
+
/**
|
|
25
|
+
* Consecutive searches that had to fall back because the FTS index could not
|
|
26
|
+
* be read. Only used to throttle the diagnostic line.
|
|
27
|
+
*/
|
|
28
|
+
let searchIndexFailures = 0;
|
|
24
29
|
const DB_NAME = "sessions.db";
|
|
25
30
|
/** Cold sibling of {@link DB_NAME}: archived session logs live here. */
|
|
26
31
|
const ARCHIVE_DB_NAME = "sessions-archive.db";
|
|
@@ -40,6 +45,31 @@ function deleteSessionRows(db, id) {
|
|
|
40
45
|
db.prepare("DELETE FROM events WHERE session_id = ?").run(id);
|
|
41
46
|
db.prepare("DELETE FROM sessions WHERE id = ?").run(id);
|
|
42
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Run `fn` inside one `BEGIN IMMEDIATE … COMMIT`, rolling back on throw.
|
|
50
|
+
*
|
|
51
|
+
* The three deletes above are a single logical removal: they used to autocommit
|
|
52
|
+
* one by one, so a crash (or a locked FTS index) between them left "skull" rows
|
|
53
|
+
* — `events` gone while `search_fts` still matched, so search returned a
|
|
54
|
+
* sessionId that `has()` reports as missing. Callers that already hold a
|
|
55
|
+
* transaction (`copySessionRows`) must not wrap again.
|
|
56
|
+
*/
|
|
57
|
+
function withImmediate(db, run) {
|
|
58
|
+
db.exec("BEGIN IMMEDIATE");
|
|
59
|
+
try {
|
|
60
|
+
run();
|
|
61
|
+
db.exec("COMMIT");
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
try {
|
|
65
|
+
db.exec("ROLLBACK");
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
/* already rolled back / connection gone */
|
|
69
|
+
}
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
43
73
|
/** Copy one session's sessions/events/FTS rows from `from` into `to` (replace). */
|
|
44
74
|
function copySessionRows(from, to, id) {
|
|
45
75
|
const eventRows = from
|
|
@@ -48,10 +78,23 @@ function copySessionRows(from, to, id) {
|
|
|
48
78
|
const ftsRows = from
|
|
49
79
|
.prepare("SELECT seq, text FROM search_fts WHERE session_id = ?")
|
|
50
80
|
.all(id);
|
|
81
|
+
// Hints travel with the rows. Inserting a bare `id` left every archived or
|
|
82
|
+
// restored session at event_count/last_ts 0 forever (the backfill only runs
|
|
83
|
+
// on a schema bump), which made `session.list` fall back to a full event scan
|
|
84
|
+
// and reported the session as blank. A missing row stays 0 on purpose: the
|
|
85
|
+
// hint reader treats <= 0 as "unknown" and rescans correctly.
|
|
86
|
+
const hints = from
|
|
87
|
+
.prepare("SELECT last_ts, event_count, has_turn_start, has_command_run FROM sessions WHERE id = ?")
|
|
88
|
+
.get(id);
|
|
51
89
|
to.exec("BEGIN IMMEDIATE");
|
|
52
90
|
try {
|
|
53
91
|
deleteSessionRows(to, id);
|
|
54
|
-
to.prepare("INSERT INTO sessions (id) VALUES (?)").run(id);
|
|
92
|
+
to.prepare("INSERT INTO sessions (id, last_ts, event_count, has_turn_start, has_command_run) VALUES (?, ?, ?, ?, ?)").run(id, hints?.last_ts ?? 0, hints?.event_count ?? 0, hints?.has_turn_start ?? 0, hints?.has_command_run ?? 0);
|
|
93
|
+
// One prepared statement reused per row beats chunked multi-value INSERTs
|
|
94
|
+
// here: measured on an 18,370-row / 45.8 MB session, batching made
|
|
95
|
+
// offload/restore ~25% *slower* (2,744 / 2,726 ms vs 2,197 / 2,116 ms),
|
|
96
|
+
// because every chunk needs a fresh `prepare` and SQLite's per-row path
|
|
97
|
+
// already reuses the compiled statement.
|
|
55
98
|
const insertEvent = to.prepare("INSERT INTO events (session_id, seq, ts, payload) VALUES (?, ?, ?, ?)");
|
|
56
99
|
for (const row of eventRows) {
|
|
57
100
|
insertEvent.run(id, row.seq, row.ts, row.payload);
|
|
@@ -132,6 +175,19 @@ export function ftsMatchQuery(query) {
|
|
|
132
175
|
return '""';
|
|
133
176
|
return `"${trimmed.replace(/"/g, '""')}"`;
|
|
134
177
|
}
|
|
178
|
+
export function planFtsQuery(query) {
|
|
179
|
+
const trimmed = query.trim();
|
|
180
|
+
if (!trimmed)
|
|
181
|
+
return null;
|
|
182
|
+
// Code points, not UTF-16 units: the tokenizer counts characters.
|
|
183
|
+
if ([...trimmed].length >= 3) {
|
|
184
|
+
return { kind: "match", value: ftsMatchQuery(trimmed) };
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
kind: "like",
|
|
188
|
+
value: `%${trimmed.replace(/[\\%_]/g, (c) => `\\${c}`)}%`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
135
191
|
/**
|
|
136
192
|
* Join text chunks so a token split across indexes stays searchable after flush.
|
|
137
193
|
* `prefix` is the nearest earlier text chunk before this batch (flush boundary).
|
|
@@ -180,13 +236,13 @@ function storageTs(record) {
|
|
|
180
236
|
return isPackedChunkRow(record) ? record.ts0 : record.ts;
|
|
181
237
|
}
|
|
182
238
|
function ensureFts(db) {
|
|
183
|
-
db.exec(`
|
|
184
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS search_fts USING fts5(
|
|
185
|
-
session_id UNINDEXED,
|
|
186
|
-
seq UNINDEXED,
|
|
187
|
-
text,
|
|
188
|
-
tokenize = 'trigram'
|
|
189
|
-
);
|
|
239
|
+
db.exec(`
|
|
240
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS search_fts USING fts5(
|
|
241
|
+
session_id UNINDEXED,
|
|
242
|
+
seq UNINDEXED,
|
|
243
|
+
text,
|
|
244
|
+
tokenize = 'trigram'
|
|
245
|
+
);
|
|
190
246
|
`);
|
|
191
247
|
}
|
|
192
248
|
function schemaVersion(db) {
|
|
@@ -234,24 +290,24 @@ function addSessionHintColumns(db) {
|
|
|
234
290
|
function backfillSessionHints(db) {
|
|
235
291
|
db.exec("INSERT OR IGNORE INTO sessions (id) SELECT DISTINCT session_id FROM events");
|
|
236
292
|
db.exec("DROP TABLE IF EXISTS temp._session_hint_agg");
|
|
237
|
-
db.exec(`
|
|
238
|
-
CREATE TEMP TABLE _session_hint_agg AS
|
|
239
|
-
SELECT session_id,
|
|
240
|
-
MAX(ts) AS last_ts,
|
|
241
|
-
COUNT(*) AS event_count,
|
|
242
|
-
MAX(CASE WHEN json_extract(payload, '$.type') = 'turn/start' THEN 1 ELSE 0 END) AS has_turn_start,
|
|
243
|
-
MAX(CASE WHEN json_extract(payload, '$.type') = 'command/run' THEN 1 ELSE 0 END) AS has_command_run
|
|
244
|
-
FROM events
|
|
245
|
-
GROUP BY session_id
|
|
293
|
+
db.exec(`
|
|
294
|
+
CREATE TEMP TABLE _session_hint_agg AS
|
|
295
|
+
SELECT session_id,
|
|
296
|
+
MAX(ts) AS last_ts,
|
|
297
|
+
COUNT(*) AS event_count,
|
|
298
|
+
MAX(CASE WHEN json_extract(payload, '$.type') = 'turn/start' THEN 1 ELSE 0 END) AS has_turn_start,
|
|
299
|
+
MAX(CASE WHEN json_extract(payload, '$.type') = 'command/run' THEN 1 ELSE 0 END) AS has_command_run
|
|
300
|
+
FROM events
|
|
301
|
+
GROUP BY session_id
|
|
246
302
|
`);
|
|
247
|
-
db.exec(`
|
|
248
|
-
UPDATE sessions SET
|
|
249
|
-
last_ts = a.last_ts,
|
|
250
|
-
event_count = a.event_count,
|
|
251
|
-
has_turn_start = a.has_turn_start,
|
|
252
|
-
has_command_run = a.has_command_run
|
|
253
|
-
FROM _session_hint_agg a
|
|
254
|
-
WHERE a.session_id = sessions.id
|
|
303
|
+
db.exec(`
|
|
304
|
+
UPDATE sessions SET
|
|
305
|
+
last_ts = a.last_ts,
|
|
306
|
+
event_count = a.event_count,
|
|
307
|
+
has_turn_start = a.has_turn_start,
|
|
308
|
+
has_command_run = a.has_command_run
|
|
309
|
+
FROM _session_hint_agg a
|
|
310
|
+
WHERE a.session_id = sessions.id
|
|
255
311
|
`);
|
|
256
312
|
db.exec("DROP TABLE temp._session_hint_agg");
|
|
257
313
|
}
|
|
@@ -299,32 +355,32 @@ function initSchema(db, journalMode = "WAL") {
|
|
|
299
355
|
db.exec("PRAGMA wal_autocheckpoint = 1000");
|
|
300
356
|
db.exec("PRAGMA journal_size_limit = 67108864");
|
|
301
357
|
}
|
|
302
|
-
db.exec(`
|
|
303
|
-
CREATE TABLE IF NOT EXISTS meta (
|
|
304
|
-
key TEXT PRIMARY KEY,
|
|
305
|
-
value TEXT NOT NULL
|
|
306
|
-
);
|
|
358
|
+
db.exec(`
|
|
359
|
+
CREATE TABLE IF NOT EXISTS meta (
|
|
360
|
+
key TEXT PRIMARY KEY,
|
|
361
|
+
value TEXT NOT NULL
|
|
362
|
+
);
|
|
307
363
|
`);
|
|
308
364
|
const hooks = {
|
|
309
365
|
ensureTables: () => {
|
|
310
|
-
db.exec(`
|
|
311
|
-
CREATE TABLE IF NOT EXISTS sessions (
|
|
312
|
-
id TEXT PRIMARY KEY,
|
|
313
|
-
last_ts INTEGER NOT NULL DEFAULT 0,
|
|
314
|
-
event_count INTEGER NOT NULL DEFAULT 0,
|
|
315
|
-
has_turn_start INTEGER NOT NULL DEFAULT 0,
|
|
316
|
-
has_command_run INTEGER NOT NULL DEFAULT 0
|
|
317
|
-
);
|
|
318
|
-
CREATE TABLE IF NOT EXISTS events (
|
|
319
|
-
session_id TEXT NOT NULL,
|
|
320
|
-
seq INTEGER NOT NULL,
|
|
321
|
-
ts INTEGER NOT NULL,
|
|
322
|
-
payload TEXT NOT NULL,
|
|
323
|
-
PRIMARY KEY (session_id, seq),
|
|
324
|
-
FOREIGN KEY (session_id) REFERENCES sessions(id)
|
|
325
|
-
);
|
|
326
|
-
CREATE INDEX IF NOT EXISTS idx_events_session_seq
|
|
327
|
-
ON events (session_id, seq);
|
|
366
|
+
db.exec(`
|
|
367
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
368
|
+
id TEXT PRIMARY KEY,
|
|
369
|
+
last_ts INTEGER NOT NULL DEFAULT 0,
|
|
370
|
+
event_count INTEGER NOT NULL DEFAULT 0,
|
|
371
|
+
has_turn_start INTEGER NOT NULL DEFAULT 0,
|
|
372
|
+
has_command_run INTEGER NOT NULL DEFAULT 0
|
|
373
|
+
);
|
|
374
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
375
|
+
session_id TEXT NOT NULL,
|
|
376
|
+
seq INTEGER NOT NULL,
|
|
377
|
+
ts INTEGER NOT NULL,
|
|
378
|
+
payload TEXT NOT NULL,
|
|
379
|
+
PRIMARY KEY (session_id, seq),
|
|
380
|
+
FOREIGN KEY (session_id) REFERENCES sessions(id)
|
|
381
|
+
);
|
|
382
|
+
CREATE INDEX IF NOT EXISTS idx_events_session_seq
|
|
383
|
+
ON events (session_id, seq);
|
|
328
384
|
`);
|
|
329
385
|
},
|
|
330
386
|
ensureSessionHints: () => {
|
|
@@ -340,6 +396,14 @@ function initSchema(db, journalMode = "WAL") {
|
|
|
340
396
|
},
|
|
341
397
|
};
|
|
342
398
|
const stored = schemaVersion(db);
|
|
399
|
+
if (stored > SCHEMA_VERSION) {
|
|
400
|
+
// Direction-aware refusal. A newer build already migrated this file and may
|
|
401
|
+
// have written rows this build would misread; opening it "successfully"
|
|
402
|
+
// would rewrite that data under the old shape — silent corruption instead
|
|
403
|
+
// of a message the user can act on.
|
|
404
|
+
throw new Error(`sessions.db schema v${stored} is newer than this build (v${SCHEMA_VERSION}):`
|
|
405
|
+
+ " it was written by a newer XRK Harness — upgrade instead of opening it");
|
|
406
|
+
}
|
|
343
407
|
if (stored >= SCHEMA_VERSION) {
|
|
344
408
|
// A current schema_version means the migration chain already built every
|
|
345
409
|
// table/index/FTS object. Re-running the full DDL on every Host start takes
|
|
@@ -361,21 +425,219 @@ function parseStoragePayload(payload) {
|
|
|
361
425
|
}
|
|
362
426
|
return [assertSessionEvent(raw)];
|
|
363
427
|
}
|
|
428
|
+
/** True when `prefix` is `full[0..prefix.length)` (JSON-stable event equality). */
|
|
429
|
+
function logicalEventsEqualPrefix(full, prefix) {
|
|
430
|
+
if (prefix.length > full.length)
|
|
431
|
+
return false;
|
|
432
|
+
for (let i = 0; i < prefix.length; i++) {
|
|
433
|
+
// Truncate / edit-resubmit usually passes a `slice` of the resident log —
|
|
434
|
+
// same object identity. JSON.stringify of 16k events was dominating the
|
|
435
|
+
// R7 fast path (~hundreds of ms) before the cheap DELETE.
|
|
436
|
+
if (full[i] === prefix[i])
|
|
437
|
+
continue;
|
|
438
|
+
if (JSON.stringify(full[i]) !== JSON.stringify(prefix[i]))
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
return true;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Map a logical keep-count onto the first *physical* `events.seq` to delete.
|
|
445
|
+
* Packed chunk rows that straddle the cut force a full rewrite.
|
|
446
|
+
*
|
|
447
|
+
* When `totalLogical` is known (resident length / healed hints), walk **DESC**
|
|
448
|
+
* and only expand the discarded suffix — edit-resubmit / truncate usually drop
|
|
449
|
+
* a few hundred events off a multi-10k log; ASC-scanning the whole prefix was
|
|
450
|
+
* the R7 fast-path bottleneck (~1–2 s).
|
|
451
|
+
*/
|
|
452
|
+
function physicalTailCutSeq(db, sessionId, keepLogical, totalLogical) {
|
|
453
|
+
if (keepLogical <= 0)
|
|
454
|
+
return "empty";
|
|
455
|
+
if (typeof totalLogical === "number"
|
|
456
|
+
&& totalLogical >= keepLogical
|
|
457
|
+
&& Number.isFinite(totalLogical)) {
|
|
458
|
+
const needDrop = totalLogical - keepLogical;
|
|
459
|
+
if (needDrop === 0)
|
|
460
|
+
return "noop";
|
|
461
|
+
const iter = db
|
|
462
|
+
.prepare("SELECT seq, payload FROM events WHERE session_id = ? ORDER BY seq DESC")
|
|
463
|
+
.iterate(sessionId);
|
|
464
|
+
let dropped = 0;
|
|
465
|
+
let sawRow = false;
|
|
466
|
+
for (const row of iter) {
|
|
467
|
+
sawRow = true;
|
|
468
|
+
let n;
|
|
469
|
+
try {
|
|
470
|
+
n = parseStoragePayload(row.payload).length;
|
|
471
|
+
}
|
|
472
|
+
catch {
|
|
473
|
+
return "rewrite";
|
|
474
|
+
}
|
|
475
|
+
if (dropped + n < needDrop) {
|
|
476
|
+
dropped += n;
|
|
477
|
+
continue;
|
|
478
|
+
}
|
|
479
|
+
if (dropped + n === needDrop) {
|
|
480
|
+
return row.seq;
|
|
481
|
+
}
|
|
482
|
+
// Packed row straddles the logical cut.
|
|
483
|
+
return "rewrite";
|
|
484
|
+
}
|
|
485
|
+
if (!sawRow)
|
|
486
|
+
return "noop";
|
|
487
|
+
return "rewrite";
|
|
488
|
+
}
|
|
489
|
+
const rows = db
|
|
490
|
+
.prepare("SELECT seq, payload FROM events WHERE session_id = ? ORDER BY seq ASC")
|
|
491
|
+
.all(sessionId);
|
|
492
|
+
if (rows.length === 0)
|
|
493
|
+
return "noop";
|
|
494
|
+
let logical = 0;
|
|
495
|
+
for (const row of rows) {
|
|
496
|
+
if (logical >= keepLogical)
|
|
497
|
+
return row.seq;
|
|
498
|
+
let n;
|
|
499
|
+
try {
|
|
500
|
+
n = parseStoragePayload(row.payload).length;
|
|
501
|
+
}
|
|
502
|
+
catch {
|
|
503
|
+
return "rewrite";
|
|
504
|
+
}
|
|
505
|
+
if (logical + n <= keepLogical) {
|
|
506
|
+
logical += n;
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
return "rewrite";
|
|
510
|
+
}
|
|
511
|
+
return logical === keepLogical ? "noop" : "rewrite";
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* A stored row this build cannot read: corrupt JSON, an unknown event type, or
|
|
515
|
+
* a row written by a newer format.
|
|
516
|
+
*
|
|
517
|
+
* Loading stops here instead of returning the rows that happened to work,
|
|
518
|
+
* because `ensureLoaded` feeds whatever it gets straight into crash repair: a
|
|
519
|
+
* silently truncated view makes the store append a synthetic `turn/end` into
|
|
520
|
+
* the real log, which pushes every surviving event behind a turn boundary that
|
|
521
|
+
* never existed. Refusing to load is the only failure that leaves the log
|
|
522
|
+
* intact, so the caller can tell the user to upgrade instead.
|
|
523
|
+
*/
|
|
524
|
+
export class SessionLogUnreadableError extends Error {
|
|
525
|
+
sessionId;
|
|
526
|
+
seq;
|
|
527
|
+
reason;
|
|
528
|
+
constructor(sessionId,
|
|
529
|
+
/** Position of the first unreadable row. */
|
|
530
|
+
seq, reason) {
|
|
531
|
+
super(`session log unreadable: ${sessionId} seq ${seq} (${reason}) — refusing to load a partial log`);
|
|
532
|
+
this.sessionId = sessionId;
|
|
533
|
+
this.seq = seq;
|
|
534
|
+
this.reason = reason;
|
|
535
|
+
this.name = "SessionLogUnreadableError";
|
|
536
|
+
}
|
|
537
|
+
}
|
|
364
538
|
function loadSessionEvents(db, id) {
|
|
365
539
|
const rows = db
|
|
366
|
-
.prepare("SELECT payload FROM events WHERE session_id = ? ORDER BY seq ASC")
|
|
540
|
+
.prepare("SELECT seq, payload FROM events WHERE session_id = ? ORDER BY seq ASC")
|
|
367
541
|
.all(id);
|
|
368
542
|
const events = [];
|
|
369
543
|
for (const row of rows) {
|
|
370
544
|
try {
|
|
371
545
|
events.push(...parseStoragePayload(row.payload));
|
|
372
546
|
}
|
|
373
|
-
catch {
|
|
374
|
-
|
|
547
|
+
catch (error) {
|
|
548
|
+
// Newer Harness may write pure-info rows with `ignorable: true`. Skipping
|
|
549
|
+
// keeps the readable prefix intact; required unknowns still refuse load.
|
|
550
|
+
if (error instanceof SessionEventParseError
|
|
551
|
+
&& error.code === "unknown-ignorable") {
|
|
552
|
+
continue;
|
|
553
|
+
}
|
|
554
|
+
throw new SessionLogUnreadableError(id, row.seq, error instanceof Error ? error.message : String(error));
|
|
375
555
|
}
|
|
376
556
|
}
|
|
377
557
|
return events;
|
|
378
558
|
}
|
|
559
|
+
/**
|
|
560
|
+
* Expand a physical suffix until at least `maxLogical` events (or the whole log).
|
|
561
|
+
* Rows are read newest-first then reversed so the result is a chronological suffix.
|
|
562
|
+
*/
|
|
563
|
+
/**
|
|
564
|
+
* True when `hintedCount` is safe as a logical length for absolute seq.
|
|
565
|
+
* Packed logs with a stale physical backfill look like count === row count.
|
|
566
|
+
*/
|
|
567
|
+
function eventCountLooksLogical(db, id, hintedCount) {
|
|
568
|
+
const physical = db
|
|
569
|
+
.prepare("SELECT COUNT(*) AS n FROM events WHERE session_id = ?")
|
|
570
|
+
.get(id)?.n ?? 0;
|
|
571
|
+
if (hintedCount > physical)
|
|
572
|
+
return true;
|
|
573
|
+
if (hintedCount < physical)
|
|
574
|
+
return false;
|
|
575
|
+
// Equal: only safe when no packed chunk rows (1 event per physical row).
|
|
576
|
+
const packed = db
|
|
577
|
+
.prepare(`SELECT 1 AS hit FROM events WHERE session_id = ? AND (
|
|
578
|
+
json_extract(payload, '$.type') = 'text-chunks'
|
|
579
|
+
OR json_extract(payload, '$.type') = 'tool-call-chunks'
|
|
580
|
+
) LIMIT 1`)
|
|
581
|
+
.get(id);
|
|
582
|
+
return packed === undefined;
|
|
583
|
+
}
|
|
584
|
+
function loadSessionEventsTail(db, id, maxLogical) {
|
|
585
|
+
if (maxLogical <= 0)
|
|
586
|
+
return [];
|
|
587
|
+
const rows = db
|
|
588
|
+
.prepare("SELECT seq, payload FROM events WHERE session_id = ? ORDER BY seq DESC")
|
|
589
|
+
.all(id);
|
|
590
|
+
const newestFirst = [];
|
|
591
|
+
let logical = 0;
|
|
592
|
+
for (const row of rows) {
|
|
593
|
+
try {
|
|
594
|
+
const expanded = parseStoragePayload(row.payload);
|
|
595
|
+
newestFirst.push(expanded);
|
|
596
|
+
logical += expanded.length;
|
|
597
|
+
if (logical >= maxLogical)
|
|
598
|
+
break;
|
|
599
|
+
}
|
|
600
|
+
catch (error) {
|
|
601
|
+
if (error instanceof SessionEventParseError
|
|
602
|
+
&& error.code === "unknown-ignorable") {
|
|
603
|
+
continue;
|
|
604
|
+
}
|
|
605
|
+
throw new SessionLogUnreadableError(id, row.seq, error instanceof Error ? error.message : String(error));
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
const out = [];
|
|
609
|
+
for (let i = newestFirst.length - 1; i >= 0; i--) {
|
|
610
|
+
out.push(...newestFirst[i]);
|
|
611
|
+
}
|
|
612
|
+
return out;
|
|
613
|
+
}
|
|
614
|
+
/** Visit non-packed durable events in seq order (no chunk expansion). */
|
|
615
|
+
function scanDurableSinglesFromDb(db, id, visit) {
|
|
616
|
+
const rows = db
|
|
617
|
+
.prepare("SELECT seq, payload FROM events WHERE session_id = ? ORDER BY seq ASC")
|
|
618
|
+
.all(id);
|
|
619
|
+
for (const row of rows) {
|
|
620
|
+
let raw;
|
|
621
|
+
try {
|
|
622
|
+
raw = JSON.parse(row.payload);
|
|
623
|
+
}
|
|
624
|
+
catch (error) {
|
|
625
|
+
throw new SessionLogUnreadableError(id, row.seq, error instanceof Error ? error.message : String(error));
|
|
626
|
+
}
|
|
627
|
+
if (isPackedChunkRow(raw))
|
|
628
|
+
continue;
|
|
629
|
+
try {
|
|
630
|
+
visit(assertSessionEvent(raw));
|
|
631
|
+
}
|
|
632
|
+
catch (error) {
|
|
633
|
+
if (error instanceof SessionEventParseError
|
|
634
|
+
&& error.code === "unknown-ignorable") {
|
|
635
|
+
continue;
|
|
636
|
+
}
|
|
637
|
+
throw new SessionLogUnreadableError(id, row.seq, error instanceof Error ? error.message : String(error));
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
379
641
|
function nextSeqFromDb(db, sessionId) {
|
|
380
642
|
const row = db
|
|
381
643
|
.prepare("SELECT COALESCE(MAX(seq), -1) AS maxSeq FROM events WHERE session_id = ?")
|
|
@@ -384,16 +646,16 @@ function nextSeqFromDb(db, sessionId) {
|
|
|
384
646
|
}
|
|
385
647
|
function hasTurnStartInDb(db, sessionId) {
|
|
386
648
|
const row = db
|
|
387
|
-
.prepare(`SELECT 1 AS hit FROM events
|
|
388
|
-
WHERE session_id = ? AND json_extract(payload, '$.type') = 'turn/start'
|
|
649
|
+
.prepare(`SELECT 1 AS hit FROM events
|
|
650
|
+
WHERE session_id = ? AND json_extract(payload, '$.type') = 'turn/start'
|
|
389
651
|
LIMIT 1`)
|
|
390
652
|
.get(sessionId);
|
|
391
653
|
return row !== undefined;
|
|
392
654
|
}
|
|
393
655
|
function hasCommandRunInDb(db, sessionId) {
|
|
394
656
|
const row = db
|
|
395
|
-
.prepare(`SELECT 1 AS hit FROM events
|
|
396
|
-
WHERE session_id = ? AND json_extract(payload, '$.type') = 'command/run'
|
|
657
|
+
.prepare(`SELECT 1 AS hit FROM events
|
|
658
|
+
WHERE session_id = ? AND json_extract(payload, '$.type') = 'command/run'
|
|
397
659
|
LIMIT 1`)
|
|
398
660
|
.get(sessionId);
|
|
399
661
|
return row !== undefined;
|
|
@@ -423,6 +685,7 @@ function sessionHintsFromDb(db, sessionId) {
|
|
|
423
685
|
return undefined;
|
|
424
686
|
return {
|
|
425
687
|
lastEventTs: row.last_ts > 0 ? row.last_ts : null,
|
|
688
|
+
eventCount: row.event_count,
|
|
426
689
|
hasTurnStart: row.has_turn_start === 1,
|
|
427
690
|
hasCommandRun: row.has_command_run === 1,
|
|
428
691
|
};
|
|
@@ -482,7 +745,7 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
482
745
|
for (const id of [...coldIds]) {
|
|
483
746
|
if (hotIds.has(id)) {
|
|
484
747
|
try {
|
|
485
|
-
deleteSessionRows(archiveDb, id);
|
|
748
|
+
withImmediate(archiveDb, () => deleteSessionRows(archiveDb, id));
|
|
486
749
|
}
|
|
487
750
|
catch {
|
|
488
751
|
/* best-effort */
|
|
@@ -549,14 +812,18 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
549
812
|
// newest ts and the sticky flags monotonic under out-of-order batches.
|
|
550
813
|
const upsertSessionHints = shared
|
|
551
814
|
? undefined
|
|
552
|
-
: db.prepare(`INSERT INTO sessions (id, last_ts, event_count, has_turn_start, has_command_run)
|
|
553
|
-
VALUES (?, ?, ?, ?, ?)
|
|
554
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
555
|
-
last_ts = MAX(sessions.last_ts, excluded.last_ts),
|
|
556
|
-
event_count = sessions.event_count + excluded.event_count,
|
|
557
|
-
has_turn_start = MAX(sessions.has_turn_start, excluded.has_turn_start),
|
|
815
|
+
: db.prepare(`INSERT INTO sessions (id, last_ts, event_count, has_turn_start, has_command_run)
|
|
816
|
+
VALUES (?, ?, ?, ?, ?)
|
|
817
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
818
|
+
last_ts = MAX(sessions.last_ts, excluded.last_ts),
|
|
819
|
+
event_count = sessions.event_count + excluded.event_count,
|
|
820
|
+
has_turn_start = MAX(sessions.has_turn_start, excluded.has_turn_start),
|
|
558
821
|
has_command_run = MAX(sessions.has_command_run, excluded.has_command_run)`);
|
|
559
|
-
|
|
822
|
+
/**
|
|
823
|
+
* Append-only flush: **add** this batch's length to `event_count`.
|
|
824
|
+
* Do not use for seed / replacePrefix / repair (those need an absolute set).
|
|
825
|
+
*/
|
|
826
|
+
const bumpSessionHints = (sessionId, events) => {
|
|
560
827
|
if (upsertSessionHints === undefined)
|
|
561
828
|
return;
|
|
562
829
|
let lastTs = 0;
|
|
@@ -572,6 +839,26 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
572
839
|
}
|
|
573
840
|
upsertSessionHints.run(sessionId, lastTs, events.length, turnStart, commandRun);
|
|
574
841
|
};
|
|
842
|
+
/**
|
|
843
|
+
* Absolute list hints from a full logical log (seed / truncate / hydrate repair).
|
|
844
|
+
* `bumpSessionHints` alone would ADD `events.length` onto a stale counter.
|
|
845
|
+
*/
|
|
846
|
+
const setSessionHints = (sessionId, events) => {
|
|
847
|
+
if (shared)
|
|
848
|
+
return;
|
|
849
|
+
let lastTs = 0;
|
|
850
|
+
let turnStart = 0;
|
|
851
|
+
let commandRun = 0;
|
|
852
|
+
for (const event of events) {
|
|
853
|
+
if (event.ts > lastTs)
|
|
854
|
+
lastTs = event.ts;
|
|
855
|
+
if (event.type === "turn/start")
|
|
856
|
+
turnStart = 1;
|
|
857
|
+
else if (event.type === "command/run")
|
|
858
|
+
commandRun = 1;
|
|
859
|
+
}
|
|
860
|
+
db.prepare("UPDATE sessions SET last_ts = ?, event_count = ?, has_turn_start = ?, has_command_run = ? WHERE id = ?").run(lastTs, events.length, turnStart, commandRun, sessionId);
|
|
861
|
+
};
|
|
575
862
|
const allocateSeq = (sessionId) => {
|
|
576
863
|
let next = nextSeqBySession.get(sessionId);
|
|
577
864
|
if (next === undefined) {
|
|
@@ -583,6 +870,15 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
583
870
|
const writeRecord = (sessionId, record) => {
|
|
584
871
|
const seq = allocateSeq(sessionId);
|
|
585
872
|
insertEvent.run(sessionId, seq, storageTs(record), JSON.stringify(record));
|
|
873
|
+
// `text-chunks` rows are indexed by `indexJoinedTextChunks`, whose row
|
|
874
|
+
// carries the flush-boundary prefix and therefore the whole text of this
|
|
875
|
+
// row as a strict subset. Writing both stored the same conversation twice
|
|
876
|
+
// in `search_fts` (measured: 165 fully-overlapping (session_id, seq)
|
|
877
|
+
// pairs in one live session), doubling the index and every archive /
|
|
878
|
+
// restore / delete copy of it. `MATCH` recall is unchanged: the kept row
|
|
879
|
+
// is the superset, and search only returns DISTINCT session_id.
|
|
880
|
+
if (isTextChunkRow(record))
|
|
881
|
+
return;
|
|
586
882
|
const text = extractStorageSearchText(record);
|
|
587
883
|
if (text)
|
|
588
884
|
insertFts.run(sessionId, seq, text);
|
|
@@ -716,11 +1012,13 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
716
1012
|
// Human input is the one thing a power cut must not swallow: upgrade to
|
|
717
1013
|
// FULL for the transaction carrying it, then fall back to NORMAL. PRAGMA
|
|
718
1014
|
// synchronous cannot change inside a transaction, so it brackets BEGIN.
|
|
1015
|
+
// BEGIN (and the FULL pragma) must sit inside try: a busy/IO throw before
|
|
1016
|
+
// COMMIT would otherwise drop `batch` from `pending` with no restore.
|
|
719
1017
|
const needsFullSync = batch.some((row) => row.event.type === "user/message");
|
|
720
|
-
if (needsFullSync)
|
|
721
|
-
db.exec("PRAGMA synchronous = FULL");
|
|
722
|
-
db.exec("BEGIN IMMEDIATE");
|
|
723
1018
|
try {
|
|
1019
|
+
if (needsFullSync)
|
|
1020
|
+
db.exec("PRAGMA synchronous = FULL");
|
|
1021
|
+
db.exec("BEGIN IMMEDIATE");
|
|
724
1022
|
for (const sessionId of order) {
|
|
725
1023
|
const events = bySession.get(sessionId);
|
|
726
1024
|
const packed = packChunkRunsForExport(events);
|
|
@@ -728,7 +1026,7 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
728
1026
|
writeRecord(sessionId, record);
|
|
729
1027
|
}
|
|
730
1028
|
indexJoinedTextChunks(sessionId, events);
|
|
731
|
-
|
|
1029
|
+
bumpSessionHints(sessionId, events);
|
|
732
1030
|
}
|
|
733
1031
|
db.exec("COMMIT");
|
|
734
1032
|
}
|
|
@@ -737,7 +1035,7 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
737
1035
|
db.exec("ROLLBACK");
|
|
738
1036
|
}
|
|
739
1037
|
catch {
|
|
740
|
-
/* already rolled back / closed */
|
|
1038
|
+
/* already rolled back / closed / never began */
|
|
741
1039
|
}
|
|
742
1040
|
restoreSeqMap(seqSnapshot);
|
|
743
1041
|
// Prepend this flush's batch so later flush/close can retry; keep any
|
|
@@ -783,8 +1081,11 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
783
1081
|
const flushMicrotaskIds = new Set();
|
|
784
1082
|
let flushMicrotaskQueued = false;
|
|
785
1083
|
let storeClosed = false;
|
|
1084
|
+
let backgroundFlushFailures = 0;
|
|
1085
|
+
let backgroundFlushPaused = false;
|
|
1086
|
+
let lastBackgroundFlushError;
|
|
786
1087
|
const scheduleFlushPending = (sessionId) => {
|
|
787
|
-
if (shared || storeClosed)
|
|
1088
|
+
if (shared || storeClosed || backgroundFlushPaused)
|
|
788
1089
|
return;
|
|
789
1090
|
flushMicrotaskIds.add(sessionId);
|
|
790
1091
|
if (flushMicrotaskQueued)
|
|
@@ -792,7 +1093,7 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
792
1093
|
flushMicrotaskQueued = true;
|
|
793
1094
|
queueMicrotask(() => {
|
|
794
1095
|
flushMicrotaskQueued = false;
|
|
795
|
-
if (storeClosed) {
|
|
1096
|
+
if (storeClosed || backgroundFlushPaused) {
|
|
796
1097
|
flushMicrotaskIds.clear();
|
|
797
1098
|
return;
|
|
798
1099
|
}
|
|
@@ -802,8 +1103,20 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
802
1103
|
try {
|
|
803
1104
|
flushPending(id);
|
|
804
1105
|
}
|
|
805
|
-
catch {
|
|
1106
|
+
catch (error) {
|
|
806
1107
|
/* pending restored inside flushPending; close()/flush() retries */
|
|
1108
|
+
// A retry that never succeeds is data loss with no trail: the events
|
|
1109
|
+
// look saved in memory and vanish on exit. Pause auto-drain (DSH) so
|
|
1110
|
+
// the next explicit flush()/close() is the only path forward.
|
|
1111
|
+
backgroundFlushFailures += 1;
|
|
1112
|
+
backgroundFlushPaused = true;
|
|
1113
|
+
lastBackgroundFlushError =
|
|
1114
|
+
error instanceof Error ? error.message : String(error);
|
|
1115
|
+
if (backgroundFlushFailures <= 3 || backgroundFlushFailures % 100 === 0) {
|
|
1116
|
+
console.error(`[session-store] background flush failed #${backgroundFlushFailures}`
|
|
1117
|
+
+ ` for ${id}; auto-drain paused, events stay queued: `
|
|
1118
|
+
+ lastBackgroundFlushError);
|
|
1119
|
+
}
|
|
807
1120
|
}
|
|
808
1121
|
}
|
|
809
1122
|
});
|
|
@@ -838,7 +1151,7 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
838
1151
|
const events = loadSessionEvents(sourceDbFor(id), id);
|
|
839
1152
|
const repairs = repairOpenTurnEvents(events);
|
|
840
1153
|
if (repairs.length > 0) {
|
|
841
|
-
const frozenRepairs = repairs.map((ev) =>
|
|
1154
|
+
const frozenRepairs = repairs.map((ev) => freezeSessionEvent(ev));
|
|
842
1155
|
// Cold / shared: memory-only repair (archive is read for turns; shared is RO).
|
|
843
1156
|
if (!shared && !offloaded) {
|
|
844
1157
|
const seqSnapshot = new Map(nextSeqBySession);
|
|
@@ -847,7 +1160,9 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
847
1160
|
for (const frozen of frozenRepairs) {
|
|
848
1161
|
persistImmediate(id, frozen);
|
|
849
1162
|
}
|
|
850
|
-
|
|
1163
|
+
// Repairs are appends — bump; absolute set happens below against the
|
|
1164
|
+
// full logical log (also heals stale event_count from older builds).
|
|
1165
|
+
bumpSessionHints(id, frozenRepairs);
|
|
851
1166
|
db.exec("COMMIT");
|
|
852
1167
|
}
|
|
853
1168
|
catch (err) {
|
|
@@ -867,6 +1182,19 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
867
1182
|
}
|
|
868
1183
|
sessions.set(id, events);
|
|
869
1184
|
touchResident(id);
|
|
1185
|
+
// Heal durable event_count when it drifted (R7 ADD-bug / partial bump).
|
|
1186
|
+
// R8 cold tail keys absolute seq off this column.
|
|
1187
|
+
if (!shared && !offloaded) {
|
|
1188
|
+
const hinted = sessionHintsFromDb(sourceDbFor(id), id)?.eventCount;
|
|
1189
|
+
if (hinted !== events.length) {
|
|
1190
|
+
try {
|
|
1191
|
+
setSessionHints(id, events);
|
|
1192
|
+
}
|
|
1193
|
+
catch {
|
|
1194
|
+
/* RO / closed */
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
870
1198
|
return events;
|
|
871
1199
|
};
|
|
872
1200
|
const assertHotMutable = (id) => {
|
|
@@ -907,11 +1235,11 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
907
1235
|
return;
|
|
908
1236
|
flushPending(sid);
|
|
909
1237
|
if (hotIds.has(sid)) {
|
|
910
|
-
deleteSessionRows(db, sid);
|
|
1238
|
+
withImmediate(db, () => deleteSessionRows(db, sid));
|
|
911
1239
|
hotIds.delete(sid);
|
|
912
1240
|
}
|
|
913
1241
|
if (coldIds.has(sid)) {
|
|
914
|
-
deleteSessionRows(archiveDb, sid);
|
|
1242
|
+
withImmediate(archiveDb, () => deleteSessionRows(archiveDb, sid));
|
|
915
1243
|
coldIds.delete(sid);
|
|
916
1244
|
}
|
|
917
1245
|
sessionIds.delete(sid);
|
|
@@ -942,7 +1270,7 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
942
1270
|
return;
|
|
943
1271
|
flushPending(sid);
|
|
944
1272
|
copySessionRows(db, archiveDb, sid);
|
|
945
|
-
deleteSessionRows(db, sid);
|
|
1273
|
+
withImmediate(db, () => deleteSessionRows(db, sid));
|
|
946
1274
|
hotIds.delete(sid);
|
|
947
1275
|
coldIds.add(sid);
|
|
948
1276
|
dropResident(sid);
|
|
@@ -961,7 +1289,7 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
961
1289
|
return;
|
|
962
1290
|
flushPending(sid);
|
|
963
1291
|
copySessionRows(archiveDb, db, sid);
|
|
964
|
-
deleteSessionRows(archiveDb, sid);
|
|
1292
|
+
withImmediate(archiveDb, () => deleteSessionRows(archiveDb, sid));
|
|
965
1293
|
coldIds.delete(sid);
|
|
966
1294
|
hotIds.add(sid);
|
|
967
1295
|
dropResident(sid);
|
|
@@ -980,8 +1308,7 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
980
1308
|
}
|
|
981
1309
|
assertHotMutable(id);
|
|
982
1310
|
const events = ensureLoaded(id);
|
|
983
|
-
const
|
|
984
|
-
const frozen = deepFreeze(structuredClone(parsed));
|
|
1311
|
+
const frozen = freezeSessionEvent(event);
|
|
985
1312
|
events.push(frozen);
|
|
986
1313
|
try {
|
|
987
1314
|
persistEvent(id, frozen);
|
|
@@ -1009,7 +1336,7 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
1009
1336
|
}
|
|
1010
1337
|
const frozen = [];
|
|
1011
1338
|
for (const event of eventsInput) {
|
|
1012
|
-
frozen.push(
|
|
1339
|
+
frozen.push(freezeSessionEvent(event));
|
|
1013
1340
|
}
|
|
1014
1341
|
// Create + one packed transaction (not N persistEvent flushes). Chunk
|
|
1015
1342
|
// runs pack the same way as flushPending so fork seed matches live shape.
|
|
@@ -1031,6 +1358,12 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
1031
1358
|
writeRecord(sid, record);
|
|
1032
1359
|
}
|
|
1033
1360
|
indexJoinedTextChunks(sid, frozen);
|
|
1361
|
+
// Same hints `replacePrefix` maintains. Without this a freshly forked
|
|
1362
|
+
// child sits at event_count 0 / has_turn_start 0 until its first
|
|
1363
|
+
// non-turn-start append, at which point the hint reader stops falling
|
|
1364
|
+
// back to an event scan and `blank` flips true — the sidebar then
|
|
1365
|
+
// offers the new-session button a 6-figure-event branch to reuse.
|
|
1366
|
+
setSessionHints(sid, frozen);
|
|
1034
1367
|
db.exec("COMMIT");
|
|
1035
1368
|
}
|
|
1036
1369
|
catch (err) {
|
|
@@ -1054,6 +1387,89 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
1054
1387
|
}
|
|
1055
1388
|
return { id: sid, events: frozen };
|
|
1056
1389
|
},
|
|
1390
|
+
/**
|
|
1391
|
+
* Fork R6: `INSERT…SELECT` the parent's durable prefix, then write only
|
|
1392
|
+
* `suffix` (closers + end-seed). Returns undefined → {@link forkSession}
|
|
1393
|
+
* falls back to full `seed` (packed row straddles the cut, or cold source).
|
|
1394
|
+
*/
|
|
1395
|
+
seedFromSession(sourceId, keepLogical, childId, suffix) {
|
|
1396
|
+
assertWritable();
|
|
1397
|
+
const src = assertSafeId(sourceId);
|
|
1398
|
+
if (!sessionIds.has(src) || coldIds.has(src))
|
|
1399
|
+
return undefined;
|
|
1400
|
+
flushPending(src);
|
|
1401
|
+
assertHotMutable(src);
|
|
1402
|
+
const sourceEvents = ensureLoaded(src);
|
|
1403
|
+
if (keepLogical > sourceEvents.length)
|
|
1404
|
+
return undefined;
|
|
1405
|
+
const cut = physicalTailCutSeq(db, src, keepLogical, sourceEvents.length);
|
|
1406
|
+
if (cut === "rewrite")
|
|
1407
|
+
return undefined;
|
|
1408
|
+
const sid = assertSafeId(childId ?? newSessionId());
|
|
1409
|
+
if (sessionIds.has(sid)) {
|
|
1410
|
+
throw new Error(`session already exists: ${sid}`);
|
|
1411
|
+
}
|
|
1412
|
+
const prefix = sourceEvents.slice(0, keepLogical);
|
|
1413
|
+
const frozenSuffix = [];
|
|
1414
|
+
for (const event of suffix) {
|
|
1415
|
+
frozenSuffix.push(freezeSessionEvent(event));
|
|
1416
|
+
}
|
|
1417
|
+
const frozen = prefix.concat(frozenSuffix);
|
|
1418
|
+
const sourceNext = nextSeqBySession.get(src) ?? nextSeqFromDb(db, src);
|
|
1419
|
+
const nextAfterCopy = cut === "empty" ? 0 : cut === "noop" ? sourceNext : cut;
|
|
1420
|
+
sessionIds.add(sid);
|
|
1421
|
+
hotIds.add(sid);
|
|
1422
|
+
evictResidents(sid);
|
|
1423
|
+
sessions.set(sid, frozen);
|
|
1424
|
+
touchResident(sid);
|
|
1425
|
+
nextSeqBySession.set(sid, nextAfterCopy);
|
|
1426
|
+
insertSession.run(sid);
|
|
1427
|
+
const seqSnapshot = new Map(nextSeqBySession);
|
|
1428
|
+
db.exec("BEGIN IMMEDIATE");
|
|
1429
|
+
try {
|
|
1430
|
+
if (cut === "noop") {
|
|
1431
|
+
db.prepare("INSERT INTO events (session_id, seq, ts, payload) "
|
|
1432
|
+
+ "SELECT ?, seq, ts, payload FROM events WHERE session_id = ?").run(sid, src);
|
|
1433
|
+
db.prepare("INSERT INTO search_fts (session_id, seq, text) "
|
|
1434
|
+
+ "SELECT ?, seq, text FROM search_fts WHERE session_id = ?").run(sid, src);
|
|
1435
|
+
}
|
|
1436
|
+
else if (typeof cut === "number") {
|
|
1437
|
+
db.prepare("INSERT INTO events (session_id, seq, ts, payload) "
|
|
1438
|
+
+ "SELECT ?, seq, ts, payload FROM events WHERE session_id = ? AND seq < ?").run(sid, src, cut);
|
|
1439
|
+
db.prepare("INSERT INTO search_fts (session_id, seq, text) "
|
|
1440
|
+
+ "SELECT ?, seq, text FROM search_fts WHERE session_id = ? AND seq < ?").run(sid, src, cut);
|
|
1441
|
+
}
|
|
1442
|
+
if (frozenSuffix.length > 0) {
|
|
1443
|
+
const packed = packChunkRunsForExport(frozenSuffix);
|
|
1444
|
+
for (const record of packed) {
|
|
1445
|
+
writeRecord(sid, record);
|
|
1446
|
+
}
|
|
1447
|
+
indexJoinedTextChunks(sid, frozenSuffix);
|
|
1448
|
+
}
|
|
1449
|
+
setSessionHints(sid, frozen);
|
|
1450
|
+
db.exec("COMMIT");
|
|
1451
|
+
}
|
|
1452
|
+
catch (err) {
|
|
1453
|
+
try {
|
|
1454
|
+
db.exec("ROLLBACK");
|
|
1455
|
+
}
|
|
1456
|
+
catch {
|
|
1457
|
+
/* already rolled back / closed */
|
|
1458
|
+
}
|
|
1459
|
+
restoreSeqMap(seqSnapshot);
|
|
1460
|
+
sessionIds.delete(sid);
|
|
1461
|
+
hotIds.delete(sid);
|
|
1462
|
+
dropResident(sid);
|
|
1463
|
+
try {
|
|
1464
|
+
db.prepare("DELETE FROM sessions WHERE id = ?").run(sid);
|
|
1465
|
+
}
|
|
1466
|
+
catch {
|
|
1467
|
+
/* best-effort */
|
|
1468
|
+
}
|
|
1469
|
+
throw err;
|
|
1470
|
+
}
|
|
1471
|
+
return { id: sid, events: frozen };
|
|
1472
|
+
},
|
|
1057
1473
|
replacePrefix(id, eventsInput = []) {
|
|
1058
1474
|
assertWritable();
|
|
1059
1475
|
const sid = assertSafeId(id);
|
|
@@ -1064,7 +1480,56 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
1064
1480
|
flushPending(sid);
|
|
1065
1481
|
const frozen = [];
|
|
1066
1482
|
for (const event of eventsInput) {
|
|
1067
|
-
frozen.push(
|
|
1483
|
+
frozen.push(freezeSessionEvent(event));
|
|
1484
|
+
}
|
|
1485
|
+
// Fast path (edit-resubmit / truncate): prefix unchanged → DELETE tail
|
|
1486
|
+
// rows only. Full wipe+rewrite was ~1.6s on a 16k-event session.
|
|
1487
|
+
const current = ensureLoaded(sid);
|
|
1488
|
+
if (frozen.length <= current.length
|
|
1489
|
+
&& logicalEventsEqualPrefix(current, frozen)) {
|
|
1490
|
+
const cut = physicalTailCutSeq(db, sid, frozen.length, current.length);
|
|
1491
|
+
if (cut === "noop") {
|
|
1492
|
+
sessions.set(sid, frozen);
|
|
1493
|
+
touchResident(sid);
|
|
1494
|
+
return { id: sid, events: frozen };
|
|
1495
|
+
}
|
|
1496
|
+
if (cut === "empty" || typeof cut === "number") {
|
|
1497
|
+
const seqSnapshot = new Map(nextSeqBySession);
|
|
1498
|
+
db.exec("BEGIN IMMEDIATE");
|
|
1499
|
+
try {
|
|
1500
|
+
if (cut === "empty") {
|
|
1501
|
+
db.prepare("DELETE FROM search_fts WHERE session_id = ?").run(sid);
|
|
1502
|
+
db.prepare("DELETE FROM events WHERE session_id = ?").run(sid);
|
|
1503
|
+
nextSeqBySession.set(sid, 0);
|
|
1504
|
+
}
|
|
1505
|
+
else {
|
|
1506
|
+
db.prepare("DELETE FROM search_fts WHERE session_id = ? AND seq >= ?").run(sid, cut);
|
|
1507
|
+
db.prepare("DELETE FROM events WHERE session_id = ? AND seq >= ?").run(sid, cut);
|
|
1508
|
+
nextSeqBySession.set(sid, cut);
|
|
1509
|
+
}
|
|
1510
|
+
if (frozen.length === 0) {
|
|
1511
|
+
db.prepare("UPDATE sessions SET last_ts = 0, event_count = 0, has_turn_start = 0, has_command_run = 0 WHERE id = ?").run(sid);
|
|
1512
|
+
}
|
|
1513
|
+
else {
|
|
1514
|
+
setSessionHints(sid, frozen);
|
|
1515
|
+
}
|
|
1516
|
+
db.exec("COMMIT");
|
|
1517
|
+
}
|
|
1518
|
+
catch (err) {
|
|
1519
|
+
try {
|
|
1520
|
+
db.exec("ROLLBACK");
|
|
1521
|
+
}
|
|
1522
|
+
catch {
|
|
1523
|
+
/* already rolled back / closed */
|
|
1524
|
+
}
|
|
1525
|
+
restoreSeqMap(seqSnapshot);
|
|
1526
|
+
throw err;
|
|
1527
|
+
}
|
|
1528
|
+
sessions.set(sid, frozen);
|
|
1529
|
+
touchResident(sid);
|
|
1530
|
+
return { id: sid, events: frozen };
|
|
1531
|
+
}
|
|
1532
|
+
// cut === "rewrite" (packed row straddles the logical boundary)
|
|
1068
1533
|
}
|
|
1069
1534
|
const seqSnapshot = new Map(nextSeqBySession);
|
|
1070
1535
|
db.exec("BEGIN IMMEDIATE");
|
|
@@ -1079,7 +1544,7 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
1079
1544
|
writeRecord(sid, record);
|
|
1080
1545
|
}
|
|
1081
1546
|
indexJoinedTextChunks(sid, frozen);
|
|
1082
|
-
|
|
1547
|
+
setSessionHints(sid, frozen);
|
|
1083
1548
|
}
|
|
1084
1549
|
db.exec("COMMIT");
|
|
1085
1550
|
}
|
|
@@ -1113,8 +1578,12 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
1113
1578
|
if (hints !== undefined)
|
|
1114
1579
|
return hints;
|
|
1115
1580
|
// Pre-v4 rows (or a stripped archive) still fall back to the scans.
|
|
1581
|
+
const lastEventTs = lastEventTsFromDb(source, id);
|
|
1116
1582
|
return {
|
|
1117
|
-
lastEventTs
|
|
1583
|
+
lastEventTs,
|
|
1584
|
+
eventCount: source
|
|
1585
|
+
.prepare("SELECT COUNT(*) AS n FROM events WHERE session_id = ?")
|
|
1586
|
+
.get(id)?.n ?? 0,
|
|
1118
1587
|
hasTurnStart: hasTurnStartInDb(source, id),
|
|
1119
1588
|
hasCommandRun: hasCommandRunInDb(source, id),
|
|
1120
1589
|
};
|
|
@@ -1122,28 +1591,108 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
1122
1591
|
isLoaded(id) {
|
|
1123
1592
|
return sessions.has(id);
|
|
1124
1593
|
},
|
|
1594
|
+
readEventsTail(id, maxLogical) {
|
|
1595
|
+
if (!sessionIds.has(id)) {
|
|
1596
|
+
throw new Error(`session not found: ${id}`);
|
|
1597
|
+
}
|
|
1598
|
+
const cap = Math.max(0, Math.floor(maxLogical));
|
|
1599
|
+
if (cap <= 0) {
|
|
1600
|
+
return { events: [], baseIndex: 0 };
|
|
1601
|
+
}
|
|
1602
|
+
const cached = sessions.get(id);
|
|
1603
|
+
if (cached !== undefined) {
|
|
1604
|
+
touchResident(id);
|
|
1605
|
+
if (cached.length <= cap) {
|
|
1606
|
+
return { events: cached, baseIndex: 0 };
|
|
1607
|
+
}
|
|
1608
|
+
const baseIndex = cached.length - cap;
|
|
1609
|
+
return { events: cached.slice(baseIndex), baseIndex };
|
|
1610
|
+
}
|
|
1611
|
+
const source = sourceDbFor(id);
|
|
1612
|
+
const hints = sessionHintsFromDb(source, id);
|
|
1613
|
+
const total = hints?.eventCount;
|
|
1614
|
+
if (typeof total !== "number" || total <= 0)
|
|
1615
|
+
return undefined;
|
|
1616
|
+
// v4 hint backfill used physical COUNT(*). Packed sessions then report
|
|
1617
|
+
// event_count === row count while logical length is larger — refuse the
|
|
1618
|
+
// fast path so Face falls back to a full expand (correct absolute seq).
|
|
1619
|
+
if (!eventCountLooksLogical(source, id, total))
|
|
1620
|
+
return undefined;
|
|
1621
|
+
const events = loadSessionEventsTail(source, id, cap);
|
|
1622
|
+
if (events.length === 0)
|
|
1623
|
+
return { events: [], baseIndex: total };
|
|
1624
|
+
if (events.length > total)
|
|
1625
|
+
return undefined;
|
|
1626
|
+
return { events, baseIndex: total - events.length };
|
|
1627
|
+
},
|
|
1628
|
+
scanDurableSingles(id, visit) {
|
|
1629
|
+
if (!sessionIds.has(id)) {
|
|
1630
|
+
throw new Error(`session not found: ${id}`);
|
|
1631
|
+
}
|
|
1632
|
+
const cached = sessions.get(id);
|
|
1633
|
+
if (cached !== undefined) {
|
|
1634
|
+
touchResident(id);
|
|
1635
|
+
for (const event of cached)
|
|
1636
|
+
visit(event);
|
|
1637
|
+
return;
|
|
1638
|
+
}
|
|
1639
|
+
scanDurableSinglesFromDb(sourceDbFor(id), id, visit);
|
|
1640
|
+
},
|
|
1125
1641
|
searchSessionIds(query) {
|
|
1126
|
-
const
|
|
1127
|
-
if (
|
|
1642
|
+
const plan = planFtsQuery(query);
|
|
1643
|
+
if (plan === null)
|
|
1128
1644
|
return [];
|
|
1129
1645
|
const ids = new Set();
|
|
1646
|
+
// A common word ("session", "测试"→LIKE) matches thousands of rows. Face
|
|
1647
|
+
// shows 20 with a hasMore flag and then reads every candidate's full log,
|
|
1648
|
+
// so an uncapped candidate list pulls hundreds of sessions into the LRU
|
|
1649
|
+
// and evicts them again one by one.
|
|
1650
|
+
const CANDIDATE_LIMIT = 200;
|
|
1651
|
+
let ftsFailed = false;
|
|
1130
1652
|
const run = (target) => {
|
|
1131
1653
|
try {
|
|
1132
|
-
const rows =
|
|
1133
|
-
|
|
1134
|
-
|
|
1654
|
+
const rows = (plan.kind === "match"
|
|
1655
|
+
? target
|
|
1656
|
+
.prepare("SELECT DISTINCT session_id AS id FROM search_fts WHERE search_fts MATCH ? LIMIT ?")
|
|
1657
|
+
.all(plan.value, CANDIDATE_LIMIT)
|
|
1658
|
+
: target
|
|
1659
|
+
.prepare("SELECT DISTINCT session_id AS id FROM search_fts WHERE text LIKE ? ESCAPE '\\' LIMIT ?")
|
|
1660
|
+
.all(plan.value, CANDIDATE_LIMIT));
|
|
1135
1661
|
for (const row of rows)
|
|
1136
1662
|
ids.add(row.id);
|
|
1137
1663
|
}
|
|
1138
1664
|
catch {
|
|
1139
|
-
/* corrupt / missing FTS — skip that DB */
|
|
1665
|
+
/* corrupt / missing FTS — skip that DB, but say so below */
|
|
1666
|
+
ftsFailed = true;
|
|
1140
1667
|
}
|
|
1141
1668
|
};
|
|
1142
1669
|
run(db);
|
|
1143
1670
|
run(archiveDb);
|
|
1671
|
+
const needle = query.trim().toLowerCase();
|
|
1672
|
+
if (ftsFailed) {
|
|
1673
|
+
// A damaged index must not read as "no results": that is indistinguishable
|
|
1674
|
+
// from a real miss and sends the user hunting for content that is right
|
|
1675
|
+
// there. Scan the resident logs (the same text the index would hold) and
|
|
1676
|
+
// leave a throttled trace for diagnosis.
|
|
1677
|
+
for (const [id, events] of sessions) {
|
|
1678
|
+
if (ids.has(id))
|
|
1679
|
+
continue;
|
|
1680
|
+
for (const event of events) {
|
|
1681
|
+
const text = extractEventSearchText(event);
|
|
1682
|
+
if (text !== undefined && text.toLowerCase().includes(needle)) {
|
|
1683
|
+
ids.add(id);
|
|
1684
|
+
break;
|
|
1685
|
+
}
|
|
1686
|
+
}
|
|
1687
|
+
}
|
|
1688
|
+
searchIndexFailures += 1;
|
|
1689
|
+
if (searchIndexFailures <= 3 || searchIndexFailures % 100 === 0) {
|
|
1690
|
+
console.error(`[session-store] search index unavailable (#${searchIndexFailures});`
|
|
1691
|
+
+ " falling back to resident logs — rebuild FTS to restore cold search");
|
|
1692
|
+
}
|
|
1693
|
+
}
|
|
1144
1694
|
// Pending batches are not in FTS yet. Match them in memory so a search
|
|
1145
1695
|
// does not COMMIT every other session's interior events.
|
|
1146
|
-
const needle = query.trim().toLowerCase();
|
|
1147
1696
|
const chunkText = new Map();
|
|
1148
1697
|
for (const row of pending) {
|
|
1149
1698
|
const text = extractEventSearchText(row.event);
|
|
@@ -1172,8 +1721,37 @@ export function createPersistentSessionStore(dir, options = {}) {
|
|
|
1172
1721
|
}
|
|
1173
1722
|
return [...ids];
|
|
1174
1723
|
},
|
|
1724
|
+
releaseResident(sessionId) {
|
|
1725
|
+
const sid = sessionId;
|
|
1726
|
+
if (!sessionIds.has(sid))
|
|
1727
|
+
return false;
|
|
1728
|
+
const events = sessions.get(sid);
|
|
1729
|
+
if (events === undefined)
|
|
1730
|
+
return true;
|
|
1731
|
+
// Same pin as LRU eviction: re-hydrate mid-turn would re-run repair and
|
|
1732
|
+
// can insert a synthetic interrupted assistant while the live loop still
|
|
1733
|
+
// streams.
|
|
1734
|
+
if (sessionHasOpenTurn(events))
|
|
1735
|
+
return false;
|
|
1736
|
+
flushPending(sid);
|
|
1737
|
+
onEvict?.(sid);
|
|
1738
|
+
dropResident(sid);
|
|
1739
|
+
return true;
|
|
1740
|
+
},
|
|
1741
|
+
flushFailureReport() {
|
|
1742
|
+
return {
|
|
1743
|
+
failures: backgroundFlushFailures,
|
|
1744
|
+
paused: backgroundFlushPaused,
|
|
1745
|
+
...(lastBackgroundFlushError !== undefined
|
|
1746
|
+
? { lastError: lastBackgroundFlushError }
|
|
1747
|
+
: {}),
|
|
1748
|
+
};
|
|
1749
|
+
},
|
|
1175
1750
|
flush(sessionId) {
|
|
1176
1751
|
flushPending(sessionId);
|
|
1752
|
+
// Explicit barrier cleared the pause — resume microtask auto-drain.
|
|
1753
|
+
backgroundFlushPaused = false;
|
|
1754
|
+
lastBackgroundFlushError = undefined;
|
|
1177
1755
|
},
|
|
1178
1756
|
close() {
|
|
1179
1757
|
storeClosed = true;
|