@cortexkit/opencode-magic-context 0.47.0 → 0.48.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-w8cykrnf.js} +12 -10
- package/dist/{context-wq4ffwyb.js → context-m0cy262m.js} +2690 -1903
- package/dist/{derive-budgets-ke12jnnh.js → derive-budgets-sg0xsq7s.js} +4 -3
- package/dist/embedding-activity-g1dhes6g.js +10 -0
- package/dist/embedding-backfill-9rcm1mfy.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/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.d.ts +29 -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-session.d.ts +6 -0
- package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
- package/dist/features/magic-context/storage-tag-identity-revision.d.ts +30 -0
- package/dist/features/magic-context/storage-tag-identity-revision.d.ts.map +1 -0
- package/dist/features/magic-context/storage-tags.d.ts +144 -4
- package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
- package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -1
- package/dist/features/magic-context/transform-decision-log.d.ts +1 -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-worker-client.d.ts +32 -3
- package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
- package/dist/hooks/magic-context/command-handler.d.ts +1 -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/event-handler.d.ts.map +1 -1
- package/dist/hooks/magic-context/hook.d.ts +1 -1
- 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/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/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 +12 -0
- 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 +83 -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/sentinel.d.ts +41 -1
- package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/hooks/magic-context/transform.d.ts +8 -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-w2t4ah5j.js → index-0an7742d.js} +14072 -14286
- package/dist/index-0qhce371.js +120 -0
- package/dist/{index-q6hef7fh.js → index-0sahzkwr.js} +6 -19
- package/dist/{index-k5bdx1bx.js → index-0w56v4fm.js} +3 -5
- package/dist/index-14cjxt20.js +819 -0
- package/dist/{v2/server-51dv1pr5.js → index-1qb0z7wa.js} +301 -27
- package/dist/index-2bvekkfy.js +11 -0
- package/dist/{index-sj29b3z2.js → index-2y0s2hep.js} +3 -3
- package/dist/index-4dhv7mqz.js +131 -0
- package/dist/{index-b35pxds2.js → index-58e3y90n.js} +1 -18
- package/dist/index-5zygecde.js +152 -0
- package/dist/{index-6d9e1m08.js → index-692jzy0p.js} +17775 -17450
- package/dist/index-72nhv486.js +2307 -0
- package/dist/index-7jzrrxap.js +931 -0
- package/dist/{v2/server-njt3np1k.js → index-7mx8v0pw.js} +220 -961
- package/dist/index-8ajstryz.js +18 -0
- package/dist/{index-sfpzqvdz.js → index-8cd2j99z.js} +2 -3
- package/dist/{index-hybnrwq0.js → index-8j7gqj40.js} +131 -128
- package/dist/index-bdckkfw6.js +3261 -0
- package/dist/{index-m5fe6jch.js → index-bhvjj0ys.js} +152 -2453
- package/dist/index-c43kr12f.js +3030 -0
- package/dist/index-cb7emxgj.js +984 -0
- package/dist/index-d9vfe7xq.js +16 -0
- package/dist/{index-5gq3b2ya.js → index-db7zwa3v.js} +147 -209
- package/dist/index-dhwzyd54.js +1142 -0
- package/dist/{index-8da2zjhz.js → index-eeezr5zz.js} +9 -7
- package/dist/{index-cwf6s3ay.js → index-f0h6xwqm.js} +2828 -2618
- package/dist/index-fb3zxn06.js +13 -0
- package/dist/index-fbv1dn35.js +171 -0
- package/dist/index-fr0wbhdn.js +43 -0
- package/dist/{index-mc22ayvf.js → index-ghc9f0n7.js} +11 -9
- package/dist/{index-fzbvakh0.js → index-jcbd3znx.js} +3 -3
- package/dist/{index-5a2r0p9f.js → index-k1xb52kd.js} +20 -13
- package/dist/index-k9nnwad5.js +3532 -0
- package/dist/{index-wx8a6bw3.js → index-kb9nn0a0.js} +270 -53
- package/dist/index-knh4y330.js +566 -0
- package/dist/{v2/server-fq7kq32k.js → index-mfkzp7qj.js} +1 -16
- package/dist/{index-gg8j07zz.js → index-mmyh6d8f.js} +4 -4
- package/dist/index-pavzsdc6.js +17 -0
- package/dist/{index-0c82743p.js → index-pdecwzrd.js} +17 -15
- package/dist/index-pg50n748.js +1060 -0
- package/dist/{index-92bp57hg.js → index-q2tqeqde.js} +123 -80
- package/dist/{index-rrrsepyw.js → index-q7h7csab.js} +90 -85
- package/dist/{v2/server-yr3zj7e7.js → index-qt1qqasc.js} +6 -7
- package/dist/{index-6wkcswft.js → index-ty64eqcn.js} +28 -18
- package/dist/{index-adwfkpex.js → index-yq8n9qcb.js} +23 -23
- package/dist/{index-9pk9exrb.js → index-z8e0psj8.js} +18 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +586 -344
- package/dist/logger-d3wex3dz.js +20 -0
- package/dist/message-index-bounded-7ezbgddp.js +124 -0
- package/dist/{v2/message-time-backfill-1f9tzvcs.js → message-time-backfill-brbd63hv.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 +1 -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-7qzptcw7.js +88 -0
- package/dist/raw-ordinal-warmup-worker.js +60 -0
- package/dist/{read-session-chunk-4jey7hpt.js → read-session-chunk-6k83m4fj.js} +15 -9
- package/dist/read-session-raw-3g9qy1xa.js +58 -0
- package/dist/recomp-orchestrator-d3fp1cy0.js +57 -0
- package/dist/{v2/safe-notification-target-eb1n1vfb.js → safe-notification-target-5ffqq32m.js} +4 -2
- package/dist/search-epax1ecv.js +45 -0
- package/dist/{v2/send-session-notification-c0wtscea.js → send-session-notification-erecz4y4.js} +10 -7
- 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/model-resolution.d.ts +2 -3
- package/dist/shared/model-resolution.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/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-d3b0v2ss.js +131 -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-search/tools.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-spcy2qre.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-sf98kstd.js} +3737 -3004
- package/dist/v2/{derive-budgets-nc9avxz8.js → derive-budgets-3vc0y84t.js} +4 -3
- package/dist/v2/embedding-activity-g1dhes6g.js +10 -0
- package/dist/v2/embedding-backfill-vn8g1nh1.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/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 +1 -2
- package/dist/v2/hooks/dream-trigger.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-mxd0ym09.js +19 -0
- package/dist/v2/message-index-bounded-dy3s2k1e.js +123 -0
- package/dist/{message-time-backfill-r5epkzj3.js → v2/message-time-backfill-gtx1pwk1.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-1tgba5dv.js +86 -0
- package/dist/v2/raw-ordinal-warmup-worker.js +60 -0
- package/dist/v2/{read-session-chunk-gyyv7w2r.js → read-session-chunk-rh4khdkv.js} +14 -8
- package/dist/v2/read-session-raw-bsbmf0vj.js +57 -0
- package/dist/v2/recomp-orchestrator-az61rfcg.js +57 -0
- package/dist/{safe-notification-target-43r8jsxw.js → v2/safe-notification-target-73ax1p5v.js} +3 -3
- package/dist/v2/search-nzkwrc6n.js +45 -0
- package/dist/{send-session-notification-0m68ms3n.js → v2/send-session-notification-6km439kn.js} +9 -8
- package/dist/{index-5eqk6z3s.js → v2/server-1r6pmz4f.js} +301 -27
- package/dist/v2/server-2bvekkfy.js +11 -0
- package/dist/v2/server-2fbhp79z.js +3205 -0
- package/dist/v2/{server-ajzeteqw.js → server-2ra6pwf3.js} +1 -18
- package/dist/v2/server-4dhv7mqz.js +131 -0
- package/dist/v2/{server-y10vbq6y.js → server-4k748ke6.js} +11 -1053
- package/dist/v2/{server-vs5gpnd4.js → server-52awr2mw.js} +81 -145
- package/dist/v2/{server-1qbnzc80.js → server-5m3dt5r1.js} +136 -148
- package/dist/v2/server-686jg6eb.js +3508 -0
- package/dist/v2/server-7jzrrxap.js +931 -0
- package/dist/v2/server-7wwc2nga.js +3023 -0
- package/dist/v2/server-8ajstryz.js +18 -0
- package/dist/v2/{server-sfpzqvdz.js → server-8cd2j99z.js} +2 -3
- package/dist/v2/{server-d0sraw7m.js → server-8pyt7hev.js} +291 -286
- package/dist/v2/server-8tqanswc.js +984 -0
- package/dist/v2/{server-14vq4kpm.js → server-aan4q8mx.js} +3 -3
- package/dist/v2/server-d9vfe7xq.js +16 -0
- package/dist/{index-x3kwrmqk.js → v2/server-e0vdaae2.js} +35 -792
- package/dist/v2/server-ezhze64f.js +1048 -0
- package/dist/v2/server-fb3zxn06.js +13 -0
- package/dist/v2/server-fr0wbhdn.js +43 -0
- package/dist/v2/server-g5r0n3b6.js +1137 -0
- package/dist/v2/server-gjcr4w98.js +154 -0
- package/dist/v2/server-k228xhjg.js +171 -0
- package/dist/v2/{server-nf82q6pt.js → server-k8x2rbxc.js} +5946 -5602
- package/dist/v2/{server-wx8a6bw3.js → server-kb9nn0a0.js} +270 -53
- package/dist/{index-rrbbspwh.js → v2/server-mfkzp7qj.js} +1 -16
- package/dist/v2/server-pavzsdc6.js +17 -0
- package/dist/v2/{server-e0c1b7a7.js → server-psqc7e9n.js} +122 -79
- package/dist/{index-yr3zj7e7.js → v2/server-qt1qqasc.js} +6 -7
- package/dist/v2/server-qye6ykf7.js +120 -0
- package/dist/v2/{server-qdjnb2z1.js → server-r5p3b1wy.js} +11 -9
- package/dist/v2/server-sggvvzhb.js +759 -0
- package/dist/v2/{server-cpepxy2q.js → server-v06jcv0w.js} +14 -12
- package/dist/v2/server-vqpf3167.js +1048 -0
- package/dist/v2/{server-rz514f14.js → server-x2g40a71.js} +2044 -2060
- package/dist/v2/{server-vd4e7174.js → server-xdfwt6kh.js} +20 -16
- package/dist/v2/{server-efhwzx05.js → server-xxm59eww.js} +23 -23
- package/dist/v2/server-yczc713m.js +564 -0
- package/dist/v2/{server-fcdehk1s.js → server-z2037m6z.js} +4 -4
- package/dist/v2/{server-50hvkg3v.js → server-zm570tr2.js} +160 -158
- package/dist/v2/{server-6r257mf5.js → server-zxhgvsf9.js} +3 -3
- 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-w4tv77sn.js +130 -0
- package/dist/v2/store-reader.d.ts +16 -0
- 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-mz7efs7w.js} +51 -30
- package/dist/wrapup-orchestrator-amzta1t4.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/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/model-resolution.test.ts +54 -17
- package/src/shared/model-resolution.ts +6 -17
- 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/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
|
@@ -1,25 +1,31 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
2
|
+
harnessOwnsOpenCodeStore2
|
|
3
|
+
} from "./server-pavzsdc6.js";
|
|
4
|
+
import {
|
|
3
5
|
getMagicContextStorageDir,
|
|
4
6
|
getLegacyOpenCodeMagicContextStorageDir,
|
|
5
7
|
sanitizeDiagnosticText,
|
|
6
8
|
importPluginModule,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
} from "./server-
|
|
9
|
+
writeForwardedLogLine2,
|
|
10
|
+
log2
|
|
11
|
+
} from "./server-5m3dt5r1.js";
|
|
10
12
|
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
} from "./server-
|
|
13
|
+
registerSlowWriteReporter2,
|
|
14
|
+
registerSqliteDiagnosticSink2,
|
|
15
|
+
detectSqliteRuntime2,
|
|
16
|
+
Database2,
|
|
17
|
+
withSqliteBackgroundWriter2,
|
|
18
|
+
withoutSqliteTransformPass2,
|
|
19
|
+
isTransientSqliteError2,
|
|
20
|
+
withPrivilegedWriter2
|
|
21
|
+
} from "./server-kb9nn0a0.js";
|
|
22
|
+
import {
|
|
23
|
+
configureContextDatabasePragmas2
|
|
24
|
+
} from "./server-fb3zxn06.js";
|
|
25
|
+
import {
|
|
26
|
+
startMessageFtsRowidMapBackfill
|
|
27
|
+
} from "./server-k228xhjg.js";
|
|
20
28
|
import {
|
|
21
|
-
canonicalProjectDirectory,
|
|
22
|
-
startMessageFtsRowidMapBackfill,
|
|
23
29
|
LKG_SLOT_CHUNKS_DDL,
|
|
24
30
|
SESSION_REPLAY_DECISIONS_DDL,
|
|
25
31
|
LKG_SLOTS_DDL,
|
|
@@ -27,21 +33,26 @@ import {
|
|
|
27
33
|
FORK_MIGRATION_VERSION_FLOOR,
|
|
28
34
|
hasPendingMigrations,
|
|
29
35
|
getMainThreadMigrationBodyCount,
|
|
30
|
-
runMigrations
|
|
31
|
-
|
|
32
|
-
scheduleAfterBootQuiet
|
|
33
|
-
} from "./server-njt3np1k.js";
|
|
36
|
+
runMigrations
|
|
37
|
+
} from "./server-e0vdaae2.js";
|
|
34
38
|
import {
|
|
35
39
|
ensureColumn,
|
|
36
40
|
installV95PerfSchema,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
} from "./server-vs5gpnd4.js";
|
|
41
|
+
installTagIdentityRevisionTrigger
|
|
42
|
+
} from "./server-52awr2mw.js";
|
|
40
43
|
import {
|
|
41
|
-
closeQuietly,
|
|
42
44
|
resolveOpenCodeDbPath,
|
|
43
45
|
hasV1MessageTables
|
|
44
|
-
} from "./server-
|
|
46
|
+
} from "./server-2ra6pwf3.js";
|
|
47
|
+
import {
|
|
48
|
+
canonicalProjectDirectory,
|
|
49
|
+
bootQuietRemainingMs,
|
|
50
|
+
scheduleAfterBootQuiet
|
|
51
|
+
} from "./server-yczc713m.js";
|
|
52
|
+
import {
|
|
53
|
+
setDatabase,
|
|
54
|
+
loadToolDefinitionMeasurements
|
|
55
|
+
} from "./server-qye6ykf7.js";
|
|
45
56
|
import {
|
|
46
57
|
getErrorMessage
|
|
47
58
|
} from "./server-y8v6yerm.js";
|
|
@@ -53,213 +64,12 @@ import {
|
|
|
53
64
|
copyStorageTreeSync,
|
|
54
65
|
tightenStorageTreeSync
|
|
55
66
|
} from "./server-1bc61ans.js";
|
|
67
|
+
import {
|
|
68
|
+
closeQuietly
|
|
69
|
+
} from "./server-8ajstryz.js";
|
|
56
70
|
import {
|
|
57
71
|
logSlowWriteTransaction
|
|
58
|
-
} from "./server-
|
|
59
|
-
|
|
60
|
-
// src/features/magic-context/fail-closed-block.ts
|
|
61
|
-
var FAIL_CLOSED_DOCTOR_COMMAND = "npx @cortexkit/magic-context@latest doctor";
|
|
62
|
-
function attachFailClosedBlockingProcessEvidence(process2, evidence) {
|
|
63
|
-
Object.defineProperties(process2, {
|
|
64
|
-
startTime: { configurable: true, value: evidence.startTime },
|
|
65
|
-
commandLine: { configurable: true, value: evidence.commandLine }
|
|
66
|
-
});
|
|
67
|
-
return process2;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
class FailClosedBlockingError extends Error {
|
|
71
|
-
code = "FAIL_CLOSED_BLOCKING";
|
|
72
|
-
reason;
|
|
73
|
-
constructor(message, reason, options) {
|
|
74
|
-
super(message, options);
|
|
75
|
-
this.name = "FailClosedBlockingError";
|
|
76
|
-
this.reason = reason;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
var OPENCODE_INTERNAL_AGENT_NAMES = new Set(["title", "summary", "compaction"]);
|
|
80
|
-
function isMagicContextHiddenAgentName(agent) {
|
|
81
|
-
if (agent === "smart-note-compiler" || agent.startsWith("smart-note-")) {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
if (agent === "historian" || agent.startsWith("historian-"))
|
|
85
|
-
return true;
|
|
86
|
-
if (agent === "dreamer" || agent.startsWith("dreamer-"))
|
|
87
|
-
return true;
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
var MAX_FORMATTED_BLOCKING_PROCESSES = 8;
|
|
91
|
-
var MAX_FORMATTED_COMMAND_LINE_LENGTH = 80;
|
|
92
|
-
function normalizeFailClosedProcessKind(process2) {
|
|
93
|
-
switch (process2.kind) {
|
|
94
|
-
case "OpenCode server":
|
|
95
|
-
case "OpenCode instance (TUI/CLI)":
|
|
96
|
-
case "Pi":
|
|
97
|
-
case "process":
|
|
98
|
-
return process2.kind;
|
|
99
|
-
}
|
|
100
|
-
switch (process2.harness?.trim().toLowerCase()) {
|
|
101
|
-
case "opencode server":
|
|
102
|
-
return "OpenCode server";
|
|
103
|
-
case "opencode instance (tui/cli)":
|
|
104
|
-
case "opencode instance":
|
|
105
|
-
return "OpenCode instance (TUI/CLI)";
|
|
106
|
-
case "pi":
|
|
107
|
-
case "pi harness":
|
|
108
|
-
case "omp":
|
|
109
|
-
return "Pi";
|
|
110
|
-
default:
|
|
111
|
-
return "process";
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
function formatFailClosedProcessStartTime(startTime) {
|
|
115
|
-
if (!Number.isFinite(startTime) || startTime <= 0)
|
|
116
|
-
return "unverified";
|
|
117
|
-
try {
|
|
118
|
-
const parts = new Intl.DateTimeFormat("en-US", {
|
|
119
|
-
day: "numeric",
|
|
120
|
-
hour: "2-digit",
|
|
121
|
-
minute: "2-digit",
|
|
122
|
-
month: "short",
|
|
123
|
-
hour12: false
|
|
124
|
-
}).formatToParts(new Date(startTime));
|
|
125
|
-
const values = Object.fromEntries(parts.map(({ type, value }) => [type, value]));
|
|
126
|
-
if (!values.month || !values.day || !values.hour || !values.minute)
|
|
127
|
-
return "unverified";
|
|
128
|
-
return `${values.month} ${values.day} ${values.hour}:${values.minute}`;
|
|
129
|
-
} catch {
|
|
130
|
-
return "unverified";
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
function formatFailClosedCommandLine(commandLine) {
|
|
134
|
-
if (typeof commandLine !== "string" || commandLine.trim().length === 0)
|
|
135
|
-
return "unverified";
|
|
136
|
-
try {
|
|
137
|
-
const normalized = commandLine.replaceAll("\x00", " ").replace(/\s+/g, " ").trim();
|
|
138
|
-
if (normalized.length === 0)
|
|
139
|
-
return "unverified";
|
|
140
|
-
const sanitized = sanitizeDiagnosticText(normalized).trim();
|
|
141
|
-
if (sanitized.length === 0)
|
|
142
|
-
return "unverified";
|
|
143
|
-
return sanitized.length > MAX_FORMATTED_COMMAND_LINE_LENGTH ? `${sanitized.slice(0, MAX_FORMATTED_COMMAND_LINE_LENGTH - 3)}...` : sanitized;
|
|
144
|
-
} catch {
|
|
145
|
-
return "unverified";
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
function formatFailClosedBlockingProcesses(processes) {
|
|
149
|
-
const uniqueProcesses = new Map;
|
|
150
|
-
for (const process2 of processes) {
|
|
151
|
-
if (!Number.isInteger(process2.pid) || process2.pid <= 0)
|
|
152
|
-
continue;
|
|
153
|
-
const candidate = {
|
|
154
|
-
kind: normalizeFailClosedProcessKind(process2),
|
|
155
|
-
pid: process2.pid,
|
|
156
|
-
startTime: process2.startTime,
|
|
157
|
-
commandLine: process2.commandLine
|
|
158
|
-
};
|
|
159
|
-
const previous = uniqueProcesses.get(process2.pid);
|
|
160
|
-
if (!previous || previous.kind === "process" && candidate.kind !== "process") {
|
|
161
|
-
uniqueProcesses.set(process2.pid, candidate);
|
|
162
|
-
} else {
|
|
163
|
-
uniqueProcesses.set(process2.pid, {
|
|
164
|
-
...previous,
|
|
165
|
-
startTime: previous.startTime ?? candidate.startTime,
|
|
166
|
-
commandLine: previous.commandLine ?? candidate.commandLine
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
const entries = [...uniqueProcesses.values()];
|
|
171
|
-
const visible = entries.slice(0, MAX_FORMATTED_BLOCKING_PROCESSES);
|
|
172
|
-
const rendered = visible.map(({ kind, pid }) => `${kind} (PID ${pid})`);
|
|
173
|
-
const omitted = entries.length - visible.length;
|
|
174
|
-
if (omitted > 0)
|
|
175
|
-
rendered.push(`${omitted} more blocking process(es)`);
|
|
176
|
-
if (rendered.length === 0)
|
|
177
|
-
return "a live process";
|
|
178
|
-
const summary = rendered.length === 1 ? rendered[0] : `${rendered.slice(0, -1).join(", ")}, and ${rendered.at(-1)}`;
|
|
179
|
-
const evidence = entries.map(({ kind, pid, startTime, commandLine }) => `- PID ${pid}: ${kind}, started ${formatFailClosedProcessStartTime(startTime)}, cmd: ${formatFailClosedCommandLine(commandLine)}`).join(`
|
|
180
|
-
`);
|
|
181
|
-
return `${summary}
|
|
182
|
-
Blocking process evidence:
|
|
183
|
-
${evidence}`;
|
|
184
|
-
}
|
|
185
|
-
function formatFailClosedBlockingMessage(reason) {
|
|
186
|
-
if (reason.kind === "migration_guard") {
|
|
187
|
-
if (reason.unreadableFile) {
|
|
188
|
-
const arm = reason.unreadableArm ?? "io";
|
|
189
|
-
const recovery = arm === "io" ? `If none of these processes are running, it is safe to delete ${reason.unreadableFile} and retry.` : `The file may be a recent incomplete write; retry after the file is older than the ten-minute grace window, or stop the relevant process before deleting it.`;
|
|
190
|
-
return [
|
|
191
|
-
`Magic Context cannot migrate the shared database because RPC discovery file ${reason.unreadableFile} is uncertain (${arm} arm), so the absence of a live process cannot be proven.`,
|
|
192
|
-
recovery,
|
|
193
|
-
`Recovery: ${FAIL_CLOSED_DOCTOR_COMMAND}`
|
|
194
|
-
].join(" ");
|
|
195
|
-
}
|
|
196
|
-
return [
|
|
197
|
-
`Magic Context cannot migrate the shared database (one database serves every project on this machine) because ${formatFailClosedBlockingProcesses(reason.blockingProcesses)} may be running an older Magic Context build that would fail against the migrated database.`,
|
|
198
|
-
`The database is at upstream migration v${reason.persistedVersion}; this build needs v${reason.supportedVersion}.`,
|
|
199
|
-
"Restart the blocking process — even one from a different project — and it will pick up the new build and migrate on start; or shut it down and retry.",
|
|
200
|
-
"If that host loads a pinned or cached older Magic Context build, a restart alone is not enough: stop it or update its Magic Context build, then start this host once so it migrates the database with nothing older attached.",
|
|
201
|
-
`Recovery: ${FAIL_CLOSED_DOCTOR_COMMAND}`
|
|
202
|
-
].join(" ");
|
|
203
|
-
}
|
|
204
|
-
if (reason.kind === "schema_fence") {
|
|
205
|
-
return [
|
|
206
|
-
`Magic Context cannot operate: this Magic Context build is older than the database; upgrade/restart this harness (upstream migration lane v${reason.persistedVersion}, build supports through v${reason.supportedVersion}).`,
|
|
207
|
-
`Recovery: ${FAIL_CLOSED_DOCTOR_COMMAND}`
|
|
208
|
-
].join(" ");
|
|
209
|
-
}
|
|
210
|
-
const cause = reason.cause.trim().length > 0 ? reason.cause.trim() : "unknown storage error";
|
|
211
|
-
return [
|
|
212
|
-
`Magic Context cannot operate: persistent storage failed (${cause}).`,
|
|
213
|
-
"The plugin will not silently degrade to native compaction while enabled.",
|
|
214
|
-
`Recovery: ${FAIL_CLOSED_DOCTOR_COMMAND}`
|
|
215
|
-
].join(" ");
|
|
216
|
-
}
|
|
217
|
-
function formatFailClosedBlockingSummary(reason) {
|
|
218
|
-
if (reason.kind === "migration_guard") {
|
|
219
|
-
if (reason.unreadableFile) {
|
|
220
|
-
return `Magic Context cannot migrate the shared database from v${reason.persistedVersion} to v${reason.supportedVersion}: RPC discovery file ${reason.unreadableFile} could not be read, so an older host may still be attached.`;
|
|
221
|
-
}
|
|
222
|
-
const blockers = reason.blockingProcesses.filter((process2) => Number.isInteger(process2.pid) && process2.pid > 0).map((process2) => `${normalizeFailClosedProcessKind(process2)} (PID ${process2.pid})`);
|
|
223
|
-
const named = blockers.length > 0 ? blockers.join(", ") : "a live process";
|
|
224
|
-
return `Magic Context cannot migrate the shared database from v${reason.persistedVersion} to v${reason.supportedVersion} while ${named} may still run an older Magic Context build. Stop or update that host, then start this one once.`;
|
|
225
|
-
}
|
|
226
|
-
if (reason.kind === "schema_fence") {
|
|
227
|
-
return `Magic Context cannot operate: the shared database is at v${reason.persistedVersion}, newer than this build supports (v${reason.supportedVersion}). Update and restart this host.`;
|
|
228
|
-
}
|
|
229
|
-
const cause = reason.cause.trim().length > 0 ? reason.cause.trim() : "unknown storage error";
|
|
230
|
-
return `Magic Context cannot operate: persistent storage failed (${cause}).`;
|
|
231
|
-
}
|
|
232
|
-
function createFailClosedBlockingError(reason, options) {
|
|
233
|
-
return new FailClosedBlockingError(formatFailClosedBlockingMessage(reason), reason, options);
|
|
234
|
-
}
|
|
235
|
-
function isFailClosedBlockingError(error) {
|
|
236
|
-
return error instanceof FailClosedBlockingError || typeof error === "object" && error !== null && error.name === "FailClosedBlockingError" && error.code === "FAIL_CLOSED_BLOCKING";
|
|
237
|
-
}
|
|
238
|
-
function shouldBypassFailClosedBlock(input) {
|
|
239
|
-
if (input.isPiSubagentEnv === true)
|
|
240
|
-
return true;
|
|
241
|
-
if (input.isInternalChildSession === true)
|
|
242
|
-
return true;
|
|
243
|
-
const agent = typeof input.agent === "string" ? input.agent.trim() : "";
|
|
244
|
-
if (agent.length === 0)
|
|
245
|
-
return false;
|
|
246
|
-
if (OPENCODE_INTERNAL_AGENT_NAMES.has(agent))
|
|
247
|
-
return true;
|
|
248
|
-
if (isMagicContextHiddenAgentName(agent))
|
|
249
|
-
return true;
|
|
250
|
-
return false;
|
|
251
|
-
}
|
|
252
|
-
function resolveAgentNameFromMessages(messages) {
|
|
253
|
-
for (let i = messages.length - 1;i >= 0; i -= 1) {
|
|
254
|
-
const info = messages[i]?.info;
|
|
255
|
-
if (!info || typeof info !== "object")
|
|
256
|
-
continue;
|
|
257
|
-
const agent = info.agent;
|
|
258
|
-
if (typeof agent === "string" && agent.length > 0)
|
|
259
|
-
return agent;
|
|
260
|
-
}
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
72
|
+
} from "./server-aan4q8mx.js";
|
|
263
73
|
|
|
264
74
|
// src/features/magic-context/storage-db.ts
|
|
265
75
|
import {
|
|
@@ -815,7 +625,7 @@ function classifyLivePiSnapshot(snapshot, probeParents = true) {
|
|
|
815
625
|
continue;
|
|
816
626
|
if (ancestors.has(fact.pid)) {
|
|
817
627
|
skippedAncestorPids.push(fact.pid);
|
|
818
|
-
|
|
628
|
+
log2(`[magic-context] Pi process scan: skipping ancestor PID ${fact.pid} (session launcher shim)`);
|
|
819
629
|
continue;
|
|
820
630
|
}
|
|
821
631
|
if (commandHasPiHarnessArc(command)) {
|
|
@@ -823,7 +633,7 @@ function classifyLivePiSnapshot(snapshot, probeParents = true) {
|
|
|
823
633
|
continue;
|
|
824
634
|
}
|
|
825
635
|
inconclusivePids.add(fact.pid);
|
|
826
|
-
|
|
636
|
+
log2(`[magic-context] Pi process scan: PID ${fact.pid} command line is ambiguous (image-name or missing Pi/OMP arc); treating as inconclusive`);
|
|
827
637
|
}
|
|
828
638
|
skippedAncestorPids.sort((left, right) => left - right);
|
|
829
639
|
const verified = [...processIds].sort((left, right) => left - right);
|
|
@@ -997,18 +807,6 @@ function inspectWindowsProcessesSync() {
|
|
|
997
807
|
};
|
|
998
808
|
}
|
|
999
809
|
|
|
1000
|
-
// src/shared/sqlite-context-pragmas.ts
|
|
1001
|
-
function configureContextDatabasePragmas(db, readonly = false) {
|
|
1002
|
-
const [row] = db.prepare(readonly ? "PRAGMA journal_mode" : "PRAGMA journal_mode=WAL").all();
|
|
1003
|
-
const mode = row?.journal_mode?.toLowerCase();
|
|
1004
|
-
if (mode === "memory" || readonly && mode !== "wal")
|
|
1005
|
-
return;
|
|
1006
|
-
if (mode !== "wal") {
|
|
1007
|
-
throw new Error(`context.db requires WAL before synchronous=NORMAL (got ${mode ?? "unknown"})`);
|
|
1008
|
-
}
|
|
1009
|
-
db.exec("PRAGMA synchronous=NORMAL");
|
|
1010
|
-
}
|
|
1011
|
-
|
|
1012
810
|
// src/features/magic-context/context-store-uuid.ts
|
|
1013
811
|
import { randomUUID } from "node:crypto";
|
|
1014
812
|
function getContextStoreUuid(db) {
|
|
@@ -1020,7 +818,7 @@ function ensureContextStoreUuid(db) {
|
|
|
1020
818
|
if (existing)
|
|
1021
819
|
return existing;
|
|
1022
820
|
const minted = randomUUID();
|
|
1023
|
-
|
|
821
|
+
withPrivilegedWriter2(db, () => {
|
|
1024
822
|
db.transaction(() => {
|
|
1025
823
|
db.prepare("INSERT INTO context_store_meta(key, value) VALUES ('store_uuid', ?) ON CONFLICT(key) DO NOTHING").run(minted);
|
|
1026
824
|
}).immediate();
|
|
@@ -1028,6 +826,210 @@ function ensureContextStoreUuid(db) {
|
|
|
1028
826
|
return getContextStoreUuid(db) ?? minted;
|
|
1029
827
|
}
|
|
1030
828
|
|
|
829
|
+
// src/features/magic-context/fail-closed-block.ts
|
|
830
|
+
var FAIL_CLOSED_DOCTOR_COMMAND = "npx @cortexkit/magic-context@latest doctor";
|
|
831
|
+
function attachFailClosedBlockingProcessEvidence(process2, evidence) {
|
|
832
|
+
Object.defineProperties(process2, {
|
|
833
|
+
startTime: { configurable: true, value: evidence.startTime },
|
|
834
|
+
commandLine: { configurable: true, value: evidence.commandLine }
|
|
835
|
+
});
|
|
836
|
+
return process2;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
class FailClosedBlockingError extends Error {
|
|
840
|
+
code = "FAIL_CLOSED_BLOCKING";
|
|
841
|
+
reason;
|
|
842
|
+
constructor(message, reason, options) {
|
|
843
|
+
super(message, options);
|
|
844
|
+
this.name = "FailClosedBlockingError";
|
|
845
|
+
this.reason = reason;
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
var OPENCODE_INTERNAL_AGENT_NAMES = new Set(["title", "summary", "compaction"]);
|
|
849
|
+
function isMagicContextHiddenAgentName(agent) {
|
|
850
|
+
if (agent === "smart-note-compiler" || agent.startsWith("smart-note-")) {
|
|
851
|
+
return true;
|
|
852
|
+
}
|
|
853
|
+
if (agent === "historian" || agent.startsWith("historian-"))
|
|
854
|
+
return true;
|
|
855
|
+
if (agent === "dreamer" || agent.startsWith("dreamer-"))
|
|
856
|
+
return true;
|
|
857
|
+
return false;
|
|
858
|
+
}
|
|
859
|
+
var MAX_FORMATTED_BLOCKING_PROCESSES = 8;
|
|
860
|
+
var MAX_FORMATTED_COMMAND_LINE_LENGTH = 80;
|
|
861
|
+
function normalizeFailClosedProcessKind(process2) {
|
|
862
|
+
switch (process2.kind) {
|
|
863
|
+
case "OpenCode server":
|
|
864
|
+
case "OpenCode instance (TUI/CLI)":
|
|
865
|
+
case "Pi":
|
|
866
|
+
case "process":
|
|
867
|
+
return process2.kind;
|
|
868
|
+
}
|
|
869
|
+
switch (process2.harness?.trim().toLowerCase()) {
|
|
870
|
+
case "opencode server":
|
|
871
|
+
return "OpenCode server";
|
|
872
|
+
case "opencode instance (tui/cli)":
|
|
873
|
+
case "opencode instance":
|
|
874
|
+
return "OpenCode instance (TUI/CLI)";
|
|
875
|
+
case "pi":
|
|
876
|
+
case "pi harness":
|
|
877
|
+
case "omp":
|
|
878
|
+
return "Pi";
|
|
879
|
+
default:
|
|
880
|
+
return "process";
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
function formatFailClosedProcessStartTime(startTime) {
|
|
884
|
+
if (!Number.isFinite(startTime) || startTime <= 0)
|
|
885
|
+
return "unverified";
|
|
886
|
+
try {
|
|
887
|
+
const parts = new Intl.DateTimeFormat("en-US", {
|
|
888
|
+
day: "numeric",
|
|
889
|
+
hour: "2-digit",
|
|
890
|
+
minute: "2-digit",
|
|
891
|
+
month: "short",
|
|
892
|
+
hour12: false
|
|
893
|
+
}).formatToParts(new Date(startTime));
|
|
894
|
+
const values = Object.fromEntries(parts.map(({ type, value }) => [type, value]));
|
|
895
|
+
if (!values.month || !values.day || !values.hour || !values.minute)
|
|
896
|
+
return "unverified";
|
|
897
|
+
return `${values.month} ${values.day} ${values.hour}:${values.minute}`;
|
|
898
|
+
} catch {
|
|
899
|
+
return "unverified";
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
function formatFailClosedCommandLine(commandLine) {
|
|
903
|
+
if (typeof commandLine !== "string" || commandLine.trim().length === 0)
|
|
904
|
+
return "unverified";
|
|
905
|
+
try {
|
|
906
|
+
const normalized = commandLine.replaceAll("\x00", " ").replace(/\s+/g, " ").trim();
|
|
907
|
+
if (normalized.length === 0)
|
|
908
|
+
return "unverified";
|
|
909
|
+
const sanitized = sanitizeDiagnosticText(normalized).trim();
|
|
910
|
+
if (sanitized.length === 0)
|
|
911
|
+
return "unverified";
|
|
912
|
+
return sanitized.length > MAX_FORMATTED_COMMAND_LINE_LENGTH ? `${sanitized.slice(0, MAX_FORMATTED_COMMAND_LINE_LENGTH - 3)}...` : sanitized;
|
|
913
|
+
} catch {
|
|
914
|
+
return "unverified";
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
function formatFailClosedBlockingProcesses(processes) {
|
|
918
|
+
const uniqueProcesses = new Map;
|
|
919
|
+
for (const process2 of processes) {
|
|
920
|
+
if (!Number.isInteger(process2.pid) || process2.pid <= 0)
|
|
921
|
+
continue;
|
|
922
|
+
const candidate = {
|
|
923
|
+
kind: normalizeFailClosedProcessKind(process2),
|
|
924
|
+
pid: process2.pid,
|
|
925
|
+
startTime: process2.startTime,
|
|
926
|
+
commandLine: process2.commandLine
|
|
927
|
+
};
|
|
928
|
+
const previous = uniqueProcesses.get(process2.pid);
|
|
929
|
+
if (!previous || previous.kind === "process" && candidate.kind !== "process") {
|
|
930
|
+
uniqueProcesses.set(process2.pid, candidate);
|
|
931
|
+
} else {
|
|
932
|
+
uniqueProcesses.set(process2.pid, {
|
|
933
|
+
...previous,
|
|
934
|
+
startTime: previous.startTime ?? candidate.startTime,
|
|
935
|
+
commandLine: previous.commandLine ?? candidate.commandLine
|
|
936
|
+
});
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
const entries = [...uniqueProcesses.values()];
|
|
940
|
+
const visible = entries.slice(0, MAX_FORMATTED_BLOCKING_PROCESSES);
|
|
941
|
+
const rendered = visible.map(({ kind, pid }) => `${kind} (PID ${pid})`);
|
|
942
|
+
const omitted = entries.length - visible.length;
|
|
943
|
+
if (omitted > 0)
|
|
944
|
+
rendered.push(`${omitted} more blocking process(es)`);
|
|
945
|
+
if (rendered.length === 0)
|
|
946
|
+
return "a live process";
|
|
947
|
+
const summary = rendered.length === 1 ? rendered[0] : `${rendered.slice(0, -1).join(", ")}, and ${rendered.at(-1)}`;
|
|
948
|
+
const evidence = entries.map(({ kind, pid, startTime, commandLine }) => `- PID ${pid}: ${kind}, started ${formatFailClosedProcessStartTime(startTime)}, cmd: ${formatFailClosedCommandLine(commandLine)}`).join(`
|
|
949
|
+
`);
|
|
950
|
+
return `${summary}
|
|
951
|
+
Blocking process evidence:
|
|
952
|
+
${evidence}`;
|
|
953
|
+
}
|
|
954
|
+
function formatFailClosedBlockingMessage(reason) {
|
|
955
|
+
if (reason.kind === "migration_guard") {
|
|
956
|
+
if (reason.unreadableFile) {
|
|
957
|
+
const arm = reason.unreadableArm ?? "io";
|
|
958
|
+
const recovery = arm === "io" ? `If none of these processes are running, it is safe to delete ${reason.unreadableFile} and retry.` : `The file may be a recent incomplete write; retry after the file is older than the ten-minute grace window, or stop the relevant process before deleting it.`;
|
|
959
|
+
return [
|
|
960
|
+
`Magic Context cannot migrate the shared database because RPC discovery file ${reason.unreadableFile} is uncertain (${arm} arm), so the absence of a live process cannot be proven.`,
|
|
961
|
+
recovery,
|
|
962
|
+
`Recovery: ${FAIL_CLOSED_DOCTOR_COMMAND}`
|
|
963
|
+
].join(" ");
|
|
964
|
+
}
|
|
965
|
+
return [
|
|
966
|
+
`Magic Context cannot migrate the shared database (one database serves every project on this machine) because ${formatFailClosedBlockingProcesses(reason.blockingProcesses)} may be running an older Magic Context build that would fail against the migrated database.`,
|
|
967
|
+
`The database is at upstream migration v${reason.persistedVersion}; this build needs v${reason.supportedVersion}.`,
|
|
968
|
+
"Restart the blocking process — even one from a different project — and it will pick up the new build and migrate on start; or shut it down and retry.",
|
|
969
|
+
"If that host loads a pinned or cached older Magic Context build, a restart alone is not enough: stop it or update its Magic Context build, then start this host once so it migrates the database with nothing older attached.",
|
|
970
|
+
`Recovery: ${FAIL_CLOSED_DOCTOR_COMMAND}`
|
|
971
|
+
].join(" ");
|
|
972
|
+
}
|
|
973
|
+
if (reason.kind === "schema_fence") {
|
|
974
|
+
return [
|
|
975
|
+
`Magic Context cannot operate: this Magic Context build is older than the database; upgrade/restart this harness (upstream migration lane v${reason.persistedVersion}, build supports through v${reason.supportedVersion}).`,
|
|
976
|
+
`Recovery: ${FAIL_CLOSED_DOCTOR_COMMAND}`
|
|
977
|
+
].join(" ");
|
|
978
|
+
}
|
|
979
|
+
const cause = reason.cause.trim().length > 0 ? reason.cause.trim() : "unknown storage error";
|
|
980
|
+
return [
|
|
981
|
+
`Magic Context cannot operate: persistent storage failed (${cause}).`,
|
|
982
|
+
"The plugin will not silently degrade to native compaction while enabled.",
|
|
983
|
+
`Recovery: ${FAIL_CLOSED_DOCTOR_COMMAND}`
|
|
984
|
+
].join(" ");
|
|
985
|
+
}
|
|
986
|
+
function formatFailClosedBlockingSummary(reason) {
|
|
987
|
+
if (reason.kind === "migration_guard") {
|
|
988
|
+
if (reason.unreadableFile) {
|
|
989
|
+
return `Magic Context cannot migrate the shared database from v${reason.persistedVersion} to v${reason.supportedVersion}: RPC discovery file ${reason.unreadableFile} could not be read, so an older host may still be attached.`;
|
|
990
|
+
}
|
|
991
|
+
const blockers = reason.blockingProcesses.filter((process2) => Number.isInteger(process2.pid) && process2.pid > 0).map((process2) => `${normalizeFailClosedProcessKind(process2)} (PID ${process2.pid})`);
|
|
992
|
+
const named = blockers.length > 0 ? blockers.join(", ") : "a live process";
|
|
993
|
+
return `Magic Context cannot migrate the shared database from v${reason.persistedVersion} to v${reason.supportedVersion} while ${named} may still run an older Magic Context build. Stop or update that host, then start this one once.`;
|
|
994
|
+
}
|
|
995
|
+
if (reason.kind === "schema_fence") {
|
|
996
|
+
return `Magic Context cannot operate: the shared database is at v${reason.persistedVersion}, newer than this build supports (v${reason.supportedVersion}). Update and restart this host.`;
|
|
997
|
+
}
|
|
998
|
+
const cause = reason.cause.trim().length > 0 ? reason.cause.trim() : "unknown storage error";
|
|
999
|
+
return `Magic Context cannot operate: persistent storage failed (${cause}).`;
|
|
1000
|
+
}
|
|
1001
|
+
function createFailClosedBlockingError(reason, options) {
|
|
1002
|
+
return new FailClosedBlockingError(formatFailClosedBlockingMessage(reason), reason, options);
|
|
1003
|
+
}
|
|
1004
|
+
function isFailClosedBlockingError(error) {
|
|
1005
|
+
return error instanceof FailClosedBlockingError || typeof error === "object" && error !== null && error.name === "FailClosedBlockingError" && error.code === "FAIL_CLOSED_BLOCKING";
|
|
1006
|
+
}
|
|
1007
|
+
function shouldBypassFailClosedBlock(input) {
|
|
1008
|
+
if (input.isPiSubagentEnv === true)
|
|
1009
|
+
return true;
|
|
1010
|
+
if (input.isInternalChildSession === true)
|
|
1011
|
+
return true;
|
|
1012
|
+
const agent = typeof input.agent === "string" ? input.agent.trim() : "";
|
|
1013
|
+
if (agent.length === 0)
|
|
1014
|
+
return false;
|
|
1015
|
+
if (OPENCODE_INTERNAL_AGENT_NAMES.has(agent))
|
|
1016
|
+
return true;
|
|
1017
|
+
if (isMagicContextHiddenAgentName(agent))
|
|
1018
|
+
return true;
|
|
1019
|
+
return false;
|
|
1020
|
+
}
|
|
1021
|
+
function resolveAgentNameFromMessages(messages) {
|
|
1022
|
+
for (let i = messages.length - 1;i >= 0; i -= 1) {
|
|
1023
|
+
const info = messages[i]?.info;
|
|
1024
|
+
if (!info || typeof info !== "object")
|
|
1025
|
+
continue;
|
|
1026
|
+
const agent = info.agent;
|
|
1027
|
+
if (typeof agent === "string" && agent.length > 0)
|
|
1028
|
+
return agent;
|
|
1029
|
+
}
|
|
1030
|
+
return;
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1031
1033
|
// src/features/magic-context/migration-worker-client.ts
|
|
1032
1034
|
import { Worker } from "node:worker_threads";
|
|
1033
1035
|
|
|
@@ -1130,7 +1132,7 @@ function runMigrationsOffThread(data) {
|
|
|
1130
1132
|
reject(workerStartError(error instanceof Error ? error.message : String(error)));
|
|
1131
1133
|
return;
|
|
1132
1134
|
}
|
|
1133
|
-
|
|
1135
|
+
log2(`[migrations] applying pending migrations on a worker thread: ${data.dbPath}`);
|
|
1134
1136
|
let ready = false;
|
|
1135
1137
|
let settled = false;
|
|
1136
1138
|
let endBusy = beginOffThreadMigration();
|
|
@@ -1158,10 +1160,10 @@ function runMigrationsOffThread(data) {
|
|
|
1158
1160
|
switch (message.type) {
|
|
1159
1161
|
case "ready":
|
|
1160
1162
|
ready = true;
|
|
1161
|
-
|
|
1163
|
+
log2(`[migrations] migration worker ready: ${data.dbPath}`);
|
|
1162
1164
|
return;
|
|
1163
1165
|
case "log":
|
|
1164
|
-
|
|
1166
|
+
writeForwardedLogLine2(message.line);
|
|
1165
1167
|
return;
|
|
1166
1168
|
case "lock-wait":
|
|
1167
1169
|
if (!settled)
|
|
@@ -1242,7 +1244,7 @@ function runToolOwnerBackfill(db) {
|
|
|
1242
1244
|
}
|
|
1243
1245
|
const opencodeDbPath = resolveOpencodeDbPath();
|
|
1244
1246
|
if (!existsSync(opencodeDbPath)) {
|
|
1245
|
-
|
|
1247
|
+
log2(`[backfill] OpenCode DB not found at ${opencodeDbPath} — marking all unbackfilled sessions as skipped. Lazy adoption (defense-in-depth) handles legacy rows at runtime.`);
|
|
1246
1248
|
markAllUnbackfilledSessionsSkipped(db);
|
|
1247
1249
|
result.sessionsSkippedNoOcDb = countSessionsByStatus(db, "skipped");
|
|
1248
1250
|
result.durationMs = performance.now() - startedAt;
|
|
@@ -1259,11 +1261,11 @@ function runToolOwnerBackfill(db) {
|
|
|
1259
1261
|
try {
|
|
1260
1262
|
db.exec("DETACH DATABASE oc_backfill");
|
|
1261
1263
|
} catch (error) {
|
|
1262
|
-
|
|
1264
|
+
log2(`[backfill] failed to detach oc_backfill database: ${error instanceof Error ? error.message : String(error)}`);
|
|
1263
1265
|
}
|
|
1264
1266
|
}
|
|
1265
1267
|
result.durationMs = performance.now() - startedAt;
|
|
1266
|
-
|
|
1268
|
+
log2(`[backfill] sessions=${result.sessionsProcessed} completed=${result.sessionsCompleted} skipped_no_oc=${result.sessionsSkippedNoOcDb} skipped_no_matches=${result.sessionsSkippedNoMatches} blocked_by_lease=${result.sessionsBlockedByLease} errored=${result.sessionsErrored} rows_updated=${result.rowsUpdated} rows_left_null=${result.rowsLeftNull} duration_ms=${Math.round(result.durationMs)}`);
|
|
1267
1269
|
return result;
|
|
1268
1270
|
}
|
|
1269
1271
|
function isToolOwnerBackfillNeeded(db) {
|
|
@@ -1448,7 +1450,7 @@ function backfillToolOwnersInChunks(db, result) {
|
|
|
1448
1450
|
result.sessionsCompleted += 1;
|
|
1449
1451
|
}
|
|
1450
1452
|
} catch (error) {
|
|
1451
|
-
|
|
1453
|
+
log2(`[backfill] session=${sessionId} errored: ${error instanceof Error ? error.message : String(error)}`);
|
|
1452
1454
|
markSessionErrored(db, sessionId, error);
|
|
1453
1455
|
result.sessionsErrored += 1;
|
|
1454
1456
|
}
|
|
@@ -1461,8 +1463,8 @@ function backfillToolOwnersInChunks(db, result) {
|
|
|
1461
1463
|
}
|
|
1462
1464
|
|
|
1463
1465
|
// src/features/magic-context/storage-db.ts
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
+
registerSlowWriteReporter2(logSlowWriteTransaction);
|
|
1467
|
+
registerSqliteDiagnosticSink2((message) => log2(message));
|
|
1466
1468
|
var databases = new Map;
|
|
1467
1469
|
var pendingAsyncOpens = new Map;
|
|
1468
1470
|
var persistenceByDatabase = new WeakMap;
|
|
@@ -1487,7 +1489,7 @@ function ensureSecureStorageDir(dir) {
|
|
|
1487
1489
|
}
|
|
1488
1490
|
function tightenStorageTree(dir) {
|
|
1489
1491
|
const { failures } = tightenStorageTreeSync(dir);
|
|
1490
|
-
|
|
1492
|
+
log2(`[magic-context] storage permission tightening failures=${failures}`);
|
|
1491
1493
|
}
|
|
1492
1494
|
function resolveBootBusyTimeoutMs(value) {
|
|
1493
1495
|
if (value === undefined)
|
|
@@ -1496,9 +1498,9 @@ function resolveBootBusyTimeoutMs(value) {
|
|
|
1496
1498
|
return BOOT_SQLITE_BUSY_TIMEOUT_MS;
|
|
1497
1499
|
return Math.max(0, Math.min(BOOT_SQLITE_BUSY_TIMEOUT_MS, Math.floor(value)));
|
|
1498
1500
|
}
|
|
1499
|
-
function installBootBusyTimeout(db, dbPath, timeoutMs, report =
|
|
1501
|
+
function installBootBusyTimeout(db, dbPath, timeoutMs, report = log2) {
|
|
1500
1502
|
db.exec(`PRAGMA busy_timeout=${timeoutMs}`);
|
|
1501
|
-
report(`[magic-context] SQLite boot busy timeout: backend=${
|
|
1503
|
+
report(`[magic-context] SQLite boot busy timeout: backend=${detectSqliteRuntime2()} timeout=${timeoutMs}ms path=${dbPath}`);
|
|
1502
1504
|
}
|
|
1503
1505
|
function resolveDatabasePath(dbPathOverride) {
|
|
1504
1506
|
if (dbPathOverride) {
|
|
@@ -1518,18 +1520,18 @@ function migrateLegacyStorageIfNeeded(targetDbPath, targetDbDir) {
|
|
|
1518
1520
|
const legacyDbPath = join2(legacyDir, "context.db");
|
|
1519
1521
|
if (!existsSync2(legacyDbPath))
|
|
1520
1522
|
return;
|
|
1521
|
-
|
|
1523
|
+
log2(`[magic-context] migrating legacy plugin storage: ${legacyDir} -> ${targetDbDir} (legacy left in place as backup)`);
|
|
1522
1524
|
ensureSecureStorageDir(targetDbDir);
|
|
1523
1525
|
try {
|
|
1524
|
-
const legacyDb = new
|
|
1526
|
+
const legacyDb = new Database2(legacyDbPath);
|
|
1525
1527
|
try {
|
|
1526
|
-
|
|
1528
|
+
configureContextDatabasePragmas2(legacyDb, true);
|
|
1527
1529
|
legacyDb.exec("PRAGMA wal_checkpoint(TRUNCATE)");
|
|
1528
1530
|
} finally {
|
|
1529
1531
|
closeQuietly(legacyDb);
|
|
1530
1532
|
}
|
|
1531
1533
|
} catch (error) {
|
|
1532
|
-
|
|
1534
|
+
log2(`[magic-context] legacy WAL checkpoint before copy failed (continuing with sidecar copy): ${getErrorMessage(error)}`);
|
|
1533
1535
|
}
|
|
1534
1536
|
for (const suffix of ["", "-wal", "-shm"]) {
|
|
1535
1537
|
const src = `${legacyDbPath}${suffix}`;
|
|
@@ -1538,7 +1540,7 @@ function migrateLegacyStorageIfNeeded(targetDbPath, targetDbDir) {
|
|
|
1538
1540
|
try {
|
|
1539
1541
|
copyStorageFileSync(src, dst);
|
|
1540
1542
|
} catch (error) {
|
|
1541
|
-
|
|
1543
|
+
log2(`[magic-context] failed to copy ${src}:`, getErrorMessage(error));
|
|
1542
1544
|
}
|
|
1543
1545
|
}
|
|
1544
1546
|
}
|
|
@@ -1548,7 +1550,7 @@ function migrateLegacyStorageIfNeeded(targetDbPath, targetDbDir) {
|
|
|
1548
1550
|
try {
|
|
1549
1551
|
copyStorageTreeSync(legacyModelsDir, targetModelsDir);
|
|
1550
1552
|
} catch (error) {
|
|
1551
|
-
|
|
1553
|
+
log2("[magic-context] failed to copy embedding model cache:", getErrorMessage(error));
|
|
1552
1554
|
}
|
|
1553
1555
|
}
|
|
1554
1556
|
}
|
|
@@ -1583,7 +1585,7 @@ function enforceSchemaFence(db, dbPath, latestSupportedVersion) {
|
|
|
1583
1585
|
return true;
|
|
1584
1586
|
}
|
|
1585
1587
|
lastSchemaFenceRejection = { persistedVersion, supportedVersion: latestSupportedVersion };
|
|
1586
|
-
|
|
1588
|
+
log2(`[magic-context] storage fatal: refusing to open ${dbPath}; upstream migration lane v${persistedVersion} is newer than this binary supports (max v${latestSupportedVersion}). A pinned or stale plugin is likely sharing this database with a newer instance; update or unpin Magic Context with 'npx @cortexkit/magic-context@latest doctor --force', then restart.`);
|
|
1587
1589
|
return false;
|
|
1588
1590
|
}
|
|
1589
1591
|
function unreadableDiscovery(path, arm) {
|
|
@@ -1655,7 +1657,7 @@ function classifyJunkDiscovery(portFile, raw, staleFiles) {
|
|
|
1655
1657
|
}
|
|
1656
1658
|
staleFiles.push(portFile);
|
|
1657
1659
|
const reason = invalidDiscoveryReason(raw);
|
|
1658
|
-
|
|
1660
|
+
log2(`[magic-context] removing stale RPC discovery file ${portFile}: ${reason} record older than 10 minutes`);
|
|
1659
1661
|
return null;
|
|
1660
1662
|
}
|
|
1661
1663
|
function inspectRpcServerDiscovery(storageDir, processes, options) {
|
|
@@ -1800,12 +1802,12 @@ function formatInconclusivePiMigrationWarning(dbPath, pids) {
|
|
|
1800
1802
|
function logInconclusiveMigrationProbes(dbPath, discovery, piDiscovery) {
|
|
1801
1803
|
const uncertainPids = discovery.inconclusivePids ?? [];
|
|
1802
1804
|
if (uncertainPids.length > 0) {
|
|
1803
|
-
|
|
1805
|
+
log2(formatInconclusiveOpenCodeMigrationWarning(dbPath, uncertainPids));
|
|
1804
1806
|
}
|
|
1805
1807
|
if (piDiscovery.state === "unreadable") {
|
|
1806
|
-
|
|
1808
|
+
log2(`[magic-context] storage warning: continuing migration for ${dbPath}; the Pi/OMP process-list probe could not run, which commonly means an OS sandbox denied ps. No live Pi harness was confirmed.`);
|
|
1807
1809
|
} else if ((piDiscovery.inconclusivePids?.length ?? 0) > 0) {
|
|
1808
|
-
|
|
1810
|
+
log2(formatInconclusivePiMigrationWarning(dbPath, piDiscovery.inconclusivePids ?? []));
|
|
1809
1811
|
}
|
|
1810
1812
|
}
|
|
1811
1813
|
function isDefaultSharedDatabasePath(dbPath) {
|
|
@@ -1867,9 +1869,9 @@ function enforceMigrationOnOpenGuard(db, dbPath, dbDir, latestSupportedVersion,
|
|
|
1867
1869
|
const unreadableFile = discovery.unreadableFile ?? "<unknown>";
|
|
1868
1870
|
const arm = discovery.unreadableArm ?? "io";
|
|
1869
1871
|
const recovery = arm === "io" ? `If no OpenCode server is running, it is safe to delete ${unreadableFile} and retry.` : `Retry after the file is older than the ten-minute grace window, or stop OpenCode before deleting it.`;
|
|
1870
|
-
|
|
1872
|
+
log2(`[magic-context] storage fatal: refusing to migrate ${dbPath} from upstream migration v${persistedVersion} to v${latestSupportedVersion} because RPC discovery file ${unreadableFile} is uncertain (${arm} arm), so the absence of a live OpenCode server cannot be proven. ${recovery}`);
|
|
1871
1873
|
} else {
|
|
1872
|
-
|
|
1874
|
+
log2(formatLiveProcessMigrationRefusal(dbPath, persistedVersion, latestSupportedVersion, discovery.serverPids, piPids));
|
|
1873
1875
|
}
|
|
1874
1876
|
return false;
|
|
1875
1877
|
}
|
|
@@ -1898,34 +1900,34 @@ function finishDatabaseOpen(db, dbPath, explicitDbPath, latestSupportedVersion)
|
|
|
1898
1900
|
}
|
|
1899
1901
|
healWedgedChannel2Claims(db);
|
|
1900
1902
|
if (!explicitDbPath) {
|
|
1901
|
-
const readsOpenCodeStore =
|
|
1903
|
+
const readsOpenCodeStore = harnessOwnsOpenCodeStore2();
|
|
1902
1904
|
let busyRetryMs = 100;
|
|
1903
|
-
const runBackfills = () =>
|
|
1905
|
+
const runBackfills = () => withoutSqliteTransformPass2(() => withSqliteBackgroundWriter2(() => {
|
|
1904
1906
|
if (readsOpenCodeStore) {
|
|
1905
1907
|
try {
|
|
1906
1908
|
runToolOwnerBackfill(db);
|
|
1907
1909
|
} catch (error) {
|
|
1908
|
-
|
|
1910
|
+
log2(`[magic-context] tool-owner backfill failed (continuing with lazy adoption fallback): ${getErrorMessage(error)}`);
|
|
1909
1911
|
}
|
|
1910
1912
|
}
|
|
1911
1913
|
startMessageFtsRowidMapBackfill(db).then(async () => {
|
|
1912
1914
|
if (!readsOpenCodeStore)
|
|
1913
1915
|
return;
|
|
1914
|
-
const { readRawSessionMessagePage, readRawSessionMessages } = await importPluginModule(() => import("./read-session-chunk-
|
|
1915
|
-
const { startMessageTimeBackfill } = await importPluginModule(() => import("./message-time-backfill-
|
|
1916
|
+
const { readRawSessionMessagePage, readRawSessionMessages } = await importPluginModule(() => import("./read-session-chunk-rh4khdkv.js"));
|
|
1917
|
+
const { startMessageTimeBackfill } = await importPluginModule(() => import("./message-time-backfill-gtx1pwk1.js"));
|
|
1916
1918
|
await startMessageTimeBackfill(db, Object.assign(readRawSessionMessages, {
|
|
1917
1919
|
readPage: readRawSessionMessagePage
|
|
1918
1920
|
}));
|
|
1919
1921
|
}).catch((error) => {
|
|
1920
|
-
if (
|
|
1921
|
-
|
|
1922
|
+
if (isTransientSqliteError2(error)) {
|
|
1923
|
+
withoutSqliteTransformPass2(() => {
|
|
1922
1924
|
const timer = setTimeout(runBackfills, busyRetryMs);
|
|
1923
1925
|
timer.unref();
|
|
1924
1926
|
});
|
|
1925
1927
|
busyRetryMs = Math.min(30000, busyRetryMs * 2);
|
|
1926
1928
|
return;
|
|
1927
1929
|
}
|
|
1928
|
-
|
|
1930
|
+
log2(`[magic-context] message-index backfill failed (will resume next startup): ${getErrorMessage(error)}`);
|
|
1929
1931
|
});
|
|
1930
1932
|
}));
|
|
1931
1933
|
if (bootQuietRemainingMs() > 0)
|
|
@@ -1941,14 +1943,14 @@ function finishDatabaseOpen(db, dbPath, explicitDbPath, latestSupportedVersion)
|
|
|
1941
1943
|
persistenceByDatabase.set(db, true);
|
|
1942
1944
|
persistenceErrorByDatabase.delete(db);
|
|
1943
1945
|
if (!explicitDbPath) {
|
|
1944
|
-
|
|
1946
|
+
log2(formatSchemaFenceBootLog(getPersistedSchemaVersion(db), latestSupportedVersion));
|
|
1945
1947
|
}
|
|
1946
1948
|
return db;
|
|
1947
1949
|
}
|
|
1948
1950
|
function initializeDatabase(db, busyTimeoutMs = BOOT_SQLITE_BUSY_TIMEOUT_MS) {
|
|
1949
1951
|
db.exec(`PRAGMA busy_timeout=${resolveBootBusyTimeoutMs(busyTimeoutMs)}`);
|
|
1950
1952
|
db.exec("PRAGMA foreign_keys=ON");
|
|
1951
|
-
|
|
1953
|
+
configureContextDatabasePragmas2(db);
|
|
1952
1954
|
applySqliteTuningPragmas(db);
|
|
1953
1955
|
db.exec(`
|
|
1954
1956
|
CREATE TABLE IF NOT EXISTS tags (
|
|
@@ -3182,6 +3184,7 @@ CREATE INDEX IF NOT EXISTS idx_dream_queue_pending ON dream_queue(started_at, en
|
|
|
3182
3184
|
const version = getPersistedSchemaVersion(db);
|
|
3183
3185
|
if (version === 0 || version >= 95)
|
|
3184
3186
|
installV95PerfSchema(db, false, version === 0);
|
|
3187
|
+
installTagIdentityRevisionTrigger(db);
|
|
3185
3188
|
}
|
|
3186
3189
|
var CHANNEL2_CLAIM_TTL_MS = 10 * 60000;
|
|
3187
3190
|
var channel2HealStatements = new WeakMap;
|
|
@@ -3211,7 +3214,7 @@ function openDatabase(dbPathOrOptions) {
|
|
|
3211
3214
|
lastMigrationOnOpenRefusal = null;
|
|
3212
3215
|
const existing = databases.get(dbPath);
|
|
3213
3216
|
if (!existing && pendingAsyncOpens.has(dbPath)) {
|
|
3214
|
-
|
|
3217
|
+
log2(`[magic-context] storage not ready: ${dbPath} is still being opened or migrated; refusing a second synchronous open`);
|
|
3215
3218
|
return null;
|
|
3216
3219
|
}
|
|
3217
3220
|
if (existing) {
|
|
@@ -3239,14 +3242,14 @@ function openDatabase(dbPathOrOptions) {
|
|
|
3239
3242
|
throw error;
|
|
3240
3243
|
}
|
|
3241
3244
|
}
|
|
3242
|
-
db = new
|
|
3245
|
+
db = new Database2(dbPath);
|
|
3243
3246
|
installBootBusyTimeout(db, dbPath, busyTimeoutMs, options?.onBootBusyTimeout);
|
|
3244
3247
|
if (!enforceSchemaFence(db, dbPath, latestSupportedVersion)) {
|
|
3245
3248
|
closeQuietly(db);
|
|
3246
3249
|
return null;
|
|
3247
3250
|
}
|
|
3248
3251
|
if (options?.allowMigrations === false && hasPendingMigrations(db)) {
|
|
3249
|
-
|
|
3252
|
+
log2(`[magic-context] storage not ready: pending migrations at ${dbPath}; host callers must await the async opener`);
|
|
3250
3253
|
closeQuietly(db);
|
|
3251
3254
|
return null;
|
|
3252
3255
|
}
|
|
@@ -3263,12 +3266,13 @@ function openDatabase(dbPathOrOptions) {
|
|
|
3263
3266
|
} else
|
|
3264
3267
|
runMigrations(db);
|
|
3265
3268
|
ensureContextStoreUuid(db);
|
|
3269
|
+
installTagIdentityRevisionTrigger(db);
|
|
3266
3270
|
return finishDatabaseOpen(db, dbPath, explicitDbPath, latestSupportedVersion);
|
|
3267
3271
|
} catch (error) {
|
|
3268
3272
|
if (db)
|
|
3269
3273
|
closeQuietly(db);
|
|
3270
3274
|
const detail = getErrorMessage(error);
|
|
3271
|
-
|
|
3275
|
+
log2(`[magic-context] storage fatal: failed to open ${dbPath}: ${detail}`);
|
|
3272
3276
|
throw new Error(`[magic-context] storage unavailable: ${detail}. Magic Context is disabled for this run; check log for details.`);
|
|
3273
3277
|
}
|
|
3274
3278
|
}
|
|
@@ -3327,7 +3331,7 @@ async function openDatabaseAsync(dbPathOrOptions) {
|
|
|
3327
3331
|
throw error;
|
|
3328
3332
|
}
|
|
3329
3333
|
}
|
|
3330
|
-
db = new
|
|
3334
|
+
db = new Database2(dbPath);
|
|
3331
3335
|
installBootBusyTimeout(db, dbPath, busyTimeoutMs, options?.onBootBusyTimeout);
|
|
3332
3336
|
openMs = performance.now() - openStartedAt;
|
|
3333
3337
|
guardStartedAt = performance.now();
|
|
@@ -3359,6 +3363,7 @@ async function openDatabaseAsync(dbPathOrOptions) {
|
|
|
3359
3363
|
throw new Error("storage initialization left a pending migration; reinstall or rebuild the plugin");
|
|
3360
3364
|
}
|
|
3361
3365
|
ensureContextStoreUuid(db);
|
|
3366
|
+
installTagIdentityRevisionTrigger(db);
|
|
3362
3367
|
const opened = finishDatabaseOpen(db, dbPath, explicitDbPath, latestSupportedVersion);
|
|
3363
3368
|
migrateMs = performance.now() - migrateStartedAt;
|
|
3364
3369
|
return opened;
|
|
@@ -3366,10 +3371,10 @@ async function openDatabaseAsync(dbPathOrOptions) {
|
|
|
3366
3371
|
if (db)
|
|
3367
3372
|
closeQuietly(db);
|
|
3368
3373
|
const detail = getErrorMessage(error);
|
|
3369
|
-
|
|
3374
|
+
log2(`[magic-context] storage fatal: failed to open ${dbPath}: ${detail}`);
|
|
3370
3375
|
throw new Error(`[magic-context] storage unavailable: ${detail}. Magic Context is disabled for this run; check log for details.`);
|
|
3371
3376
|
} finally {
|
|
3372
|
-
|
|
3377
|
+
log2(`[migrations] async open main-thread migration-body count: ${getMainThreadMigrationBodyCount() - mainThreadBodiesBefore} (total=${getMainThreadMigrationBodyCount()}) path=${dbPath}`);
|
|
3373
3378
|
if (openMs === 0)
|
|
3374
3379
|
openMs = performance.now() - openStartedAt;
|
|
3375
3380
|
if (guardStartedAt !== null && guardMs === 0) {
|