@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
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getMagicContextStorageDir
|
|
3
|
+
} from "./index-0sahzkwr.js";
|
|
4
|
+
import {
|
|
5
|
+
log2
|
|
6
|
+
} from "./index-8j7gqj40.js";
|
|
7
|
+
import {
|
|
8
|
+
writeStorageFileAtomicSync
|
|
9
|
+
} from "./index-1bc61ans.js";
|
|
10
|
+
|
|
11
|
+
// src/features/magic-context/memory/project-identity.ts
|
|
12
|
+
import { execFileSync } from "node:child_process";
|
|
13
|
+
import { createHash as createHash2 } from "node:crypto";
|
|
14
|
+
import { existsSync, realpathSync as realpathSync2, statSync } from "node:fs";
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
|
+
import path3 from "node:path";
|
|
17
|
+
|
|
18
|
+
// src/features/magic-context/memory/project-identity-cache.ts
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
import { readFileSync } from "node:fs";
|
|
21
|
+
import path2 from "node:path";
|
|
22
|
+
|
|
23
|
+
// src/shared/project-directory-key.ts
|
|
24
|
+
import { realpathSync } from "node:fs";
|
|
25
|
+
import path from "node:path";
|
|
26
|
+
function projectDirectoryKey(directory) {
|
|
27
|
+
const slashed = directory.replaceAll("\\", "/").replace(/^\/\/\?\/UNC\//i, "//").replace(/^\/\/\?\//, "");
|
|
28
|
+
if (/^[a-z]:\//i.test(slashed) || slashed.startsWith("//")) {
|
|
29
|
+
return path.win32.normalize(slashed).replaceAll("\\", "/").replace(/\/$/, "").toLowerCase();
|
|
30
|
+
}
|
|
31
|
+
return path.resolve(directory);
|
|
32
|
+
}
|
|
33
|
+
var realpathForCanonicalDirectory = (directory) => realpathSync.native(directory);
|
|
34
|
+
function canonicalProjectDirectory(directory) {
|
|
35
|
+
let resolved = directory;
|
|
36
|
+
try {
|
|
37
|
+
resolved = realpathForCanonicalDirectory(directory);
|
|
38
|
+
} catch {}
|
|
39
|
+
return projectDirectoryKey(resolved);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// src/features/magic-context/memory/project-identity-cache.ts
|
|
43
|
+
function cachePath(directory, storageDir = getMagicContextStorageDir()) {
|
|
44
|
+
const hash = createHash("sha256").update(projectDirectoryKey(directory)).digest("hex");
|
|
45
|
+
return path2.join(storageDir, "project-identities", `${hash}.json`);
|
|
46
|
+
}
|
|
47
|
+
function rememberGitIdentity(directory, identity) {
|
|
48
|
+
try {
|
|
49
|
+
const destination = cachePath(directory);
|
|
50
|
+
writeStorageFileAtomicSync(destination, JSON.stringify({ directory: projectDirectoryKey(directory), identity }));
|
|
51
|
+
} catch {}
|
|
52
|
+
}
|
|
53
|
+
function readRememberedGitIdentity(directory, storageDir) {
|
|
54
|
+
try {
|
|
55
|
+
const record = JSON.parse(readFileSync(cachePath(directory, storageDir), "utf8"));
|
|
56
|
+
if (record.directory === projectDirectoryKey(directory) && /^git:[0-9a-f]{7,64}$/.test(record.identity))
|
|
57
|
+
return record.identity;
|
|
58
|
+
} catch {}
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// src/features/magic-context/memory/project-identity.ts
|
|
63
|
+
var GIT_TIMEOUT_MS = 5000;
|
|
64
|
+
var TRANSIENT_FAILURE_COOLDOWN_MS = 5 * 60 * 1000;
|
|
65
|
+
var identityCache = new Map;
|
|
66
|
+
var linkedGitWorktreeCache = new Map;
|
|
67
|
+
var lastKnownGitIdentityCache = new Map;
|
|
68
|
+
var directoryFallbackCache = new Map;
|
|
69
|
+
var transientFailureCooldown = new Map;
|
|
70
|
+
var dubiousOwnershipFallbackDirectories = new Set;
|
|
71
|
+
var dubiousOwnershipLoggedDirectories = new Set;
|
|
72
|
+
var dubiousOwnershipWarnedDirectories = new Set;
|
|
73
|
+
var transientGitIdentityReuseLoggedDirectories = new Set;
|
|
74
|
+
var sessionIdentityCache = new Map;
|
|
75
|
+
var homeProjectPermission = false;
|
|
76
|
+
var homeProjectSkipLogged = false;
|
|
77
|
+
var pausedIdentityReasons = new Map;
|
|
78
|
+
var pausedIdentityLogged = new Set;
|
|
79
|
+
function setHomeProjectPermission(allowed) {
|
|
80
|
+
homeProjectPermission = allowed;
|
|
81
|
+
}
|
|
82
|
+
function shouldSkipHomeProjectMemory(directory) {
|
|
83
|
+
try {
|
|
84
|
+
assertProjectAllowed(directory, homeProjectPermission);
|
|
85
|
+
return false;
|
|
86
|
+
} catch (error) {
|
|
87
|
+
if (!(error instanceof ProjectIdentityError) || error.errorClass !== "home_project_disabled")
|
|
88
|
+
throw error;
|
|
89
|
+
if (!homeProjectSkipLogged) {
|
|
90
|
+
homeProjectSkipLogged = true;
|
|
91
|
+
log2("[magic-context] home project memory disabled; skipping memory features");
|
|
92
|
+
}
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
var execFileSyncForIdentity = execFileSync;
|
|
97
|
+
var userHomeDirectoryForIdentity = () => homedir();
|
|
98
|
+
var nowMs = () => Date.now();
|
|
99
|
+
var filesystemProbeObserverForTests;
|
|
100
|
+
|
|
101
|
+
class ProjectIdentityError extends Error {
|
|
102
|
+
errorClass;
|
|
103
|
+
rawDirectory;
|
|
104
|
+
constructor(errorClass, rawDirectory, message, cause) {
|
|
105
|
+
super(message);
|
|
106
|
+
this.name = "ProjectIdentityError";
|
|
107
|
+
this.errorClass = errorClass;
|
|
108
|
+
this.rawDirectory = rawDirectory;
|
|
109
|
+
if (cause) {
|
|
110
|
+
this.cause = cause;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function asError(error) {
|
|
115
|
+
return error instanceof Error ? error : undefined;
|
|
116
|
+
}
|
|
117
|
+
function getErrorCode(error) {
|
|
118
|
+
if (error === null || typeof error !== "object" || !("code" in error)) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const code = error.code;
|
|
122
|
+
return typeof code === "string" ? code : undefined;
|
|
123
|
+
}
|
|
124
|
+
function getErrorSignal(error) {
|
|
125
|
+
if (error === null || typeof error !== "object" || !("signal" in error)) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const signal = error.signal;
|
|
129
|
+
return typeof signal === "string" ? signal : undefined;
|
|
130
|
+
}
|
|
131
|
+
function getErrorKilled(error) {
|
|
132
|
+
if (error === null || typeof error !== "object" || !("killed" in error)) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
return error.killed === true;
|
|
136
|
+
}
|
|
137
|
+
function getErrorStderr(error) {
|
|
138
|
+
if (error === null || typeof error !== "object" || !("stderr" in error)) {
|
|
139
|
+
return "";
|
|
140
|
+
}
|
|
141
|
+
const stderr = error.stderr;
|
|
142
|
+
if (typeof stderr === "string") {
|
|
143
|
+
return stderr;
|
|
144
|
+
}
|
|
145
|
+
if (Buffer.isBuffer(stderr)) {
|
|
146
|
+
return stderr.toString("utf8");
|
|
147
|
+
}
|
|
148
|
+
return "";
|
|
149
|
+
}
|
|
150
|
+
function directoryFallback(directory) {
|
|
151
|
+
const canonical = path3.resolve(directory);
|
|
152
|
+
const hash = createHash2("md5").update(canonical, "utf8").digest("hex").slice(0, 12);
|
|
153
|
+
return `dir:${hash}`;
|
|
154
|
+
}
|
|
155
|
+
function rememberedIdentityOrDirectoryFallback(canonical) {
|
|
156
|
+
return readRememberedGitIdentity(canonical) ?? directoryFallback(canonical);
|
|
157
|
+
}
|
|
158
|
+
function assertDirectoryUsable(canonicalDirectory, rawDirectory) {
|
|
159
|
+
try {
|
|
160
|
+
const stat = statSync(canonicalDirectory);
|
|
161
|
+
if (!stat.isDirectory()) {
|
|
162
|
+
throw new ProjectIdentityError("unknown", rawDirectory, `Project path is not a directory: ${canonicalDirectory}`);
|
|
163
|
+
}
|
|
164
|
+
} catch (error) {
|
|
165
|
+
if (error instanceof ProjectIdentityError) {
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
const code = getErrorCode(error);
|
|
169
|
+
if (code === "EACCES" || code === "EPERM") {
|
|
170
|
+
throw new ProjectIdentityError("permission_denied", rawDirectory, `Permission denied while accessing project directory: ${canonicalDirectory}`, asError(error));
|
|
171
|
+
}
|
|
172
|
+
throw new ProjectIdentityError("unknown", rawDirectory, `Unable to access project directory: ${canonicalDirectory}`, asError(error));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function isGitTimeoutError(error) {
|
|
176
|
+
const code = getErrorCode(error);
|
|
177
|
+
const signal = getErrorSignal(error);
|
|
178
|
+
return code === "ETIMEDOUT" || signal === "SIGTERM" || signal === "SIGKILL" || getErrorKilled(error);
|
|
179
|
+
}
|
|
180
|
+
function hasUnbornHead(directory) {
|
|
181
|
+
const options = {
|
|
182
|
+
cwd: directory,
|
|
183
|
+
encoding: "utf8",
|
|
184
|
+
env: { ...process.env, LC_ALL: "C", LANG: "C" },
|
|
185
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
186
|
+
timeout: GIT_TIMEOUT_MS,
|
|
187
|
+
windowsHide: true
|
|
188
|
+
};
|
|
189
|
+
try {
|
|
190
|
+
execFileSyncForIdentity("git", ["rev-parse", "--git-dir"], options);
|
|
191
|
+
try {
|
|
192
|
+
execFileSyncForIdentity("git", ["rev-parse", "--verify", "--quiet", "HEAD"], options);
|
|
193
|
+
return false;
|
|
194
|
+
} catch (error) {
|
|
195
|
+
return !isGitTimeoutError(error) && typeof error === "object" && error !== null && "status" in error && error.status === 1 && getErrorStderr(error) === "";
|
|
196
|
+
}
|
|
197
|
+
} catch {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function classifyGitError(error, rawDirectory) {
|
|
202
|
+
if (isGitTimeoutError(error)) {
|
|
203
|
+
return new ProjectIdentityError("git_timeout", rawDirectory, `git rev-list timed out after ${GIT_TIMEOUT_MS}ms`, asError(error));
|
|
204
|
+
}
|
|
205
|
+
const code = getErrorCode(error);
|
|
206
|
+
if (code === "ENOENT") {
|
|
207
|
+
return new ProjectIdentityError("git_missing", rawDirectory, "git binary is not available in PATH", asError(error));
|
|
208
|
+
}
|
|
209
|
+
if (code === "EACCES" || code === "EPERM") {
|
|
210
|
+
return new ProjectIdentityError("permission_denied", rawDirectory, "Permission denied while spawning git", asError(error));
|
|
211
|
+
}
|
|
212
|
+
const stderr = getErrorStderr(error).toLowerCase();
|
|
213
|
+
if (stderr.includes("detected dubious ownership")) {
|
|
214
|
+
return new ProjectIdentityError("dubious_ownership", rawDirectory, "git refused to read the repository because it detected dubious ownership", asError(error));
|
|
215
|
+
}
|
|
216
|
+
if (stderr.includes("not a git repository") || stderr.includes("does not have any commits yet") || stderr.includes("ambiguous argument 'head'") || stderr.includes("unknown revision or path")) {
|
|
217
|
+
return new ProjectIdentityError("not_git_repo", rawDirectory, "Directory has no git root commit; caller may use directory fallback", asError(error));
|
|
218
|
+
}
|
|
219
|
+
return new ProjectIdentityError("unknown", rawDirectory, "git rev-list failed while resolving project identity", asError(error));
|
|
220
|
+
}
|
|
221
|
+
function resolveProjectIdentityStrict(directory, allowHomeProject = homeProjectPermission) {
|
|
222
|
+
assertProjectAllowed(directory, allowHomeProject);
|
|
223
|
+
const canonical = path3.resolve(directory);
|
|
224
|
+
const cached = identityCache.get(canonical);
|
|
225
|
+
if (cached !== undefined) {
|
|
226
|
+
return cached;
|
|
227
|
+
}
|
|
228
|
+
assertDirectoryUsable(canonical, directory);
|
|
229
|
+
if (!hasGitDir(canonical)) {
|
|
230
|
+
throw new ProjectIdentityError("not_git_repo", directory, "Directory has no git metadata; caller may use directory fallback");
|
|
231
|
+
}
|
|
232
|
+
let output;
|
|
233
|
+
try {
|
|
234
|
+
output = execFileSyncForIdentity("git", ["rev-list", "--max-parents=0", "HEAD"], {
|
|
235
|
+
cwd: canonical,
|
|
236
|
+
encoding: "utf8",
|
|
237
|
+
env: { ...process.env, LC_ALL: "C", LANG: "C" },
|
|
238
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
239
|
+
timeout: GIT_TIMEOUT_MS,
|
|
240
|
+
windowsHide: true
|
|
241
|
+
});
|
|
242
|
+
} catch (error) {
|
|
243
|
+
const classified = classifyGitError(error, directory);
|
|
244
|
+
if (classified.errorClass === "not_git_repo" && hasUnbornHead(canonical)) {
|
|
245
|
+
throw new ProjectIdentityError("no_commits", directory, "Git repository has no commits yet");
|
|
246
|
+
}
|
|
247
|
+
throw classified;
|
|
248
|
+
}
|
|
249
|
+
const rootCommit = output.split(`
|
|
250
|
+
`).map((line) => line.trim().slice(0, 64)).filter((line) => /^[0-9a-f]{7,64}$/.test(line)).sort()[0];
|
|
251
|
+
if (!rootCommit) {
|
|
252
|
+
throw new ProjectIdentityError("unknown", directory, "git rev-list returned no valid root commit hash");
|
|
253
|
+
}
|
|
254
|
+
const identity = `git:${rootCommit}`;
|
|
255
|
+
identityCache.set(canonical, identity);
|
|
256
|
+
lastKnownGitIdentityCache.set(canonical, identity);
|
|
257
|
+
rememberGitIdentity(canonical, identity);
|
|
258
|
+
const root = gitRootDirectory(canonical);
|
|
259
|
+
if (root && root !== canonical)
|
|
260
|
+
rememberGitIdentity(root, identity);
|
|
261
|
+
transientFailureCooldown.delete(canonical);
|
|
262
|
+
dubiousOwnershipFallbackDirectories.delete(canonical);
|
|
263
|
+
transientGitIdentityReuseLoggedDirectories.delete(canonical);
|
|
264
|
+
return identity;
|
|
265
|
+
}
|
|
266
|
+
function shouldUseDirectoryFallback(error) {
|
|
267
|
+
return error.errorClass !== "home_project_disabled";
|
|
268
|
+
}
|
|
269
|
+
function getActiveCooldown(canonical) {
|
|
270
|
+
const until = transientFailureCooldown.get(canonical);
|
|
271
|
+
if (until === undefined)
|
|
272
|
+
return;
|
|
273
|
+
if (nowMs() < until)
|
|
274
|
+
return until;
|
|
275
|
+
transientFailureCooldown.delete(canonical);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
function lastKnownGitIdentity(canonical) {
|
|
279
|
+
return lastKnownGitIdentityCache.get(canonical) ?? identityCache.get(canonical) ?? readRememberedGitIdentity(canonical);
|
|
280
|
+
}
|
|
281
|
+
function nearestLastKnownGitIdentity(canonical) {
|
|
282
|
+
const visited = new Set;
|
|
283
|
+
const walk = (start) => {
|
|
284
|
+
let current = start;
|
|
285
|
+
while (!visited.has(current)) {
|
|
286
|
+
visited.add(current);
|
|
287
|
+
const cached = lastKnownGitIdentity(current);
|
|
288
|
+
if (cached !== undefined)
|
|
289
|
+
return { identity: cached, source: current };
|
|
290
|
+
if (existsSync(path3.join(current, ".git")))
|
|
291
|
+
break;
|
|
292
|
+
const parent = path3.dirname(current);
|
|
293
|
+
if (parent === current)
|
|
294
|
+
break;
|
|
295
|
+
current = parent;
|
|
296
|
+
}
|
|
297
|
+
return;
|
|
298
|
+
};
|
|
299
|
+
const exactOrAncestor = walk(canonical);
|
|
300
|
+
if (exactOrAncestor)
|
|
301
|
+
return exactOrAncestor;
|
|
302
|
+
try {
|
|
303
|
+
const realCanonical = realpathSync2.native(canonical);
|
|
304
|
+
if (realCanonical !== canonical)
|
|
305
|
+
return walk(realCanonical);
|
|
306
|
+
} catch {}
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
function reuseLastKnownGitIdentity(canonical) {
|
|
310
|
+
const cached = nearestLastKnownGitIdentity(canonical);
|
|
311
|
+
if (cached === undefined)
|
|
312
|
+
return;
|
|
313
|
+
if (!transientGitIdentityReuseLoggedDirectories.has(canonical)) {
|
|
314
|
+
transientGitIdentityReuseLoggedDirectories.add(canonical);
|
|
315
|
+
const sourceNote = cached.source === canonical ? "" : ` from ancestor ${cached.source}`;
|
|
316
|
+
log2(`[magic-context] git identity resolution is temporarily unavailable for ${canonical}; reusing the last successful project identity${sourceNote} to avoid splitting project-scoped memory`);
|
|
317
|
+
}
|
|
318
|
+
return cached.identity;
|
|
319
|
+
}
|
|
320
|
+
function formatDubiousOwnershipWarning(canonical) {
|
|
321
|
+
return `Magic Context: git refused to read ${canonical} (dubious ownership — the repo is owned by a different user). Memory features are paused unless a previous git identity is available. Fix: git config --global --add safe.directory ${canonical}`;
|
|
322
|
+
}
|
|
323
|
+
function recordDubiousOwnershipFallback(canonical) {
|
|
324
|
+
dubiousOwnershipFallbackDirectories.add(canonical);
|
|
325
|
+
if (dubiousOwnershipLoggedDirectories.has(canonical))
|
|
326
|
+
return;
|
|
327
|
+
dubiousOwnershipLoggedDirectories.add(canonical);
|
|
328
|
+
log2(`[magic-context] ${formatDubiousOwnershipWarning(canonical)}`);
|
|
329
|
+
}
|
|
330
|
+
function takeDubiousOwnershipProjectIdentityWarning(directory) {
|
|
331
|
+
const canonical = path3.resolve(directory);
|
|
332
|
+
if (!dubiousOwnershipFallbackDirectories.has(canonical))
|
|
333
|
+
return null;
|
|
334
|
+
if (dubiousOwnershipWarnedDirectories.has(canonical))
|
|
335
|
+
return null;
|
|
336
|
+
dubiousOwnershipWarnedDirectories.add(canonical);
|
|
337
|
+
return formatDubiousOwnershipWarning(canonical);
|
|
338
|
+
}
|
|
339
|
+
function canonicalUserHomeDirectory() {
|
|
340
|
+
const homeDirectory = userHomeDirectoryForIdentity();
|
|
341
|
+
try {
|
|
342
|
+
return realpathSync2.native(homeDirectory);
|
|
343
|
+
} catch {
|
|
344
|
+
return homeDirectory;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function isUserHomeDirectory(directory) {
|
|
348
|
+
if (projectDirectoryKey(directory) === projectDirectoryKey(userHomeDirectoryForIdentity()))
|
|
349
|
+
return true;
|
|
350
|
+
try {
|
|
351
|
+
return projectDirectoryKey(realpathSync2.native(path3.resolve(directory))) === projectDirectoryKey(canonicalUserHomeDirectory());
|
|
352
|
+
} catch {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function assertProjectAllowed(directory, allowHomeProject) {
|
|
357
|
+
const canonical = path3.resolve(directory);
|
|
358
|
+
if (!allowHomeProject && (isUserHomeDirectory(directory) || isUserHomeDirectory(gitRootDirectory(canonical) ?? canonical))) {
|
|
359
|
+
throw new ProjectIdentityError("home_project_disabled", directory, "Home project memory is disabled; set allow_home_project to opt in");
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
function resolveProjectIdentity(directory, allowHomeProject = homeProjectPermission) {
|
|
363
|
+
assertProjectAllowed(directory, allowHomeProject);
|
|
364
|
+
const canonical = path3.resolve(directory);
|
|
365
|
+
const cachedFallback = directoryFallbackCache.get(canonical);
|
|
366
|
+
if (cachedFallback !== undefined) {
|
|
367
|
+
if (!hasGitDir(canonical)) {
|
|
368
|
+
return cachedFallback;
|
|
369
|
+
}
|
|
370
|
+
directoryFallbackCache.delete(canonical);
|
|
371
|
+
}
|
|
372
|
+
if (getActiveCooldown(canonical) !== undefined) {
|
|
373
|
+
if (hasGitDir(canonical)) {
|
|
374
|
+
const cachedGitIdentity = reuseLastKnownGitIdentity(canonical);
|
|
375
|
+
if (cachedGitIdentity !== undefined) {
|
|
376
|
+
return cachedGitIdentity;
|
|
377
|
+
}
|
|
378
|
+
throw new ProjectIdentityError("git_identity_unavailable", directory, "Git identity unavailable; memory features paused until the retry cooldown expires");
|
|
379
|
+
}
|
|
380
|
+
return rememberedIdentityOrDirectoryFallback(canonical);
|
|
381
|
+
}
|
|
382
|
+
try {
|
|
383
|
+
return resolveProjectIdentityStrict(directory, allowHomeProject);
|
|
384
|
+
} catch (error) {
|
|
385
|
+
if (error instanceof ProjectIdentityError && shouldUseDirectoryFallback(error)) {
|
|
386
|
+
if (error.errorClass === "no_commits")
|
|
387
|
+
return directoryFallback(canonical);
|
|
388
|
+
if (!hasGitDir(canonical)) {
|
|
389
|
+
if (error.errorClass === "permission_denied")
|
|
390
|
+
throw error;
|
|
391
|
+
const resolved = rememberedIdentityOrDirectoryFallback(canonical);
|
|
392
|
+
directoryFallbackCache.set(canonical, resolved);
|
|
393
|
+
transientFailureCooldown.delete(canonical);
|
|
394
|
+
return resolved;
|
|
395
|
+
}
|
|
396
|
+
transientFailureCooldown.set(canonical, nowMs() + TRANSIENT_FAILURE_COOLDOWN_MS);
|
|
397
|
+
const cachedGitIdentity = reuseLastKnownGitIdentity(canonical);
|
|
398
|
+
if (error.errorClass === "dubious_ownership")
|
|
399
|
+
recordDubiousOwnershipFallback(canonical);
|
|
400
|
+
if (cachedGitIdentity !== undefined) {
|
|
401
|
+
return cachedGitIdentity;
|
|
402
|
+
}
|
|
403
|
+
throw error;
|
|
404
|
+
}
|
|
405
|
+
throw error;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
function resolveProjectIdentityOrFallback(directory, allowHomeProject = homeProjectPermission) {
|
|
409
|
+
try {
|
|
410
|
+
return resolveProjectIdentity(directory, allowHomeProject);
|
|
411
|
+
} catch (error) {
|
|
412
|
+
const canonical = path3.resolve(directory);
|
|
413
|
+
if (hasGitDir(canonical) || error instanceof ProjectIdentityError && error.errorClass === "home_project_disabled")
|
|
414
|
+
throw error;
|
|
415
|
+
const fallback = rememberedIdentityOrDirectoryFallback(canonical);
|
|
416
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
417
|
+
log2(`[magic-context] project identity resolution failed for ${canonical}; using directory fallback ${fallback}: ${message}`);
|
|
418
|
+
return fallback;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
function hasGitDir(canonical) {
|
|
422
|
+
if (hasGitDirInAncestorChain(canonical)) {
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
try {
|
|
426
|
+
const realCanonical = realpathSync2.native(canonical);
|
|
427
|
+
return realCanonical !== canonical && hasGitDirInAncestorChain(realCanonical);
|
|
428
|
+
} catch {
|
|
429
|
+
return false;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
function gitRootInAncestorChain(startDirectory) {
|
|
433
|
+
let current = startDirectory;
|
|
434
|
+
while (true) {
|
|
435
|
+
if (existsSync(path3.join(current, ".git"))) {
|
|
436
|
+
try {
|
|
437
|
+
return realpathSync2.native(current);
|
|
438
|
+
} catch {
|
|
439
|
+
return path3.resolve(current);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
const parent = path3.dirname(current);
|
|
443
|
+
if (parent === current) {
|
|
444
|
+
return null;
|
|
445
|
+
}
|
|
446
|
+
current = parent;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
function hasGitDirInAncestorChain(startDirectory) {
|
|
450
|
+
return gitRootInAncestorChain(startDirectory) !== null;
|
|
451
|
+
}
|
|
452
|
+
function gitRootDirectory(canonical) {
|
|
453
|
+
const direct = gitRootInAncestorChain(canonical);
|
|
454
|
+
if (direct)
|
|
455
|
+
return direct;
|
|
456
|
+
try {
|
|
457
|
+
const realCanonical = realpathSync2.native(canonical);
|
|
458
|
+
return realCanonical === canonical ? null : gitRootInAncestorChain(realCanonical);
|
|
459
|
+
} catch {
|
|
460
|
+
return null;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
function directoryHasGitMetadata(directory) {
|
|
464
|
+
return gitRootDirectory(path3.resolve(directory)) !== null;
|
|
465
|
+
}
|
|
466
|
+
function describeUnresolvedProjectIdentity(directory) {
|
|
467
|
+
const resolvedDirectory = path3.resolve(directory);
|
|
468
|
+
const canonicalHome = canonicalUserHomeDirectory();
|
|
469
|
+
const canonicalDirectory = (() => {
|
|
470
|
+
try {
|
|
471
|
+
return realpathSync2.native(resolvedDirectory);
|
|
472
|
+
} catch {
|
|
473
|
+
return resolvedDirectory;
|
|
474
|
+
}
|
|
475
|
+
})();
|
|
476
|
+
if (isUserHomeDirectory(directory) || gitRootDirectory(canonicalDirectory) === canonicalHome) {
|
|
477
|
+
return `this session runs in your home directory (${canonicalHome}), which Magic Context does not treat as a project. ` + "Start OpenCode inside a project folder, or set `allow_home_project: true` in the user-level " + "magic-context.jsonc (~/.config/cortexkit/) to give home sessions their own memory.";
|
|
478
|
+
}
|
|
479
|
+
if (hasGitDir(resolvedDirectory))
|
|
480
|
+
return `git identity resolution for ${resolvedDirectory} is temporarily unavailable. Memory features are paused; retry after git access recovers.`;
|
|
481
|
+
return `the session directory ${resolvedDirectory} could not be read as a project.`;
|
|
482
|
+
}
|
|
483
|
+
function isUsableProjectIdentity(identity) {
|
|
484
|
+
return typeof identity === "string" && identity.trim().length > 0;
|
|
485
|
+
}
|
|
486
|
+
function resolveProjectIdentityForSession(directory, allowHomeProject = homeProjectPermission) {
|
|
487
|
+
const resolvedDirectory = path3.resolve(directory);
|
|
488
|
+
const cacheKey = `${allowHomeProject ? "1" : "0"}\x00${resolvedDirectory}`;
|
|
489
|
+
const cached = sessionIdentityCache.get(cacheKey);
|
|
490
|
+
if (cached && (cached.revalidateAt === null || nowMs() < cached.revalidateAt) && !(cached.identity?.startsWith("dir:") && hasGitDir(resolvedDirectory))) {
|
|
491
|
+
return cached.identity;
|
|
492
|
+
}
|
|
493
|
+
sessionIdentityCache.delete(cacheKey);
|
|
494
|
+
filesystemProbeObserverForTests?.();
|
|
495
|
+
const canonicalDirectory = (() => {
|
|
496
|
+
try {
|
|
497
|
+
filesystemProbeObserverForTests?.();
|
|
498
|
+
return realpathSync2.native(resolvedDirectory);
|
|
499
|
+
} catch {
|
|
500
|
+
return resolvedDirectory;
|
|
501
|
+
}
|
|
502
|
+
})();
|
|
503
|
+
filesystemProbeObserverForTests?.();
|
|
504
|
+
const homeRoot = gitRootDirectory(canonicalDirectory);
|
|
505
|
+
const inheritsHomeRepository = homeRoot !== null && isUserHomeDirectory(homeRoot);
|
|
506
|
+
let identity;
|
|
507
|
+
if (!allowHomeProject && (isUserHomeDirectory(directory) || inheritsHomeRepository)) {
|
|
508
|
+
identity = undefined;
|
|
509
|
+
} else {
|
|
510
|
+
try {
|
|
511
|
+
identity = resolveProjectIdentityOrFallback(isUserHomeDirectory(directory) ? canonicalUserHomeDirectory() : directory, allowHomeProject);
|
|
512
|
+
} catch (error) {
|
|
513
|
+
if (!(error instanceof ProjectIdentityError))
|
|
514
|
+
throw error;
|
|
515
|
+
const reason = error.errorClass === "git_identity_unavailable" ? pausedIdentityReasons.get(resolvedDirectory) ?? error.errorClass : error.errorClass;
|
|
516
|
+
pausedIdentityReasons.set(resolvedDirectory, reason);
|
|
517
|
+
const logKey = `${resolvedDirectory}\x00${reason}`;
|
|
518
|
+
if (!pausedIdentityLogged.has(logKey)) {
|
|
519
|
+
pausedIdentityLogged.add(logKey);
|
|
520
|
+
log2(`[magic-context] memory features paused for ${resolvedDirectory}: ${reason}`);
|
|
521
|
+
}
|
|
522
|
+
identity = undefined;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
if (identity !== undefined)
|
|
526
|
+
pausedIdentityReasons.delete(resolvedDirectory);
|
|
527
|
+
sessionIdentityCache.set(cacheKey, {
|
|
528
|
+
identity,
|
|
529
|
+
revalidateAt: identity?.startsWith("git:") === true ? null : nowMs() + TRANSIENT_FAILURE_COOLDOWN_MS
|
|
530
|
+
});
|
|
531
|
+
return identity;
|
|
532
|
+
}
|
|
533
|
+
function normalizeStoredProjectPath(rawOrStored) {
|
|
534
|
+
if (rawOrStored.startsWith("git:") || rawOrStored.startsWith("dir:")) {
|
|
535
|
+
return rawOrStored;
|
|
536
|
+
}
|
|
537
|
+
try {
|
|
538
|
+
return resolveProjectIdentity(rawOrStored);
|
|
539
|
+
} catch {
|
|
540
|
+
return rawOrStored;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
function storedPathBelongsToIdentity(storedProjectPath, projectIdentity) {
|
|
544
|
+
return storedProjectPath === projectIdentity || normalizeStoredProjectPath(storedProjectPath) === projectIdentity;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// src/plugin/boot-quiet.ts
|
|
548
|
+
var BOOT_QUIET_MS = 120000;
|
|
549
|
+
var bootQuietUntilMs = 0;
|
|
550
|
+
function beginBootQuietPeriod(now = Date.now()) {
|
|
551
|
+
if (bootQuietUntilMs === 0)
|
|
552
|
+
bootQuietUntilMs = now + BOOT_QUIET_MS;
|
|
553
|
+
}
|
|
554
|
+
function bootQuietRemainingMs(now = Date.now()) {
|
|
555
|
+
return Math.max(0, bootQuietUntilMs - now);
|
|
556
|
+
}
|
|
557
|
+
function scheduleAfterBootQuiet(task, additionalDelayMs = 0) {
|
|
558
|
+
const timer = setTimeout(task, bootQuietRemainingMs() + Math.max(0, additionalDelayMs));
|
|
559
|
+
timer.unref?.();
|
|
560
|
+
return timer;
|
|
561
|
+
}
|
|
562
|
+
function setBootQuietPeriodForTests(startAtMs) {
|
|
563
|
+
bootQuietUntilMs = startAtMs === null ? 0 : startAtMs + BOOT_QUIET_MS;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
export { canonicalProjectDirectory, setHomeProjectPermission, shouldSkipHomeProjectMemory, ProjectIdentityError, resolveProjectIdentityStrict, takeDubiousOwnershipProjectIdentityWarning, isUserHomeDirectory, resolveProjectIdentity, directoryHasGitMetadata, describeUnresolvedProjectIdentity, isUsableProjectIdentity, resolveProjectIdentityForSession, normalizeStoredProjectPath, storedPathBelongsToIdentity, beginBootQuietPeriod, bootQuietRemainingMs, scheduleAfterBootQuiet, setBootQuietPeriodForTests };
|
|
@@ -226,19 +226,4 @@ function renderToolTemplate(source, input, output, legacyPreview = false) {
|
|
|
226
226
|
return truncate(render(bareOutputNodes, root, legacyPreview), legacyPreview ? 1000 : undefined, legacyPreview);
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
-
|
|
230
|
-
var DEFAULT_PROTECTED_TOOLS = {
|
|
231
|
-
todowrite: 1,
|
|
232
|
-
ctx_reduce: 3
|
|
233
|
-
};
|
|
234
|
-
function normalizeProtectedToolName(name) {
|
|
235
|
-
return (name ?? "").toLowerCase().replace(/^mcp_/, "");
|
|
236
|
-
}
|
|
237
|
-
function mergeProtectedTools(...maps) {
|
|
238
|
-
return Object.fromEntries([DEFAULT_PROTECTED_TOOLS, ...maps].flatMap((map) => Object.entries(map ?? {}).map(([name, count]) => [
|
|
239
|
-
normalizeProtectedToolName(name),
|
|
240
|
-
count
|
|
241
|
-
])));
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
export { toolTemplateError, renderToolTemplate, DEFAULT_PROTECTED_TOOLS, normalizeProtectedToolName, mergeProtectedTools };
|
|
229
|
+
export { toolTemplateError, renderToolTemplate };
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "./index-
|
|
2
|
+
sessionLog2
|
|
3
|
+
} from "./index-8j7gqj40.js";
|
|
4
4
|
import {
|
|
5
5
|
renderUserFacingFailure,
|
|
6
6
|
userFacingFailureCode,
|
|
7
7
|
clearEmergencyRecovery,
|
|
8
8
|
dropSlot,
|
|
9
9
|
executeContextRecomp
|
|
10
|
-
} from "./index-
|
|
10
|
+
} from "./index-692jzy0p.js";
|
|
11
11
|
|
|
12
12
|
// src/hooks/magic-context/recomp-orchestrator.ts
|
|
13
13
|
function resolveLiveModelKey(liveSessionState, sessionId) {
|
|
@@ -126,7 +126,7 @@ async function runManagedRecomp2(ctx, sessionId, options) {
|
|
|
126
126
|
return message;
|
|
127
127
|
} catch (error) {
|
|
128
128
|
const failure = renderUserFacingFailure("recomp_unavailable");
|
|
129
|
-
|
|
129
|
+
sessionLog2(sessionId, `recomp failed code=${userFacingFailureCode("recomp_unavailable")}`, error);
|
|
130
130
|
setRecompTerminal2(ctx.liveSessionState, sessionId, "failed", failure);
|
|
131
131
|
return `## Magic Recomp — Failed
|
|
132
132
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/shared/harness.ts
|
|
2
|
+
var currentHarness = "opencode";
|
|
3
|
+
var harnessLocked = false;
|
|
4
|
+
function setHarness2(value) {
|
|
5
|
+
if (harnessLocked && currentHarness !== value) {
|
|
6
|
+
throw new Error(`Magic Context: harness already locked to "${currentHarness}"; cannot change to "${value}"`);
|
|
7
|
+
}
|
|
8
|
+
currentHarness = value;
|
|
9
|
+
harnessLocked = true;
|
|
10
|
+
}
|
|
11
|
+
function getHarness2() {
|
|
12
|
+
return currentHarness;
|
|
13
|
+
}
|
|
14
|
+
function harnessOwnsOpenCodeStore2(harness = currentHarness) {
|
|
15
|
+
return harness === "opencode" || harness === "opencode2";
|
|
16
|
+
}
|
|
17
|
+
export { setHarness2, getHarness2, harnessOwnsOpenCodeStore2 };
|