@cortexkit/opencode-magic-context 0.49.18 → 0.49.20
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/auto-search-worker.js +53 -10
- package/dist/chunk-embedding-write-worker.js +30 -23
- package/dist/{compaction-marker-candidates-n4krhat4.js → compaction-marker-candidates-b2q30cft.js} +3 -3
- package/dist/compaction-marker-candidates-worker.js +2 -2
- package/dist/compartment-chunk-embedding-va090as0.js +65 -0
- package/dist/config/schema/magic-context.d.ts +6 -6
- package/dist/{conflict-warning-hook-4pmz879v.js → conflict-warning-hook-frp3z2wk.js} +9 -8
- package/dist/{context-m897gfp9.js → context-mkece1db.js} +460 -135
- package/dist/{derive-budgets-zn7yzd2d.js → derive-budgets-pqybnx09.js} +2 -2
- package/dist/embedding-backfill-gy3p78py.js +25 -0
- package/dist/embedding-worker-process.js +2 -2
- package/dist/embedding-worker.js +5 -5
- package/dist/features/magic-context/chunk-embedding-writer.d.ts.map +1 -1
- package/dist/features/magic-context/compartment-chunk-embedding.d.ts +44 -1
- package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/classify.d.ts +3 -0
- package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts +11 -0
- package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/map-memories.d.ts +3 -0
- package/dist/features/magic-context/dreamer/map-memories.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-config.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-scheduler.d.ts +2 -0
- package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/verify.d.ts +3 -0
- package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
- package/dist/features/magic-context/memory/embedding-identity.d.ts.map +1 -1
- package/dist/features/magic-context/memory/embedding-local.d.ts +1 -0
- package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
- package/dist/features/magic-context/memory/local-embedding-pooling.d.ts +22 -0
- package/dist/features/magic-context/memory/local-embedding-pooling.d.ts.map +1 -0
- package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
- package/dist/features/magic-context/message-index.d.ts +2 -0
- package/dist/features/magic-context/message-index.d.ts.map +1 -1
- package/dist/features/magic-context/migrations.d.ts.map +1 -1
- package/dist/features/magic-context/mural/compress-cues.d.ts.map +1 -1
- package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
- package/dist/features/magic-context/search.d.ts +27 -0
- package/dist/features/magic-context/search.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
- package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-persisted.d.ts +14 -0
- package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
- package/dist/features/magic-context/subagent-token-capture.d.ts +20 -0
- package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -1
- package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
- package/dist/{history-owner-xp3pngv7.js → history-owner-36wp3mkb.js} +2 -2
- package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-embed-session.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-hint.d.ts +7 -1
- package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-worker-client.d.ts +33 -6
- package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-worker-evaluation.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/auto-search-worker-evaluation.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/cache-busting-signals.d.ts +5 -2
- package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -1
- package/dist/hooks/magic-context/channel2-delivery.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-types.d.ts +5 -0
- package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-trigger.d.ts +1 -1
- package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
- package/dist/hooks/magic-context/diagnostic-log-state.d.ts +4 -0
- package/dist/hooks/magic-context/diagnostic-log-state.d.ts.map +1 -0
- package/dist/hooks/magic-context/execute-reclaim.d.ts +35 -0
- package/dist/hooks/magic-context/execute-reclaim.d.ts.map +1 -0
- package/dist/hooks/magic-context/hook-handlers.d.ts.map +1 -1
- package/dist/hooks/magic-context/hook.d.ts +1 -3
- package/dist/hooks/magic-context/hook.d.ts.map +1 -1
- package/dist/hooks/magic-context/latest-assistant-turn.d.ts +8 -0
- package/dist/hooks/magic-context/latest-assistant-turn.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-recovery-fence.d.ts +5 -0
- package/dist/hooks/magic-context/lkg-recovery-fence.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-recovery-prefix.d.ts +13 -0
- package/dist/hooks/magic-context/lkg-recovery-prefix.d.ts.map +1 -1
- package/dist/hooks/magic-context/nudge-evaluation-log.d.ts +3 -0
- package/dist/hooks/magic-context/nudge-evaluation-log.d.ts.map +1 -0
- package/dist/hooks/magic-context/pending-drop-eligibility.d.ts.map +1 -1
- package/dist/hooks/magic-context/protected-tail-boundary.d.ts +4 -0
- package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -1
- package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts.map +1 -1
- package/dist/hooks/magic-context/system-date-refresh.d.ts +15 -2
- package/dist/hooks/magic-context/system-date-refresh.d.ts.map +1 -1
- package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
- package/dist/hooks/magic-context/system-prompt-sticky-date.d.ts +10 -0
- package/dist/hooks/magic-context/system-prompt-sticky-date.d.ts.map +1 -0
- package/dist/hooks/magic-context/tag-messages.d.ts +2 -0
- package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +23 -6
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform.d.ts.map +1 -1
- package/dist/{index-bjcnntmz.js → index-0wthn7fp.js} +468 -18
- package/dist/{index-kq82mtg0.js → index-11zf2wwc.js} +3 -3
- package/dist/{index-b5vqckbw.js → index-153r2q6z.js} +314 -127
- package/dist/{index-v8awdgvd.js → index-1pefp8ar.js} +5 -5
- package/dist/{v2/server-beht37jy.js → index-1zx2pa5d.js} +1 -1
- package/dist/{index-ze7mvk54.js → index-2yhtnfcf.js} +75 -57
- package/dist/{index-cf74k5ak.js → index-305y133n.js} +4 -4
- package/dist/{index-s734jcsr.js → index-35qc6606.js} +9 -3
- package/dist/{index-x4njr8df.js → index-48stjd56.js} +105 -19
- package/dist/{index-24jbw52d.js → index-4n7w9rad.js} +6 -6
- package/dist/{index-kee4kn5j.js → index-4pnsgvfk.js} +1 -1
- package/dist/{v2/server-8cd2j99z.js → index-5kym00ag.js} +32 -13
- package/dist/{index-4s3t0nd0.js → index-616rsjrv.js} +2 -2
- package/dist/{index-e4xv8890.js → index-67nyj0gy.js} +507 -210
- package/dist/{index-6x57ar45.js → index-adk2z5d8.js} +3 -3
- package/dist/{index-c5pytzne.js → index-b88dwwrh.js} +1 -1
- package/dist/{index-rr2bb45z.js → index-c4b76d4t.js} +2 -2
- package/dist/{index-nj7yykkx.js → index-c7phnbvk.js} +1 -1
- package/dist/index-cpjk5jd2.js +82 -0
- package/dist/{index-6s5941tm.js → index-d6rp4dxh.js} +5 -5
- package/dist/{index-s7j8tvhv.js → index-dc8hy95c.js} +69 -17
- package/dist/{index-j75v2476.js → index-h7tgn49j.js} +12 -15
- package/dist/{index-ke416mdc.js → index-j76ah6d7.js} +2 -2
- package/dist/{index-r4nkrs05.js → index-jfh3cktr.js} +4 -4
- package/dist/{index-a6mc0v4d.js → index-jmycsey7.js} +3 -3
- package/dist/{index-24fezq97.js → index-jr5na10t.js} +4 -4
- package/dist/{index-s74zqahq.js → index-kc9pn495.js} +4 -4
- package/dist/{index-p5y3k4g7.js → index-nda0zgna.js} +2 -1
- package/dist/{index-jn12fvvh.js → index-neb2jaed.js} +3 -3
- package/dist/{index-qn7xstt2.js → index-pnjwa6qa.js} +6 -7
- package/dist/{index-fgncb0ng.js → index-rmd0069m.js} +11 -11
- package/dist/{index-y9f76s3f.js → index-rrv26qjz.js} +1 -1
- package/dist/{index-v10f1rjv.js → index-spwjbkc7.js} +1 -1
- package/dist/{index-k29z4aqh.js → index-t5pck3ss.js} +1 -1
- package/dist/{index-936py2wm.js → index-t7hx3qcb.js} +361 -113
- package/dist/{index-s1ex9y6p.js → index-v7r4td4c.js} +464 -79
- package/dist/{index-2vxtcb95.js → index-vkc1ca9p.js} +2 -2
- package/dist/{index-rmwykbbb.js → index-x4k3f4mf.js} +33 -10
- package/dist/{index-bp5083x2.js → index-x9k3mqrf.js} +1 -1
- package/dist/{index-n37sebck.js → index-y4a3nhtk.js} +1 -1
- package/dist/index.js +57 -50
- package/dist/{logger-jm3sqqzr.js → logger-94kew5wm.js} +1 -1
- package/dist/{message-fts-rowid-map-17s0dfn4.js → message-fts-rowid-map-22tevnnj.js} +6 -5
- package/dist/{message-index-66jv6fh4.js → message-index-5qxcz6h7.js} +16 -15
- package/dist/{message-index-bounded-n1frdn85.js → message-index-bounded-n0m0t7tv.js} +16 -15
- package/dist/{message-time-backfill-73mmm76q.js → message-time-backfill-0myx7fz3.js} +3 -3
- package/dist/migration-worker.js +13 -12
- package/dist/{model-resolution-nx97z3x7.js → model-resolution-280gmqvd.js} +1 -1
- package/dist/plugin/embedding-bootstrap.d.ts +3 -1
- package/dist/plugin/embedding-bootstrap.d.ts.map +1 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
- package/dist/plugin/messages-transform.d.ts.map +1 -1
- package/dist/plugin/rpc-handlers.d.ts +8 -0
- package/dist/plugin/rpc-handlers.d.ts.map +1 -1
- package/dist/plugin/subagent-tool-policy.d.ts +9 -0
- package/dist/plugin/subagent-tool-policy.d.ts.map +1 -1
- package/dist/plugin/tool-registry.d.ts.map +1 -1
- package/dist/{project-embedding-registry-z74mhqkf.js → project-embedding-registry-s2pqgec9.js} +13 -12
- package/dist/raw-ordinal-warmup-worker.js +136 -101
- package/dist/{read-session-chunk-v06g3vka.js → read-session-chunk-0a8vdyqp.js} +11 -10
- package/dist/{read-session-raw-rsc8c7qy.js → read-session-raw-y5cszf0b.js} +4 -3
- package/dist/recomp-orchestrator-61vyha9j.js +62 -0
- package/dist/{safe-notification-target-1szv1k5k.js → safe-notification-target-mkr9yzvr.js} +2 -2
- package/dist/{search-archive-4d53y23e.js → search-archive-8q9s49p5.js} +12 -11
- package/dist/{search-nkf271d4.js → search-v1y9ejws.js} +25 -24
- package/dist/{send-session-notification-6ve0e8p4.js → send-session-notification-0k6qzydk.js} +7 -6
- package/dist/shared/logger.d.ts.map +1 -1
- package/dist/shared/model-resolution.d.ts +2 -0
- package/dist/shared/model-resolution.d.ts.map +1 -1
- package/dist/shared/model-suggestion-retry.d.ts +30 -1
- package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
- package/dist/shared/prompt-async-transport.d.ts +3 -0
- package/dist/shared/prompt-async-transport.d.ts.map +1 -1
- package/dist/shared/rpc-types.d.ts +7 -0
- package/dist/shared/rpc-types.d.ts.map +1 -1
- package/dist/shared/sqlite.d.ts +1 -1
- package/dist/shared/sqlite.d.ts.map +1 -1
- package/dist/shared/subagent-runner.d.ts +2 -0
- package/dist/shared/subagent-runner.d.ts.map +1 -1
- package/dist/shared/worker-shutdown.d.ts +68 -0
- package/dist/shared/worker-shutdown.d.ts.map +1 -0
- package/dist/shared/worker-shutdown.fixture.d.ts +2 -0
- package/dist/shared/worker-shutdown.fixture.d.ts.map +1 -0
- package/dist/{sqlite-zf72c52d.js → sqlite-1rpvw2rj.js} +1 -1
- package/dist/{storage-memory-y3qmy00r.js → storage-memory-nm7v82mj.js} +2 -2
- package/dist/{storage-tags-r7k9tjcv.js → storage-tags-r6nk29n4.js} +5 -5
- package/dist/{task-config-x3qmayd2.js → task-config-t6bpyka7.js} +2 -2
- package/dist/tools/ctx-expand/rust-mode-tag.test-support.d.ts +15 -0
- package/dist/tools/ctx-expand/rust-mode-tag.test-support.d.ts.map +1 -0
- package/dist/tools/ctx-expand/tools.d.ts +11 -0
- package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
- package/dist/tools/ctx-search/tools.d.ts.map +1 -1
- package/dist/{transform-postprocess-phase-zpgav0h7.js → transform-postprocess-phase-vtrgb7m6.js} +34 -31
- package/dist/v2/auto-search-worker.js +53 -10
- package/dist/v2/chunk-embedding-write-worker.js +30 -23
- package/dist/v2/{compaction-marker-candidates-ebx3388k.js → compaction-marker-candidates-cfab70cs.js} +3 -3
- package/dist/v2/compaction-marker-candidates-worker.js +2 -2
- package/dist/v2/compartment-chunk-embedding-nbdqx1td.js +64 -0
- package/dist/v2/{context-f2xh7ba4.js → context-cc33tv2z.js} +1259 -404
- package/dist/v2/{derive-budgets-2zh4gm2c.js → derive-budgets-knf763tt.js} +3 -3
- package/dist/v2/embedding-backfill-yxv2h5mc.js +24 -0
- package/dist/v2/embedding-worker-process.js +2 -2
- package/dist/v2/embedding-worker.js +5 -5
- package/dist/v2/hidden-child-record.d.ts +2 -0
- package/dist/v2/hidden-child-record.d.ts.map +1 -1
- package/dist/v2/hidden-completion.d.ts +2 -0
- package/dist/v2/hidden-completion.d.ts.map +1 -1
- package/dist/v2/hidden-model-activity.d.ts +7 -0
- package/dist/v2/hidden-model-activity.d.ts.map +1 -0
- package/dist/v2/{history-owner-42e16w0n.js → history-owner-ad0crnrn.js} +2 -2
- package/dist/v2/hooks/context.d.ts.map +1 -1
- package/dist/v2/hooks/generate.d.ts +36 -1
- package/dist/v2/hooks/generate.d.ts.map +1 -1
- package/dist/v2/hooks/lkg-system.d.ts +35 -4
- package/dist/v2/hooks/lkg-system.d.ts.map +1 -1
- package/dist/v2/hooks/payload.d.ts +16 -1
- package/dist/v2/hooks/payload.d.ts.map +1 -1
- package/dist/v2/hooks/tools.d.ts.map +1 -1
- package/dist/v2/{logger-7qt02bnb.js → logger-p34mjtja.js} +1 -1
- package/dist/v2/{message-fts-rowid-map-wfx67gfd.js → message-fts-rowid-map-dg12wymk.js} +6 -5
- package/dist/v2/{message-index-bounded-w3hfm29z.js → message-index-bounded-f4e01xk0.js} +16 -15
- package/dist/v2/{message-index-48f7hw7a.js → message-index-ydzrp6y6.js} +16 -15
- package/dist/v2/{message-time-backfill-04t0km1z.js → message-time-backfill-ddh8n9gy.js} +3 -3
- package/dist/v2/migration-worker.js +13 -12
- package/dist/v2/{model-resolution-nx97z3x7.js → model-resolution-280gmqvd.js} +1 -1
- package/dist/v2/{project-embedding-registry-gnkj56xp.js → project-embedding-registry-deza9ksw.js} +13 -12
- package/dist/v2/raw-ordinal-warmup-worker.js +136 -101
- package/dist/v2/{read-session-chunk-zpgmxwte.js → read-session-chunk-8cxfagky.js} +11 -10
- package/dist/v2/{read-session-raw-yaegtjzh.js → read-session-raw-1nrrecvx.js} +4 -3
- package/dist/v2/recomp-orchestrator-47m4hv5g.js +61 -0
- package/dist/v2/{safe-notification-target-qg7n2s77.js → safe-notification-target-khnzg57c.js} +2 -2
- package/dist/v2/{search-archive-vv48s2aa.js → search-archive-e80cvc09.js} +12 -11
- package/dist/v2/{search-kza414f0.js → search-fjz746zr.js} +25 -24
- package/dist/v2/{send-session-notification-3pxn658x.js → send-session-notification-nwvrv34d.js} +7 -6
- package/dist/v2/{server-8by8qfec.js → server-0epqaxhd.js} +75 -57
- package/dist/v2/{server-pwv4ezb0.js → server-168pb207.js} +1 -1
- package/dist/v2/{server-h0410h0v.js → server-1bw1wcbp.js} +1 -1
- package/dist/{index-beht37jy.js → v2/server-1zx2pa5d.js} +1 -1
- package/dist/v2/{server-a9xqj88f.js → server-230fnbws.js} +4 -4
- package/dist/v2/{server-tbe1femw.js → server-29qp8nz4.js} +1 -1
- package/dist/v2/{server-tgnbmwah.js → server-3mz2qh5a.js} +1 -1
- package/dist/v2/{server-hy3d3vsx.js → server-4nw4fqhr.js} +2 -2
- package/dist/v2/{server-qv7f0hhe.js → server-4sxjs6hn.js} +5 -5
- package/dist/v2/{server-34kwfsr4.js → server-53eh1r8r.js} +2 -2
- package/dist/v2/{server-xj136kt8.js → server-55rgxfrw.js} +9 -3
- package/dist/v2/{server-nj659894.js → server-5arr9ecn.js} +2 -2
- package/dist/{index-8cd2j99z.js → v2/server-5kym00ag.js} +32 -13
- package/dist/v2/{server-2ehj0bw7.js → server-63fqdghs.js} +106 -20
- package/dist/v2/{server-f2xf5gcb.js → server-6495nmn9.js} +12 -15
- package/dist/v2/{server-qd11g795.js → server-92g7d776.js} +2 -1
- package/dist/v2/{server-gpvay0xz.js → server-9x0kmta4.js} +6 -7
- package/dist/v2/{server-27gq4mfz.js → server-a3dwxfgd.js} +4 -4
- package/dist/v2/{server-6tmj0s7j.js → server-af2pght7.js} +3 -3
- package/dist/v2/{server-1wy7b9de.js → server-br1x0tev.js} +3 -3
- package/dist/v2/{server-n1prf1g6.js → server-brj8j2gk.js} +2 -2
- package/dist/v2/{server-bfpda1tb.js → server-c7dxxsj7.js} +466 -81
- package/dist/v2/server-cpjk5jd2.js +82 -0
- package/dist/v2/{server-g3qma5c0.js → server-dj7tz4ph.js} +2 -2
- package/dist/v2/{server-xhab8jx8.js → server-ej96a39v.js} +33 -10
- package/dist/v2/{server-6pmqg9m4.js → server-gyy4k6mf.js} +1 -1
- package/dist/v2/{server-a2eqhkxr.js → server-hqzyq8n4.js} +11 -11
- package/dist/v2/{server-h1v0pyxb.js → server-j4jnp9b5.js} +468 -18
- package/dist/v2/{server-da07v4xp.js → server-k3t06fxr.js} +1 -1
- package/dist/v2/{server-1nyybqan.js → server-m91f9m5s.js} +69 -17
- package/dist/v2/{server-rmygf5pn.js → server-ne8arh8t.js} +2 -2
- package/dist/v2/{server-my7k4eds.js → server-vn2nwcv6.js} +5 -5
- package/dist/v2/{server-46neh5fa.js → server-wyawsa88.js} +314 -127
- package/dist/v2/{server-zzkj2fch.js → server-xsryvyf6.js} +4 -4
- package/dist/v2/{server-n37sebck.js → server-y4a3nhtk.js} +1 -1
- package/dist/v2/{server-d04vrx0j.js → server-ygtykank.js} +2 -2
- package/dist/v2/server.js +6 -6
- package/dist/v2/{sqlite-zf72c52d.js → sqlite-1rpvw2rj.js} +1 -1
- package/dist/v2/{storage-memory-y3qmy00r.js → storage-memory-nm7v82mj.js} +2 -2
- package/dist/v2/{storage-tags-3wdb8zph.js → storage-tags-ss08kj5r.js} +5 -5
- package/dist/v2/store-reader.d.ts +8 -0
- package/dist/v2/store-reader.d.ts.map +1 -1
- package/dist/v2/{task-config-nvz8mapa.js → task-config-7md27rx8.js} +2 -2
- package/dist/v2/{wrapup-orchestrator-psqz7yh0.js → wrapup-orchestrator-639whfhq.js} +32 -31
- package/dist/wrapup-orchestrator-mnvt2g8m.js +49 -0
- package/package.json +1 -1
- package/src/config/index.test.ts +28 -6
- package/src/shared/logger.test.ts +42 -1
- package/src/shared/logger.ts +11 -13
- package/src/shared/model-resolution.test.ts +67 -12
- package/src/shared/model-resolution.ts +43 -16
- package/src/shared/model-suggestion-retry.test.ts +166 -0
- package/src/shared/model-suggestion-retry.ts +165 -14
- package/src/shared/prompt-async-transport.test.ts +107 -0
- package/src/shared/prompt-async-transport.ts +86 -3
- package/src/shared/rpc-types.ts +7 -0
- package/src/shared/sqlite-busy-budget-review.test.ts +6 -1
- package/src/shared/sqlite.ts +4 -2
- package/src/shared/subagent-runner.ts +2 -0
- package/src/shared/worker-shutdown-fence.test.ts +87 -0
- package/src/shared/worker-shutdown.fixture.ts +25 -0
- package/src/shared/worker-shutdown.test.ts +127 -0
- package/src/shared/worker-shutdown.ts +160 -0
- package/dist/embedding-backfill-fmz50tsy.js +0 -24
- package/dist/recomp-orchestrator-ghpk2dtq.js +0 -61
- package/dist/v2/embedding-backfill-7c7yr69y.js +0 -23
- package/dist/v2/recomp-orchestrator-4vfxej9t.js +0 -60
- package/dist/wrapup-orchestrator-s9zc5b00.js +0 -48
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
getTemporalDecisions,
|
|
8
8
|
freezeTemporalDecisions,
|
|
9
9
|
stableStringify
|
|
10
|
-
} from "./index-
|
|
10
|
+
} from "./index-x9k3mqrf.js";
|
|
11
11
|
import {
|
|
12
12
|
protectedToolTagNumbers,
|
|
13
13
|
byteSize,
|
|
@@ -73,31 +73,37 @@ import {
|
|
|
73
73
|
adoptNullOwnerToolTag2,
|
|
74
74
|
getCandidateToolOwners2,
|
|
75
75
|
pickNearestPriorOwner2
|
|
76
|
-
} from "./index-
|
|
76
|
+
} from "./index-305y133n.js";
|
|
77
77
|
import {
|
|
78
78
|
textMentionsRecentCommit,
|
|
79
79
|
hasMeaningfulUserText2,
|
|
80
80
|
estimateTokens
|
|
81
|
-
} from "./index-
|
|
81
|
+
} from "./index-b88dwwrh.js";
|
|
82
|
+
import {
|
|
83
|
+
getMagicContextStorageDir
|
|
84
|
+
} from "./index-g2q4htwp.js";
|
|
82
85
|
import {
|
|
83
86
|
log2,
|
|
84
87
|
sessionLog2
|
|
85
|
-
} from "./index-
|
|
88
|
+
} from "./index-h7tgn49j.js";
|
|
86
89
|
import {
|
|
87
90
|
inRootAsyncContext2,
|
|
88
91
|
getTagIdentityWriteGeneration2,
|
|
89
92
|
getSqliteDatabasePath2,
|
|
90
93
|
assertTransformWrite2,
|
|
91
94
|
isTransientSqliteError2
|
|
92
|
-
} from "./index-
|
|
95
|
+
} from "./index-1zx2pa5d.js";
|
|
93
96
|
import {
|
|
94
97
|
getProjectEmbeddingSnapshot2,
|
|
95
98
|
embedTextForProject2,
|
|
96
99
|
embedBatchForProject2
|
|
97
|
-
} from "./index-
|
|
100
|
+
} from "./index-2yhtnfcf.js";
|
|
101
|
+
import {
|
|
102
|
+
createWorkerShutdown
|
|
103
|
+
} from "./index-cpjk5jd2.js";
|
|
98
104
|
import {
|
|
99
105
|
runSessionWarmupWorker
|
|
100
|
-
} from "./index-
|
|
106
|
+
} from "./index-35qc6606.js";
|
|
101
107
|
import {
|
|
102
108
|
getMaxM0MutationId,
|
|
103
109
|
getLastCompartmentEndMessage,
|
|
@@ -133,12 +139,12 @@ import {
|
|
|
133
139
|
peekNoteNudgeText,
|
|
134
140
|
markNoteNudgeDelivered,
|
|
135
141
|
getActiveCompartmentRun
|
|
136
|
-
} from "./index-
|
|
142
|
+
} from "./index-v7r4td4c.js";
|
|
137
143
|
import {
|
|
138
144
|
BoundedSessionMap,
|
|
139
145
|
cleanSearchText,
|
|
140
146
|
matchedSearchSnippet
|
|
141
|
-
} from "./index-
|
|
147
|
+
} from "./index-48stjd56.js";
|
|
142
148
|
import {
|
|
143
149
|
stripSystemInjection,
|
|
144
150
|
isTextPart,
|
|
@@ -178,6 +184,8 @@ import {
|
|
|
178
184
|
applyStrippedPlaceholderDelta,
|
|
179
185
|
THINKING_BINDING_RECOVERY_FROZEN_PREFIX,
|
|
180
186
|
thinkingBindingRecoveryFrozenId,
|
|
187
|
+
compactionOffThinkingFrozenId,
|
|
188
|
+
compactionOffFrozenThinkingIds,
|
|
181
189
|
getThinkingBindingRecoveryTarget,
|
|
182
190
|
getMergedReasoningStrippedIds,
|
|
183
191
|
addMergedReasoningStrippedIds,
|
|
@@ -232,7 +240,7 @@ import {
|
|
|
232
240
|
extractToolCallObservation,
|
|
233
241
|
ToolMutationBatch,
|
|
234
242
|
createToolDropTarget
|
|
235
|
-
} from "./index-
|
|
243
|
+
} from "./index-x4k3f4mf.js";
|
|
236
244
|
import {
|
|
237
245
|
isValidLanguageCode
|
|
238
246
|
} from "./index-wgypt3cs.js";
|
|
@@ -243,10 +251,10 @@ import {
|
|
|
243
251
|
openCodeDbExists,
|
|
244
252
|
withReadOnlySessionDb,
|
|
245
253
|
getMessageTimesFromOpenCodeDb
|
|
246
|
-
} from "./index-
|
|
254
|
+
} from "./index-11zf2wwc.js";
|
|
247
255
|
import {
|
|
248
256
|
userFacingFailureCode
|
|
249
|
-
} from "./index-
|
|
257
|
+
} from "./index-1pefp8ar.js";
|
|
250
258
|
import {
|
|
251
259
|
normalizeProtectedToolName,
|
|
252
260
|
mergeProtectedTools
|
|
@@ -256,7 +264,7 @@ import {
|
|
|
256
264
|
} from "./index-y8v6yerm.js";
|
|
257
265
|
import {
|
|
258
266
|
logSlowWriteTransaction
|
|
259
|
-
} from "./index-
|
|
267
|
+
} from "./index-t5pck3ss.js";
|
|
260
268
|
|
|
261
269
|
// src/features/magic-context/tagger.ts
|
|
262
270
|
var TOOL_COMPOSITE_KEY_SEP = "\x00";
|
|
@@ -1241,7 +1249,8 @@ ${trimmedBody}…
|
|
|
1241
1249
|
return wrapped;
|
|
1242
1250
|
}
|
|
1243
1251
|
function selectAutoSearchResults(results, threshold) {
|
|
1244
|
-
|
|
1252
|
+
const relevance = (result) => result.relevanceScore ?? result.score;
|
|
1253
|
+
return results.filter((result) => relevance(result) >= threshold).sort((left, right) => relevance(right) - relevance(left));
|
|
1245
1254
|
}
|
|
1246
1255
|
|
|
1247
1256
|
// src/hooks/magic-context/auto-search-worker-client.ts
|
|
@@ -1334,6 +1343,13 @@ function retryUnpublishedAutoSearchNoHint(db, sessionId, messageId, startedAt) {
|
|
|
1334
1343
|
}
|
|
1335
1344
|
return true;
|
|
1336
1345
|
}
|
|
1346
|
+
|
|
1347
|
+
class AutoSearchBusyError extends Error {
|
|
1348
|
+
constructor() {
|
|
1349
|
+
super("an earlier auto-search of this session is still running");
|
|
1350
|
+
this.name = "AutoSearchBusyError";
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1337
1353
|
async function searchAutoHint(db, sessionId, projectPath, query, options, entry = new URL(new URL(import.meta.url).pathname.endsWith(".ts") ? "./auto-search-worker.ts" : "./auto-search-worker.js", import.meta.url)) {
|
|
1338
1354
|
return executeAutoSearchWorker(db, sessionId, projectPath, query, options, entry, "search");
|
|
1339
1355
|
}
|
|
@@ -1342,14 +1358,19 @@ var searchWorkers = new WeakMap;
|
|
|
1342
1358
|
var liveSearchWorkers = new Set;
|
|
1343
1359
|
var MAX_IDLE_SEARCH_WORKERS = 4;
|
|
1344
1360
|
var SEARCH_WORKER_IDLE_MS = 5 * 60000;
|
|
1361
|
+
var DETACHED_SEARCH_LIMIT_MS = 30000;
|
|
1362
|
+
var AUTO_SEARCH_WORKER_CLOSE_DEADLINE_MS = 2000;
|
|
1345
1363
|
var workersCreated = 0;
|
|
1346
1364
|
var workersReused = 0;
|
|
1365
|
+
var searchesSkippedBusy = 0;
|
|
1347
1366
|
async function acquireSearchWorker(db, key, entry, input, signal) {
|
|
1348
1367
|
const pool = searchWorkers.get(db) ?? new Map;
|
|
1349
1368
|
searchWorkers.set(db, pool);
|
|
1350
1369
|
while (!signal.aborted) {
|
|
1351
1370
|
let slot = pool.get(key);
|
|
1352
1371
|
if (slot?.busy) {
|
|
1372
|
+
if (input.job === "search" && (slot.detached || slot.busySessionId === input.sessionId))
|
|
1373
|
+
return "busy";
|
|
1353
1374
|
const current = slot;
|
|
1354
1375
|
await new Promise((resolve) => {
|
|
1355
1376
|
const done = () => {
|
|
@@ -1358,6 +1379,8 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
|
|
|
1358
1379
|
};
|
|
1359
1380
|
signal.addEventListener("abort", done, { once: true });
|
|
1360
1381
|
current.busy?.then(done);
|
|
1382
|
+
if (!current.detached)
|
|
1383
|
+
current.detachedSignal?.then(done);
|
|
1361
1384
|
if (signal.aborted)
|
|
1362
1385
|
done();
|
|
1363
1386
|
});
|
|
@@ -1366,14 +1389,16 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
|
|
|
1366
1389
|
const fresh = !slot;
|
|
1367
1390
|
if (!slot) {
|
|
1368
1391
|
const worker = inRootAsyncContext2(() => new Worker(entry, { workerData: { ...input, persistent: true } }));
|
|
1392
|
+
const shutdown = createWorkerShutdown(worker, "auto-search", AUTO_SEARCH_WORKER_CLOSE_DEADLINE_MS);
|
|
1369
1393
|
slot = {
|
|
1370
1394
|
worker,
|
|
1371
1395
|
dispose() {
|
|
1396
|
+
this.disposed = true;
|
|
1372
1397
|
clearTimeout(this.idleTimer);
|
|
1373
1398
|
if (pool.get(key) === this)
|
|
1374
1399
|
pool.delete(key);
|
|
1375
1400
|
liveSearchWorkers.delete(this);
|
|
1376
|
-
|
|
1401
|
+
shutdown.close();
|
|
1377
1402
|
worker.unref();
|
|
1378
1403
|
}
|
|
1379
1404
|
};
|
|
@@ -1387,9 +1412,14 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
|
|
|
1387
1412
|
workersReused++;
|
|
1388
1413
|
clearTimeout(slot.idleTimer);
|
|
1389
1414
|
const current = slot;
|
|
1415
|
+
current.busySessionId = input.sessionId;
|
|
1416
|
+
current.detached = false;
|
|
1390
1417
|
current.busy = new Promise((resolve) => {
|
|
1391
1418
|
current.release = resolve;
|
|
1392
1419
|
});
|
|
1420
|
+
current.detachedSignal = new Promise((resolve) => {
|
|
1421
|
+
current.markDetached = resolve;
|
|
1422
|
+
});
|
|
1393
1423
|
current.worker.ref();
|
|
1394
1424
|
return { slot: current, fresh };
|
|
1395
1425
|
}
|
|
@@ -1398,6 +1428,9 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
|
|
|
1398
1428
|
function queueAutoSearchBackfill(db, sessionId, projectPath, query) {
|
|
1399
1429
|
if (isEmbeddingHostBusy2())
|
|
1400
1430
|
return Promise.resolve();
|
|
1431
|
+
const snapshot = getProjectEmbeddingSnapshot2(projectPath);
|
|
1432
|
+
if (!snapshot?.enabled || !snapshot.features.memoryEnabled)
|
|
1433
|
+
return Promise.resolve();
|
|
1401
1434
|
const key = `${sessionId}\x00${projectPath}`;
|
|
1402
1435
|
const pending = pendingBackfills.get(db) ?? new Map;
|
|
1403
1436
|
pendingBackfills.set(db, pending);
|
|
@@ -1445,6 +1478,7 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
|
|
|
1445
1478
|
signal: deadlineSignal,
|
|
1446
1479
|
readMessages: _readMessages,
|
|
1447
1480
|
searchMessageHistory: _searchMessageHistory,
|
|
1481
|
+
stepTimings: _stepTimings,
|
|
1448
1482
|
...serializable
|
|
1449
1483
|
} = options;
|
|
1450
1484
|
const lifecycle = registerAutoSearchWork(sessionId);
|
|
@@ -1480,30 +1514,55 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
|
|
|
1480
1514
|
lifecycle.done();
|
|
1481
1515
|
return [];
|
|
1482
1516
|
}
|
|
1517
|
+
if (lease === "busy") {
|
|
1518
|
+
lifecycle.done();
|
|
1519
|
+
searchesSkippedBusy++;
|
|
1520
|
+
throw new AutoSearchBusyError;
|
|
1521
|
+
}
|
|
1483
1522
|
const { slot, fresh } = lease;
|
|
1484
1523
|
const worker = slot.worker;
|
|
1524
|
+
const detachable = job === "search" && entry.href === defaultAutoSearchWorkerEntry().href;
|
|
1525
|
+
const startedAt = performance.now();
|
|
1526
|
+
let detachedAt;
|
|
1527
|
+
let ownerVectorMs;
|
|
1528
|
+
let abandonTimer;
|
|
1485
1529
|
return new Promise((resolve, reject) => {
|
|
1486
1530
|
let settled = false;
|
|
1487
|
-
|
|
1531
|
+
let released = false;
|
|
1532
|
+
const settle = (results, error) => {
|
|
1488
1533
|
if (settled)
|
|
1489
1534
|
return;
|
|
1490
1535
|
settled = true;
|
|
1536
|
+
if (error)
|
|
1537
|
+
reject(error);
|
|
1538
|
+
else
|
|
1539
|
+
resolve(results);
|
|
1540
|
+
};
|
|
1541
|
+
const release = (dispose) => {
|
|
1542
|
+
if (released)
|
|
1543
|
+
return;
|
|
1544
|
+
released = true;
|
|
1545
|
+
clearTimeout(abandonTimer);
|
|
1491
1546
|
signal?.removeEventListener("abort", abort);
|
|
1492
1547
|
lifecycle.signal.removeEventListener("abort", abort);
|
|
1493
1548
|
lifecycle.done();
|
|
1494
1549
|
worker.off("message", onMessage);
|
|
1495
1550
|
worker.off("error", onError);
|
|
1496
1551
|
worker.off("exit", onExit);
|
|
1497
|
-
if (
|
|
1552
|
+
if (dispose || !detachable)
|
|
1498
1553
|
slot.dispose();
|
|
1499
|
-
else {
|
|
1554
|
+
else if (!slot.disposed) {
|
|
1500
1555
|
slot.idleTimer = setTimeout(() => slot.dispose(), SEARCH_WORKER_IDLE_MS);
|
|
1501
1556
|
slot.idleTimer.unref?.();
|
|
1502
1557
|
}
|
|
1503
|
-
const
|
|
1558
|
+
const free = slot.release;
|
|
1504
1559
|
slot.busy = undefined;
|
|
1505
1560
|
slot.release = undefined;
|
|
1506
|
-
|
|
1561
|
+
slot.busySessionId = undefined;
|
|
1562
|
+
slot.detached = false;
|
|
1563
|
+
slot.detachedSignal = undefined;
|
|
1564
|
+
slot.markDetached = undefined;
|
|
1565
|
+
free?.();
|
|
1507
1566
|
const reusable = liveSearchWorkers.delete(slot);
|
|
1508
1567
|
if (reusable)
|
|
1509
1568
|
liveSearchWorkers.add(slot);
|
|
@@ -1511,51 +1570,82 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
|
|
|
1511
1570
|
for (const prior of idle.slice(0, Math.max(0, idle.length - MAX_IDLE_SEARCH_WORKERS)))
|
|
1512
1571
|
prior.dispose();
|
|
1513
1572
|
worker.unref();
|
|
1514
|
-
if (error)
|
|
1515
|
-
reject(error);
|
|
1516
|
-
else
|
|
1517
|
-
resolve(results);
|
|
1518
1573
|
};
|
|
1519
|
-
const
|
|
1574
|
+
const finish = (results, error) => {
|
|
1575
|
+
settle(results, error);
|
|
1576
|
+
release(Boolean(error) || signal.aborted);
|
|
1577
|
+
};
|
|
1578
|
+
const abort = () => {
|
|
1579
|
+
if (lifecycle.signal.aborted || !detachable) {
|
|
1580
|
+
finish([]);
|
|
1581
|
+
return;
|
|
1582
|
+
}
|
|
1583
|
+
if (settled)
|
|
1584
|
+
return;
|
|
1585
|
+
detachedAt = performance.now();
|
|
1586
|
+
slot.detached = true;
|
|
1587
|
+
slot.markDetached?.();
|
|
1588
|
+
settle([]);
|
|
1589
|
+
abandonTimer = setTimeout(() => {
|
|
1590
|
+
log2(`[auto-search] session ${sessionId}: search still running ${DETACHED_SEARCH_LIMIT_MS} ms after its deadline; disposing its worker (owner vector wait ${formatMs(ownerVectorMs)})`);
|
|
1591
|
+
release(true);
|
|
1592
|
+
}, DETACHED_SEARCH_LIMIT_MS);
|
|
1593
|
+
abandonTimer.unref?.();
|
|
1594
|
+
};
|
|
1520
1595
|
signal?.addEventListener("abort", abort, { once: true });
|
|
1521
1596
|
lifecycle.signal.addEventListener("abort", abort, { once: true });
|
|
1522
1597
|
const onError = (error) => finish([], error);
|
|
1523
1598
|
const onExit = (code) => finish([], new Error(`auto-search worker exited (${code})`));
|
|
1524
1599
|
const onMessage = async (reply) => {
|
|
1525
|
-
if (
|
|
1600
|
+
if (released)
|
|
1526
1601
|
return;
|
|
1527
|
-
if (reply.kind === "result") {
|
|
1602
|
+
if (reply.kind === "result" || reply.kind === "error") {
|
|
1603
|
+
if (detachedAt !== undefined) {
|
|
1604
|
+
logLateSearch(sessionId, performance.now() - detachedAt, detachedAt - startedAt, ownerVectorMs, reply.kind === "result" ? reply.timings : undefined, reply.kind === "error");
|
|
1605
|
+
release(reply.kind === "error");
|
|
1606
|
+
return;
|
|
1607
|
+
}
|
|
1608
|
+
if (reply.kind === "error") {
|
|
1609
|
+
finish([], new Error(reply.error));
|
|
1610
|
+
return;
|
|
1611
|
+
}
|
|
1528
1612
|
if (snapshot && getProjectEmbeddingSnapshot2(projectPath)?.generation !== snapshot.generation)
|
|
1529
1613
|
finish([]);
|
|
1530
1614
|
else
|
|
1531
1615
|
finish(reply.results);
|
|
1532
1616
|
return;
|
|
1533
1617
|
}
|
|
1534
|
-
if (reply.kind === "error") {
|
|
1535
|
-
finish([], new Error(reply.error));
|
|
1536
|
-
return;
|
|
1537
|
-
}
|
|
1538
1618
|
if (reply.kind === "messages" || reply.kind === "accepted")
|
|
1539
1619
|
return;
|
|
1540
1620
|
const response = { id: reply.id };
|
|
1541
|
-
|
|
1621
|
+
if (!signal.aborted) {
|
|
1622
|
+
const requestedAt = performance.now();
|
|
1623
|
+
try {
|
|
1624
|
+
if (reply.kind === "query")
|
|
1625
|
+
response.result = await (job === "backfill" ? embedTextForProject2(projectPath, reply.text, signal, "query") : boundedHintEmbedding(embedQuery, reply.text, signal)) ?? null;
|
|
1626
|
+
else {
|
|
1627
|
+
const passage = await embedBatchForProject2(projectPath, reply.texts, signal, reply.purpose);
|
|
1628
|
+
const current = getProjectEmbeddingSnapshot2(projectPath);
|
|
1629
|
+
response.passage = passage && current ? {
|
|
1630
|
+
...passage,
|
|
1631
|
+
providerIdentity: current.providerIdentity,
|
|
1632
|
+
runtimeFingerprint: current.runtimeFingerprint,
|
|
1633
|
+
dimensions: passage.vectors.find((vector) => vector !== null)?.length ?? null
|
|
1634
|
+
} : null;
|
|
1635
|
+
}
|
|
1636
|
+
} catch (error) {
|
|
1637
|
+
response.error = error instanceof Error ? error.message : String(error);
|
|
1638
|
+
}
|
|
1542
1639
|
if (reply.kind === "query")
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
response.
|
|
1548
|
-
...passage,
|
|
1549
|
-
providerIdentity: current.providerIdentity,
|
|
1550
|
-
runtimeFingerprint: current.runtimeFingerprint,
|
|
1551
|
-
dimensions: passage.vectors.find((vector) => vector !== null)?.length ?? null
|
|
1552
|
-
} : null;
|
|
1640
|
+
ownerVectorMs = performance.now() - requestedAt;
|
|
1641
|
+
if (signal.aborted) {
|
|
1642
|
+
response.result = undefined;
|
|
1643
|
+
response.passage = undefined;
|
|
1644
|
+
response.error = undefined;
|
|
1553
1645
|
}
|
|
1554
|
-
} catch (error) {
|
|
1555
|
-
response.error = error instanceof Error ? error.message : String(error);
|
|
1556
1646
|
}
|
|
1557
1647
|
response.embeddingHostBusy = isEmbeddingHostBusy2();
|
|
1558
|
-
if (!
|
|
1648
|
+
if (!released) {
|
|
1559
1649
|
try {
|
|
1560
1650
|
worker.postMessage(response);
|
|
1561
1651
|
} catch (error) {
|
|
@@ -1577,6 +1667,15 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
|
|
|
1577
1667
|
}
|
|
1578
1668
|
});
|
|
1579
1669
|
}
|
|
1670
|
+
function formatMs(value) {
|
|
1671
|
+
return value === undefined ? "n/a" : `${Math.round(value)} ms`;
|
|
1672
|
+
}
|
|
1673
|
+
function logLateSearch(sessionId, lateMs, waitedMs, ownerVectorMs, timings, failed) {
|
|
1674
|
+
const steps = timings?.steps;
|
|
1675
|
+
const warm = timings?.lastPoolWarm;
|
|
1676
|
+
const pool = warm ? `last pool refresh ${warm.outcome} in ${formatMs(warm.totalMs)} (probe ${formatMs(warm.probeMs)}, read ${formatMs(warm.readMs)}, decode ${formatMs(warm.decodeMs)}, ${warm.probedRows} rows probed, ${warm.decodedRows} decoded)` : "no pool refresh yet";
|
|
1677
|
+
log2(`[auto-search] session ${sessionId}: deadline passed after ${formatMs(waitedMs)}; the search ${failed ? "failed" : "finished"} ${formatMs(lateMs)} later. Steps: message FTS ${formatMs(steps?.messageMs)}, vector wait ${formatMs(steps?.vectorWaitMs)} (owner embedding ${formatMs(ownerVectorMs)}), chunk lane ${formatMs(steps?.chunkMs)} (pool ${steps?.chunkPool ?? "n/a"}), other lanes ${formatMs(steps?.otherLanesMs)}, job ${formatMs(timings?.jobMs)}; ${pool}`);
|
|
1678
|
+
}
|
|
1580
1679
|
async function boundedHintEmbedding(embed, text, signal) {
|
|
1581
1680
|
const controller = new AbortController;
|
|
1582
1681
|
const combined = AbortSignal.any([signal, controller.signal]);
|
|
@@ -1600,6 +1699,7 @@ function defaultAutoSearchWorkerEntry() {
|
|
|
1600
1699
|
}
|
|
1601
1700
|
var MESSAGE_WORKER_ACCEPT_TIMEOUT_MS = 400;
|
|
1602
1701
|
var MESSAGE_WORKER_RESULT_TIMEOUT_MS = 30000;
|
|
1702
|
+
var MESSAGE_SEARCH_WORKER_CLOSE_DEADLINE_MS = 2000;
|
|
1603
1703
|
var messageSearchWorkerFallbacks = new Map;
|
|
1604
1704
|
function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWorkerEntry(), deadlines = {}) {
|
|
1605
1705
|
const fallback = (reason, detail) => {
|
|
@@ -1627,6 +1727,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
|
|
|
1627
1727
|
return new Promise((resolve) => {
|
|
1628
1728
|
let settled = false;
|
|
1629
1729
|
let worker;
|
|
1730
|
+
let shutdown;
|
|
1630
1731
|
let deadline;
|
|
1631
1732
|
const finish = (outcome, reason, detail) => {
|
|
1632
1733
|
if (settled)
|
|
@@ -1635,7 +1736,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
|
|
|
1635
1736
|
clearTimeout(deadline);
|
|
1636
1737
|
if (reason)
|
|
1637
1738
|
fallback(reason, detail);
|
|
1638
|
-
|
|
1739
|
+
shutdown?.close();
|
|
1639
1740
|
worker?.unref();
|
|
1640
1741
|
resolve(outcome);
|
|
1641
1742
|
};
|
|
@@ -1646,6 +1747,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
|
|
|
1646
1747
|
};
|
|
1647
1748
|
try {
|
|
1648
1749
|
worker = inRootAsyncContext2(() => new Worker(entry, { workerData: input }));
|
|
1750
|
+
shutdown = createWorkerShutdown(worker, "message-search", MESSAGE_SEARCH_WORKER_CLOSE_DEADLINE_MS);
|
|
1649
1751
|
} catch (error) {
|
|
1650
1752
|
finish(null, "start-failed", error);
|
|
1651
1753
|
return;
|
|
@@ -1914,7 +2016,8 @@ async function runAutoSearchHint(args) {
|
|
|
1914
2016
|
},
|
|
1915
2017
|
isEmbeddingRuntimeEnabled: () => embeddingEnabled === true,
|
|
1916
2018
|
visibleMemoryIds: options.visibleMemoryIds ?? null,
|
|
1917
|
-
sources: ["memory", "message", "git_commit"]
|
|
2019
|
+
sources: ["memory", "message", "git_commit"],
|
|
2020
|
+
chunkPoolWarmOnly: true
|
|
1918
2021
|
};
|
|
1919
2022
|
return searchAutoHint(db, sessionId, options.projectPath, rawPrompt, {
|
|
1920
2023
|
...searchOptions,
|
|
@@ -1925,6 +2028,11 @@ async function runAutoSearchHint(args) {
|
|
|
1925
2028
|
} catch (error) {
|
|
1926
2029
|
if (lifecycleSignal.aborted)
|
|
1927
2030
|
return AUTO_SEARCH_OK;
|
|
2031
|
+
if (error instanceof AutoSearchBusyError) {
|
|
2032
|
+
sessionLog2(sessionId, "auto-search: an earlier search of this session is still running, skipping hint for this turn");
|
|
2033
|
+
persistAutoSearchSkip(db, sessionId, userMsgId);
|
|
2034
|
+
return { ok: false, kind: "timeout" };
|
|
2035
|
+
}
|
|
1928
2036
|
log2(`[auto-search] unified search failed for session ${sessionId} (no-hint frozen for this turn): ${error instanceof Error ? error.message : String(error)}`);
|
|
1929
2037
|
const outcome = await writeNoHintAndReconcile("error");
|
|
1930
2038
|
return outcome.ok ? { ok: false, kind: "search-failure" } : outcome;
|
|
@@ -1974,7 +2082,7 @@ ${hintText}`;
|
|
|
1974
2082
|
if (outcome.decision.decision === "hint") {
|
|
1975
2083
|
appendReminderToUserMessageById(messages, userMsgId, outcome.decision.text);
|
|
1976
2084
|
}
|
|
1977
|
-
sessionLog2(sessionId, `auto-search: attached hint to ${userMsgId} (${results.length} fragments, top
|
|
2085
|
+
sessionLog2(sessionId, `auto-search: attached hint to ${userMsgId} (${results.length} fragments, top relevance ${(results[0].relevanceScore ?? results[0].score).toFixed(3)})`);
|
|
1978
2086
|
return AUTO_SEARCH_OK;
|
|
1979
2087
|
} finally {
|
|
1980
2088
|
if (!lifecycleSignal.aborted && results !== null)
|
|
@@ -2283,6 +2391,22 @@ function resolveTodowriteAvailability(sessionId) {
|
|
|
2283
2391
|
return resolveToolAvailability(sessionId, TODOWRITE_TOOL);
|
|
2284
2392
|
}
|
|
2285
2393
|
|
|
2394
|
+
// src/hooks/magic-context/diagnostic-log-state.ts
|
|
2395
|
+
var states = new BoundedSessionMap(1000);
|
|
2396
|
+
var scope = (sessionId) => `${getMagicContextStorageDir()}\x00${getHarness2()}\x00${sessionId}`;
|
|
2397
|
+
function diagnosticStateChanged(sessionId, category, state) {
|
|
2398
|
+
const key = scope(sessionId);
|
|
2399
|
+
const previous = states.get(key) ?? new Map;
|
|
2400
|
+
if (previous.get(category) === state)
|
|
2401
|
+
return false;
|
|
2402
|
+
previous.set(category, state);
|
|
2403
|
+
states.set(key, previous);
|
|
2404
|
+
return true;
|
|
2405
|
+
}
|
|
2406
|
+
function clearDiagnosticLogState(sessionId) {
|
|
2407
|
+
states.delete(scope(sessionId));
|
|
2408
|
+
}
|
|
2409
|
+
|
|
2286
2410
|
// src/hooks/magic-context/cache-busting-signals.ts
|
|
2287
2411
|
function canConsumeDeferredOnThisPass(args) {
|
|
2288
2412
|
if (args.justAwaitedPublication)
|
|
@@ -2290,7 +2414,7 @@ function canConsumeDeferredOnThisPass(args) {
|
|
|
2290
2414
|
return args.schedulerDecision === "execute" || args.contextPercentage >= (args.forceMaterializationPercentage ?? escalationBands(65).forceMaterializationPercentage);
|
|
2291
2415
|
}
|
|
2292
2416
|
function hasReclaimRide(signals) {
|
|
2293
|
-
return signals.hardFold || signals.force || signals.explicitFlush || signals.publishedHistory || signals.subagentExecute === true;
|
|
2417
|
+
return signals.hardFold || signals.force || signals.explicitFlush || signals.publishedHistory || signals.subagentExecute === true || signals.executeReclaim === true;
|
|
2294
2418
|
}
|
|
2295
2419
|
function prefixMutationPermitted(gate) {
|
|
2296
2420
|
return !gate.signedThinkingHold || gate.firstRender || gate.idleExpiry || gate.emergency;
|
|
@@ -2303,13 +2427,233 @@ var RECLAIM_RIDE_NAMES = [
|
|
|
2303
2427
|
"force",
|
|
2304
2428
|
"explicitFlush",
|
|
2305
2429
|
"publishedHistory",
|
|
2306
|
-
"subagentExecute"
|
|
2430
|
+
"subagentExecute",
|
|
2431
|
+
"executeReclaim"
|
|
2307
2432
|
];
|
|
2308
2433
|
function reclaimRideLabel(signals) {
|
|
2309
2434
|
const active = RECLAIM_RIDE_NAMES.filter((name) => signals[name]);
|
|
2310
2435
|
return `ride=${active.length > 0 ? active.join("+") : "none"}`;
|
|
2311
2436
|
}
|
|
2312
2437
|
|
|
2438
|
+
// src/hooks/magic-context/pending-drop-eligibility.ts
|
|
2439
|
+
function pendingDropVeto(tagNumber, target, protectedTagIds) {
|
|
2440
|
+
if (protectedTagIds.has(tagNumber))
|
|
2441
|
+
return "protected";
|
|
2442
|
+
if (target?.thinkingDropProtected)
|
|
2443
|
+
return "active_thinking";
|
|
2444
|
+
return null;
|
|
2445
|
+
}
|
|
2446
|
+
function capturePendingDropEligibility(targets, protectedTagIds) {
|
|
2447
|
+
const eligible = new Set;
|
|
2448
|
+
for (const [number, target] of targets) {
|
|
2449
|
+
if (pendingDropVeto(number, target, protectedTagIds))
|
|
2450
|
+
continue;
|
|
2451
|
+
if (target.drop) {
|
|
2452
|
+
if (target.canDrop?.() === true)
|
|
2453
|
+
eligible.add(number);
|
|
2454
|
+
} else {
|
|
2455
|
+
const content = target.getContent?.();
|
|
2456
|
+
const replacement = `[dropped §${number}§]`;
|
|
2457
|
+
if (typeof content === "string" && content.length > replacement.length && target.canSetContent?.(replacement) !== false)
|
|
2458
|
+
eligible.add(number);
|
|
2459
|
+
}
|
|
2460
|
+
}
|
|
2461
|
+
return eligible;
|
|
2462
|
+
}
|
|
2463
|
+
function pendingDropEligibilityKey(db, sessionId, input, protectionInputs) {
|
|
2464
|
+
const digests = input.map((message) => message.contentDigest?.() ?? null);
|
|
2465
|
+
if (digests.some((digest) => digest === null))
|
|
2466
|
+
return null;
|
|
2467
|
+
const revision = db.prepare("SELECT value FROM schema_migrations_meta WHERE key = ?").get(tagRevisionKey(sessionId));
|
|
2468
|
+
if (!revision?.value)
|
|
2469
|
+
return null;
|
|
2470
|
+
return JSON.stringify([
|
|
2471
|
+
input.map((message, index) => [
|
|
2472
|
+
message.id,
|
|
2473
|
+
message.role,
|
|
2474
|
+
message.synthetic,
|
|
2475
|
+
digests[index]
|
|
2476
|
+
]),
|
|
2477
|
+
revision.value,
|
|
2478
|
+
readEpochFloorSnapshot(db, sessionId),
|
|
2479
|
+
sessionDecisionCalibration(db, sessionId).toolsRatio,
|
|
2480
|
+
loadProtectedTailMeta(db, sessionId),
|
|
2481
|
+
[...getMergedReasoningStrippedIds(db, sessionId)].sort(),
|
|
2482
|
+
[...getReasoningRemovalState(db, sessionId).messageIds].sort(),
|
|
2483
|
+
protectionInputs
|
|
2484
|
+
]);
|
|
2485
|
+
}
|
|
2486
|
+
function createPendingDropEligibilityCache() {
|
|
2487
|
+
const sessions = new Map;
|
|
2488
|
+
return {
|
|
2489
|
+
read(sessionId, key) {
|
|
2490
|
+
const previous = sessions.get(sessionId);
|
|
2491
|
+
if (key === null || previous?.key !== key) {
|
|
2492
|
+
sessions.delete(sessionId);
|
|
2493
|
+
return;
|
|
2494
|
+
}
|
|
2495
|
+
return previous.eligible;
|
|
2496
|
+
},
|
|
2497
|
+
record(sessionId, key, eligible) {
|
|
2498
|
+
sessions.delete(sessionId);
|
|
2499
|
+
if (key === null)
|
|
2500
|
+
return;
|
|
2501
|
+
const oldest = sessions.keys().next().value;
|
|
2502
|
+
if (sessions.size >= 64 && oldest !== undefined)
|
|
2503
|
+
sessions.delete(oldest);
|
|
2504
|
+
sessions.set(sessionId, { key, eligible: new Set(eligible) });
|
|
2505
|
+
}
|
|
2506
|
+
};
|
|
2507
|
+
}
|
|
2508
|
+
|
|
2509
|
+
// src/hooks/magic-context/postprocess-read-cache.ts
|
|
2510
|
+
var connections = new WeakMap;
|
|
2511
|
+
function snapshot(db, sessionId) {
|
|
2512
|
+
const transaction = db;
|
|
2513
|
+
try {
|
|
2514
|
+
if (transaction.inTransaction || transaction.isTransaction) {
|
|
2515
|
+
connections.delete(db);
|
|
2516
|
+
return { version: -1, changes: -1 };
|
|
2517
|
+
}
|
|
2518
|
+
} catch {
|
|
2519
|
+
connections.delete(db);
|
|
2520
|
+
return { version: -1, changes: -1 };
|
|
2521
|
+
}
|
|
2522
|
+
let connection = connections.get(db);
|
|
2523
|
+
if (!connection) {
|
|
2524
|
+
connection = {
|
|
2525
|
+
stamp: db.prepare("SELECT total_changes() AS changes, data_version AS version FROM pragma_data_version"),
|
|
2526
|
+
sessions: new BoundedSessionMap(100)
|
|
2527
|
+
};
|
|
2528
|
+
connections.set(db, connection);
|
|
2529
|
+
}
|
|
2530
|
+
const stamp = connection.stamp.get();
|
|
2531
|
+
const previous = connection.sessions.get(sessionId);
|
|
2532
|
+
if (previous?.version === stamp.version && previous.changes === stamp.changes) {
|
|
2533
|
+
return previous;
|
|
2534
|
+
}
|
|
2535
|
+
const value = { ...stamp };
|
|
2536
|
+
connection.sessions.set(sessionId, value);
|
|
2537
|
+
return value;
|
|
2538
|
+
}
|
|
2539
|
+
function postprocessTailTags(db, sessionId) {
|
|
2540
|
+
const state = snapshot(db, sessionId);
|
|
2541
|
+
return state.tags ??= getTailHygieneTags2(db, sessionId);
|
|
2542
|
+
}
|
|
2543
|
+
function postprocessOldestTags(db, sessionId, protectedNumbers) {
|
|
2544
|
+
const state = snapshot(db, sessionId);
|
|
2545
|
+
const hints = state.hints;
|
|
2546
|
+
if (hints && hints.protectedNumbers.size === protectedNumbers.size && [...protectedNumbers].every((number) => hints.protectedNumbers.has(number))) {
|
|
2547
|
+
return hints.value;
|
|
2548
|
+
}
|
|
2549
|
+
const value = getOldestActiveUnprotectedToolTags2(db, sessionId, protectedNumbers);
|
|
2550
|
+
state.hints = { protectedNumbers: new Set(protectedNumbers), value };
|
|
2551
|
+
return value;
|
|
2552
|
+
}
|
|
2553
|
+
function postprocessReplaySnapshot(db, sessionId) {
|
|
2554
|
+
const state = snapshot(db, sessionId);
|
|
2555
|
+
const replay = state.replay ??= loadPostprocessReplaySnapshot(db, sessionId);
|
|
2556
|
+
return {
|
|
2557
|
+
...replay,
|
|
2558
|
+
staleReduceStrippedIds: new Set(replay.staleReduceStrippedIds),
|
|
2559
|
+
processedImageStrippedIds: new Set(replay.processedImageStrippedIds),
|
|
2560
|
+
processedImageMarkers: new Map(replay.processedImageMarkers),
|
|
2561
|
+
strippedPlaceholderIds: new Set(replay.strippedPlaceholderIds),
|
|
2562
|
+
hiddenSeamPlaceholderIds: new Set(replay.hiddenSeamPlaceholderIds),
|
|
2563
|
+
mergedReasoningStrippedIds: new Set(replay.mergedReasoningStrippedIds),
|
|
2564
|
+
trailingBlankDecisions: new Map(replay.trailingBlankDecisions),
|
|
2565
|
+
noteNudgeAnchors: structuredClone(replay.noteNudgeAnchors),
|
|
2566
|
+
autoSearchHintDecisions: structuredClone(replay.autoSearchHintDecisions),
|
|
2567
|
+
todoSyntheticAnchor: structuredClone(replay.todoSyntheticAnchor),
|
|
2568
|
+
pendingCompactionMarker: structuredClone(replay.pendingCompactionMarker),
|
|
2569
|
+
compactionMarker: structuredClone(replay.compactionMarker)
|
|
2570
|
+
};
|
|
2571
|
+
}
|
|
2572
|
+
|
|
2573
|
+
// src/hooks/magic-context/execute-reclaim.ts
|
|
2574
|
+
var NAMESPACE = "executeReclaim";
|
|
2575
|
+
var failedWrites = new WeakMap;
|
|
2576
|
+
function readExecuteReclaimState(db, sessionId) {
|
|
2577
|
+
return parseState(postprocessReplaySnapshot(db, sessionId).executeReclaim);
|
|
2578
|
+
}
|
|
2579
|
+
function parseState(lane) {
|
|
2580
|
+
const value = lane;
|
|
2581
|
+
return {
|
|
2582
|
+
heldPasses: typeof value?.heldPasses === "number" ? Math.max(0, value.heldPasses) : 0,
|
|
2583
|
+
floorOrdinal: typeof value?.floorOrdinal === "number" ? value.floorOrdinal : null,
|
|
2584
|
+
floorPromptId: typeof value?.floorPromptId === "string" ? value.floorPromptId : null
|
|
2585
|
+
};
|
|
2586
|
+
}
|
|
2587
|
+
function writeExecuteReclaimState(db, sessionId, patch) {
|
|
2588
|
+
if (failedWrites.get(db)?.has(sessionId))
|
|
2589
|
+
return false;
|
|
2590
|
+
try {
|
|
2591
|
+
const current = readExecuteReclaimState(db, sessionId);
|
|
2592
|
+
if (JSON.stringify(current) === JSON.stringify({ ...current, ...patch }))
|
|
2593
|
+
return true;
|
|
2594
|
+
if (!updateReplayDocument(db, sessionId, (doc) => {
|
|
2595
|
+
const previous = parseState(doc[NAMESPACE]);
|
|
2596
|
+
const state = { ...previous, ...patch };
|
|
2597
|
+
if (JSON.stringify(previous) === JSON.stringify(state))
|
|
2598
|
+
return false;
|
|
2599
|
+
doc.version = 2;
|
|
2600
|
+
doc[NAMESPACE] = state;
|
|
2601
|
+
return true;
|
|
2602
|
+
}))
|
|
2603
|
+
throw new Error("Could not persist execute reclaim state");
|
|
2604
|
+
return true;
|
|
2605
|
+
} catch (error) {
|
|
2606
|
+
let failed = failedWrites.get(db);
|
|
2607
|
+
if (!failed)
|
|
2608
|
+
failedWrites.set(db, failed = new Set);
|
|
2609
|
+
failed.add(sessionId);
|
|
2610
|
+
sessionLog2(sessionId, `execute reclaim state persistence failed; retaining existing policy: ${String(error)}`);
|
|
2611
|
+
return false;
|
|
2612
|
+
}
|
|
2613
|
+
}
|
|
2614
|
+
function clearExecuteReclaimState(db, sessionId) {
|
|
2615
|
+
writeExecuteReclaimState(db, sessionId, {
|
|
2616
|
+
heldPasses: 0,
|
|
2617
|
+
floorOrdinal: null,
|
|
2618
|
+
floorPromptId: null
|
|
2619
|
+
});
|
|
2620
|
+
}
|
|
2621
|
+
function maintainExecuteFloorMark(db, sessionId, promptId, belowExecute) {
|
|
2622
|
+
failedWrites.get(db)?.delete(sessionId);
|
|
2623
|
+
const state = readExecuteReclaimState(db, sessionId);
|
|
2624
|
+
if (state.floorOrdinal !== null && (belowExecute || promptId !== null && promptId !== state.floorPromptId)) {
|
|
2625
|
+
writeExecuteReclaimState(db, sessionId, { floorOrdinal: null, floorPromptId: null });
|
|
2626
|
+
}
|
|
2627
|
+
}
|
|
2628
|
+
function estimateExecuteReclaimTokens(args) {
|
|
2629
|
+
const eligible = capturePendingDropEligibility(args.targets, args.protectedTagIds);
|
|
2630
|
+
const queued = new Set(args.pendingOps.filter((op) => op.operation === "drop").map((op) => op.tagId));
|
|
2631
|
+
const candidates = args.tags.filter((tag) => tag.status === "active" && queued.has(tag.tagNumber) && eligible.has(tag.tagNumber));
|
|
2632
|
+
const preparationTargets = new Map;
|
|
2633
|
+
for (const tag of candidates) {
|
|
2634
|
+
const target = args.targets.get(tag.tagNumber);
|
|
2635
|
+
if (target?.prepareDrop)
|
|
2636
|
+
preparationTargets.set(tag.tagNumber, target);
|
|
2637
|
+
}
|
|
2638
|
+
const prepared = preparationTargets.size === 0 ? new Set : args.probePreparation?.(preparationTargets) ?? new Set([...preparationTargets].filter(([, target]) => target.prepareDrop?.() !== false).map(([number]) => number));
|
|
2639
|
+
const seed = sessionDecisionCalibration(args.db, args.sessionId);
|
|
2640
|
+
return candidates.reduce((total, tag) => {
|
|
2641
|
+
if (preparationTargets.has(tag.tagNumber) && !prepared.has(tag.tagNumber))
|
|
2642
|
+
return total;
|
|
2643
|
+
const ratio = tag.type === "tool" ? seed.toolsRatio : seed.proseRatio;
|
|
2644
|
+
return total + Math.max(0, (tag.tokenCount ?? Math.ceil(tag.byteSize / 4)) * ratio);
|
|
2645
|
+
}, 0);
|
|
2646
|
+
}
|
|
2647
|
+
function originateExecuteReclaim(args) {
|
|
2648
|
+
if (failedWrites.get(args.db)?.has(args.sessionId))
|
|
2649
|
+
return false;
|
|
2650
|
+
const state = readExecuteReclaimState(args.db, args.sessionId);
|
|
2651
|
+
const heldPasses = args.primaryExecute && args.reclaimableTokens > 0 && !args.alreadyBusting ? state.heldPasses + 1 : 0;
|
|
2652
|
+
if (!writeExecuteReclaimState(args.db, args.sessionId, { heldPasses }))
|
|
2653
|
+
return false;
|
|
2654
|
+
return args.primaryExecute && !args.alreadyBusting && !args.summaryCanCome && args.reclaimableTokens > 0 && (args.usableWindow > 0 && args.reclaimableTokens >= args.usableWindow * 0.02 || heldPasses >= 3);
|
|
2655
|
+
}
|
|
2656
|
+
|
|
2313
2657
|
// src/hooks/magic-context/reasoning-budget-status.ts
|
|
2314
2658
|
var sources = new Map;
|
|
2315
2659
|
function captureOpencodeReasoningBudgetStatus(sessionId, messages, budget, prefixBound, proseRatio = 1) {
|
|
@@ -2592,6 +2936,9 @@ function latestAssistantTurnStart(messages) {
|
|
|
2592
2936
|
function latestAssistantTurnMessages(messages) {
|
|
2593
2937
|
return new Set(messages.slice(latestAssistantTurnStart(messages)));
|
|
2594
2938
|
}
|
|
2939
|
+
function isAnthropicThinkingPart(part, familyRoute) {
|
|
2940
|
+
return isRecord(part) && THINKING_TYPES.has(String(part.type ?? part.kind)) && (familyRoute || isRecord(part.metadata) && isRecord(part.metadata.anthropic));
|
|
2941
|
+
}
|
|
2595
2942
|
function hasActiveAnthropicThinkingTurn(messages, provider, model) {
|
|
2596
2943
|
const familyRoute = isAnthropicFamilyRoute(provider, model);
|
|
2597
2944
|
for (const message of messages.slice(latestAssistantTurnStart(messages))) {
|
|
@@ -2600,7 +2947,7 @@ function hasActiveAnthropicThinkingTurn(messages, provider, model) {
|
|
|
2600
2947
|
const parts = content(message);
|
|
2601
2948
|
if (!Array.isArray(parts))
|
|
2602
2949
|
continue;
|
|
2603
|
-
if (parts.some((part) =>
|
|
2950
|
+
if (parts.some((part) => isAnthropicThinkingPart(part, familyRoute)))
|
|
2604
2951
|
return true;
|
|
2605
2952
|
}
|
|
2606
2953
|
return false;
|
|
@@ -2676,14 +3023,14 @@ function retainedActiveThinkingParts(args) {
|
|
|
2676
3023
|
}
|
|
2677
3024
|
|
|
2678
3025
|
// src/features/magic-context/storage-caveman-rules.ts
|
|
2679
|
-
var
|
|
3026
|
+
var NAMESPACE2 = "caveman";
|
|
2680
3027
|
var CURRENT_RULES_VERSION = 2;
|
|
2681
3028
|
var ORIGINAL_RULES = {
|
|
2682
3029
|
currentRules: false,
|
|
2683
3030
|
englishWordRules: true,
|
|
2684
3031
|
legacyReasoningTags: new Set
|
|
2685
3032
|
};
|
|
2686
|
-
function
|
|
3033
|
+
function parseState2(lane) {
|
|
2687
3034
|
if (!isRecord(lane) || lane.rules !== CURRENT_RULES_VERSION)
|
|
2688
3035
|
return ORIGINAL_RULES;
|
|
2689
3036
|
const tags = Array.isArray(lane.legacyReasoningTags) ? lane.legacyReasoningTags : [];
|
|
@@ -2695,7 +3042,7 @@ function parseState(lane) {
|
|
|
2695
3042
|
}
|
|
2696
3043
|
function getCavemanReplayState(db, sessionId) {
|
|
2697
3044
|
try {
|
|
2698
|
-
return
|
|
3045
|
+
return parseState2(readReplayEnvelope(db, sessionId)[NAMESPACE2]);
|
|
2699
3046
|
} catch (error) {
|
|
2700
3047
|
if (error instanceof ReplayDocumentError)
|
|
2701
3048
|
return ORIGINAL_RULES;
|
|
@@ -2705,11 +3052,11 @@ function getCavemanReplayState(db, sessionId) {
|
|
|
2705
3052
|
function recordCavemanCurrentRules(db, sessionId, englishWordRules, legacyReasoningTags) {
|
|
2706
3053
|
const tags = [...new Set(legacyReasoningTags)].sort((a, b) => a - b);
|
|
2707
3054
|
const persisted = updateReplayDocument(db, sessionId, (doc) => {
|
|
2708
|
-
const current =
|
|
3055
|
+
const current = parseState2(doc[NAMESPACE2]);
|
|
2709
3056
|
if (current.currentRules && current.englishWordRules === englishWordRules)
|
|
2710
3057
|
return false;
|
|
2711
3058
|
doc.version = 2;
|
|
2712
|
-
doc[
|
|
3059
|
+
doc[NAMESPACE2] = {
|
|
2713
3060
|
rules: CURRENT_RULES_VERSION,
|
|
2714
3061
|
legacyReasoningTags: current.currentRules ? [...current.legacyReasoningTags].sort((a, b) => a - b) : tags,
|
|
2715
3062
|
...englishWordRules ? {} : { englishWordRules: false }
|
|
@@ -2923,93 +3270,23 @@ function degradedPassError(site, error) {
|
|
|
2923
3270
|
return new DegradedPassRefusalError(site, { cause: error });
|
|
2924
3271
|
}
|
|
2925
3272
|
|
|
2926
|
-
// src/hooks/magic-context/pending-drop-eligibility.ts
|
|
2927
|
-
function pendingDropVeto(tagNumber, target, protectedTagIds) {
|
|
2928
|
-
if (protectedTagIds.has(tagNumber))
|
|
2929
|
-
return "protected";
|
|
2930
|
-
if (target?.thinkingDropProtected)
|
|
2931
|
-
return "active_thinking";
|
|
2932
|
-
return null;
|
|
2933
|
-
}
|
|
2934
|
-
function capturePendingDropEligibility(targets, protectedTagIds) {
|
|
2935
|
-
const eligible = new Set;
|
|
2936
|
-
for (const [number, target] of targets) {
|
|
2937
|
-
if (pendingDropVeto(number, target, protectedTagIds))
|
|
2938
|
-
continue;
|
|
2939
|
-
if (target.drop) {
|
|
2940
|
-
if (target.canDrop?.() === true)
|
|
2941
|
-
eligible.add(number);
|
|
2942
|
-
} else {
|
|
2943
|
-
const content = target.getContent?.();
|
|
2944
|
-
if (typeof content === "string" && content.length > `[dropped §${number}§]`.length)
|
|
2945
|
-
eligible.add(number);
|
|
2946
|
-
}
|
|
2947
|
-
}
|
|
2948
|
-
return eligible;
|
|
2949
|
-
}
|
|
2950
|
-
function pendingDropEligibilityKey(db, sessionId, input, protectionInputs) {
|
|
2951
|
-
const digests = input.map((message) => message.contentDigest?.() ?? null);
|
|
2952
|
-
if (digests.some((digest) => digest === null))
|
|
2953
|
-
return null;
|
|
2954
|
-
const revision = db.prepare("SELECT value FROM schema_migrations_meta WHERE key = ?").get(tagRevisionKey(sessionId));
|
|
2955
|
-
if (!revision?.value)
|
|
2956
|
-
return null;
|
|
2957
|
-
return JSON.stringify([
|
|
2958
|
-
input.map((message, index) => [
|
|
2959
|
-
message.id,
|
|
2960
|
-
message.role,
|
|
2961
|
-
message.synthetic,
|
|
2962
|
-
digests[index]
|
|
2963
|
-
]),
|
|
2964
|
-
revision.value,
|
|
2965
|
-
readEpochFloorSnapshot(db, sessionId),
|
|
2966
|
-
sessionDecisionCalibration(db, sessionId).toolsRatio,
|
|
2967
|
-
loadProtectedTailMeta(db, sessionId),
|
|
2968
|
-
[...getMergedReasoningStrippedIds(db, sessionId)].sort(),
|
|
2969
|
-
[...getReasoningRemovalState(db, sessionId).messageIds].sort(),
|
|
2970
|
-
protectionInputs
|
|
2971
|
-
]);
|
|
2972
|
-
}
|
|
2973
|
-
function createPendingDropEligibilityCache() {
|
|
2974
|
-
const sessions = new Map;
|
|
2975
|
-
return {
|
|
2976
|
-
read(sessionId, key) {
|
|
2977
|
-
const previous = sessions.get(sessionId);
|
|
2978
|
-
if (key === null || previous?.key !== key) {
|
|
2979
|
-
sessions.delete(sessionId);
|
|
2980
|
-
return;
|
|
2981
|
-
}
|
|
2982
|
-
return previous.eligible;
|
|
2983
|
-
},
|
|
2984
|
-
record(sessionId, key, eligible) {
|
|
2985
|
-
sessions.delete(sessionId);
|
|
2986
|
-
if (key === null)
|
|
2987
|
-
return;
|
|
2988
|
-
const oldest = sessions.keys().next().value;
|
|
2989
|
-
if (sessions.size >= 64 && oldest !== undefined)
|
|
2990
|
-
sessions.delete(oldest);
|
|
2991
|
-
sessions.set(sessionId, { key, eligible: new Set(eligible) });
|
|
2992
|
-
}
|
|
2993
|
-
};
|
|
2994
|
-
}
|
|
2995
|
-
|
|
2996
3273
|
// src/features/magic-context/storage-host-instruction-retention.ts
|
|
2997
|
-
var
|
|
3274
|
+
var NAMESPACE3 = "hostInstructionRetention";
|
|
2998
3275
|
var enabled = true;
|
|
2999
3276
|
function hostInstructionRetentionEnabled() {
|
|
3000
3277
|
return enabled;
|
|
3001
3278
|
}
|
|
3002
3279
|
function isHostInstructionRetentionOn(db, sessionId) {
|
|
3003
|
-
const lane = readReplayEnvelope(db, sessionId)[
|
|
3280
|
+
const lane = readReplayEnvelope(db, sessionId)[NAMESPACE3];
|
|
3004
3281
|
return typeof lane === "object" && lane !== null && lane.on === true;
|
|
3005
3282
|
}
|
|
3006
3283
|
function markHostInstructionRetention(db, sessionId) {
|
|
3007
3284
|
return updateReplayDocument(db, sessionId, (doc) => {
|
|
3008
|
-
const lane = doc[
|
|
3285
|
+
const lane = doc[NAMESPACE3];
|
|
3009
3286
|
if (typeof lane === "object" && lane !== null && lane.on === true)
|
|
3010
3287
|
return false;
|
|
3011
3288
|
doc.version = 2;
|
|
3012
|
-
doc[
|
|
3289
|
+
doc[NAMESPACE3] = { on: true };
|
|
3013
3290
|
return true;
|
|
3014
3291
|
});
|
|
3015
3292
|
}
|
|
@@ -3299,12 +3576,16 @@ function applyPendingOperations(sessionId, db, targets, protectedTagIds, preload
|
|
|
3299
3576
|
}
|
|
3300
3577
|
} else if (target) {
|
|
3301
3578
|
const replacement = buildReplacementContent(pendingOp.tagId);
|
|
3579
|
+
if (target.canSetContent?.(replacement) === false) {
|
|
3580
|
+
reject("content_unchanged");
|
|
3581
|
+
continue;
|
|
3582
|
+
}
|
|
3302
3583
|
persistDrop();
|
|
3303
3584
|
mutations.push(() => {
|
|
3304
3585
|
const priorContent = target.getContent?.();
|
|
3305
3586
|
const changed = target.setContent(replacement);
|
|
3306
|
-
record(changed);
|
|
3307
3587
|
if (changed) {
|
|
3588
|
+
record(true);
|
|
3308
3589
|
const originalCharacters = typeof priorContent === "string" ? priorContent.length : tagById.get(pendingOp.tagId)?.byteSize ?? replacement.length;
|
|
3309
3590
|
onTagReduced?.({
|
|
3310
3591
|
tagNumber: pendingOp.tagId,
|
|
@@ -3875,70 +4156,6 @@ function isVisibleNoteReadPart(part) {
|
|
|
3875
4156
|
return false;
|
|
3876
4157
|
}
|
|
3877
4158
|
|
|
3878
|
-
// src/hooks/magic-context/postprocess-read-cache.ts
|
|
3879
|
-
var connections = new WeakMap;
|
|
3880
|
-
function snapshot(db, sessionId) {
|
|
3881
|
-
const transaction = db;
|
|
3882
|
-
try {
|
|
3883
|
-
if (transaction.inTransaction || transaction.isTransaction) {
|
|
3884
|
-
connections.delete(db);
|
|
3885
|
-
return { version: -1, changes: -1 };
|
|
3886
|
-
}
|
|
3887
|
-
} catch {
|
|
3888
|
-
connections.delete(db);
|
|
3889
|
-
return { version: -1, changes: -1 };
|
|
3890
|
-
}
|
|
3891
|
-
let connection = connections.get(db);
|
|
3892
|
-
if (!connection) {
|
|
3893
|
-
connection = {
|
|
3894
|
-
stamp: db.prepare("SELECT total_changes() AS changes, data_version AS version FROM pragma_data_version"),
|
|
3895
|
-
sessions: new BoundedSessionMap(100)
|
|
3896
|
-
};
|
|
3897
|
-
connections.set(db, connection);
|
|
3898
|
-
}
|
|
3899
|
-
const stamp = connection.stamp.get();
|
|
3900
|
-
const previous = connection.sessions.get(sessionId);
|
|
3901
|
-
if (previous?.version === stamp.version && previous.changes === stamp.changes) {
|
|
3902
|
-
return previous;
|
|
3903
|
-
}
|
|
3904
|
-
const value = { ...stamp };
|
|
3905
|
-
connection.sessions.set(sessionId, value);
|
|
3906
|
-
return value;
|
|
3907
|
-
}
|
|
3908
|
-
function postprocessTailTags(db, sessionId) {
|
|
3909
|
-
const state = snapshot(db, sessionId);
|
|
3910
|
-
return state.tags ??= getTailHygieneTags2(db, sessionId);
|
|
3911
|
-
}
|
|
3912
|
-
function postprocessOldestTags(db, sessionId, protectedNumbers) {
|
|
3913
|
-
const state = snapshot(db, sessionId);
|
|
3914
|
-
const hints = state.hints;
|
|
3915
|
-
if (hints && hints.protectedNumbers.size === protectedNumbers.size && [...protectedNumbers].every((number) => hints.protectedNumbers.has(number))) {
|
|
3916
|
-
return hints.value;
|
|
3917
|
-
}
|
|
3918
|
-
const value = getOldestActiveUnprotectedToolTags2(db, sessionId, protectedNumbers);
|
|
3919
|
-
state.hints = { protectedNumbers: new Set(protectedNumbers), value };
|
|
3920
|
-
return value;
|
|
3921
|
-
}
|
|
3922
|
-
function postprocessReplaySnapshot(db, sessionId) {
|
|
3923
|
-
const state = snapshot(db, sessionId);
|
|
3924
|
-
const replay = state.replay ??= loadPostprocessReplaySnapshot(db, sessionId);
|
|
3925
|
-
return {
|
|
3926
|
-
...replay,
|
|
3927
|
-
staleReduceStrippedIds: new Set(replay.staleReduceStrippedIds),
|
|
3928
|
-
processedImageStrippedIds: new Set(replay.processedImageStrippedIds),
|
|
3929
|
-
processedImageMarkers: new Map(replay.processedImageMarkers),
|
|
3930
|
-
strippedPlaceholderIds: new Set(replay.strippedPlaceholderIds),
|
|
3931
|
-
hiddenSeamPlaceholderIds: new Set(replay.hiddenSeamPlaceholderIds),
|
|
3932
|
-
mergedReasoningStrippedIds: new Set(replay.mergedReasoningStrippedIds),
|
|
3933
|
-
trailingBlankDecisions: new Map(replay.trailingBlankDecisions),
|
|
3934
|
-
noteNudgeAnchors: structuredClone(replay.noteNudgeAnchors),
|
|
3935
|
-
autoSearchHintDecisions: structuredClone(replay.autoSearchHintDecisions),
|
|
3936
|
-
todoSyntheticAnchor: structuredClone(replay.todoSyntheticAnchor),
|
|
3937
|
-
pendingCompactionMarker: structuredClone(replay.pendingCompactionMarker),
|
|
3938
|
-
compactionMarker: structuredClone(replay.compactionMarker)
|
|
3939
|
-
};
|
|
3940
|
-
}
|
|
3941
|
-
|
|
3942
4159
|
// src/hooks/magic-context/strict-thinking-prefix.ts
|
|
3943
4160
|
function servedPrefixMatches(args) {
|
|
3944
4161
|
const heads = args.messages?.slice(0, 2);
|
|
@@ -4810,6 +5027,10 @@ function tagMessages(sessionId, messages, tagger, db, options = {}) {
|
|
|
4810
5027
|
dropReasoningParts: thinkingParts,
|
|
4811
5028
|
mutationParts: [{ message, part: textPart }],
|
|
4812
5029
|
textPrefix: skipPrefixInjection ? "" : prependTag(tagId, ""),
|
|
5030
|
+
canSetContent: (content) => {
|
|
5031
|
+
const partialEnd = messageId ? getPartialEnds().get(messageId) : undefined;
|
|
5032
|
+
return textPart.text !== content && (partialEnd === undefined || partIndex <= partialEnd);
|
|
5033
|
+
},
|
|
4813
5034
|
setContent: (content, options) => {
|
|
4814
5035
|
if (textPart.text === content)
|
|
4815
5036
|
return false;
|
|
@@ -5087,7 +5308,10 @@ function freezeReasoningOnBustingPass2(args) {
|
|
|
5087
5308
|
return { strip: null, persistenceFailed: false };
|
|
5088
5309
|
let persisted = false;
|
|
5089
5310
|
try {
|
|
5090
|
-
persisted = addMergedReasoningStrippedIds(args.db, args.sessionId,
|
|
5311
|
+
persisted = addMergedReasoningStrippedIds(args.db, args.sessionId, [
|
|
5312
|
+
...messageIds.map(thinkingBindingRecoveryFrozenId),
|
|
5313
|
+
...args.compactionOff ? messageIds.map(compactionOffThinkingFrozenId) : []
|
|
5314
|
+
]);
|
|
5091
5315
|
} catch (error) {
|
|
5092
5316
|
sessionLog2(args.sessionId, "proactive thinking strip: persistence threw:", error);
|
|
5093
5317
|
}
|
|
@@ -5113,6 +5337,25 @@ function proactiveStripStartIndex(args) {
|
|
|
5113
5337
|
return divergence;
|
|
5114
5338
|
return divergence ?? lastServed.messages.length;
|
|
5115
5339
|
}
|
|
5340
|
+
function servesThinkingBlock2(messages, providerID, modelID) {
|
|
5341
|
+
const familyRoute = isAnthropicFamilyRoute(providerID, modelID);
|
|
5342
|
+
for (const message of messages) {
|
|
5343
|
+
if (message.info.role !== "assistant")
|
|
5344
|
+
continue;
|
|
5345
|
+
for (const part of message.parts) {
|
|
5346
|
+
if (!isAnthropicThinkingPart(part, familyRoute) || part.ignored === true)
|
|
5347
|
+
continue;
|
|
5348
|
+
if (part.type === "redacted_thinking")
|
|
5349
|
+
return true;
|
|
5350
|
+
if (typeof part.text === "string" && part.text !== "")
|
|
5351
|
+
return true;
|
|
5352
|
+
const records = isRecord(part.metadata) ? Object.values(part.metadata) : [];
|
|
5353
|
+
if (records.some((record) => isRecord(record) && record.redactedData !== undefined))
|
|
5354
|
+
return true;
|
|
5355
|
+
}
|
|
5356
|
+
}
|
|
5357
|
+
return false;
|
|
5358
|
+
}
|
|
5116
5359
|
function isPartDroppedBeforeWire(part, providerID) {
|
|
5117
5360
|
if (!modelAcceptsEmptyContent(providerID) || !isRecord(part))
|
|
5118
5361
|
return false;
|
|
@@ -5597,7 +5840,7 @@ function finalizeMessageRepresentation2(messages, resolvedProviderID, options) {
|
|
|
5597
5840
|
clearedParts = stripClearedReasoning(targetedMessages.filter((message) => !restoredMessages.has(message)));
|
|
5598
5841
|
}
|
|
5599
5842
|
}
|
|
5600
|
-
const bindingRecoveryParts =
|
|
5843
|
+
const bindingRecoveryParts = stripReasoningFromAssistantIds(messages, resolvedProviderID, options?.frozenThinkingBindingMessageIds ?? new Set, restoredMessages);
|
|
5601
5844
|
const mergedReasoningParts = bindingRecoveryParts + (options?.skipMergedReasoningStrip ? 0 : stripReasoningFromMergedAssistants(messages, resolvedProviderID, {
|
|
5602
5845
|
mutationExemptMessage: options?.reasoningMutationExemptMessage,
|
|
5603
5846
|
frozenMessageIds: options?.mergedReasoningStrippedIds,
|
|
@@ -5674,8 +5917,9 @@ async function runPostTransformPhase2(args) {
|
|
|
5674
5917
|
let deferredMaterialize = args.canConsumeDeferredLate && deferredMaterializationWasPending;
|
|
5675
5918
|
let materializationRequested = isExplicitFlush || deferredMaterialize;
|
|
5676
5919
|
const m0M1EnabledForFold = args.m0M1 !== undefined && (!!args.m0M1.projectPath || !!args.m0M1.projectDirectory) && (args.fullFeatureMode || compactionOff);
|
|
5677
|
-
const frozenThinking = new Set(args.activeThinkingTurn ? getMergedReasoningStrippedIds(args.db, args.sessionId) : []);
|
|
5678
|
-
const
|
|
5920
|
+
const frozenThinking = new Set(args.activeThinkingTurn || compactionOff ? getMergedReasoningStrippedIds(args.db, args.sessionId) : []);
|
|
5921
|
+
const compactionOffFrozenThinking = compactionOff ? compactionOffFrozenThinkingIds(frozenThinking) : new Set;
|
|
5922
|
+
const bindingThinking = compactionOff ? new Set(compactionOffFrozenThinking) : new Set([...frozenThinking].filter((id) => id.startsWith(THINKING_BINDING_RECOVERY_FROZEN_PREFIX)).map((id) => id.slice(THINKING_BINDING_RECOVERY_FROZEN_PREFIX.length)));
|
|
5679
5923
|
const retainedThinking = args.activeThinkingTurn ? retainedActiveThinkingParts({
|
|
5680
5924
|
messages: args.messages,
|
|
5681
5925
|
providerID: args.resolvedProviderID,
|
|
@@ -5700,15 +5944,22 @@ async function runPostTransformPhase2(args) {
|
|
|
5700
5944
|
let freezeM0M1 = args.freezeM0M1 === true || activeThinkingPrefixHold;
|
|
5701
5945
|
let rewritingSignedPrefix = false;
|
|
5702
5946
|
let thinkingReleasedForFit = false;
|
|
5703
|
-
const releaseThinkingForRewrite = (forFit = false) => {
|
|
5947
|
+
const releaseThinkingForRewrite = (forFit = false, stripInCompactionOff = false) => {
|
|
5948
|
+
const stripOffWire = compactionOff && stripInCompactionOff;
|
|
5704
5949
|
const stripped = freezeReasoningOnBustingPass2({
|
|
5705
5950
|
db: args.db,
|
|
5706
5951
|
sessionId: args.sessionId,
|
|
5707
5952
|
messages: args.messages,
|
|
5708
|
-
alreadyFrozen: bindingThinking
|
|
5953
|
+
alreadyFrozen: bindingThinking,
|
|
5954
|
+
compactionOff: stripOffWire
|
|
5709
5955
|
});
|
|
5710
5956
|
if (stripped.persistenceFailed)
|
|
5711
5957
|
throw new Error("Cannot persist signed thinking omission before prefix rewrite");
|
|
5958
|
+
if (stripOffWire)
|
|
5959
|
+
for (const id of stripped.strip?.messageIds ?? [])
|
|
5960
|
+
compactionOffFrozenThinking.add(id);
|
|
5961
|
+
for (const id of stripped.strip?.messageIds ?? [])
|
|
5962
|
+
bindingThinking.add(id);
|
|
5712
5963
|
retainedThinking.clear();
|
|
5713
5964
|
protectedThinkingMessages.clear();
|
|
5714
5965
|
activeThinkingTurn = false;
|
|
@@ -5721,6 +5972,10 @@ async function runPostTransformPhase2(args) {
|
|
|
5721
5972
|
if (args.forceSignedRebuildForFit && (activeThinkingPrefixHold || activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true)) {
|
|
5722
5973
|
releaseThinkingForRewrite(true);
|
|
5723
5974
|
}
|
|
5975
|
+
if (args.compactionModeTransition === true && args.thinkingBindingRecoveryEnabledForModel === true) {
|
|
5976
|
+
sessionLog2(args.sessionId, "compaction mode switch: stripping signed thinking");
|
|
5977
|
+
releaseThinkingForRewrite(false, true);
|
|
5978
|
+
}
|
|
5724
5979
|
const foldDueDecision = m0M1EnabledForFold && args.m0M1 && !freezeM0M1 ? mustMaterialize({
|
|
5725
5980
|
db: args.db,
|
|
5726
5981
|
sessionId: args.sessionId,
|
|
@@ -5760,6 +6015,7 @@ async function runPostTransformPhase2(args) {
|
|
|
5760
6015
|
};
|
|
5761
6016
|
if ((foldDueDecision.value || softRefreshOpportunity || firstRenderBust && activeThinkingPrefixHold) && m0M1EnabledForFold && args.m0M1) {
|
|
5762
6017
|
let committedFoldBustsServedPrefix;
|
|
6018
|
+
let committedFoldChangesHead;
|
|
5763
6019
|
try {
|
|
5764
6020
|
const previousM1 = args.sessionMeta.cachedM1Bytes?.toString("utf8");
|
|
5765
6021
|
const foldResult = injectM0M1({
|
|
@@ -5789,6 +6045,12 @@ async function runPostTransformPhase2(args) {
|
|
|
5789
6045
|
m1Text: rendered.m1Bytes.toString(),
|
|
5790
6046
|
muralDataUrl: rendered.muralDataUrl
|
|
5791
6047
|
}) : foldBustsServedPrefix(foldDueDecision.reason, servedPrefixBeforeFold, rendered);
|
|
6048
|
+
committedFoldChangesHead = firstRenderBust ? !servedPrefixMatches({
|
|
6049
|
+
messages: servedBeforeFirstRender,
|
|
6050
|
+
m0Text: rendered.m0Bytes.toString(),
|
|
6051
|
+
m1Text: rendered.m1Bytes.toString(),
|
|
6052
|
+
muralDataUrl: rendered.muralDataUrl
|
|
6053
|
+
}) : foldChangesServedPrefix(servedPrefixBeforeFold, rendered);
|
|
5792
6054
|
if (bustsPrefix) {
|
|
5793
6055
|
if (!conversions.isCurrent(db)) {
|
|
5794
6056
|
throw new MaterializeContentionError({
|
|
@@ -5806,7 +6068,10 @@ async function runPostTransformPhase2(args) {
|
|
|
5806
6068
|
});
|
|
5807
6069
|
preparedPrefix = foldResult;
|
|
5808
6070
|
if (activeThinkingPrefixHold && firstRenderBust && committedFoldBustsServedPrefix) {
|
|
5809
|
-
releaseThinkingForRewrite();
|
|
6071
|
+
releaseThinkingForRewrite(false, true);
|
|
6072
|
+
} else if (compactionOff && !activeThinkingPrefixHold && args.thinkingBindingRecoveryEnabledForModel === true && committedFoldChangesHead) {
|
|
6073
|
+
sessionLog2(args.sessionId, "compaction-off fold changed the head: stripping signed thinking");
|
|
6074
|
+
releaseThinkingForRewrite(false, true);
|
|
5810
6075
|
}
|
|
5811
6076
|
prefixPreflightFailed = foldResult.materializationContentionRetryExhausted === true;
|
|
5812
6077
|
foldExecutedThisPass = foldExecutesThisPass(foldDueDecision.value || softRefreshOpportunity, foldResult.m0RematerializedThisPass);
|
|
@@ -5864,12 +6129,30 @@ async function runPostTransformPhase2(args) {
|
|
|
5864
6129
|
const heldIdleExpiryRebuild = activeThinkingPrefixHold && args.m0M1?.hardSignals?.cacheExpired === true;
|
|
5865
6130
|
const idleExpiryRebuild = (!freezeM0M1 || activeThinkingPrefixHold) && args.m0M1?.hardSignals?.cacheExpired === true;
|
|
5866
6131
|
const rideSignals = {
|
|
6132
|
+
executeReclaim: false,
|
|
5867
6133
|
subagentExecute: !args.fullFeatureMode && args.schedulerDecision === "execute",
|
|
5868
6134
|
hardFold: rewritingSignedPrefix || foldBustsServedPrefixThisPass || firstRenderBust || idleExpiryRebuild,
|
|
5869
6135
|
force: emergencyDropEligible && (args.contextUsage.percentage >= 95 || args.contextUsageFromEstimate !== true && getEmergencyInputSample(args.db, args.sessionId) === 0),
|
|
5870
6136
|
explicitFlush: isExplicitFlush && hasPendingMaterializationOrigin(args.pendingMaterializationSessions, args.sessionId, "user_flush"),
|
|
5871
6137
|
publishedHistory: !prefixPreflightFailed && (publishedM1RefreshedThisPass || !m0M1EnabledForFold && (args.pendingCompartmentInjection?.compartmentCount ?? 0) > 0 && legacyPublishedHeadChanged(args))
|
|
5872
6138
|
};
|
|
6139
|
+
const protectedToolTags = protectedToolTagNumbers(args.tags, args.protectedTools);
|
|
6140
|
+
rideSignals.executeReclaim = !compactionOff && originateExecuteReclaim({
|
|
6141
|
+
db: args.db,
|
|
6142
|
+
sessionId: args.sessionId,
|
|
6143
|
+
primaryExecute: args.fullFeatureMode && args.schedulerDecision === "execute" && args.contextUsage.percentage < args.forceMaterializationPercentage,
|
|
6144
|
+
alreadyBusting: Object.values(rideSignals).some(Boolean) || args.historyRebuiltThisPass,
|
|
6145
|
+
summaryCanCome: compartmentRunning || args.sessionMeta.compartmentInProgress || (prefixPreflightFailed || freezeM0M1 || activeThinkingPrefixHold) && (args.deferredHistoryRefreshSessions.has(args.sessionId) || args.deferredMaterializationSessions.has(args.sessionId) || args.historyRefreshSessions?.has(args.sessionId) === true) || readExecuteReclaimState(args.db, args.sessionId).floorOrdinal !== null,
|
|
6146
|
+
reclaimableTokens: estimateExecuteReclaimTokens({
|
|
6147
|
+
db: args.db,
|
|
6148
|
+
sessionId: args.sessionId,
|
|
6149
|
+
pendingOps,
|
|
6150
|
+
tags: args.tags,
|
|
6151
|
+
targets: newTargets,
|
|
6152
|
+
protectedTagIds: new Set([...args.protectedTagIds, ...protectedToolTags])
|
|
6153
|
+
}),
|
|
6154
|
+
usableWindow: args.usableWindow
|
|
6155
|
+
});
|
|
5873
6156
|
const publishedWorkDrainAllowed = !compactionOff && reclaimRidePermitted(rideSignals, {
|
|
5874
6157
|
signedThinkingHold: activeThinkingPrefixHold,
|
|
5875
6158
|
firstRender: firstRenderBust,
|
|
@@ -5877,7 +6160,7 @@ async function runPostTransformPhase2(args) {
|
|
|
5877
6160
|
emergency: emergencyDropEligible
|
|
5878
6161
|
});
|
|
5879
6162
|
const shouldApplyPendingOps = publishedWorkDrainAllowed;
|
|
5880
|
-
const shouldRunHeuristics = publishedWorkDrainAllowed && (rideSignals.publishedHistory || materializationRequested || forceMaterialization || foldBustsServedPrefixThisPass || firstRenderBust || heldIdleExpiryRebuild || emergencyDropEligible || args.schedulerDecision === "execute" && (!alreadyRanThisTurn || !args.fullFeatureMode));
|
|
6163
|
+
const shouldRunHeuristics = publishedWorkDrainAllowed && (rideSignals.publishedHistory || rideSignals.executeReclaim || materializationRequested || forceMaterialization || foldBustsServedPrefixThisPass || firstRenderBust || heldIdleExpiryRebuild || emergencyDropEligible || args.schedulerDecision === "execute" && (!alreadyRanThisTurn || !args.fullFeatureMode));
|
|
5881
6164
|
const isCacheBustingPass = publishedWorkDrainAllowed;
|
|
5882
6165
|
let unheldSignedTurnBust = false;
|
|
5883
6166
|
if (isCacheBustingPass && !activeThinkingPrefixHold && activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true) {
|
|
@@ -5969,17 +6252,28 @@ async function runPostTransformPhase2(args) {
|
|
|
5969
6252
|
throw new EmergencyFailClosedError("Magic Context could not read its saved reasoning-removal state for this session", { cause: error });
|
|
5970
6253
|
}
|
|
5971
6254
|
}
|
|
6255
|
+
const heuristicsLogChanged = diagnosticStateChanged(args.sessionId, "heuristics", JSON.stringify([
|
|
6256
|
+
args.currentTurnId,
|
|
6257
|
+
shouldRunHeuristics,
|
|
6258
|
+
shouldRunHeuristics ? null : args.schedulerDeferReason
|
|
6259
|
+
]));
|
|
6260
|
+
const pendingLogChanged = diagnosticStateChanged(args.sessionId, "pending-ops", JSON.stringify([
|
|
6261
|
+
args.currentTurnId,
|
|
6262
|
+
shouldApplyPendingOps,
|
|
6263
|
+
shouldApplyPendingOps ? null : args.schedulerDeferReason,
|
|
6264
|
+
shouldApplyPendingOps ? null : (getPendingOpsCount(args.db, args.sessionId) ?? 0) > 0
|
|
6265
|
+
]));
|
|
5972
6266
|
if (shouldRunHeuristics) {
|
|
5973
6267
|
const subagentRerun = !args.fullFeatureMode && alreadyRanThisTurn && args.schedulerDecision === "execute" && !isExplicitFlush && !forceMaterialization;
|
|
5974
6268
|
const reason = isExplicitFlush ? `pending_materialization origin=${pendingOrigin}` : deferredMaterialize ? "deferred_materialization" : forceMaterialization ? `force_materialization (${args.contextUsage.percentage.toFixed(1)}% >= ${args.forceMaterializationPercentage}%)` : foldBustsServedPrefixThisPass && args.schedulerDecision !== "execute" ? `m0_hard_fold (drain folded into executed m[0] bust, scheduler=${args.schedulerDecision})` : subagentRerun ? `${reclaimRideLabel(rideSignals)} subagent_rerun (pendingOps=${pendingOps.length}, scheduler=${args.schedulerDecision})` : `${reclaimRideLabel(rideSignals)} (pendingOps=${pendingOps.length}, scheduler=${args.schedulerDecision})`;
|
|
5975
6269
|
sessionLog2(args.sessionId, `heuristics WILL RUN — reason=${reason}, context=${args.contextUsage.percentage.toFixed(1)}%, turn=${args.currentTurnId}`);
|
|
5976
|
-
} else if (args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
|
|
6270
|
+
} else if (heuristicsLogChanged && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
|
|
5977
6271
|
sessionLog2(args.sessionId, `heuristics WILL NOT RUN — reason=${args.schedulerDeferReason}`);
|
|
5978
6272
|
}
|
|
5979
6273
|
if (alreadyRanThisTurn && args.schedulerDecision === "execute" && !materializationRequested && args.fullFeatureMode) {
|
|
5980
6274
|
sessionLog2(args.sessionId, `transform: skipping heuristics (already ran for turn ${args.currentTurnId})`);
|
|
5981
6275
|
}
|
|
5982
|
-
if (!shouldApplyPendingOps && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
|
|
6276
|
+
if (!shouldApplyPendingOps && pendingLogChanged && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
|
|
5983
6277
|
sessionLog2(args.sessionId, `pending ops WILL NOT APPLY — reason=${args.schedulerDeferReason} pendingOps=${formatPendingOpsDepth()} context=${args.contextUsage.percentage.toFixed(1)}%`);
|
|
5984
6278
|
}
|
|
5985
6279
|
if (hasPendingUserOps && !shouldApplyPendingOps) {
|
|
@@ -5988,7 +6282,6 @@ async function runPostTransformPhase2(args) {
|
|
|
5988
6282
|
let explicitMaterializedSuccessfully = false;
|
|
5989
6283
|
let deferredMaterializedSuccessfully = false;
|
|
5990
6284
|
let pendingOpsDidMutate = false;
|
|
5991
|
-
const protectedToolTags = protectedToolTagNumbers(args.tags, args.protectedTools);
|
|
5992
6285
|
const firstApplicationEdits = { any: false, beforeNewerThinking: false };
|
|
5993
6286
|
const recordFirstApplicationWireEdit = (beforeNewerThinking) => {
|
|
5994
6287
|
firstApplicationEdits.any = true;
|
|
@@ -6724,7 +7017,10 @@ async function runPostTransformPhase2(args) {
|
|
|
6724
7017
|
const mergedReasoningStrippedIds = new Set(replaySnapshot?.mergedReasoningStrippedIds ?? []);
|
|
6725
7018
|
const frozenThinkingBindingMessageIds = new Set;
|
|
6726
7019
|
let thinkingBindingRecovery = null;
|
|
6727
|
-
if (
|
|
7020
|
+
if (compactionOff) {
|
|
7021
|
+
for (const id of compactionOffFrozenThinking)
|
|
7022
|
+
frozenThinkingBindingMessageIds.add(id);
|
|
7023
|
+
} else {
|
|
6728
7024
|
try {
|
|
6729
7025
|
for (const id of mergedReasoningStrippedIds) {
|
|
6730
7026
|
if (id.startsWith(THINKING_BINDING_RECOVERY_FROZEN_PREFIX)) {
|
|
@@ -7066,6 +7362,8 @@ async function runPostTransformPhase2(args) {
|
|
|
7066
7362
|
});
|
|
7067
7363
|
}
|
|
7068
7364
|
logTransformTiming(args.sessionId, "pp.tailGuard", tTailGuard);
|
|
7365
|
+
if (bustedThisPass)
|
|
7366
|
+
clearExecuteReclaimState(args.db, args.sessionId);
|
|
7069
7367
|
return {
|
|
7070
7368
|
explicitMaterializedSuccessfully,
|
|
7071
7369
|
deferredMaterializedSuccessfully,
|
|
@@ -7086,8 +7384,7 @@ async function runPostTransformPhase2(args) {
|
|
|
7086
7384
|
prefixTrimStatus: deliveredPrefix?.prefixTrimStatus ?? null,
|
|
7087
7385
|
thinkingBindingRecovery,
|
|
7088
7386
|
proactiveThinkingStrip,
|
|
7089
|
-
thinkingReleasedForFit
|
|
7090
|
-
openTurnSignedThinkingKept: args.thinkingBindingRecoveryEnabledForModel === true && activeThinkingTurn && !rewritingSignedPrefix
|
|
7387
|
+
thinkingReleasedForFit
|
|
7091
7388
|
};
|
|
7092
7389
|
}
|
|
7093
7390
|
function checkM0MutationDriftAndSignal2(args) {
|
|
@@ -7102,4 +7399,4 @@ function checkM0MutationDriftAndSignal2(args) {
|
|
|
7102
7399
|
return false;
|
|
7103
7400
|
}
|
|
7104
7401
|
|
|
7105
|
-
export { makeToolCompositeKey, createTagger, cavemanWordRulesForLanguage, searchMessageHistoryOffThread, findSessionId, findLastUserMessageId, clearAutoSearchForSession, setCtxReduceRegisteredGlobally, resolveCtxReduceAvailabilityFromMessages, resolveCtxReduceAvailability, primeCtxReduceSpawnPermission, ctxReduceSpawnPermissionReadNeeded, spawnAgentFromMessages, spawnAgentFromOpenCodeDb, todowritePermissionDenied, cachedToolPermissionDenied, clearToolPermissionDenied, resolveTodowriteAvailabilityFromMessages, resolveTodowriteAvailability, canConsumeDeferredOnThisPass, hasReclaimRide, reclaimRidePermitted, reclaimRideLabel, captureOpencodeReasoningBudgetStatus, reasoningBudgetStatusLine, ENGINE_RECONNECTING_USER_MESSAGE, ENGINE_BUSY_USER_MESSAGE, SIGNED_THINKING_RESET_FENCE_FAILED, contextRefusalError, protectedToolRefusal, outgoingContextRefusal, signedTurnContextRefusal, EmergencyFailClosedError, latestAssistantTurnStart, latestAssistantTurnMessages, hasActiveAnthropicThinkingTurn, replayCavemanCompression, DegradedPassRefusalError, degradedPassError,
|
|
7402
|
+
export { makeToolCompositeKey, createTagger, cavemanWordRulesForLanguage, searchMessageHistoryOffThread, findSessionId, findLastUserMessageId, clearAutoSearchForSession, setCtxReduceRegisteredGlobally, resolveCtxReduceAvailabilityFromMessages, resolveCtxReduceAvailability, primeCtxReduceSpawnPermission, ctxReduceSpawnPermissionReadNeeded, spawnAgentFromMessages, spawnAgentFromOpenCodeDb, todowritePermissionDenied, cachedToolPermissionDenied, clearToolPermissionDenied, resolveTodowriteAvailabilityFromMessages, resolveTodowriteAvailability, diagnosticStateChanged, clearDiagnosticLogState, canConsumeDeferredOnThisPass, hasReclaimRide, reclaimRidePermitted, reclaimRideLabel, pendingDropEligibilityKey, createPendingDropEligibilityCache, readExecuteReclaimState, writeExecuteReclaimState, maintainExecuteFloorMark, captureOpencodeReasoningBudgetStatus, reasoningBudgetStatusLine, ENGINE_RECONNECTING_USER_MESSAGE, ENGINE_BUSY_USER_MESSAGE, SIGNED_THINKING_RESET_FENCE_FAILED, contextRefusalError, protectedToolRefusal, outgoingContextRefusal, signedTurnContextRefusal, EmergencyFailClosedError, latestAssistantTurnStart, latestAssistantTurnMessages, hasActiveAnthropicThinkingTurn, replayCavemanCompression, DegradedPassRefusalError, degradedPassError, applyFlushedStatuses, prewarmTagOwners, waitForTagOwners, stripStructuralNoise, withTransformTimingSummary, logTransformTiming, hasRecentAssistantCommit, tagMessages, resetDegradedCacheCount2, isSyntheticHeadMessage2, applyTodoSynthesis2, freezeReasoningOnBustingPass2, servesThinkingBlock2, firstServedDivergenceIndex2, rustModeServedKeyAfterPersistedStrips2, replayRustModeBindingMismatchStrips2, RUST_MARKER_LOCK_SKIP_LOG2, applyRustModeDeferredCompactionMarker2, clearRustModeBoundaryRecord2, runRustModePostprocess2, reconcileMarkerRepresentation2, clearPendingCompactionMarkerAfterSuccessfulDrain2, defaultCompactionMarkerStrategy2, abortSessionFailClosed2, evaluateEmergencyFailClosed2, finalizeMessageRepresentation2, runPostTransformPhase2, checkM0MutationDriftAndSignal2 };
|