@cortexkit/opencode-magic-context 0.47.0 → 0.49.0
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/dist/agents/magic-context-prompt.d.ts +1 -1
- package/dist/agents/magic-context-prompt.d.ts.map +1 -1
- package/dist/{announcement-y35wzg2r.js → announcement-fp14dw0n.js} +3 -2
- package/dist/auto-search-worker.js +27 -30
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/mural-model-deprecation.d.ts +15 -0
- package/dist/config/mural-model-deprecation.d.ts.map +1 -0
- package/dist/config/project-security.d.ts +0 -3
- package/dist/config/project-security.d.ts.map +1 -1
- package/dist/config/schema/magic-context.d.ts +10 -6
- package/dist/config/schema/magic-context.d.ts.map +1 -1
- package/dist/{conflict-warning-hook-z44ynfz7.js → conflict-warning-hook-kzx4dmk1.js} +12 -10
- package/dist/{context-wq4ffwyb.js → context-nj5f293n.js} +2765 -1925
- package/dist/{derive-budgets-ke12jnnh.js → derive-budgets-qz5rrr08.js} +4 -3
- package/dist/embedding-activity-g1dhes6g.js +10 -0
- package/dist/embedding-backfill-aetxv1vt.js +21 -0
- package/dist/embedding-cache-mgyr73ef.js +16 -0
- package/dist/embedding-worker.js +11 -9
- package/dist/features/magic-context/compaction-marker.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts +1 -0
- package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-config.d.ts +3 -3
- package/dist/features/magic-context/dreamer/task-config.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-executor.d.ts +1 -1
- package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-registry.d.ts +1 -0
- package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
- package/dist/features/magic-context/git-commits/search-git-commits.d.ts +2 -0
- package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
- package/dist/features/magic-context/message-index-async.d.ts +16 -3
- package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
- package/dist/features/magic-context/message-index-bounded.d.ts +17 -0
- package/dist/features/magic-context/message-index-bounded.d.ts.map +1 -0
- package/dist/features/magic-context/message-index.d.ts +7 -1
- package/dist/features/magic-context/message-index.d.ts.map +1 -1
- package/dist/features/magic-context/mural/render-trigger.d.ts +7 -4
- package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
- package/dist/features/magic-context/pi-content-decisions.d.ts +7 -1
- package/dist/features/magic-context/pi-content-decisions.d.ts.map +1 -1
- package/dist/features/magic-context/search-rerank.d.ts +35 -0
- package/dist/features/magic-context/search-rerank.d.ts.map +1 -0
- package/dist/features/magic-context/search.d.ts +40 -0
- package/dist/features/magic-context/search.d.ts.map +1 -1
- package/dist/features/magic-context/session-activity.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/runner.d.ts +1 -0
- package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
- package/dist/features/magic-context/storage-db.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-persisted.d.ts +13 -2
- package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-session.d.ts +7 -1
- package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta.d.ts +1 -1
- package/dist/features/magic-context/storage-meta.d.ts.map +1 -1
- package/dist/features/magic-context/storage-session-tables.d.ts +2 -0
- package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
- package/dist/features/magic-context/storage-tag-identity-revision.d.ts +50 -0
- package/dist/features/magic-context/storage-tag-identity-revision.d.ts.map +1 -0
- package/dist/features/magic-context/storage-tags.d.ts +153 -4
- package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
- package/dist/features/magic-context/storage.d.ts +1 -1
- package/dist/features/magic-context/storage.d.ts.map +1 -1
- package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -1
- package/dist/features/magic-context/tagger.d.ts +2 -0
- package/dist/features/magic-context/tagger.d.ts.map +1 -1
- package/dist/features/magic-context/transform-decision-log.d.ts +4 -1
- package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
- package/dist/harness-e4avh192.js +10 -0
- package/dist/hooks/magic-context/active-anthropic-turn.d.ts +2 -0
- package/dist/hooks/magic-context/active-anthropic-turn.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-replay.fixture.d.ts +24 -0
- package/dist/hooks/magic-context/auto-search-replay.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-runner.d.ts +1 -1
- package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-worker-client.d.ts +34 -3
- package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
- package/dist/hooks/magic-context/command-handler.d.ts +3 -0
- package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
- package/dist/hooks/magic-context/emergency-fail-closed.d.ts +28 -0
- package/dist/hooks/magic-context/emergency-fail-closed.d.ts.map +1 -1
- package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
- package/dist/hooks/magic-context/historian-host-runner.d.ts +8 -0
- package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/hook.d.ts +3 -2
- package/dist/hooks/magic-context/hook.d.ts.map +1 -1
- package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
- package/dist/hooks/magic-context/latest-thinking-recovery.d.ts +7 -0
- package/dist/hooks/magic-context/latest-thinking-recovery.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-persist.d.ts +4 -3
- package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-replay.d.ts +13 -8
- package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-slot.d.ts +139 -2
- package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
- package/dist/hooks/magic-context/message-search-accepting-silent-worker.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/message-search-accepting-silent-worker.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/oc-stall-r2-warmup-worker.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/oc-stall-r2-warmup-worker.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/oc-stall-search-review.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/oc-stall-search-review.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/opencode1-to-model-messages.fixture.d.ts +63 -0
- package/dist/hooks/magic-context/opencode1-to-model-messages.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/pass-outcome.d.ts +1 -0
- package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
- package/dist/hooks/magic-context/provider-visible-parts.d.ts +45 -0
- package/dist/hooks/magic-context/provider-visible-parts.d.ts.map +1 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup-silent-worker.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup-silent-worker.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup-worker.d.ts +2 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup-worker.d.ts.map +1 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts +87 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts.map +1 -0
- package/dist/hooks/magic-context/read-session-chunk.d.ts +19 -1
- package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-formatting.d.ts +5 -0
- package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-raw.d.ts +118 -1
- package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts.map +1 -1
- package/dist/hooks/magic-context/reasoning-budget.d.ts.map +1 -1
- package/dist/hooks/magic-context/rust-mode-transform.d.ts +36 -0
- package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/sentinel.d.ts +41 -1
- package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
- package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +8 -1
- package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -1
- package/dist/hooks/magic-context/strict-thinking-prefix.d.ts +8 -0
- package/dist/hooks/magic-context/strict-thinking-prefix.d.ts.map +1 -0
- package/dist/hooks/magic-context/strip-content.d.ts +14 -2
- package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
- package/dist/hooks/magic-context/system-prompt-hash.d.ts +1 -0
- package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-messages.d.ts +8 -0
- package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-owner-warmup.d.ts +6 -0
- package/dist/hooks/magic-context/tag-owner-warmup.d.ts.map +1 -0
- package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
- package/dist/hooks/magic-context/token-count-exact.d.ts +35 -0
- package/dist/hooks/magic-context/token-count-exact.d.ts.map +1 -0
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +13 -0
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform.d.ts +9 -2
- package/dist/hooks/magic-context/transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
- package/dist/{index-q6hef7fh.js → index-0sahzkwr.js} +6 -19
- package/dist/{index-k5bdx1bx.js → index-0w56v4fm.js} +3 -5
- package/dist/{index-5gq3b2ya.js → index-1bt88epp.js} +227 -205
- package/dist/{index-cwf6s3ay.js → index-1g30axtz.js} +3279 -2907
- package/dist/{index-5a2r0p9f.js → index-1r0k9js3.js} +20 -13
- package/dist/index-2bvekkfy.js +11 -0
- package/dist/{index-6d9e1m08.js → index-2jcbj7r1.js} +13301 -13225
- package/dist/index-2jgwttpt.js +3269 -0
- package/dist/index-4dhv7mqz.js +131 -0
- package/dist/{index-sj29b3z2.js → index-4mjhqadz.js} +3 -3
- package/dist/{index-0c82743p.js → index-57mrqed8.js} +17 -15
- package/dist/{index-b35pxds2.js → index-58e3y90n.js} +1 -18
- package/dist/index-7jzrrxap.js +931 -0
- package/dist/index-8ajstryz.js +18 -0
- package/dist/{index-sfpzqvdz.js → index-8cd2j99z.js} +2 -3
- package/dist/{index-6wkcswft.js → index-9qjqq45k.js} +29 -19
- package/dist/{index-adwfkpex.js → index-9rt53q79.js} +23 -23
- package/dist/index-b7mv1jx3.js +1060 -0
- package/dist/index-d9vfe7xq.js +16 -0
- package/dist/{index-gg8j07zz.js → index-ezmszwbd.js} +8 -6
- package/dist/index-fb3zxn06.js +13 -0
- package/dist/index-fr0wbhdn.js +43 -0
- package/dist/{index-mc22ayvf.js → index-ghc9f0n7.js} +11 -9
- package/dist/index-gzcmtmar.js +171 -0
- package/dist/{index-w2t4ah5j.js → index-h2py7207.js} +6762 -7400
- package/dist/index-h2wc01qk.js +120 -0
- package/dist/index-h5zfkjyk.js +1277 -0
- package/dist/{index-92bp57hg.js → index-ha87j7a8.js} +1343 -149
- package/dist/index-hj2q50k0.js +856 -0
- package/dist/{index-wx8a6bw3.js → index-kb9nn0a0.js} +270 -53
- package/dist/index-kmpvemph.js +1314 -0
- package/dist/index-kp5qe690.js +3030 -0
- package/dist/{index-m5fe6jch.js → index-kq57tdf0.js} +152 -2453
- package/dist/{v2/server-fq7kq32k.js → index-mfkzp7qj.js} +1 -16
- package/dist/{v2/server-njt3np1k.js → index-nm6a8xpd.js} +220 -961
- package/dist/{index-hybnrwq0.js → index-nsjyysj0.js} +137 -130
- package/dist/index-nydv6g8r.js +3569 -0
- package/dist/index-pavzsdc6.js +17 -0
- package/dist/index-peshmj6h.js +152 -0
- package/dist/index-pxwp2hjk.js +571 -0
- package/dist/{v2/server-yr3zj7e7.js → index-qt1qqasc.js} +6 -7
- package/dist/{v2/server-51dv1pr5.js → index-qx53vezw.js} +301 -27
- package/dist/{index-rrrsepyw.js → index-s4j7t92z.js} +90 -85
- package/dist/{index-9pk9exrb.js → index-stbr4ce6.js} +18 -18
- package/dist/{index-fzbvakh0.js → index-tqf7yg27.js} +3 -3
- package/dist/index-vkbqdnkj.js +2307 -0
- package/dist/{index-8da2zjhz.js → index-z1tjp257.js} +9 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +608 -349
- package/dist/logger-ewak5q1s.js +20 -0
- package/dist/message-index-bounded-h0mrd4pr.js +124 -0
- package/dist/{v2/message-time-backfill-1f9tzvcs.js → message-time-backfill-8x06r9kx.js} +8 -6
- package/dist/migration-worker.js +25 -18
- package/dist/{model-resolution-xhfmyyvy.js → model-resolution-nx97z3x7.js} +1 -1
- package/dist/plugin/dream-timer.d.ts +1 -1
- package/dist/plugin/dream-timer.d.ts.map +1 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +3 -0
- package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
- package/dist/plugin/host-stall-profiler-report.d.ts +1 -66
- package/dist/plugin/host-stall-profiler-report.d.ts.map +1 -1
- package/dist/plugin/host-stall-profiler.d.ts +2 -95
- package/dist/plugin/host-stall-profiler.d.ts.map +1 -1
- package/dist/plugin/messages-transform.d.ts +0 -13
- package/dist/plugin/messages-transform.d.ts.map +1 -1
- package/dist/plugin/rpc-handlers.d.ts.map +1 -1
- package/dist/plugin/tool-registry.d.ts.map +1 -1
- package/dist/project-embedding-registry-rtt0djyb.js +88 -0
- package/dist/raw-ordinal-warmup-worker.js +60 -0
- package/dist/{read-session-chunk-4jey7hpt.js → read-session-chunk-ty89v75e.js} +17 -9
- package/dist/read-session-raw-8sjbc9h0.js +60 -0
- package/dist/recomp-orchestrator-4f1yyd1q.js +57 -0
- package/dist/{v2/safe-notification-target-eb1n1vfb.js → safe-notification-target-q0cyrx3x.js} +4 -2
- package/dist/search-pz4f4wge.js +45 -0
- package/dist/{v2/send-session-notification-c0wtscea.js → send-session-notification-38cd5dqt.js} +10 -7
- package/dist/shared/auto-search-lifecycle.d.ts +14 -0
- package/dist/shared/auto-search-lifecycle.d.ts.map +1 -1
- package/dist/shared/conflict-detector.d.ts.map +1 -1
- package/dist/shared/host-stall-profiler-bun.d.ts +46 -0
- package/dist/shared/host-stall-profiler-bun.d.ts.map +1 -0
- package/dist/shared/host-stall-profiler-common.d.ts +58 -0
- package/dist/shared/host-stall-profiler-common.d.ts.map +1 -0
- package/dist/shared/host-stall-profiler-node.d.ts +36 -0
- package/dist/shared/host-stall-profiler-node.d.ts.map +1 -0
- package/dist/shared/host-stall-profiler-report.d.ts +68 -0
- package/dist/shared/host-stall-profiler-report.d.ts.map +1 -0
- package/dist/shared/host-stall-profiler.d.ts +5 -0
- package/dist/shared/host-stall-profiler.d.ts.map +1 -0
- package/dist/shared/logger.d.ts.map +1 -1
- package/dist/shared/model-resolution.d.ts +2 -3
- package/dist/shared/model-resolution.d.ts.map +1 -1
- package/dist/shared/models-dev-temperature.d.ts +18 -0
- package/dist/shared/models-dev-temperature.d.ts.map +1 -0
- package/dist/shared/project-directory-key.d.ts +16 -0
- package/dist/shared/project-directory-key.d.ts.map +1 -1
- package/dist/shared/sqlite.d.ts +30 -0
- package/dist/shared/sqlite.d.ts.map +1 -1
- package/dist/shared/stable-json.d.ts.map +1 -1
- package/dist/shared/subagent-temperature.d.ts +46 -0
- package/dist/shared/subagent-temperature.d.ts.map +1 -0
- package/dist/shared/user-facing-codes.d.ts +0 -5
- package/dist/shared/user-facing-codes.d.ts.map +1 -1
- package/dist/sqlite-context-pragmas-mv9jqwjh.js +6 -0
- package/dist/sqlite-mhjkerzq.js +46 -0
- package/dist/storage-memory-07fx57k6.js +71 -0
- package/dist/storage-tags-k0pda32s.js +133 -0
- package/dist/{task-config-v81k8jvk.js → task-config-cgpg0nvh.js} +2 -2
- package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
- package/dist/tools/ctx-note/constants.d.ts +4 -0
- package/dist/tools/ctx-note/constants.d.ts.map +1 -1
- package/dist/tools/ctx-note/tools.d.ts +1 -0
- package/dist/tools/ctx-note/tools.d.ts.map +1 -1
- package/dist/tools/ctx-reduce/tools.d.ts.map +1 -1
- package/dist/tools/ctx-search/tools.d.ts.map +1 -1
- package/dist/tools/ctx-search/types.d.ts +1 -0
- package/dist/tools/ctx-search/types.d.ts.map +1 -1
- package/dist/tools/parameter-descriptions.d.ts +2 -2
- package/dist/tools/parameter-descriptions.d.ts.map +1 -1
- package/dist/{transform-postprocess-phase-z5hzpsxv.js → transform-postprocess-phase-tck4g20s.js} +35 -20
- package/dist/transformers-node-wasm.js +18415 -18415
- package/dist/v2/auto-search-worker.js +27 -30
- package/dist/v2/{context-14v1hr8b.js → context-crbt6p1y.js} +4708 -4218
- package/dist/v2/{derive-budgets-nc9avxz8.js → derive-budgets-fgej9j46.js} +4 -3
- package/dist/v2/embedding-activity-g1dhes6g.js +10 -0
- package/dist/v2/embedding-backfill-ph1qfyn3.js +21 -0
- package/dist/v2/embedding-cache-mgyr73ef.js +16 -0
- package/dist/v2/embedding-worker.js +12 -9
- package/dist/v2/fold/host-media.d.ts +4 -0
- package/dist/v2/fold/host-media.d.ts.map +1 -1
- package/dist/v2/fold/memory-cache.d.ts +70 -0
- package/dist/v2/fold/memory-cache.d.ts.map +1 -0
- package/dist/v2/fold/native-codec.d.ts +10 -0
- package/dist/v2/fold/native-codec.d.ts.map +1 -0
- package/dist/v2/fold/native-replay.d.ts +58 -0
- package/dist/v2/fold/native-replay.d.ts.map +1 -0
- package/dist/v2/fold/policy.d.ts +24 -0
- package/dist/v2/fold/policy.d.ts.map +1 -0
- package/dist/v2/harness-e4avh192.js +10 -0
- package/dist/v2/hidden-child-native.d.ts.map +1 -1
- package/dist/v2/hidden-completion.d.ts +7 -0
- package/dist/v2/hidden-completion.d.ts.map +1 -1
- package/dist/v2/hooks/context.d.ts +2 -2
- package/dist/v2/hooks/context.d.ts.map +1 -1
- package/dist/v2/hooks/dream-manual.d.ts +1 -1
- package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
- package/dist/v2/hooks/dream-timer.d.ts.map +1 -1
- package/dist/v2/hooks/dream-trigger.d.ts +5 -3
- package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
- package/dist/v2/hooks/generate.d.ts +9 -2
- package/dist/v2/hooks/generate.d.ts.map +1 -1
- package/dist/v2/hooks/payload.d.ts.map +1 -1
- package/dist/v2/hooks/tools.d.ts.map +1 -1
- package/dist/v2/hooks/types.d.ts +6 -0
- package/dist/v2/hooks/types.d.ts.map +1 -1
- package/dist/v2/logger-pj02s7sr.js +19 -0
- package/dist/v2/message-index-bounded-xwqdywxg.js +123 -0
- package/dist/{message-time-backfill-r5epkzj3.js → v2/message-time-backfill-cje68egj.js} +7 -7
- package/dist/v2/migration-worker.js +24 -17
- package/dist/v2/{model-resolution-xhfmyyvy.js → model-resolution-nx97z3x7.js} +1 -1
- package/dist/v2/project-embedding-registry-d6m7tyxr.js +86 -0
- package/dist/v2/raw-ordinal-warmup-worker.js +60 -0
- package/dist/v2/{read-session-chunk-gyyv7w2r.js → read-session-chunk-8p5mdryx.js} +16 -8
- package/dist/v2/read-session-raw-j8dvp7f4.js +59 -0
- package/dist/v2/recomp-orchestrator-ckfgt6wq.js +57 -0
- package/dist/{safe-notification-target-43r8jsxw.js → v2/safe-notification-target-y3p1hce9.js} +3 -3
- package/dist/v2/search-ym8rehhz.js +45 -0
- package/dist/{send-session-notification-0m68ms3n.js → v2/send-session-notification-5m0yapqx.js} +9 -8
- package/dist/v2/{server-rz514f14.js → server-19zjmn02.js} +2044 -2060
- package/dist/v2/server-1tk82krw.js +796 -0
- package/dist/v2/server-2bvekkfy.js +11 -0
- package/dist/v2/{server-ajzeteqw.js → server-2ra6pwf3.js} +1 -18
- package/dist/v2/server-2s6ayq3t.js +1048 -0
- package/dist/v2/{server-fcdehk1s.js → server-2s9qz6n7.js} +4 -4
- package/dist/v2/server-3j4d00kf.js +171 -0
- package/dist/v2/{server-14vq4kpm.js → server-3t0q2cqx.js} +3 -3
- package/dist/v2/server-4dhv7mqz.js +131 -0
- package/dist/v2/server-4ez8mntn.js +3213 -0
- package/dist/v2/{server-6r257mf5.js → server-676xw7at.js} +3 -3
- package/dist/v2/{server-vs5gpnd4.js → server-6byqfbqf.js} +165 -145
- package/dist/v2/server-7ekna9zs.js +120 -0
- package/dist/v2/server-7h861yms.js +1272 -0
- package/dist/v2/server-7jzrrxap.js +931 -0
- package/dist/v2/server-8ajstryz.js +18 -0
- package/dist/v2/{server-sfpzqvdz.js → server-8cd2j99z.js} +2 -3
- package/dist/v2/{server-cpepxy2q.js → server-8k2agx29.js} +14 -12
- package/dist/v2/server-c5rrgrcd.js +3545 -0
- package/dist/v2/server-d9vfe7xq.js +16 -0
- package/dist/v2/server-fb3zxn06.js +13 -0
- package/dist/v2/server-fr0wbhdn.js +43 -0
- package/dist/v2/{server-y10vbq6y.js → server-hb6xhh9q.js} +11 -1053
- package/dist/v2/server-jvxzm1jy.js +3023 -0
- package/dist/v2/{server-wx8a6bw3.js → server-kb9nn0a0.js} +270 -53
- package/dist/{index-5eqk6z3s.js → v2/server-kzns2hbz.js} +301 -27
- package/dist/{index-rrbbspwh.js → v2/server-mfkzp7qj.js} +1 -16
- package/dist/v2/server-pavzsdc6.js +17 -0
- package/dist/v2/{server-vd4e7174.js → server-pj4pjv02.js} +21 -17
- package/dist/v2/{server-e0c1b7a7.js → server-q4ph9bwn.js} +1340 -148
- package/dist/{index-yr3zj7e7.js → v2/server-qt1qqasc.js} +6 -7
- package/dist/v2/{server-qdjnb2z1.js → server-r5p3b1wy.js} +11 -9
- package/dist/v2/{server-d0sraw7m.js → server-sa8jvrfc.js} +291 -286
- package/dist/v2/server-ss95ky04.js +1048 -0
- package/dist/v2/{server-1qbnzc80.js → server-t4k4qexw.js} +142 -150
- package/dist/{index-x3kwrmqk.js → v2/server-v4mewb78.js} +35 -792
- package/dist/v2/server-w32kmdez.js +154 -0
- package/dist/v2/{server-nf82q6pt.js → server-x4hscabv.js} +5547 -5449
- package/dist/v2/server-xwz4dqh9.js +569 -0
- package/dist/v2/{server-efhwzx05.js → server-ycw9qqcy.js} +23 -23
- package/dist/v2/{server-50hvkg3v.js → server-zm570tr2.js} +160 -158
- package/dist/v2/server-zp53y8js.js +1311 -0
- package/dist/v2/server.js +16 -14
- package/dist/v2/sqlite-context-pragmas-mv9jqwjh.js +6 -0
- package/dist/v2/sqlite-mhjkerzq.js +46 -0
- package/dist/v2/storage-memory-07fx57k6.js +71 -0
- package/dist/v2/storage-tags-8vw924zn.js +132 -0
- package/dist/v2/store-reader.d.ts +24 -2
- package/dist/v2/store-reader.d.ts.map +1 -1
- package/dist/v2/{task-config-tbndqyny.js → task-config-x0hq3qfd.js} +2 -2
- package/dist/v2/transformers-node-wasm.js +18415 -18415
- package/dist/v2/tui/index.d.ts.map +1 -1
- package/dist/v2/tui/types.d.ts +1 -10
- package/dist/v2/tui/types.d.ts.map +1 -1
- package/dist/v2/{wrapup-orchestrator-nbz854vc.js → wrapup-orchestrator-a7efxaax.js} +51 -30
- package/dist/wrapup-orchestrator-barbc6h9.js +44 -0
- package/package.json +4 -3
- package/src/agents/magic-context-prompt.ts +27 -2
- package/src/agents/smart-notes-enabled.test.ts +294 -0
- package/src/agents/smart-notes-on.golden.json +70 -0
- package/src/config/index.test.ts +67 -1
- package/src/config/index.ts +2 -0
- package/src/config/latch-permanence-guard.test.ts +4 -0
- package/src/config/mural-model-deprecation.ts +24 -0
- package/src/config/project-security.hostile-matrix.test.ts +4 -44
- package/src/config/project-security.test.ts +9 -14
- package/src/config/project-security.ts +13 -55
- package/src/config/schema/magic-context.test.ts +2 -2
- package/src/config/schema/magic-context.ts +16 -10
- package/src/features/magic-context/dreamer/task-registry.ts +6 -0
- package/src/shared/auto-search-lifecycle.ts +43 -0
- package/src/shared/conflict-detector.test.ts +56 -0
- package/src/shared/conflict-detector.ts +16 -5
- package/src/shared/host-stall-profiler-bun.ts +358 -0
- package/src/shared/host-stall-profiler-common.ts +159 -0
- package/src/shared/host-stall-profiler-node.test.ts +234 -0
- package/src/shared/host-stall-profiler-node.ts +274 -0
- package/src/shared/host-stall-profiler-report.ts +248 -0
- package/src/shared/host-stall-profiler.ts +57 -0
- package/src/shared/logger.test.ts +38 -0
- package/src/shared/logger.ts +10 -2
- package/src/shared/model-resolution.test.ts +54 -17
- package/src/shared/model-resolution.ts +6 -17
- package/src/shared/models-dev-temperature.ts +107 -0
- package/src/shared/project-directory-key.test.ts +59 -0
- package/src/shared/project-directory-key.ts +20 -0
- package/src/shared/sqlite.test.ts +52 -0
- package/src/shared/sqlite.ts +339 -23
- package/src/shared/stable-json-linear.test.ts +109 -0
- package/src/shared/stable-json.ts +37 -7
- package/src/shared/subagent-temperature.test.ts +270 -0
- package/src/shared/subagent-temperature.ts +110 -0
- package/src/shared/user-facing-codes.ts +2 -6
- package/src/shared/write-transaction-attribution.test.ts +2 -2
- package/src/v2/tui/host-contract.test.ts +41 -67
- package/src/v2/tui/index.ts +6 -214
- package/src/v2/tui/types.ts +5 -17
- package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts +0 -45
- package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts.map +0 -1
- package/dist/features/magic-context/checkout-claim.d.ts +0 -155
- package/dist/features/magic-context/checkout-claim.d.ts.map +0 -1
- package/dist/index-bb36vgr3.js +0 -6608
- package/dist/index-fnn5pjtt.js +0 -6554
- package/dist/recomp-orchestrator-rervg6q4.js +0 -42
- package/dist/v2/recomp-orchestrator-42vjba7p.js +0 -42
- package/dist/v2/server-3trjk1hx.js +0 -6360
- package/dist/v2/server-nm9n3aqq.js +0 -6461
- package/dist/wrapup-orchestrator-b2dztrar.js +0 -29
- /package/dist/{index-5prbx026.js → index-2pp04pmg.js} +0 -0
- /package/dist/v2/{index-5prbx026.js → index-2pp04pmg.js} +0 -0
|
@@ -0,0 +1,796 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getHarness2
|
|
3
|
+
} from "./server-pavzsdc6.js";
|
|
4
|
+
import {
|
|
5
|
+
removeSystemReminders,
|
|
6
|
+
hasMeaningfulUserText2,
|
|
7
|
+
extractTexts2
|
|
8
|
+
} from "./server-kzns2hbz.js";
|
|
9
|
+
import {
|
|
10
|
+
withSqliteBackgroundWriter2,
|
|
11
|
+
withoutSqliteTransformPass2
|
|
12
|
+
} from "./server-kb9nn0a0.js";
|
|
13
|
+
import {
|
|
14
|
+
TAG_TOMBSTONE_OWNER_PREFIX,
|
|
15
|
+
tagTombstoneOwnerRange,
|
|
16
|
+
tagTombstoneOwnerKey,
|
|
17
|
+
tagRevisionKey,
|
|
18
|
+
tagIdentityRevisionKey,
|
|
19
|
+
deleteTagIdentityRevisions
|
|
20
|
+
} from "./server-6byqfbqf.js";
|
|
21
|
+
import {
|
|
22
|
+
cleanUserText2
|
|
23
|
+
} from "./server-4ez8mntn.js";
|
|
24
|
+
import {
|
|
25
|
+
recordMessageFtsRowid,
|
|
26
|
+
recordIndexedMessageTime,
|
|
27
|
+
messageFtsOrdinalRangeIsMapped,
|
|
28
|
+
deleteUnmappedMessageFtsRows
|
|
29
|
+
} from "./server-3j4d00kf.js";
|
|
30
|
+
import {
|
|
31
|
+
deleteChunkEmbedBackoffForSession
|
|
32
|
+
} from "./server-ss95ky04.js";
|
|
33
|
+
import {
|
|
34
|
+
closeQuietly
|
|
35
|
+
} from "./server-8ajstryz.js";
|
|
36
|
+
import {
|
|
37
|
+
logSlowWriteTransaction
|
|
38
|
+
} from "./server-3t0q2cqx.js";
|
|
39
|
+
|
|
40
|
+
// src/features/magic-context/compression-depth-storage.ts
|
|
41
|
+
var incrementDepthStatements = new WeakMap;
|
|
42
|
+
var totalDepthStatements = new WeakMap;
|
|
43
|
+
var maxDepthStatements = new WeakMap;
|
|
44
|
+
var clearDepthStatements = new WeakMap;
|
|
45
|
+
function getClearDepthStatement(db) {
|
|
46
|
+
let stmt = clearDepthStatements.get(db);
|
|
47
|
+
if (!stmt) {
|
|
48
|
+
stmt = db.prepare("DELETE FROM compression_depth WHERE session_id = ?");
|
|
49
|
+
clearDepthStatements.set(db, stmt);
|
|
50
|
+
}
|
|
51
|
+
return stmt;
|
|
52
|
+
}
|
|
53
|
+
function clearCompressionDepth(db, sessionId) {
|
|
54
|
+
getClearDepthStatement(db).run(sessionId);
|
|
55
|
+
}
|
|
56
|
+
function clearCompressionDepthRange(db, sessionId, startOrdinal, endOrdinal) {
|
|
57
|
+
if (endOrdinal < startOrdinal) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
db.prepare("DELETE FROM compression_depth WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?").run(sessionId, startOrdinal, endOrdinal);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/features/magic-context/message-index.ts
|
|
64
|
+
import { createHash } from "node:crypto";
|
|
65
|
+
|
|
66
|
+
// src/features/magic-context/session-activity.ts
|
|
67
|
+
var PREFIX = "retrospective_activity:";
|
|
68
|
+
var pending = new WeakMap;
|
|
69
|
+
function sessionActivityKey(sessionId) {
|
|
70
|
+
return `${PREFIX}${sessionId}`;
|
|
71
|
+
}
|
|
72
|
+
function deleteSessionActivity(db, sessionIds) {
|
|
73
|
+
if (sessionIds.length === 0)
|
|
74
|
+
return;
|
|
75
|
+
const sessions = pending.get(db);
|
|
76
|
+
for (const sessionId of sessionIds) {
|
|
77
|
+
const state = sessions?.get(sessionId);
|
|
78
|
+
if (state?.timer)
|
|
79
|
+
clearTimeout(state.timer);
|
|
80
|
+
sessions?.delete(sessionId);
|
|
81
|
+
}
|
|
82
|
+
const placeholders = sessionIds.map(() => "?").join(", ");
|
|
83
|
+
db.prepare(`DELETE FROM schema_migrations_meta WHERE key IN (${placeholders})`).run(...sessionIds.map(sessionActivityKey));
|
|
84
|
+
deleteTagIdentityRevisions(db, sessionIds);
|
|
85
|
+
}
|
|
86
|
+
function advanceSessionActivity(db, sessionId, time) {
|
|
87
|
+
if (!sessionId || !Number.isFinite(time) || time <= 0)
|
|
88
|
+
return;
|
|
89
|
+
db.prepare(`INSERT INTO schema_migrations_meta (key, value) VALUES (?, ?)
|
|
90
|
+
ON CONFLICT(key) DO UPDATE SET value = CAST(MAX(CAST(value AS INTEGER), CAST(excluded.value AS INTEGER)) AS TEXT)`).run(sessionActivityKey(sessionId), String(Math.floor(time)));
|
|
91
|
+
}
|
|
92
|
+
async function backfillSessionActivity(db, harness, latestTime) {
|
|
93
|
+
const completedKey = `retrospective_activity_backfill:${harness}:v1`;
|
|
94
|
+
if (db.prepare("SELECT 1 FROM schema_migrations_meta WHERE key = ?").get(completedKey))
|
|
95
|
+
return;
|
|
96
|
+
let cursor = "";
|
|
97
|
+
while (true) {
|
|
98
|
+
const rows = db.prepare(`SELECT session_id FROM session_projects
|
|
99
|
+
WHERE harness = ? AND session_id > ? ORDER BY session_id LIMIT 100`).all(harness, cursor);
|
|
100
|
+
if (rows.length === 0)
|
|
101
|
+
break;
|
|
102
|
+
for (const row of rows) {
|
|
103
|
+
const time = await latestTime(row.session_id);
|
|
104
|
+
if (time !== undefined)
|
|
105
|
+
advanceSessionActivity(db, row.session_id, time);
|
|
106
|
+
}
|
|
107
|
+
cursor = rows[rows.length - 1].session_id;
|
|
108
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
109
|
+
}
|
|
110
|
+
db.prepare("INSERT OR IGNORE INTO schema_migrations_meta (key, value) VALUES (?, 'completed')").run(completedKey);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// src/features/magic-context/storage-session-tables.ts
|
|
114
|
+
var SESSION_SCOPED_TABLES = [
|
|
115
|
+
{ table: "pending_ops", harnessScoped: true },
|
|
116
|
+
{ table: "source_contents", harnessScoped: true },
|
|
117
|
+
{ table: "tool_owner_backfill_state" },
|
|
118
|
+
{ table: "tags", harnessScoped: true },
|
|
119
|
+
{ table: "session_meta", harnessScoped: true },
|
|
120
|
+
{
|
|
121
|
+
table: "temporal_decisions",
|
|
122
|
+
extraPredicate: "NOT EXISTS (SELECT 1 FROM session_meta AS remaining WHERE remaining.session_id = temporal_decisions.session_id)"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
table: "session_replay_decisions",
|
|
126
|
+
extraPredicate: "NOT EXISTS (SELECT 1 FROM session_meta AS remaining WHERE remaining.session_id = session_replay_decisions.session_id)"
|
|
127
|
+
},
|
|
128
|
+
{ table: "session_projects", harnessScoped: true },
|
|
129
|
+
{ table: "compartment_chunk_embeddings", harnessScoped: true },
|
|
130
|
+
{ table: "compartments", harnessScoped: true },
|
|
131
|
+
{
|
|
132
|
+
table: "compartment_history_versions",
|
|
133
|
+
extraPredicate: "NOT EXISTS (SELECT 1 FROM compartments AS remaining WHERE remaining.session_id = compartment_history_versions.session_id)"
|
|
134
|
+
},
|
|
135
|
+
{ table: "compression_depth", harnessScoped: true },
|
|
136
|
+
{ table: "session_facts", harnessScoped: true },
|
|
137
|
+
{ table: "compartment_state_lease" },
|
|
138
|
+
{ table: "notes", harnessScoped: true, extraPredicate: "type = 'session'" },
|
|
139
|
+
{ table: "recomp_compartments", harnessScoped: true },
|
|
140
|
+
{ table: "recomp_facts", harnessScoped: true },
|
|
141
|
+
{ table: "user_memory_candidates" },
|
|
142
|
+
{ table: "primer_candidates", harnessScoped: true },
|
|
143
|
+
{ table: "m0_mutation_log" },
|
|
144
|
+
{ table: "compartment_events", harnessScoped: true },
|
|
145
|
+
{ table: "subagent_invocations", harnessScoped: true },
|
|
146
|
+
{ table: "historian_runs", harnessScoped: true },
|
|
147
|
+
{ table: "plugin_messages" },
|
|
148
|
+
{ table: "transform_decisions", harnessScoped: true },
|
|
149
|
+
{ table: "synapse_batch_ledger" },
|
|
150
|
+
{ table: "embedding_measurement_corpus" },
|
|
151
|
+
{ table: "pending_session_cleanup", harnessScoped: true },
|
|
152
|
+
{ table: "message_history_fts" },
|
|
153
|
+
{ table: "message_fts_rowid_map" },
|
|
154
|
+
{ table: "message_history_source", harnessScoped: true },
|
|
155
|
+
{ table: "message_history_index", harnessScoped: true },
|
|
156
|
+
{ table: "lkg_slots" },
|
|
157
|
+
{ table: "lkg_slot_chunks" }
|
|
158
|
+
];
|
|
159
|
+
function deleteSessionScopedRows(db, sessionIds, harness, options = {}) {
|
|
160
|
+
if (sessionIds.length === 0)
|
|
161
|
+
return 0;
|
|
162
|
+
let deletableSessionIds = [...sessionIds];
|
|
163
|
+
if (options.rustModuleCleanupAcknowledged !== true) {
|
|
164
|
+
const placeholders = sessionIds.map(() => "?").join(", ");
|
|
165
|
+
const harnessPredicate = harness === undefined ? "" : " AND harness = ?";
|
|
166
|
+
const protectedRows = db.prepare(`SELECT session_id
|
|
167
|
+
FROM pending_session_cleanup
|
|
168
|
+
WHERE session_id IN (${placeholders})
|
|
169
|
+
AND harness LIKE '%:rust'${harnessPredicate}`).all(...sessionIds, ...harness === undefined ? [] : [`${harness}:rust`]);
|
|
170
|
+
const protectedSessionIds = new Set(protectedRows.map((row) => row.session_id));
|
|
171
|
+
deletableSessionIds = sessionIds.filter((sessionId) => !protectedSessionIds.has(sessionId));
|
|
172
|
+
}
|
|
173
|
+
if (deletableSessionIds.length === 0)
|
|
174
|
+
return 0;
|
|
175
|
+
const placeholders = deletableSessionIds.map(() => "?").join(", ");
|
|
176
|
+
const harnessTables = SESSION_SCOPED_TABLES.filter((definition) => definition.harnessScoped);
|
|
177
|
+
if (options.preserveTagRevisionTombstones) {
|
|
178
|
+
const owners = db.prepare(harnessTables.map((definition) => `SELECT session_id, harness FROM ${definition.table} WHERE session_id IN (${placeholders})${definition.extraPredicate ? ` AND ${definition.extraPredicate}` : ""}`).join(" UNION ")).all(...harnessTables.flatMap(() => deletableSessionIds));
|
|
179
|
+
const record = db.prepare("INSERT OR IGNORE INTO schema_migrations_meta (key, value) VALUES (?, ?)");
|
|
180
|
+
for (const owner of owners)
|
|
181
|
+
record.run(tagTombstoneOwnerKey(owner.session_id, owner.harness), owner.harness);
|
|
182
|
+
const fallback = db.prepare(`INSERT INTO schema_migrations_meta (key, value)
|
|
183
|
+
SELECT ?, ? WHERE NOT EXISTS (SELECT 1 FROM schema_migrations_meta WHERE key >= ? AND key < ?)`);
|
|
184
|
+
for (const id of deletableSessionIds)
|
|
185
|
+
fallback.run(tagTombstoneOwnerKey(id, getHarness2()), getHarness2(), ...tagTombstoneOwnerRange(id));
|
|
186
|
+
}
|
|
187
|
+
for (const sessionId of deletableSessionIds)
|
|
188
|
+
deleteChunkEmbedBackoffForSession(db, sessionId);
|
|
189
|
+
for (const definition of SESSION_SCOPED_TABLES) {
|
|
190
|
+
if (definition.table === "message_history_fts") {
|
|
191
|
+
db.prepare(`DELETE FROM message_history_fts
|
|
192
|
+
WHERE rowid IN (
|
|
193
|
+
SELECT fts_rowid
|
|
194
|
+
FROM message_fts_rowid_map
|
|
195
|
+
WHERE session_id IN (${placeholders})
|
|
196
|
+
)`).run(...deletableSessionIds);
|
|
197
|
+
deleteUnmappedMessageFtsRows(db, deletableSessionIds);
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const predicates = [`session_id IN (${placeholders})`];
|
|
201
|
+
if (definition.extraPredicate)
|
|
202
|
+
predicates.push(definition.extraPredicate);
|
|
203
|
+
const bindHarness = harness !== undefined && definition.harnessScoped === true;
|
|
204
|
+
if (bindHarness)
|
|
205
|
+
predicates.push("harness = ?");
|
|
206
|
+
const statement = db.prepare(`DELETE FROM ${definition.table} WHERE ${predicates.join(" AND ")}`);
|
|
207
|
+
if (bindHarness)
|
|
208
|
+
statement.run(...deletableSessionIds, harness);
|
|
209
|
+
else
|
|
210
|
+
statement.run(...deletableSessionIds);
|
|
211
|
+
}
|
|
212
|
+
deleteSessionActivity(db, deletableSessionIds);
|
|
213
|
+
if (!options.preserveTagRevisionTombstones) {
|
|
214
|
+
const retireOwner = db.prepare(harness === undefined ? "DELETE FROM schema_migrations_meta WHERE key >= ? AND key < ?" : "DELETE FROM schema_migrations_meta WHERE key = ?");
|
|
215
|
+
const survivingRows = harnessTables.map((definition) => `EXISTS (SELECT 1 FROM ${definition.table} WHERE session_id = ?${definition.extraPredicate ? ` AND ${definition.extraPredicate}` : ""})`).join(" OR ");
|
|
216
|
+
const retire = db.prepare(`DELETE FROM schema_migrations_meta WHERE key IN (?, ?)
|
|
217
|
+
AND NOT (${survivingRows})
|
|
218
|
+
AND NOT EXISTS (SELECT 1 FROM schema_migrations_meta AS owners WHERE owners.key >= ? AND owners.key < ?)`);
|
|
219
|
+
for (const id of deletableSessionIds) {
|
|
220
|
+
if (harness === undefined)
|
|
221
|
+
retireOwner.run(...tagTombstoneOwnerRange(id));
|
|
222
|
+
else
|
|
223
|
+
retireOwner.run(tagTombstoneOwnerKey(id, harness));
|
|
224
|
+
retire.run(tagIdentityRevisionKey(id), tagRevisionKey(id), ...harnessTables.map(() => id), ...tagTombstoneOwnerRange(id));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return deletableSessionIds.length;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// src/features/magic-context/message-index.ts
|
|
231
|
+
var MESSAGE_HISTORY_ORPHAN_SWEEP_BATCH_SIZE = 200;
|
|
232
|
+
var MESSAGE_HISTORY_ORPHAN_SAFETY_AGE_MS = 24 * 60 * 60 * 1000;
|
|
233
|
+
var MESSAGE_HISTORY_ORPHAN_SWEEP_COOLDOWN_MS = 10 * 60 * 1000;
|
|
234
|
+
var MESSAGE_HISTORY_ORPHAN_UNAVAILABLE_REPROBE_MS = 24 * 60 * 60 * 1000;
|
|
235
|
+
var lastIndexedStatements = new WeakMap;
|
|
236
|
+
var insertMessageStatements = new WeakMap;
|
|
237
|
+
var upsertProgressStatements = new WeakMap;
|
|
238
|
+
var upsertDirtyFloorStatements = new WeakMap;
|
|
239
|
+
var deleteFtsStatements = new WeakMap;
|
|
240
|
+
var deleteFtsRangeStatements = new WeakMap;
|
|
241
|
+
var deleteIndexStatements = new WeakMap;
|
|
242
|
+
var countIndexedMessageStatements = new WeakMap;
|
|
243
|
+
var getMessageSourceStatements = new WeakMap;
|
|
244
|
+
var upsertMessageSourceStatements = new WeakMap;
|
|
245
|
+
var deleteMessageSourceStatements = new WeakMap;
|
|
246
|
+
var deleteMessageSourceRangeStatements = new WeakMap;
|
|
247
|
+
var deleteMessageFtsStatements = new WeakMap;
|
|
248
|
+
var deleteFtsMapStatements = new WeakMap;
|
|
249
|
+
var deleteFtsMapRangeStatements = new WeakMap;
|
|
250
|
+
var deleteMessageFtsMapStatements = new WeakMap;
|
|
251
|
+
var MESSAGE_INDEX_MAX_FTS_BYTES = 64 * 1024;
|
|
252
|
+
var skipStatements = new WeakMap;
|
|
253
|
+
function skipStatement(db, sql) {
|
|
254
|
+
const statements = skipStatements.get(db) ?? new Map;
|
|
255
|
+
skipStatements.set(db, statements);
|
|
256
|
+
let statement = statements.get(sql);
|
|
257
|
+
if (!statement) {
|
|
258
|
+
statement = db.prepare(sql);
|
|
259
|
+
statements.set(sql, statement);
|
|
260
|
+
}
|
|
261
|
+
return statement;
|
|
262
|
+
}
|
|
263
|
+
var messageIndexSkipKey = (sessionId, messageId) => `message_index_skip:${JSON.stringify([sessionId, messageId])}`;
|
|
264
|
+
function deleteMessageIndexSkips(db, sessionId, messageId) {
|
|
265
|
+
if (messageId !== undefined) {
|
|
266
|
+
skipStatement(db, "DELETE FROM schema_migrations_meta WHERE key=?").run(messageIndexSkipKey(sessionId, messageId));
|
|
267
|
+
} else {
|
|
268
|
+
const prefix = `message_index_skip:${JSON.stringify([sessionId]).slice(0, -1)},`;
|
|
269
|
+
skipStatement(db, "DELETE FROM schema_migrations_meta WHERE substr(key,1,length(?))=?").run(prefix, prefix);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
function normalizeIndexText(text) {
|
|
273
|
+
return text.replace(/\s+/g, " ").trim();
|
|
274
|
+
}
|
|
275
|
+
function getLastIndexedStatement(db) {
|
|
276
|
+
let stmt = lastIndexedStatements.get(db);
|
|
277
|
+
if (!stmt) {
|
|
278
|
+
stmt = db.prepare("SELECT last_indexed_ordinal, dirty_floor_ordinal FROM message_history_index WHERE session_id = ?");
|
|
279
|
+
lastIndexedStatements.set(db, stmt);
|
|
280
|
+
}
|
|
281
|
+
return stmt;
|
|
282
|
+
}
|
|
283
|
+
function getInsertMessageStatement(db) {
|
|
284
|
+
let stmt = insertMessageStatements.get(db);
|
|
285
|
+
if (!stmt) {
|
|
286
|
+
stmt = db.prepare("INSERT INTO message_history_fts (session_id, message_ordinal, message_id, role, content) VALUES (?, ?, ?, ?, ?)");
|
|
287
|
+
insertMessageStatements.set(db, stmt);
|
|
288
|
+
}
|
|
289
|
+
return stmt;
|
|
290
|
+
}
|
|
291
|
+
function getUpsertProgressStatement(db) {
|
|
292
|
+
let stmt = upsertProgressStatements.get(db);
|
|
293
|
+
if (!stmt) {
|
|
294
|
+
stmt = db.prepare("INSERT INTO message_history_index (session_id, last_indexed_ordinal, dirty_floor_ordinal, updated_at, harness) VALUES (?, ?, ?, ?, ?) ON CONFLICT(session_id) DO UPDATE SET last_indexed_ordinal = excluded.last_indexed_ordinal, dirty_floor_ordinal = excluded.dirty_floor_ordinal, updated_at = excluded.updated_at");
|
|
295
|
+
upsertProgressStatements.set(db, stmt);
|
|
296
|
+
}
|
|
297
|
+
return stmt;
|
|
298
|
+
}
|
|
299
|
+
function getUpsertDirtyFloorStatement(db) {
|
|
300
|
+
let stmt = upsertDirtyFloorStatements.get(db);
|
|
301
|
+
if (!stmt) {
|
|
302
|
+
stmt = db.prepare("INSERT INTO message_history_index (session_id, last_indexed_ordinal, dirty_floor_ordinal, updated_at, harness) VALUES (?, ?, ?, ?, ?) ON CONFLICT(session_id) DO UPDATE SET last_indexed_ordinal = MAX(message_history_index.last_indexed_ordinal, excluded.last_indexed_ordinal), dirty_floor_ordinal = CASE WHEN message_history_index.dirty_floor_ordinal <= 0 THEN excluded.dirty_floor_ordinal WHEN excluded.dirty_floor_ordinal <= 0 THEN message_history_index.dirty_floor_ordinal ELSE MIN(message_history_index.dirty_floor_ordinal, excluded.dirty_floor_ordinal) END, updated_at = excluded.updated_at");
|
|
303
|
+
upsertDirtyFloorStatements.set(db, stmt);
|
|
304
|
+
}
|
|
305
|
+
return stmt;
|
|
306
|
+
}
|
|
307
|
+
function getDeleteFtsStatement(db) {
|
|
308
|
+
let stmt = deleteFtsStatements.get(db);
|
|
309
|
+
if (!stmt) {
|
|
310
|
+
stmt = db.prepare(`DELETE FROM message_history_fts
|
|
311
|
+
WHERE rowid IN (
|
|
312
|
+
SELECT fts_rowid FROM message_fts_rowid_map WHERE session_id = ?
|
|
313
|
+
)`);
|
|
314
|
+
deleteFtsStatements.set(db, stmt);
|
|
315
|
+
}
|
|
316
|
+
return stmt;
|
|
317
|
+
}
|
|
318
|
+
function getDeleteFtsRangeStatement(db) {
|
|
319
|
+
let stmt = deleteFtsRangeStatements.get(db);
|
|
320
|
+
if (!stmt) {
|
|
321
|
+
stmt = db.prepare(`DELETE FROM message_history_fts
|
|
322
|
+
WHERE rowid IN (
|
|
323
|
+
SELECT fts_rowid
|
|
324
|
+
FROM message_fts_rowid_map
|
|
325
|
+
WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?
|
|
326
|
+
)`);
|
|
327
|
+
deleteFtsRangeStatements.set(db, stmt);
|
|
328
|
+
}
|
|
329
|
+
return stmt;
|
|
330
|
+
}
|
|
331
|
+
function getDeleteIndexStatement(db) {
|
|
332
|
+
let stmt = deleteIndexStatements.get(db);
|
|
333
|
+
if (!stmt) {
|
|
334
|
+
stmt = db.prepare("DELETE FROM message_history_index WHERE session_id = ?");
|
|
335
|
+
deleteIndexStatements.set(db, stmt);
|
|
336
|
+
}
|
|
337
|
+
return stmt;
|
|
338
|
+
}
|
|
339
|
+
function getCountIndexedMessageStatement(db) {
|
|
340
|
+
let stmt = countIndexedMessageStatements.get(db);
|
|
341
|
+
if (!stmt) {
|
|
342
|
+
stmt = db.prepare(`SELECT COUNT(*) AS count
|
|
343
|
+
FROM message_history_source AS source
|
|
344
|
+
JOIN message_fts_rowid_map AS map
|
|
345
|
+
ON map.session_id = source.session_id
|
|
346
|
+
AND map.message_ordinal = source.message_ordinal
|
|
347
|
+
WHERE source.session_id = ? AND source.message_id = ?`);
|
|
348
|
+
countIndexedMessageStatements.set(db, stmt);
|
|
349
|
+
}
|
|
350
|
+
return stmt;
|
|
351
|
+
}
|
|
352
|
+
function getMessageSourceStatement(db) {
|
|
353
|
+
let stmt = getMessageSourceStatements.get(db);
|
|
354
|
+
if (!stmt) {
|
|
355
|
+
stmt = db.prepare("SELECT message_ordinal, source_version, normalized_content_hash, role FROM message_history_source WHERE session_id = ? AND message_id = ?");
|
|
356
|
+
getMessageSourceStatements.set(db, stmt);
|
|
357
|
+
}
|
|
358
|
+
return stmt;
|
|
359
|
+
}
|
|
360
|
+
function getUpsertMessageSourceStatement(db) {
|
|
361
|
+
let stmt = upsertMessageSourceStatements.get(db);
|
|
362
|
+
if (!stmt) {
|
|
363
|
+
stmt = db.prepare(`INSERT INTO message_history_source (
|
|
364
|
+
session_id, message_id, message_ordinal, source_version,
|
|
365
|
+
normalized_content_hash, role, harness, updated_at
|
|
366
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
367
|
+
ON CONFLICT(session_id, message_id) DO UPDATE SET
|
|
368
|
+
message_ordinal = excluded.message_ordinal,
|
|
369
|
+
source_version = excluded.source_version,
|
|
370
|
+
normalized_content_hash = excluded.normalized_content_hash,
|
|
371
|
+
role = excluded.role,
|
|
372
|
+
harness = excluded.harness,
|
|
373
|
+
updated_at = excluded.updated_at`);
|
|
374
|
+
upsertMessageSourceStatements.set(db, stmt);
|
|
375
|
+
}
|
|
376
|
+
return stmt;
|
|
377
|
+
}
|
|
378
|
+
function getDeleteMessageSourceStatement(db) {
|
|
379
|
+
let stmt = deleteMessageSourceStatements.get(db);
|
|
380
|
+
if (!stmt) {
|
|
381
|
+
stmt = db.prepare("DELETE FROM message_history_source WHERE session_id = ?");
|
|
382
|
+
deleteMessageSourceStatements.set(db, stmt);
|
|
383
|
+
}
|
|
384
|
+
return stmt;
|
|
385
|
+
}
|
|
386
|
+
function getDeleteMessageSourceRangeStatement(db) {
|
|
387
|
+
let stmt = deleteMessageSourceRangeStatements.get(db);
|
|
388
|
+
if (!stmt) {
|
|
389
|
+
stmt = db.prepare("DELETE FROM message_history_source WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?");
|
|
390
|
+
deleteMessageSourceRangeStatements.set(db, stmt);
|
|
391
|
+
}
|
|
392
|
+
return stmt;
|
|
393
|
+
}
|
|
394
|
+
function getDeleteMessageFtsStatement(db) {
|
|
395
|
+
let stmt = deleteMessageFtsStatements.get(db);
|
|
396
|
+
if (!stmt) {
|
|
397
|
+
stmt = db.prepare(`DELETE FROM message_history_fts
|
|
398
|
+
WHERE rowid IN (
|
|
399
|
+
SELECT map.fts_rowid
|
|
400
|
+
FROM message_history_source AS source
|
|
401
|
+
JOIN message_fts_rowid_map AS map
|
|
402
|
+
ON map.session_id = source.session_id
|
|
403
|
+
AND map.message_ordinal = source.message_ordinal
|
|
404
|
+
WHERE source.session_id = ? AND source.message_id = ?
|
|
405
|
+
)`);
|
|
406
|
+
deleteMessageFtsStatements.set(db, stmt);
|
|
407
|
+
}
|
|
408
|
+
return stmt;
|
|
409
|
+
}
|
|
410
|
+
function getDeleteFtsMapStatement(db) {
|
|
411
|
+
let stmt = deleteFtsMapStatements.get(db);
|
|
412
|
+
if (!stmt) {
|
|
413
|
+
stmt = db.prepare("DELETE FROM message_fts_rowid_map WHERE session_id = ?");
|
|
414
|
+
deleteFtsMapStatements.set(db, stmt);
|
|
415
|
+
}
|
|
416
|
+
return stmt;
|
|
417
|
+
}
|
|
418
|
+
function getDeleteFtsMapRangeStatement(db) {
|
|
419
|
+
let stmt = deleteFtsMapRangeStatements.get(db);
|
|
420
|
+
if (!stmt) {
|
|
421
|
+
stmt = db.prepare("DELETE FROM message_fts_rowid_map WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?");
|
|
422
|
+
deleteFtsMapRangeStatements.set(db, stmt);
|
|
423
|
+
}
|
|
424
|
+
return stmt;
|
|
425
|
+
}
|
|
426
|
+
function getDeleteMessageFtsMapStatement(db) {
|
|
427
|
+
let stmt = deleteMessageFtsMapStatements.get(db);
|
|
428
|
+
if (!stmt) {
|
|
429
|
+
stmt = db.prepare(`DELETE FROM message_fts_rowid_map
|
|
430
|
+
WHERE session_id = ?
|
|
431
|
+
AND message_ordinal = (
|
|
432
|
+
SELECT message_ordinal
|
|
433
|
+
FROM message_history_source
|
|
434
|
+
WHERE session_id = ? AND message_id = ?
|
|
435
|
+
)`);
|
|
436
|
+
deleteMessageFtsMapStatements.set(db, stmt);
|
|
437
|
+
}
|
|
438
|
+
return stmt;
|
|
439
|
+
}
|
|
440
|
+
function insertMessageFtsRow(db, sessionId, messageOrdinal, messageId, role, content, messageTimeMs) {
|
|
441
|
+
const result = getInsertMessageStatement(db).run(sessionId, messageOrdinal, messageId, role, content);
|
|
442
|
+
recordMessageFtsRowid(db, sessionId, messageOrdinal, result.lastInsertRowid, messageTimeMs ?? null);
|
|
443
|
+
}
|
|
444
|
+
function normalizeSourceVersion(version) {
|
|
445
|
+
if (typeof version === "number")
|
|
446
|
+
return `number:${version}`;
|
|
447
|
+
if (typeof version === "string")
|
|
448
|
+
return `string:${version}`;
|
|
449
|
+
return "null";
|
|
450
|
+
}
|
|
451
|
+
function toMessageIndexSource(message) {
|
|
452
|
+
const content = getIndexableContent(message.role, message.parts);
|
|
453
|
+
return {
|
|
454
|
+
id: message.id,
|
|
455
|
+
ordinal: message.ordinal,
|
|
456
|
+
role: message.role,
|
|
457
|
+
createdAt: message.createdAt,
|
|
458
|
+
sourceVersion: normalizeSourceVersion(message.version),
|
|
459
|
+
contentHash: createHash("sha256").update(content).digest("hex"),
|
|
460
|
+
content
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
function getMessageSourceSnapshot(message) {
|
|
464
|
+
return toMessageIndexSource(message);
|
|
465
|
+
}
|
|
466
|
+
function isIndexSourceCurrent(db, sessionId, source) {
|
|
467
|
+
const row = getMessageSourceStatement(db).get(sessionId, source.id);
|
|
468
|
+
return row?.message_ordinal === source.ordinal && row.source_version === source.sourceVersion && row.normalized_content_hash === source.contentHash && row.role === source.role;
|
|
469
|
+
}
|
|
470
|
+
function writeMessageSource(db, sessionId, source, now) {
|
|
471
|
+
getUpsertMessageSourceStatement(db).run(sessionId, source.id, source.ordinal, source.sourceVersion, source.contentHash, source.role, getHarness2(), now);
|
|
472
|
+
const bytes = Buffer.byteLength(source.content);
|
|
473
|
+
if (source.ftsSkippedBytes !== undefined || bytes > MESSAGE_INDEX_MAX_FTS_BYTES) {
|
|
474
|
+
skipStatement(db, "INSERT INTO schema_migrations_meta(key,value) VALUES (?,?) ON CONFLICT(key) DO UPDATE SET value=excluded.value").run(messageIndexSkipKey(sessionId, source.id), JSON.stringify({
|
|
475
|
+
reason: "oversized",
|
|
476
|
+
bytes: source.ftsSkippedBytes ?? bytes,
|
|
477
|
+
contentHash: source.contentHash,
|
|
478
|
+
ordinal: source.ordinal,
|
|
479
|
+
complete: true
|
|
480
|
+
}));
|
|
481
|
+
return "";
|
|
482
|
+
}
|
|
483
|
+
skipStatement(db, "DELETE FROM schema_migrations_meta WHERE key=?").run(messageIndexSkipKey(sessionId, source.id));
|
|
484
|
+
return source.content;
|
|
485
|
+
}
|
|
486
|
+
function getLastIndexedOrdinal(db, sessionId) {
|
|
487
|
+
const row = getLastIndexedStatement(db).get(sessionId);
|
|
488
|
+
return typeof row?.last_indexed_ordinal === "number" ? row.last_indexed_ordinal : 0;
|
|
489
|
+
}
|
|
490
|
+
function getIndexedMessageCorpusSize(db, sessionId, maxOrdinal) {
|
|
491
|
+
const watermark = getLastIndexedOrdinal(db, sessionId);
|
|
492
|
+
return maxOrdinal === null ? watermark : Math.min(watermark, Math.max(0, maxOrdinal));
|
|
493
|
+
}
|
|
494
|
+
function getDirtyIndexFloor(db, sessionId) {
|
|
495
|
+
const row = getLastIndexedStatement(db).get(sessionId);
|
|
496
|
+
return typeof row?.dirty_floor_ordinal === "number" && row.dirty_floor_ordinal > 0 ? row.dirty_floor_ordinal : null;
|
|
497
|
+
}
|
|
498
|
+
function markMessageIndexDirty(db, sessionId, floorOrdinal) {
|
|
499
|
+
const dirtyFloor = Math.max(1, Math.floor(floorOrdinal));
|
|
500
|
+
getUpsertDirtyFloorStatement(db).run(sessionId, getLastIndexedOrdinal(db, sessionId), dirtyFloor, Date.now(), getHarness2());
|
|
501
|
+
}
|
|
502
|
+
function isMessageAlreadyIndexed(db, sessionId, messageId) {
|
|
503
|
+
const row = getCountIndexedMessageStatement(db).get(sessionId, messageId);
|
|
504
|
+
return (typeof row?.count === "number" ? row.count : 0) > 0;
|
|
505
|
+
}
|
|
506
|
+
function setIndexProgress(db, sessionId, watermark, dirtyFloor, now) {
|
|
507
|
+
getUpsertProgressStatement(db).run(sessionId, Math.max(0, Math.floor(watermark)), dirtyFloor ?? 0, now, getHarness2());
|
|
508
|
+
}
|
|
509
|
+
function getMessageIndexReconciliationStartOrdinal(db, sessionId) {
|
|
510
|
+
const watermark = getLastIndexedOrdinal(db, sessionId);
|
|
511
|
+
const dirtyFloor = getDirtyIndexFloor(db, sessionId);
|
|
512
|
+
return dirtyFloor === null ? watermark : Math.min(watermark, dirtyFloor - 1);
|
|
513
|
+
}
|
|
514
|
+
function isMessageIndexReconciledThrough(db, sessionId, finalWatermark) {
|
|
515
|
+
const dirtyFloor = getDirtyIndexFloor(db, sessionId);
|
|
516
|
+
return getLastIndexedOrdinal(db, sessionId) >= finalWatermark && dirtyFloor === null;
|
|
517
|
+
}
|
|
518
|
+
function clearIndexedMessagesInTransaction(db, sessionId) {
|
|
519
|
+
deleteMessageIndexSkips(db, sessionId);
|
|
520
|
+
getDeleteFtsStatement(db).run(sessionId);
|
|
521
|
+
deleteUnmappedMessageFtsRows(db, [sessionId]);
|
|
522
|
+
getDeleteFtsMapStatement(db).run(sessionId);
|
|
523
|
+
getDeleteMessageSourceStatement(db).run(sessionId);
|
|
524
|
+
getDeleteIndexStatement(db).run(sessionId);
|
|
525
|
+
clearCompressionDepth(db, sessionId);
|
|
526
|
+
}
|
|
527
|
+
function getIndexableContent(role, parts) {
|
|
528
|
+
if (role === "user") {
|
|
529
|
+
if (!hasMeaningfulUserText2(parts)) {
|
|
530
|
+
return "";
|
|
531
|
+
}
|
|
532
|
+
return extractTexts2(parts).map(cleanUserText2).map(normalizeIndexText).filter((text) => text.length > 0).join(" / ");
|
|
533
|
+
}
|
|
534
|
+
if (role === "assistant") {
|
|
535
|
+
return extractTexts2(parts).map(removeSystemReminders).map(normalizeIndexText).filter((text) => text.length > 0).join(" / ");
|
|
536
|
+
}
|
|
537
|
+
return "";
|
|
538
|
+
}
|
|
539
|
+
function indexSingleMessageInTransaction(db, sessionId, message, now, dirtyFloorBeforeAttempt, source) {
|
|
540
|
+
const currentWatermark = getLastIndexedOrdinal(db, sessionId);
|
|
541
|
+
const dirtyFloor = getDirtyIndexFloor(db, sessionId);
|
|
542
|
+
if (message.ordinal <= currentWatermark) {
|
|
543
|
+
if (isIndexSourceCurrent(db, sessionId, source)) {
|
|
544
|
+
recordIndexedMessageTime(db, sessionId, message.ordinal, message.createdAt);
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
if (!messageFtsOrdinalRangeIsMapped(db, sessionId, message.ordinal, message.ordinal)) {
|
|
548
|
+
return false;
|
|
549
|
+
}
|
|
550
|
+
getDeleteMessageFtsStatement(db).run(sessionId, message.id);
|
|
551
|
+
getDeleteMessageFtsMapStatement(db).run(sessionId, sessionId, message.id);
|
|
552
|
+
const content = writeMessageSource(db, sessionId, source, now);
|
|
553
|
+
if (content.length > 0 && (message.role === "user" || message.role === "assistant")) {
|
|
554
|
+
insertMessageFtsRow(db, sessionId, message.ordinal, message.id, message.role, content, message.createdAt);
|
|
555
|
+
}
|
|
556
|
+
setIndexProgress(db, sessionId, currentWatermark, dirtyFloorBeforeAttempt === message.ordinal ? null : dirtyFloorBeforeAttempt, now);
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
if (message.ordinal !== currentWatermark + 1 || dirtyFloor !== null && dirtyFloor !== message.ordinal) {
|
|
560
|
+
return false;
|
|
561
|
+
}
|
|
562
|
+
const content = writeMessageSource(db, sessionId, source, now);
|
|
563
|
+
let inserted = false;
|
|
564
|
+
if (content.length > 0 && (message.role === "user" || message.role === "assistant") && !isMessageAlreadyIndexed(db, sessionId, message.id)) {
|
|
565
|
+
insertMessageFtsRow(db, sessionId, message.ordinal, message.id, message.role, content, message.createdAt);
|
|
566
|
+
inserted = true;
|
|
567
|
+
}
|
|
568
|
+
setIndexProgress(db, sessionId, message.ordinal, dirtyFloorBeforeAttempt === message.ordinal ? null : dirtyFloorBeforeAttempt, now);
|
|
569
|
+
return inserted;
|
|
570
|
+
}
|
|
571
|
+
function indexSingleMessage(db, sessionId, message, shouldCommit = () => true, preparedSource) {
|
|
572
|
+
if (!shouldCommit())
|
|
573
|
+
return false;
|
|
574
|
+
const source = preparedSource ?? getMessageSourceSnapshot(message);
|
|
575
|
+
const currentWatermark = getLastIndexedOrdinal(db, sessionId);
|
|
576
|
+
if (message.ordinal <= currentWatermark && isIndexSourceCurrent(db, sessionId, source)) {
|
|
577
|
+
recordIndexedMessageTime(db, sessionId, message.ordinal, message.createdAt);
|
|
578
|
+
return false;
|
|
579
|
+
}
|
|
580
|
+
const dirtyFloorBeforeAttempt = getDirtyIndexFloor(db, sessionId);
|
|
581
|
+
markMessageIndexDirty(db, sessionId, Math.min(message.ordinal, currentWatermark + 1));
|
|
582
|
+
db.exec("BEGIN IMMEDIATE");
|
|
583
|
+
const transactionStartedAt = performance.now();
|
|
584
|
+
let committed = false;
|
|
585
|
+
try {
|
|
586
|
+
const result = indexSingleMessageInTransaction(db, sessionId, message, Date.now(), dirtyFloorBeforeAttempt, source);
|
|
587
|
+
if (!shouldCommit())
|
|
588
|
+
return false;
|
|
589
|
+
db.exec("COMMIT");
|
|
590
|
+
committed = true;
|
|
591
|
+
logSlowWriteTransaction("message_index_incremental", transactionStartedAt);
|
|
592
|
+
return result;
|
|
593
|
+
} finally {
|
|
594
|
+
if (!committed) {
|
|
595
|
+
try {
|
|
596
|
+
db.exec("ROLLBACK");
|
|
597
|
+
} catch {}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
function indexMessagesAfterOrdinal(db, sessionId, messages, _lastIndexedOrdinal, finalWatermark = messages.length) {
|
|
602
|
+
return indexItemsAfterOrdinal(db, sessionId, messages, finalWatermark, toMessageIndexSource);
|
|
603
|
+
}
|
|
604
|
+
function indexSourcesAfterOrdinal(db, sessionId, sources, finalWatermark) {
|
|
605
|
+
return indexItemsAfterOrdinal(db, sessionId, sources, finalWatermark, (source) => source);
|
|
606
|
+
}
|
|
607
|
+
function indexItemsAfterOrdinal(db, sessionId, items, finalWatermark, toSource) {
|
|
608
|
+
const now = Date.now();
|
|
609
|
+
let inserted = 0;
|
|
610
|
+
const sources = new Map(items.map((item) => [item.ordinal, toSource(item)]));
|
|
611
|
+
db.exec("BEGIN IMMEDIATE");
|
|
612
|
+
const transactionStartedAt = performance.now();
|
|
613
|
+
let committed = false;
|
|
614
|
+
try {
|
|
615
|
+
const currentWatermark = getLastIndexedOrdinal(db, sessionId);
|
|
616
|
+
const dirtyFloor = getDirtyIndexFloor(db, sessionId);
|
|
617
|
+
const effectiveWatermark = dirtyFloor === null ? currentWatermark : Math.min(currentWatermark, Math.max(0, dirtyFloor - 1));
|
|
618
|
+
if (dirtyFloor !== null && dirtyFloor <= currentWatermark && !messageFtsOrdinalRangeIsMapped(db, sessionId, dirtyFloor, Math.min(currentWatermark, finalWatermark))) {
|
|
619
|
+
db.exec("COMMIT");
|
|
620
|
+
committed = true;
|
|
621
|
+
logSlowWriteTransaction("message_index_reconcile", transactionStartedAt);
|
|
622
|
+
return 0;
|
|
623
|
+
}
|
|
624
|
+
if (dirtyFloor !== null && dirtyFloor <= finalWatermark) {
|
|
625
|
+
getDeleteFtsRangeStatement(db).run(sessionId, dirtyFloor, finalWatermark);
|
|
626
|
+
getDeleteFtsMapRangeStatement(db).run(sessionId, dirtyFloor, finalWatermark);
|
|
627
|
+
getDeleteMessageSourceRangeStatement(db).run(sessionId, dirtyFloor, finalWatermark);
|
|
628
|
+
}
|
|
629
|
+
const itemsByOrdinal = new Map;
|
|
630
|
+
for (const item of items) {
|
|
631
|
+
if (item.ordinal > effectiveWatermark && item.ordinal <= finalWatermark) {
|
|
632
|
+
itemsByOrdinal.set(item.ordinal, item);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
let coveredWatermark = effectiveWatermark;
|
|
636
|
+
while (coveredWatermark < finalWatermark && itemsByOrdinal.has(coveredWatermark + 1)) {
|
|
637
|
+
coveredWatermark += 1;
|
|
638
|
+
}
|
|
639
|
+
for (let ordinal = effectiveWatermark + 1;ordinal <= coveredWatermark; ordinal++) {
|
|
640
|
+
const item = itemsByOrdinal.get(ordinal);
|
|
641
|
+
if (!item)
|
|
642
|
+
continue;
|
|
643
|
+
const message = sources.get(ordinal);
|
|
644
|
+
if (!message)
|
|
645
|
+
continue;
|
|
646
|
+
const content = writeMessageSource(db, sessionId, message, now);
|
|
647
|
+
if (content.length === 0 || message.role !== "user" && message.role !== "assistant" || isMessageAlreadyIndexed(db, sessionId, message.id)) {
|
|
648
|
+
continue;
|
|
649
|
+
}
|
|
650
|
+
insertMessageFtsRow(db, sessionId, message.ordinal, message.id, message.role, content, message.createdAt);
|
|
651
|
+
inserted += 1;
|
|
652
|
+
}
|
|
653
|
+
const missingFloor = coveredWatermark < finalWatermark ? coveredWatermark + 1 : null;
|
|
654
|
+
const preservedFloor = dirtyFloor !== null && dirtyFloor > finalWatermark ? dirtyFloor : null;
|
|
655
|
+
const nextDirtyFloor = missingFloor === null ? preservedFloor : preservedFloor === null ? missingFloor : Math.min(missingFloor, preservedFloor);
|
|
656
|
+
setIndexProgress(db, sessionId, coveredWatermark, nextDirtyFloor, now);
|
|
657
|
+
db.exec("COMMIT");
|
|
658
|
+
committed = true;
|
|
659
|
+
logSlowWriteTransaction("message_index_reconcile", transactionStartedAt);
|
|
660
|
+
} finally {
|
|
661
|
+
if (!committed) {
|
|
662
|
+
try {
|
|
663
|
+
db.exec("ROLLBACK");
|
|
664
|
+
} catch {}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
return inserted;
|
|
668
|
+
}
|
|
669
|
+
function harnessSupportsOpenCodeOrphanSweep(harness) {
|
|
670
|
+
return harness === "opencode";
|
|
671
|
+
}
|
|
672
|
+
function getMessageHistoryOrphanSweepState(db, harness) {
|
|
673
|
+
return db.prepare("SELECT cursor_session_id, last_swept_at FROM message_history_orphan_sweep WHERE harness = ?").get(harness) ?? {};
|
|
674
|
+
}
|
|
675
|
+
function persistMessageHistoryOrphanSweepState(db, cursor, lastSweptAt, harness) {
|
|
676
|
+
db.prepare(`INSERT INTO message_history_orphan_sweep (harness, cursor_session_id, last_swept_at)
|
|
677
|
+
VALUES (?, ?, ?)
|
|
678
|
+
ON CONFLICT(harness) DO UPDATE SET
|
|
679
|
+
cursor_session_id = excluded.cursor_session_id,
|
|
680
|
+
last_swept_at = excluded.last_swept_at`).run(harness, cursor, lastSweptAt);
|
|
681
|
+
}
|
|
682
|
+
function getOpenCodeSessionScopedCandidateSourceSql(harness) {
|
|
683
|
+
const sources = SESSION_SCOPED_TABLES.filter((definition) => definition.harnessScoped === true).map((definition) => {
|
|
684
|
+
const predicates = ["session_id IS NOT NULL", `harness = '${harness}'`];
|
|
685
|
+
if (definition.extraPredicate)
|
|
686
|
+
predicates.push(definition.extraPredicate);
|
|
687
|
+
return `SELECT session_id FROM ${definition.table} WHERE ${predicates.join(" AND ")}`;
|
|
688
|
+
});
|
|
689
|
+
const jsonId = `SUBSTR(key, ${TAG_TOMBSTONE_OWNER_PREFIX.length + 1}, LENGTH(key) - ${TAG_TOMBSTONE_OWNER_PREFIX.length + harness.length + 1})`;
|
|
690
|
+
sources.push(`SELECT CASE WHEN json_valid(${jsonId}) THEN
|
|
691
|
+
CASE WHEN json_type(${jsonId}) = 'text' THEN json_extract(${jsonId}, '$') END END AS session_id
|
|
692
|
+
FROM schema_migrations_meta WHERE value = '${harness}'
|
|
693
|
+
AND key >= '${TAG_TOMBSTONE_OWNER_PREFIX}' AND key < '${TAG_TOMBSTONE_OWNER_PREFIX.slice(0, -1)};'
|
|
694
|
+
AND SUBSTR(key, -${harness.length + 1}) = ':${harness}'`);
|
|
695
|
+
return sources.join(`
|
|
696
|
+
UNION
|
|
697
|
+
`);
|
|
698
|
+
}
|
|
699
|
+
function sweepOrphanedOpenCodeMessageIndexesInBackground(db, openReadableOpenCodeDb, options = {}) {
|
|
700
|
+
const now = options.now ?? Date.now();
|
|
701
|
+
const batchSize = Math.max(1, Math.floor(options.batchSize ?? MESSAGE_HISTORY_ORPHAN_SWEEP_BATCH_SIZE));
|
|
702
|
+
const safetyAgeMs = Math.max(0, options.safetyAgeMs ?? MESSAGE_HISTORY_ORPHAN_SAFETY_AGE_MS);
|
|
703
|
+
const cooldownMs = Math.max(0, options.cooldownMs ?? MESSAGE_HISTORY_ORPHAN_SWEEP_COOLDOWN_MS);
|
|
704
|
+
const unavailableReprobeMs = Math.max(cooldownMs, options.unavailableReprobeMs ?? MESSAGE_HISTORY_ORPHAN_UNAVAILABLE_REPROBE_MS);
|
|
705
|
+
const harness = getHarness2();
|
|
706
|
+
const state = getMessageHistoryOrphanSweepState(db, harness);
|
|
707
|
+
const cursor = typeof state.cursor_session_id === "string" ? state.cursor_session_id : "";
|
|
708
|
+
if (typeof state.last_swept_at === "number" && state.last_swept_at + cooldownMs > now) {
|
|
709
|
+
return { status: "cooldown", scanned: 0, deleted: 0, cursor };
|
|
710
|
+
}
|
|
711
|
+
if (!harnessSupportsOpenCodeOrphanSweep(harness)) {
|
|
712
|
+
persistMessageHistoryOrphanSweepState(db, cursor, now + unavailableReprobeMs - cooldownMs, harness);
|
|
713
|
+
if (harness === "opencode2") {
|
|
714
|
+
return {
|
|
715
|
+
status: "unavailable",
|
|
716
|
+
scanned: 0,
|
|
717
|
+
deleted: 0,
|
|
718
|
+
cursor,
|
|
719
|
+
reason: "OpenCode 2 keeps its sessions in session_v2, which this sweep does not read"
|
|
720
|
+
};
|
|
721
|
+
}
|
|
722
|
+
return { status: "unavailable", scanned: 0, deleted: 0, cursor };
|
|
723
|
+
}
|
|
724
|
+
let openCodeDb = null;
|
|
725
|
+
try {
|
|
726
|
+
openCodeDb = openReadableOpenCodeDb();
|
|
727
|
+
} catch {
|
|
728
|
+
openCodeDb = null;
|
|
729
|
+
}
|
|
730
|
+
if (!openCodeDb) {
|
|
731
|
+
persistMessageHistoryOrphanSweepState(db, cursor, now + unavailableReprobeMs - cooldownMs, harness);
|
|
732
|
+
return { status: "source_unavailable", scanned: 0, deleted: 0, cursor };
|
|
733
|
+
}
|
|
734
|
+
try {
|
|
735
|
+
const cutoff = now - safetyAgeMs;
|
|
736
|
+
const candidateSourceSql = getOpenCodeSessionScopedCandidateSourceSql(harness);
|
|
737
|
+
const candidates = db.prepare(`SELECT session_id
|
|
738
|
+
FROM (${candidateSourceSql}) AS session_candidates
|
|
739
|
+
WHERE session_id > ?
|
|
740
|
+
AND NOT EXISTS (
|
|
741
|
+
SELECT 1
|
|
742
|
+
FROM message_history_index
|
|
743
|
+
WHERE message_history_index.session_id = session_candidates.session_id
|
|
744
|
+
AND message_history_index.harness = '${harness}'
|
|
745
|
+
AND message_history_index.updated_at > ?
|
|
746
|
+
)
|
|
747
|
+
ORDER BY session_id ASC
|
|
748
|
+
LIMIT ?`).all(cursor, cutoff, batchSize);
|
|
749
|
+
const sessionExists = openCodeDb.prepare("SELECT 1 FROM session WHERE id = ? LIMIT 1");
|
|
750
|
+
const missingSessionIds = candidates.filter((candidate) => !sessionExists.get(candidate.session_id)).map((candidate) => candidate.session_id);
|
|
751
|
+
const nextCursor = candidates.length < batchSize ? "" : candidates[candidates.length - 1]?.session_id ?? cursor;
|
|
752
|
+
const completedAt = candidates.length < batchSize ? now : null;
|
|
753
|
+
db.exec("BEGIN IMMEDIATE");
|
|
754
|
+
const transactionStartedAt = performance.now();
|
|
755
|
+
let committed = false;
|
|
756
|
+
let deleted = 0;
|
|
757
|
+
try {
|
|
758
|
+
const stillEligible = db.prepare(`SELECT 1
|
|
759
|
+
FROM (${candidateSourceSql}) AS session_candidates
|
|
760
|
+
WHERE session_id = ?
|
|
761
|
+
AND NOT EXISTS (
|
|
762
|
+
SELECT 1
|
|
763
|
+
FROM message_history_index
|
|
764
|
+
WHERE message_history_index.session_id = session_candidates.session_id
|
|
765
|
+
AND message_history_index.harness = '${harness}'
|
|
766
|
+
AND message_history_index.updated_at > ?
|
|
767
|
+
)
|
|
768
|
+
LIMIT 1`);
|
|
769
|
+
const eligibleSessionIds = missingSessionIds.filter((sessionId) => stillEligible.get(sessionId, cutoff));
|
|
770
|
+
deleted = deleteSessionScopedRows(db, eligibleSessionIds, harness);
|
|
771
|
+
persistMessageHistoryOrphanSweepState(db, nextCursor, completedAt, harness);
|
|
772
|
+
db.exec("COMMIT");
|
|
773
|
+
committed = true;
|
|
774
|
+
logSlowWriteTransaction("message_index_orphan_sweep", transactionStartedAt);
|
|
775
|
+
} finally {
|
|
776
|
+
if (!committed) {
|
|
777
|
+
try {
|
|
778
|
+
db.exec("ROLLBACK");
|
|
779
|
+
} catch {}
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
return {
|
|
783
|
+
status: "swept",
|
|
784
|
+
scanned: candidates.length,
|
|
785
|
+
deleted,
|
|
786
|
+
cursor: nextCursor
|
|
787
|
+
};
|
|
788
|
+
} finally {
|
|
789
|
+
closeQuietly(openCodeDb);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
function sweepOrphanedOpenCodeMessageIndexes(db, openReadableOpenCodeDb, options = {}) {
|
|
793
|
+
return withoutSqliteTransformPass2(() => withSqliteBackgroundWriter2(() => sweepOrphanedOpenCodeMessageIndexesInBackground(db, openReadableOpenCodeDb, options)));
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
export { clearCompressionDepth, clearCompressionDepthRange, advanceSessionActivity, backfillSessionActivity, deleteSessionScopedRows, MESSAGE_INDEX_MAX_FTS_BYTES, messageIndexSkipKey, toMessageIndexSource, getLastIndexedOrdinal, getIndexedMessageCorpusSize, markMessageIndexDirty, getMessageIndexReconciliationStartOrdinal, isMessageIndexReconciledThrough, clearIndexedMessagesInTransaction, getIndexableContent, indexSingleMessage, indexMessagesAfterOrdinal, indexSourcesAfterOrdinal, sweepOrphanedOpenCodeMessageIndexes };
|