@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
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
resolveLegacyConfigSources,
|
|
7
7
|
getProtectedTokensTierOverrides,
|
|
8
8
|
loadPluginConfigDetailed
|
|
9
|
-
} from "./server-
|
|
9
|
+
} from "./server-5arr9ecn.js";
|
|
10
10
|
import {
|
|
11
11
|
getHarness2,
|
|
12
12
|
harnessOwnsOpenCodeStore2
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
log2,
|
|
22
22
|
sessionLog2,
|
|
23
23
|
getLoggerDiagnostics2
|
|
24
|
-
} from "./server-
|
|
24
|
+
} from "./server-6495nmn9.js";
|
|
25
25
|
import {
|
|
26
26
|
hasTrustedAbsoluteWall,
|
|
27
27
|
applyProvenInputFloor,
|
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
getSdkContextLimit,
|
|
34
34
|
getSdkOutputLimit,
|
|
35
35
|
getModelsDevCacheState
|
|
36
|
-
} from "./server-
|
|
36
|
+
} from "./server-29qp8nz4.js";
|
|
37
37
|
import {
|
|
38
38
|
isValidLanguageCode,
|
|
39
39
|
withContentLanguageDirective,
|
|
@@ -64,7 +64,7 @@ import {
|
|
|
64
64
|
userMemoryCollectionEnabled2,
|
|
65
65
|
userObservationCollectionEnabled2,
|
|
66
66
|
userObservationsRequested2
|
|
67
|
-
} from "./server-
|
|
67
|
+
} from "./server-92g7d776.js";
|
|
68
68
|
import {
|
|
69
69
|
historianRunConfig,
|
|
70
70
|
dreamerRunConfig,
|
|
@@ -127,6 +127,8 @@ import {
|
|
|
127
127
|
hasProcessLocalLkgProof,
|
|
128
128
|
lkgDirtyRevision,
|
|
129
129
|
rememberLkgDirtyRevision,
|
|
130
|
+
readPersistedLkgUntaggedInputIds,
|
|
131
|
+
persistLkgUntaggedInputIds,
|
|
130
132
|
noteLkgRecoveryPrefix,
|
|
131
133
|
readLkgRecoveryPrefix,
|
|
132
134
|
noteLkgHealthyPrefix,
|
|
@@ -203,11 +205,15 @@ import {
|
|
|
203
205
|
parseProviderModel,
|
|
204
206
|
modelBodyField,
|
|
205
207
|
toModelEntry,
|
|
208
|
+
ModelProducedNoOutputError,
|
|
209
|
+
noteModelActivityMonitored,
|
|
210
|
+
noteModelOutputReceived,
|
|
206
211
|
isPromptTimeoutError,
|
|
207
212
|
getPromptFailureDetail,
|
|
208
213
|
raceWithSignal,
|
|
209
214
|
promptSyncWithValidatedOutputRetry,
|
|
210
215
|
normalizeSDKResponse,
|
|
216
|
+
annotateSubagentInvocationError,
|
|
211
217
|
failedInvocationStatus,
|
|
212
218
|
sumTokensFromChildMessages,
|
|
213
219
|
recordChildInvocation,
|
|
@@ -280,10 +286,10 @@ import {
|
|
|
280
286
|
startCompartmentAgent,
|
|
281
287
|
setRecompStarting2,
|
|
282
288
|
setRecompTerminal2
|
|
283
|
-
} from "./server-
|
|
289
|
+
} from "./server-c7dxxsj7.js";
|
|
284
290
|
import {
|
|
285
291
|
resolveHistorianModel2
|
|
286
|
-
} from "./server-
|
|
292
|
+
} from "./server-5kym00ag.js";
|
|
287
293
|
import {
|
|
288
294
|
formatFailClosedBlockingMessage,
|
|
289
295
|
formatFailClosedBlockingSummary,
|
|
@@ -305,7 +311,7 @@ import {
|
|
|
305
311
|
openDatabaseAsync,
|
|
306
312
|
isDatabasePersisted,
|
|
307
313
|
getDatabasePersistenceError
|
|
308
|
-
} from "./server-
|
|
314
|
+
} from "./server-hqzyq8n4.js";
|
|
309
315
|
import {
|
|
310
316
|
pruneMissingProjectIdentities,
|
|
311
317
|
setHomeProjectPermission,
|
|
@@ -322,7 +328,7 @@ import {
|
|
|
322
328
|
storedPathBelongsToIdentity,
|
|
323
329
|
beginBootQuietPeriod,
|
|
324
330
|
scheduleAfterBootQuiet
|
|
325
|
-
} from "./server-
|
|
331
|
+
} from "./server-ne8arh8t.js";
|
|
326
332
|
import {
|
|
327
333
|
detectLatestTurnThinkingMismatch,
|
|
328
334
|
isPrefixBoundThinkingModel,
|
|
@@ -418,6 +424,8 @@ import {
|
|
|
418
424
|
applyStrippedPlaceholderDelta,
|
|
419
425
|
THINKING_BINDING_RECOVERY_FROZEN_PREFIX,
|
|
420
426
|
thinkingBindingRecoveryFrozenId,
|
|
427
|
+
compactionOffThinkingFrozenId,
|
|
428
|
+
compactionOffFrozenThinkingIds,
|
|
421
429
|
getThinkingBindingRecoveryTarget,
|
|
422
430
|
clearThinkingBindingRecoveryIf,
|
|
423
431
|
getMergedReasoningStrippedIds,
|
|
@@ -515,7 +523,7 @@ import {
|
|
|
515
523
|
readRawSessionMessageById2,
|
|
516
524
|
readSessionChunk2,
|
|
517
525
|
readRawSessionSeedTail2
|
|
518
|
-
} from "./server-
|
|
526
|
+
} from "./server-ej96a39v.js";
|
|
519
527
|
import {
|
|
520
528
|
embedPauseBySession,
|
|
521
529
|
embedRunStateBySession,
|
|
@@ -544,7 +552,7 @@ import {
|
|
|
544
552
|
embedSessionCompartmentChunks2,
|
|
545
553
|
getEmbeddingCoverageStatus2,
|
|
546
554
|
getAutoEmbeddingSessionCoverage2
|
|
547
|
-
} from "./server-
|
|
555
|
+
} from "./server-0epqaxhd.js";
|
|
548
556
|
import {
|
|
549
557
|
textMentionsRecentCommit,
|
|
550
558
|
hasMeaningfulUserText2,
|
|
@@ -555,7 +563,7 @@ import {
|
|
|
555
563
|
estimateTokens,
|
|
556
564
|
estimateFixedPromptTokens,
|
|
557
565
|
normalizeText
|
|
558
|
-
} from "./server-
|
|
566
|
+
} from "./server-3mz2qh5a.js";
|
|
559
567
|
import {
|
|
560
568
|
SubcClient,
|
|
561
569
|
connectionFileExists,
|
|
@@ -563,7 +571,7 @@ import {
|
|
|
563
571
|
toSynapseLaneDescriptor,
|
|
564
572
|
formatSynapseLaneDescriptor,
|
|
565
573
|
SynapseEmbeddingProvider
|
|
566
|
-
} from "./server-
|
|
574
|
+
} from "./server-af2pght7.js";
|
|
567
575
|
import {
|
|
568
576
|
inRootAsyncContext2,
|
|
569
577
|
getTagIdentityWriteGeneration2,
|
|
@@ -577,30 +585,34 @@ import {
|
|
|
577
585
|
isTransientSqliteError2,
|
|
578
586
|
SqliteAcquisitionBusyError2,
|
|
579
587
|
withAsyncPrivilegedWriter2
|
|
580
|
-
} from "./server-
|
|
588
|
+
} from "./server-1zx2pa5d.js";
|
|
581
589
|
import"./server-51779zs2.js";
|
|
590
|
+
import {
|
|
591
|
+
createWorkerShutdown
|
|
592
|
+
} from "./server-cpjk5jd2.js";
|
|
582
593
|
import {
|
|
583
594
|
isRawCompactionSummaryInfo2,
|
|
584
595
|
extractInMemoryMessageViews2,
|
|
585
596
|
buildInMemoryTailRawMessages2,
|
|
586
597
|
RawOrdinalsNotReady2,
|
|
587
598
|
runSessionWarmupWorker
|
|
588
|
-
} from "./server-
|
|
589
|
-
import"./server-
|
|
599
|
+
} from "./server-55rgxfrw.js";
|
|
600
|
+
import"./server-br1x0tev.js";
|
|
590
601
|
import {
|
|
591
|
-
|
|
592
|
-
} from "./server-
|
|
602
|
+
deleteChunkEmbedBackoffForSession2
|
|
603
|
+
} from "./server-wyawsa88.js";
|
|
593
604
|
import {
|
|
594
605
|
registerOwnRpcServerInstance,
|
|
595
606
|
rpcPortDir,
|
|
596
607
|
rpcPortFilePath,
|
|
597
608
|
parseRpcPortFile,
|
|
598
609
|
inspectProcessesAsync
|
|
599
|
-
} from "./server-
|
|
610
|
+
} from "./server-k3t06fxr.js";
|
|
600
611
|
import {
|
|
601
612
|
BoundedSessionMap,
|
|
602
613
|
LkgRecoveryFenceError,
|
|
603
614
|
lkgServedArrayDigest,
|
|
615
|
+
takeLkgRecoveryLockSweepPage,
|
|
604
616
|
hasCleanLkgRecoveryFence,
|
|
605
617
|
dirtyLkgRecoveryRevision,
|
|
606
618
|
ownsLkgDirtyFence,
|
|
@@ -621,7 +633,7 @@ import {
|
|
|
621
633
|
isMessageIndexReconciledThrough2,
|
|
622
634
|
indexMessagesAfterOrdinal2,
|
|
623
635
|
sweepOrphanedOpenCodeMessageIndexesCooperatively2
|
|
624
|
-
} from "./server-
|
|
636
|
+
} from "./server-63fqdghs.js";
|
|
625
637
|
import {
|
|
626
638
|
stableStringify,
|
|
627
639
|
getTemporalDecisions,
|
|
@@ -629,7 +641,7 @@ import {
|
|
|
629
641
|
freezeTemporalDecisions,
|
|
630
642
|
tagRevisionKey,
|
|
631
643
|
tagIdentityRevisionKey
|
|
632
|
-
} from "./server-
|
|
644
|
+
} from "./server-168pb207.js";
|
|
633
645
|
import {
|
|
634
646
|
resolveModelCalibration,
|
|
635
647
|
calibrateBuckets,
|
|
@@ -724,7 +736,7 @@ import {
|
|
|
724
736
|
adoptNullOwnerToolTag2,
|
|
725
737
|
getCandidateToolOwners2,
|
|
726
738
|
pickNearestPriorOwner2
|
|
727
|
-
} from "./server-
|
|
739
|
+
} from "./server-a3dwxfgd.js";
|
|
728
740
|
import {
|
|
729
741
|
resolveOpenCodeDbPath,
|
|
730
742
|
assertOpenCodeStoreGeneration,
|
|
@@ -740,12 +752,12 @@ import {
|
|
|
740
752
|
latestRealUserTurnIdFromOpenCodeDb,
|
|
741
753
|
getMessageTimesFromOpenCodeDb,
|
|
742
754
|
findLastAssistantModelFromOpenCodeDb
|
|
743
|
-
} from "./server-
|
|
755
|
+
} from "./server-brj8j2gk.js";
|
|
744
756
|
import {
|
|
745
757
|
getCurrentToolSetHash,
|
|
746
758
|
recordToolDefinition,
|
|
747
759
|
getMeasuredToolDefinitionTokens
|
|
748
|
-
} from "./server-
|
|
760
|
+
} from "./server-dj7tz4ph.js";
|
|
749
761
|
import {
|
|
750
762
|
V2_MEMORY_CATEGORIES,
|
|
751
763
|
CATEGORY_PRIORITY
|
|
@@ -758,7 +770,7 @@ import {
|
|
|
758
770
|
resolveStoredPathWorkspaceIdentity,
|
|
759
771
|
storedPathBelongsToWorkspace,
|
|
760
772
|
computeWorkspaceEpochFingerprint
|
|
761
|
-
} from "./server-
|
|
773
|
+
} from "./server-9x0kmta4.js";
|
|
762
774
|
import {
|
|
763
775
|
configureContextDatabasePragmas2
|
|
764
776
|
} from "./server-fb3zxn06.js";
|
|
@@ -804,15 +816,15 @@ import {
|
|
|
804
816
|
readGitFileChangeTimesSince,
|
|
805
817
|
verificationFileExists,
|
|
806
818
|
normalizeVerificationFiles
|
|
807
|
-
} from "./server-
|
|
819
|
+
} from "./server-vn2nwcv6.js";
|
|
808
820
|
import {
|
|
809
821
|
deriveTriggerBudget2,
|
|
810
822
|
deriveHistorianChunkTokens2,
|
|
811
823
|
resolveKnownHistorianContextLimit2,
|
|
812
824
|
resolveHistorianProducerLimits2,
|
|
813
825
|
resolveHistorianContextLimit2
|
|
814
|
-
} from "./server-
|
|
815
|
-
import"./server-
|
|
826
|
+
} from "./server-53eh1r8r.js";
|
|
827
|
+
import"./server-ygtykank.js";
|
|
816
828
|
import {
|
|
817
829
|
isEmbeddingHostBusy2
|
|
818
830
|
} from "./server-qt1qqasc.js";
|
|
@@ -825,18 +837,20 @@ import {
|
|
|
825
837
|
releaseGitSweepLease,
|
|
826
838
|
recordSessionProjectIdentity,
|
|
827
839
|
hasRecordedSessionProjectIdentity
|
|
828
|
-
} from "./server-
|
|
840
|
+
} from "./server-4nw4fqhr.js";
|
|
829
841
|
import {
|
|
830
842
|
saveEmbeddingIfHashMatches,
|
|
831
843
|
invalidateProject2,
|
|
832
844
|
invalidateMemory2
|
|
833
845
|
} from "./server-4dhv7mqz.js";
|
|
834
846
|
import {
|
|
847
|
+
getCachedLocalEmbeddingPooling,
|
|
848
|
+
preflightLocalEmbeddingPooling,
|
|
835
849
|
getLocalEmbeddingNativeMemoryStats
|
|
836
|
-
} from "./server-
|
|
850
|
+
} from "./server-j4jnp9b5.js";
|
|
837
851
|
import {
|
|
838
852
|
cosineSimilarity
|
|
839
|
-
} from "./server-
|
|
853
|
+
} from "./server-xsryvyf6.js";
|
|
840
854
|
import {
|
|
841
855
|
computeCueContentHash,
|
|
842
856
|
hasMuralCueColumns,
|
|
@@ -861,7 +875,7 @@ import {
|
|
|
861
875
|
mergeMemoryStats2,
|
|
862
876
|
archiveMemory2,
|
|
863
877
|
getMemoryCountsByStatus2
|
|
864
|
-
} from "./server-
|
|
878
|
+
} from "./server-y4a3nhtk.js";
|
|
865
879
|
import {
|
|
866
880
|
registerNotificationSink2,
|
|
867
881
|
pushNotification2,
|
|
@@ -869,11 +883,11 @@ import {
|
|
|
869
883
|
drainNotifications2,
|
|
870
884
|
isTuiConnected2
|
|
871
885
|
} from "./server-x8a7jmkh.js";
|
|
872
|
-
import"./server-
|
|
886
|
+
import"./server-1bw1wcbp.js";
|
|
873
887
|
import {
|
|
874
888
|
flushIgnoredMessages2,
|
|
875
889
|
sendStatusNotification2
|
|
876
|
-
} from "./server-
|
|
890
|
+
} from "./server-230fnbws.js";
|
|
877
891
|
import {
|
|
878
892
|
renderSingleStoreMigrationRequiredRefusal,
|
|
879
893
|
SingleStoreMigrationRequiredError,
|
|
@@ -893,14 +907,14 @@ import {
|
|
|
893
907
|
resolveMemoriesByIdsForSearch2,
|
|
894
908
|
unifiedSearch2,
|
|
895
909
|
formatSearchResults2
|
|
896
|
-
} from "./server-
|
|
910
|
+
} from "./server-m91f9m5s.js";
|
|
897
911
|
import {
|
|
898
912
|
resolvePromptContext2
|
|
899
913
|
} from "./server-fmsr7v69.js";
|
|
900
914
|
import"./server-kaqs6h31.js";
|
|
901
915
|
import {
|
|
902
916
|
renderSearchArchiveOffThread2
|
|
903
|
-
} from "./server-
|
|
917
|
+
} from "./server-4sxjs6hn.js";
|
|
904
918
|
import {
|
|
905
919
|
compareSemverCore
|
|
906
920
|
} from "./server-84w6rvvf.js";
|
|
@@ -940,7 +954,7 @@ import {
|
|
|
940
954
|
} from "./server-8ajstryz.js";
|
|
941
955
|
import {
|
|
942
956
|
logSlowWriteTransaction
|
|
943
|
-
} from "./server-
|
|
957
|
+
} from "./server-gyy4k6mf.js";
|
|
944
958
|
import {
|
|
945
959
|
shouldEnforcePrivateStoragePermissions,
|
|
946
960
|
ensureStorageDirectorySync,
|
|
@@ -3178,7 +3192,7 @@ function dropCompartmentsAfter(db, sessionId, anchor, holderId, activeBranch = f
|
|
|
3178
3192
|
if (marker && clearPendingPiCompactionMarkerStateIf(db, sessionId, marker, null))
|
|
3179
3193
|
clearedMarker = marker;
|
|
3180
3194
|
}
|
|
3181
|
-
|
|
3195
|
+
deleteChunkEmbedBackoffForSession2(db, sessionId);
|
|
3182
3196
|
queueM0Mutation(db, { sessionId, mutationType: "recomp_boundary_change" });
|
|
3183
3197
|
clearCachedM0M1(db, sessionId);
|
|
3184
3198
|
db.exec("COMMIT");
|
|
@@ -3437,6 +3451,11 @@ function scheduleReconciliation(db, sessionId, readMessages) {
|
|
|
3437
3451
|
});
|
|
3438
3452
|
}
|
|
3439
3453
|
async function sweepOrphanedOpenCodeMessageIndexesOffThread(db, openSource, options = {}) {
|
|
3454
|
+
if (getHarness2() === "opencode" || getHarness2() === "opencode2")
|
|
3455
|
+
options = {
|
|
3456
|
+
...options,
|
|
3457
|
+
fenceLockNames: options.fenceLockNames ?? takeLkgRecoveryLockSweepPage()
|
|
3458
|
+
};
|
|
3440
3459
|
if (getHarness2() === "opencode2")
|
|
3441
3460
|
openSource = () => new Database2(gaDatabasePath(getDataDir(), process.env.OPENCODE_CHANNEL ?? "latest"), {
|
|
3442
3461
|
readonly: true,
|
|
@@ -4141,7 +4160,8 @@ ${trimmedBody}…
|
|
|
4141
4160
|
return wrapped;
|
|
4142
4161
|
}
|
|
4143
4162
|
function selectAutoSearchResults(results, threshold) {
|
|
4144
|
-
|
|
4163
|
+
const relevance = (result) => result.relevanceScore ?? result.score;
|
|
4164
|
+
return results.filter((result) => relevance(result) >= threshold).sort((left, right) => relevance(right) - relevance(left));
|
|
4145
4165
|
}
|
|
4146
4166
|
|
|
4147
4167
|
// src/hooks/magic-context/auto-search-worker-client.ts
|
|
@@ -4234,6 +4254,13 @@ function retryUnpublishedAutoSearchNoHint(db, sessionId, messageId, startedAt) {
|
|
|
4234
4254
|
}
|
|
4235
4255
|
return true;
|
|
4236
4256
|
}
|
|
4257
|
+
|
|
4258
|
+
class AutoSearchBusyError extends Error {
|
|
4259
|
+
constructor() {
|
|
4260
|
+
super("an earlier auto-search of this session is still running");
|
|
4261
|
+
this.name = "AutoSearchBusyError";
|
|
4262
|
+
}
|
|
4263
|
+
}
|
|
4237
4264
|
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)) {
|
|
4238
4265
|
return executeAutoSearchWorker(db, sessionId, projectPath, query, options, entry, "search");
|
|
4239
4266
|
}
|
|
@@ -4242,14 +4269,19 @@ var searchWorkers = new WeakMap;
|
|
|
4242
4269
|
var liveSearchWorkers = new Set;
|
|
4243
4270
|
var MAX_IDLE_SEARCH_WORKERS = 4;
|
|
4244
4271
|
var SEARCH_WORKER_IDLE_MS = 5 * 60000;
|
|
4272
|
+
var DETACHED_SEARCH_LIMIT_MS = 30000;
|
|
4273
|
+
var AUTO_SEARCH_WORKER_CLOSE_DEADLINE_MS = 2000;
|
|
4245
4274
|
var workersCreated = 0;
|
|
4246
4275
|
var workersReused = 0;
|
|
4276
|
+
var searchesSkippedBusy = 0;
|
|
4247
4277
|
async function acquireSearchWorker(db, key, entry, input, signal) {
|
|
4248
4278
|
const pool = searchWorkers.get(db) ?? new Map;
|
|
4249
4279
|
searchWorkers.set(db, pool);
|
|
4250
4280
|
while (!signal.aborted) {
|
|
4251
4281
|
let slot = pool.get(key);
|
|
4252
4282
|
if (slot?.busy) {
|
|
4283
|
+
if (input.job === "search" && (slot.detached || slot.busySessionId === input.sessionId))
|
|
4284
|
+
return "busy";
|
|
4253
4285
|
const current = slot;
|
|
4254
4286
|
await new Promise((resolve) => {
|
|
4255
4287
|
const done = () => {
|
|
@@ -4258,6 +4290,8 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
|
|
|
4258
4290
|
};
|
|
4259
4291
|
signal.addEventListener("abort", done, { once: true });
|
|
4260
4292
|
current.busy?.then(done);
|
|
4293
|
+
if (!current.detached)
|
|
4294
|
+
current.detachedSignal?.then(done);
|
|
4261
4295
|
if (signal.aborted)
|
|
4262
4296
|
done();
|
|
4263
4297
|
});
|
|
@@ -4266,14 +4300,16 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
|
|
|
4266
4300
|
const fresh = !slot;
|
|
4267
4301
|
if (!slot) {
|
|
4268
4302
|
const worker = inRootAsyncContext2(() => new Worker(entry, { workerData: { ...input, persistent: true } }));
|
|
4303
|
+
const shutdown = createWorkerShutdown(worker, "auto-search", AUTO_SEARCH_WORKER_CLOSE_DEADLINE_MS);
|
|
4269
4304
|
slot = {
|
|
4270
4305
|
worker,
|
|
4271
4306
|
dispose() {
|
|
4307
|
+
this.disposed = true;
|
|
4272
4308
|
clearTimeout(this.idleTimer);
|
|
4273
4309
|
if (pool.get(key) === this)
|
|
4274
4310
|
pool.delete(key);
|
|
4275
4311
|
liveSearchWorkers.delete(this);
|
|
4276
|
-
|
|
4312
|
+
shutdown.close();
|
|
4277
4313
|
worker.unref();
|
|
4278
4314
|
}
|
|
4279
4315
|
};
|
|
@@ -4287,9 +4323,14 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
|
|
|
4287
4323
|
workersReused++;
|
|
4288
4324
|
clearTimeout(slot.idleTimer);
|
|
4289
4325
|
const current = slot;
|
|
4326
|
+
current.busySessionId = input.sessionId;
|
|
4327
|
+
current.detached = false;
|
|
4290
4328
|
current.busy = new Promise((resolve) => {
|
|
4291
4329
|
current.release = resolve;
|
|
4292
4330
|
});
|
|
4331
|
+
current.detachedSignal = new Promise((resolve) => {
|
|
4332
|
+
current.markDetached = resolve;
|
|
4333
|
+
});
|
|
4293
4334
|
current.worker.ref();
|
|
4294
4335
|
return { slot: current, fresh };
|
|
4295
4336
|
}
|
|
@@ -4298,6 +4339,9 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
|
|
|
4298
4339
|
function queueAutoSearchBackfill(db, sessionId, projectPath, query) {
|
|
4299
4340
|
if (isEmbeddingHostBusy2())
|
|
4300
4341
|
return Promise.resolve();
|
|
4342
|
+
const snapshot = getProjectEmbeddingSnapshot2(projectPath);
|
|
4343
|
+
if (!snapshot?.enabled || !snapshot.features.memoryEnabled)
|
|
4344
|
+
return Promise.resolve();
|
|
4301
4345
|
const key = `${sessionId}\x00${projectPath}`;
|
|
4302
4346
|
const pending = pendingBackfills.get(db) ?? new Map;
|
|
4303
4347
|
pendingBackfills.set(db, pending);
|
|
@@ -4345,6 +4389,7 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
|
|
|
4345
4389
|
signal: deadlineSignal,
|
|
4346
4390
|
readMessages: _readMessages,
|
|
4347
4391
|
searchMessageHistory: _searchMessageHistory,
|
|
4392
|
+
stepTimings: _stepTimings,
|
|
4348
4393
|
...serializable
|
|
4349
4394
|
} = options;
|
|
4350
4395
|
const lifecycle = registerAutoSearchWork(sessionId);
|
|
@@ -4380,30 +4425,55 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
|
|
|
4380
4425
|
lifecycle.done();
|
|
4381
4426
|
return [];
|
|
4382
4427
|
}
|
|
4428
|
+
if (lease === "busy") {
|
|
4429
|
+
lifecycle.done();
|
|
4430
|
+
searchesSkippedBusy++;
|
|
4431
|
+
throw new AutoSearchBusyError;
|
|
4432
|
+
}
|
|
4383
4433
|
const { slot, fresh } = lease;
|
|
4384
4434
|
const worker = slot.worker;
|
|
4435
|
+
const detachable = job === "search" && entry.href === defaultAutoSearchWorkerEntry().href;
|
|
4436
|
+
const startedAt = performance.now();
|
|
4437
|
+
let detachedAt;
|
|
4438
|
+
let ownerVectorMs;
|
|
4439
|
+
let abandonTimer;
|
|
4385
4440
|
return new Promise((resolve, reject) => {
|
|
4386
4441
|
let settled = false;
|
|
4387
|
-
|
|
4442
|
+
let released = false;
|
|
4443
|
+
const settle = (results, error) => {
|
|
4388
4444
|
if (settled)
|
|
4389
4445
|
return;
|
|
4390
4446
|
settled = true;
|
|
4447
|
+
if (error)
|
|
4448
|
+
reject(error);
|
|
4449
|
+
else
|
|
4450
|
+
resolve(results);
|
|
4451
|
+
};
|
|
4452
|
+
const release = (dispose) => {
|
|
4453
|
+
if (released)
|
|
4454
|
+
return;
|
|
4455
|
+
released = true;
|
|
4456
|
+
clearTimeout(abandonTimer);
|
|
4391
4457
|
signal?.removeEventListener("abort", abort);
|
|
4392
4458
|
lifecycle.signal.removeEventListener("abort", abort);
|
|
4393
4459
|
lifecycle.done();
|
|
4394
4460
|
worker.off("message", onMessage);
|
|
4395
4461
|
worker.off("error", onError);
|
|
4396
4462
|
worker.off("exit", onExit);
|
|
4397
|
-
if (
|
|
4463
|
+
if (dispose || !detachable)
|
|
4398
4464
|
slot.dispose();
|
|
4399
|
-
else {
|
|
4465
|
+
else if (!slot.disposed) {
|
|
4400
4466
|
slot.idleTimer = setTimeout(() => slot.dispose(), SEARCH_WORKER_IDLE_MS);
|
|
4401
4467
|
slot.idleTimer.unref?.();
|
|
4402
4468
|
}
|
|
4403
|
-
const
|
|
4469
|
+
const free = slot.release;
|
|
4404
4470
|
slot.busy = undefined;
|
|
4405
4471
|
slot.release = undefined;
|
|
4406
|
-
|
|
4472
|
+
slot.busySessionId = undefined;
|
|
4473
|
+
slot.detached = false;
|
|
4474
|
+
slot.detachedSignal = undefined;
|
|
4475
|
+
slot.markDetached = undefined;
|
|
4476
|
+
free?.();
|
|
4407
4477
|
const reusable = liveSearchWorkers.delete(slot);
|
|
4408
4478
|
if (reusable)
|
|
4409
4479
|
liveSearchWorkers.add(slot);
|
|
@@ -4411,51 +4481,82 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
|
|
|
4411
4481
|
for (const prior of idle.slice(0, Math.max(0, idle.length - MAX_IDLE_SEARCH_WORKERS)))
|
|
4412
4482
|
prior.dispose();
|
|
4413
4483
|
worker.unref();
|
|
4414
|
-
if (error)
|
|
4415
|
-
reject(error);
|
|
4416
|
-
else
|
|
4417
|
-
resolve(results);
|
|
4418
4484
|
};
|
|
4419
|
-
const
|
|
4485
|
+
const finish = (results, error) => {
|
|
4486
|
+
settle(results, error);
|
|
4487
|
+
release(Boolean(error) || signal.aborted);
|
|
4488
|
+
};
|
|
4489
|
+
const abort = () => {
|
|
4490
|
+
if (lifecycle.signal.aborted || !detachable) {
|
|
4491
|
+
finish([]);
|
|
4492
|
+
return;
|
|
4493
|
+
}
|
|
4494
|
+
if (settled)
|
|
4495
|
+
return;
|
|
4496
|
+
detachedAt = performance.now();
|
|
4497
|
+
slot.detached = true;
|
|
4498
|
+
slot.markDetached?.();
|
|
4499
|
+
settle([]);
|
|
4500
|
+
abandonTimer = setTimeout(() => {
|
|
4501
|
+
log2(`[auto-search] session ${sessionId}: search still running ${DETACHED_SEARCH_LIMIT_MS} ms after its deadline; disposing its worker (owner vector wait ${formatMs(ownerVectorMs)})`);
|
|
4502
|
+
release(true);
|
|
4503
|
+
}, DETACHED_SEARCH_LIMIT_MS);
|
|
4504
|
+
abandonTimer.unref?.();
|
|
4505
|
+
};
|
|
4420
4506
|
signal?.addEventListener("abort", abort, { once: true });
|
|
4421
4507
|
lifecycle.signal.addEventListener("abort", abort, { once: true });
|
|
4422
4508
|
const onError = (error) => finish([], error);
|
|
4423
4509
|
const onExit = (code) => finish([], new Error(`auto-search worker exited (${code})`));
|
|
4424
4510
|
const onMessage = async (reply) => {
|
|
4425
|
-
if (
|
|
4511
|
+
if (released)
|
|
4426
4512
|
return;
|
|
4427
|
-
if (reply.kind === "result") {
|
|
4513
|
+
if (reply.kind === "result" || reply.kind === "error") {
|
|
4514
|
+
if (detachedAt !== undefined) {
|
|
4515
|
+
logLateSearch(sessionId, performance.now() - detachedAt, detachedAt - startedAt, ownerVectorMs, reply.kind === "result" ? reply.timings : undefined, reply.kind === "error");
|
|
4516
|
+
release(reply.kind === "error");
|
|
4517
|
+
return;
|
|
4518
|
+
}
|
|
4519
|
+
if (reply.kind === "error") {
|
|
4520
|
+
finish([], new Error(reply.error));
|
|
4521
|
+
return;
|
|
4522
|
+
}
|
|
4428
4523
|
if (snapshot && getProjectEmbeddingSnapshot2(projectPath)?.generation !== snapshot.generation)
|
|
4429
4524
|
finish([]);
|
|
4430
4525
|
else
|
|
4431
4526
|
finish(reply.results);
|
|
4432
4527
|
return;
|
|
4433
4528
|
}
|
|
4434
|
-
if (reply.kind === "error") {
|
|
4435
|
-
finish([], new Error(reply.error));
|
|
4436
|
-
return;
|
|
4437
|
-
}
|
|
4438
4529
|
if (reply.kind === "messages" || reply.kind === "accepted")
|
|
4439
4530
|
return;
|
|
4440
4531
|
const response = { id: reply.id };
|
|
4441
|
-
|
|
4532
|
+
if (!signal.aborted) {
|
|
4533
|
+
const requestedAt = performance.now();
|
|
4534
|
+
try {
|
|
4535
|
+
if (reply.kind === "query")
|
|
4536
|
+
response.result = await (job === "backfill" ? embedTextForProject2(projectPath, reply.text, signal, "query") : boundedHintEmbedding(embedQuery, reply.text, signal)) ?? null;
|
|
4537
|
+
else {
|
|
4538
|
+
const passage = await embedBatchForProject2(projectPath, reply.texts, signal, reply.purpose);
|
|
4539
|
+
const current = getProjectEmbeddingSnapshot2(projectPath);
|
|
4540
|
+
response.passage = passage && current ? {
|
|
4541
|
+
...passage,
|
|
4542
|
+
providerIdentity: current.providerIdentity,
|
|
4543
|
+
runtimeFingerprint: current.runtimeFingerprint,
|
|
4544
|
+
dimensions: passage.vectors.find((vector) => vector !== null)?.length ?? null
|
|
4545
|
+
} : null;
|
|
4546
|
+
}
|
|
4547
|
+
} catch (error) {
|
|
4548
|
+
response.error = error instanceof Error ? error.message : String(error);
|
|
4549
|
+
}
|
|
4442
4550
|
if (reply.kind === "query")
|
|
4443
|
-
|
|
4444
|
-
|
|
4445
|
-
|
|
4446
|
-
|
|
4447
|
-
response.
|
|
4448
|
-
...passage,
|
|
4449
|
-
providerIdentity: current.providerIdentity,
|
|
4450
|
-
runtimeFingerprint: current.runtimeFingerprint,
|
|
4451
|
-
dimensions: passage.vectors.find((vector) => vector !== null)?.length ?? null
|
|
4452
|
-
} : null;
|
|
4551
|
+
ownerVectorMs = performance.now() - requestedAt;
|
|
4552
|
+
if (signal.aborted) {
|
|
4553
|
+
response.result = undefined;
|
|
4554
|
+
response.passage = undefined;
|
|
4555
|
+
response.error = undefined;
|
|
4453
4556
|
}
|
|
4454
|
-
} catch (error) {
|
|
4455
|
-
response.error = error instanceof Error ? error.message : String(error);
|
|
4456
4557
|
}
|
|
4457
4558
|
response.embeddingHostBusy = isEmbeddingHostBusy2();
|
|
4458
|
-
if (!
|
|
4559
|
+
if (!released) {
|
|
4459
4560
|
try {
|
|
4460
4561
|
worker.postMessage(response);
|
|
4461
4562
|
} catch (error) {
|
|
@@ -4477,6 +4578,15 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
|
|
|
4477
4578
|
}
|
|
4478
4579
|
});
|
|
4479
4580
|
}
|
|
4581
|
+
function formatMs(value) {
|
|
4582
|
+
return value === undefined ? "n/a" : `${Math.round(value)} ms`;
|
|
4583
|
+
}
|
|
4584
|
+
function logLateSearch(sessionId, lateMs, waitedMs, ownerVectorMs, timings, failed) {
|
|
4585
|
+
const steps = timings?.steps;
|
|
4586
|
+
const warm = timings?.lastPoolWarm;
|
|
4587
|
+
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";
|
|
4588
|
+
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}`);
|
|
4589
|
+
}
|
|
4480
4590
|
async function boundedHintEmbedding(embed, text, signal) {
|
|
4481
4591
|
const controller = new AbortController;
|
|
4482
4592
|
const combined = AbortSignal.any([signal, controller.signal]);
|
|
@@ -4500,6 +4610,7 @@ function defaultAutoSearchWorkerEntry() {
|
|
|
4500
4610
|
}
|
|
4501
4611
|
var MESSAGE_WORKER_ACCEPT_TIMEOUT_MS = 400;
|
|
4502
4612
|
var MESSAGE_WORKER_RESULT_TIMEOUT_MS = 30000;
|
|
4613
|
+
var MESSAGE_SEARCH_WORKER_CLOSE_DEADLINE_MS = 2000;
|
|
4503
4614
|
var messageSearchWorkerFallbacks = new Map;
|
|
4504
4615
|
function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWorkerEntry(), deadlines = {}) {
|
|
4505
4616
|
const fallback = (reason, detail) => {
|
|
@@ -4527,6 +4638,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
|
|
|
4527
4638
|
return new Promise((resolve) => {
|
|
4528
4639
|
let settled = false;
|
|
4529
4640
|
let worker;
|
|
4641
|
+
let shutdown;
|
|
4530
4642
|
let deadline;
|
|
4531
4643
|
const finish = (outcome, reason, detail) => {
|
|
4532
4644
|
if (settled)
|
|
@@ -4535,7 +4647,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
|
|
|
4535
4647
|
clearTimeout(deadline);
|
|
4536
4648
|
if (reason)
|
|
4537
4649
|
fallback(reason, detail);
|
|
4538
|
-
|
|
4650
|
+
shutdown?.close();
|
|
4539
4651
|
worker?.unref();
|
|
4540
4652
|
resolve(outcome);
|
|
4541
4653
|
};
|
|
@@ -4546,6 +4658,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
|
|
|
4546
4658
|
};
|
|
4547
4659
|
try {
|
|
4548
4660
|
worker = inRootAsyncContext2(() => new Worker(entry, { workerData: input }));
|
|
4661
|
+
shutdown = createWorkerShutdown(worker, "message-search", MESSAGE_SEARCH_WORKER_CLOSE_DEADLINE_MS);
|
|
4549
4662
|
} catch (error) {
|
|
4550
4663
|
finish(null, "start-failed", error);
|
|
4551
4664
|
return;
|
|
@@ -4814,7 +4927,8 @@ async function runAutoSearchHint(args) {
|
|
|
4814
4927
|
},
|
|
4815
4928
|
isEmbeddingRuntimeEnabled: () => embeddingEnabled === true,
|
|
4816
4929
|
visibleMemoryIds: options.visibleMemoryIds ?? null,
|
|
4817
|
-
sources: ["memory", "message", "git_commit"]
|
|
4930
|
+
sources: ["memory", "message", "git_commit"],
|
|
4931
|
+
chunkPoolWarmOnly: true
|
|
4818
4932
|
};
|
|
4819
4933
|
return searchAutoHint(db, sessionId, options.projectPath, rawPrompt, {
|
|
4820
4934
|
...searchOptions,
|
|
@@ -4825,6 +4939,11 @@ async function runAutoSearchHint(args) {
|
|
|
4825
4939
|
} catch (error) {
|
|
4826
4940
|
if (lifecycleSignal.aborted)
|
|
4827
4941
|
return AUTO_SEARCH_OK;
|
|
4942
|
+
if (error instanceof AutoSearchBusyError) {
|
|
4943
|
+
sessionLog2(sessionId, "auto-search: an earlier search of this session is still running, skipping hint for this turn");
|
|
4944
|
+
persistAutoSearchSkip(db, sessionId, userMsgId);
|
|
4945
|
+
return { ok: false, kind: "timeout" };
|
|
4946
|
+
}
|
|
4828
4947
|
log2(`[auto-search] unified search failed for session ${sessionId} (no-hint frozen for this turn): ${error instanceof Error ? error.message : String(error)}`);
|
|
4829
4948
|
const outcome = await writeNoHintAndReconcile("error");
|
|
4830
4949
|
return outcome.ok ? { ok: false, kind: "search-failure" } : outcome;
|
|
@@ -4874,7 +4993,7 @@ ${hintText}`;
|
|
|
4874
4993
|
if (outcome.decision.decision === "hint") {
|
|
4875
4994
|
appendReminderToUserMessageById(messages, userMsgId, outcome.decision.text);
|
|
4876
4995
|
}
|
|
4877
|
-
sessionLog2(sessionId, `auto-search: attached hint to ${userMsgId} (${results.length} fragments, top
|
|
4996
|
+
sessionLog2(sessionId, `auto-search: attached hint to ${userMsgId} (${results.length} fragments, top relevance ${(results[0].relevanceScore ?? results[0].score).toFixed(3)})`);
|
|
4878
4997
|
return AUTO_SEARCH_OK;
|
|
4879
4998
|
} finally {
|
|
4880
4999
|
if (!lifecycleSignal.aborted && results !== null)
|
|
@@ -4931,6 +5050,30 @@ function getSessionErrorInfo(properties) {
|
|
|
4931
5050
|
};
|
|
4932
5051
|
}
|
|
4933
5052
|
|
|
5053
|
+
// src/hooks/magic-context/diagnostic-log-state.ts
|
|
5054
|
+
var states = new BoundedSessionMap(1000);
|
|
5055
|
+
var scope = (sessionId) => `${getMagicContextStorageDir()}\x00${getHarness2()}\x00${sessionId}`;
|
|
5056
|
+
function diagnosticStateChanged(sessionId, category, state) {
|
|
5057
|
+
const key = scope(sessionId);
|
|
5058
|
+
const previous = states.get(key) ?? new Map;
|
|
5059
|
+
if (previous.get(category) === state)
|
|
5060
|
+
return false;
|
|
5061
|
+
previous.set(category, state);
|
|
5062
|
+
states.set(key, previous);
|
|
5063
|
+
return true;
|
|
5064
|
+
}
|
|
5065
|
+
function clearDiagnosticLogState(sessionId) {
|
|
5066
|
+
states.delete(scope(sessionId));
|
|
5067
|
+
}
|
|
5068
|
+
|
|
5069
|
+
// src/hooks/magic-context/nudge-evaluation-log.ts
|
|
5070
|
+
function logNudgeEvaluation(sessionId, phase, line) {
|
|
5071
|
+
const category = `${phase}:${line.split(":", 1)[0]}`;
|
|
5072
|
+
const state = line.split(" ").filter((field) => /^(ctx_reduce|band|dampening|verdict|reason|lease)=/.test(field)).join(" ");
|
|
5073
|
+
if (diagnosticStateChanged(sessionId, category, state))
|
|
5074
|
+
sessionLog2(sessionId, line);
|
|
5075
|
+
}
|
|
5076
|
+
|
|
4934
5077
|
// src/features/magic-context/dreamer/storage-task-schedule.ts
|
|
4935
5078
|
function toRow(r) {
|
|
4936
5079
|
return {
|
|
@@ -5807,7 +5950,7 @@ function canConsumeDeferredOnThisPass(args) {
|
|
|
5807
5950
|
return args.schedulerDecision === "execute" || args.contextPercentage >= (args.forceMaterializationPercentage ?? escalationBands(65).forceMaterializationPercentage);
|
|
5808
5951
|
}
|
|
5809
5952
|
function hasReclaimRide(signals) {
|
|
5810
|
-
return signals.hardFold || signals.force || signals.explicitFlush || signals.publishedHistory || signals.subagentExecute === true;
|
|
5953
|
+
return signals.hardFold || signals.force || signals.explicitFlush || signals.publishedHistory || signals.subagentExecute === true || signals.executeReclaim === true;
|
|
5811
5954
|
}
|
|
5812
5955
|
function prefixMutationPermitted(gate) {
|
|
5813
5956
|
return !gate.signedThinkingHold || gate.firstRender || gate.idleExpiry || gate.emergency;
|
|
@@ -5820,13 +5963,233 @@ var RECLAIM_RIDE_NAMES = [
|
|
|
5820
5963
|
"force",
|
|
5821
5964
|
"explicitFlush",
|
|
5822
5965
|
"publishedHistory",
|
|
5823
|
-
"subagentExecute"
|
|
5966
|
+
"subagentExecute",
|
|
5967
|
+
"executeReclaim"
|
|
5824
5968
|
];
|
|
5825
5969
|
function reclaimRideLabel(signals) {
|
|
5826
5970
|
const active = RECLAIM_RIDE_NAMES.filter((name) => signals[name]);
|
|
5827
5971
|
return `ride=${active.length > 0 ? active.join("+") : "none"}`;
|
|
5828
5972
|
}
|
|
5829
5973
|
|
|
5974
|
+
// src/hooks/magic-context/pending-drop-eligibility.ts
|
|
5975
|
+
function pendingDropVeto(tagNumber, target, protectedTagIds) {
|
|
5976
|
+
if (protectedTagIds.has(tagNumber))
|
|
5977
|
+
return "protected";
|
|
5978
|
+
if (target?.thinkingDropProtected)
|
|
5979
|
+
return "active_thinking";
|
|
5980
|
+
return null;
|
|
5981
|
+
}
|
|
5982
|
+
function capturePendingDropEligibility(targets, protectedTagIds) {
|
|
5983
|
+
const eligible = new Set;
|
|
5984
|
+
for (const [number, target] of targets) {
|
|
5985
|
+
if (pendingDropVeto(number, target, protectedTagIds))
|
|
5986
|
+
continue;
|
|
5987
|
+
if (target.drop) {
|
|
5988
|
+
if (target.canDrop?.() === true)
|
|
5989
|
+
eligible.add(number);
|
|
5990
|
+
} else {
|
|
5991
|
+
const content = target.getContent?.();
|
|
5992
|
+
const replacement = `[dropped §${number}§]`;
|
|
5993
|
+
if (typeof content === "string" && content.length > replacement.length && target.canSetContent?.(replacement) !== false)
|
|
5994
|
+
eligible.add(number);
|
|
5995
|
+
}
|
|
5996
|
+
}
|
|
5997
|
+
return eligible;
|
|
5998
|
+
}
|
|
5999
|
+
function pendingDropEligibilityKey(db, sessionId, input, protectionInputs) {
|
|
6000
|
+
const digests = input.map((message) => message.contentDigest?.() ?? null);
|
|
6001
|
+
if (digests.some((digest) => digest === null))
|
|
6002
|
+
return null;
|
|
6003
|
+
const revision = db.prepare("SELECT value FROM schema_migrations_meta WHERE key = ?").get(tagRevisionKey(sessionId));
|
|
6004
|
+
if (!revision?.value)
|
|
6005
|
+
return null;
|
|
6006
|
+
return JSON.stringify([
|
|
6007
|
+
input.map((message, index) => [
|
|
6008
|
+
message.id,
|
|
6009
|
+
message.role,
|
|
6010
|
+
message.synthetic,
|
|
6011
|
+
digests[index]
|
|
6012
|
+
]),
|
|
6013
|
+
revision.value,
|
|
6014
|
+
readEpochFloorSnapshot(db, sessionId),
|
|
6015
|
+
sessionDecisionCalibration(db, sessionId).toolsRatio,
|
|
6016
|
+
loadProtectedTailMeta(db, sessionId),
|
|
6017
|
+
[...getMergedReasoningStrippedIds(db, sessionId)].sort(),
|
|
6018
|
+
[...getReasoningRemovalState(db, sessionId).messageIds].sort(),
|
|
6019
|
+
protectionInputs
|
|
6020
|
+
]);
|
|
6021
|
+
}
|
|
6022
|
+
function createPendingDropEligibilityCache() {
|
|
6023
|
+
const sessions = new Map;
|
|
6024
|
+
return {
|
|
6025
|
+
read(sessionId, key) {
|
|
6026
|
+
const previous = sessions.get(sessionId);
|
|
6027
|
+
if (key === null || previous?.key !== key) {
|
|
6028
|
+
sessions.delete(sessionId);
|
|
6029
|
+
return;
|
|
6030
|
+
}
|
|
6031
|
+
return previous.eligible;
|
|
6032
|
+
},
|
|
6033
|
+
record(sessionId, key, eligible) {
|
|
6034
|
+
sessions.delete(sessionId);
|
|
6035
|
+
if (key === null)
|
|
6036
|
+
return;
|
|
6037
|
+
const oldest = sessions.keys().next().value;
|
|
6038
|
+
if (sessions.size >= 64 && oldest !== undefined)
|
|
6039
|
+
sessions.delete(oldest);
|
|
6040
|
+
sessions.set(sessionId, { key, eligible: new Set(eligible) });
|
|
6041
|
+
}
|
|
6042
|
+
};
|
|
6043
|
+
}
|
|
6044
|
+
|
|
6045
|
+
// src/hooks/magic-context/postprocess-read-cache.ts
|
|
6046
|
+
var connections = new WeakMap;
|
|
6047
|
+
function snapshot(db, sessionId) {
|
|
6048
|
+
const transaction = db;
|
|
6049
|
+
try {
|
|
6050
|
+
if (transaction.inTransaction || transaction.isTransaction) {
|
|
6051
|
+
connections.delete(db);
|
|
6052
|
+
return { version: -1, changes: -1 };
|
|
6053
|
+
}
|
|
6054
|
+
} catch {
|
|
6055
|
+
connections.delete(db);
|
|
6056
|
+
return { version: -1, changes: -1 };
|
|
6057
|
+
}
|
|
6058
|
+
let connection = connections.get(db);
|
|
6059
|
+
if (!connection) {
|
|
6060
|
+
connection = {
|
|
6061
|
+
stamp: db.prepare("SELECT total_changes() AS changes, data_version AS version FROM pragma_data_version"),
|
|
6062
|
+
sessions: new BoundedSessionMap(100)
|
|
6063
|
+
};
|
|
6064
|
+
connections.set(db, connection);
|
|
6065
|
+
}
|
|
6066
|
+
const stamp = connection.stamp.get();
|
|
6067
|
+
const previous = connection.sessions.get(sessionId);
|
|
6068
|
+
if (previous?.version === stamp.version && previous.changes === stamp.changes) {
|
|
6069
|
+
return previous;
|
|
6070
|
+
}
|
|
6071
|
+
const value = { ...stamp };
|
|
6072
|
+
connection.sessions.set(sessionId, value);
|
|
6073
|
+
return value;
|
|
6074
|
+
}
|
|
6075
|
+
function postprocessTailTags(db, sessionId) {
|
|
6076
|
+
const state = snapshot(db, sessionId);
|
|
6077
|
+
return state.tags ??= getTailHygieneTags2(db, sessionId);
|
|
6078
|
+
}
|
|
6079
|
+
function postprocessOldestTags(db, sessionId, protectedNumbers) {
|
|
6080
|
+
const state = snapshot(db, sessionId);
|
|
6081
|
+
const hints = state.hints;
|
|
6082
|
+
if (hints && hints.protectedNumbers.size === protectedNumbers.size && [...protectedNumbers].every((number) => hints.protectedNumbers.has(number))) {
|
|
6083
|
+
return hints.value;
|
|
6084
|
+
}
|
|
6085
|
+
const value = getOldestActiveUnprotectedToolTags2(db, sessionId, protectedNumbers);
|
|
6086
|
+
state.hints = { protectedNumbers: new Set(protectedNumbers), value };
|
|
6087
|
+
return value;
|
|
6088
|
+
}
|
|
6089
|
+
function postprocessReplaySnapshot(db, sessionId) {
|
|
6090
|
+
const state = snapshot(db, sessionId);
|
|
6091
|
+
const replay = state.replay ??= loadPostprocessReplaySnapshot(db, sessionId);
|
|
6092
|
+
return {
|
|
6093
|
+
...replay,
|
|
6094
|
+
staleReduceStrippedIds: new Set(replay.staleReduceStrippedIds),
|
|
6095
|
+
processedImageStrippedIds: new Set(replay.processedImageStrippedIds),
|
|
6096
|
+
processedImageMarkers: new Map(replay.processedImageMarkers),
|
|
6097
|
+
strippedPlaceholderIds: new Set(replay.strippedPlaceholderIds),
|
|
6098
|
+
hiddenSeamPlaceholderIds: new Set(replay.hiddenSeamPlaceholderIds),
|
|
6099
|
+
mergedReasoningStrippedIds: new Set(replay.mergedReasoningStrippedIds),
|
|
6100
|
+
trailingBlankDecisions: new Map(replay.trailingBlankDecisions),
|
|
6101
|
+
noteNudgeAnchors: structuredClone(replay.noteNudgeAnchors),
|
|
6102
|
+
autoSearchHintDecisions: structuredClone(replay.autoSearchHintDecisions),
|
|
6103
|
+
todoSyntheticAnchor: structuredClone(replay.todoSyntheticAnchor),
|
|
6104
|
+
pendingCompactionMarker: structuredClone(replay.pendingCompactionMarker),
|
|
6105
|
+
compactionMarker: structuredClone(replay.compactionMarker)
|
|
6106
|
+
};
|
|
6107
|
+
}
|
|
6108
|
+
|
|
6109
|
+
// src/hooks/magic-context/execute-reclaim.ts
|
|
6110
|
+
var NAMESPACE = "executeReclaim";
|
|
6111
|
+
var failedWrites = new WeakMap;
|
|
6112
|
+
function readExecuteReclaimState(db, sessionId) {
|
|
6113
|
+
return parseState(postprocessReplaySnapshot(db, sessionId).executeReclaim);
|
|
6114
|
+
}
|
|
6115
|
+
function parseState(lane) {
|
|
6116
|
+
const value = lane;
|
|
6117
|
+
return {
|
|
6118
|
+
heldPasses: typeof value?.heldPasses === "number" ? Math.max(0, value.heldPasses) : 0,
|
|
6119
|
+
floorOrdinal: typeof value?.floorOrdinal === "number" ? value.floorOrdinal : null,
|
|
6120
|
+
floorPromptId: typeof value?.floorPromptId === "string" ? value.floorPromptId : null
|
|
6121
|
+
};
|
|
6122
|
+
}
|
|
6123
|
+
function writeExecuteReclaimState(db, sessionId, patch) {
|
|
6124
|
+
if (failedWrites.get(db)?.has(sessionId))
|
|
6125
|
+
return false;
|
|
6126
|
+
try {
|
|
6127
|
+
const current = readExecuteReclaimState(db, sessionId);
|
|
6128
|
+
if (JSON.stringify(current) === JSON.stringify({ ...current, ...patch }))
|
|
6129
|
+
return true;
|
|
6130
|
+
if (!updateReplayDocument(db, sessionId, (doc) => {
|
|
6131
|
+
const previous = parseState(doc[NAMESPACE]);
|
|
6132
|
+
const state = { ...previous, ...patch };
|
|
6133
|
+
if (JSON.stringify(previous) === JSON.stringify(state))
|
|
6134
|
+
return false;
|
|
6135
|
+
doc.version = 2;
|
|
6136
|
+
doc[NAMESPACE] = state;
|
|
6137
|
+
return true;
|
|
6138
|
+
}))
|
|
6139
|
+
throw new Error("Could not persist execute reclaim state");
|
|
6140
|
+
return true;
|
|
6141
|
+
} catch (error) {
|
|
6142
|
+
let failed = failedWrites.get(db);
|
|
6143
|
+
if (!failed)
|
|
6144
|
+
failedWrites.set(db, failed = new Set);
|
|
6145
|
+
failed.add(sessionId);
|
|
6146
|
+
sessionLog2(sessionId, `execute reclaim state persistence failed; retaining existing policy: ${String(error)}`);
|
|
6147
|
+
return false;
|
|
6148
|
+
}
|
|
6149
|
+
}
|
|
6150
|
+
function clearExecuteReclaimState(db, sessionId) {
|
|
6151
|
+
writeExecuteReclaimState(db, sessionId, {
|
|
6152
|
+
heldPasses: 0,
|
|
6153
|
+
floorOrdinal: null,
|
|
6154
|
+
floorPromptId: null
|
|
6155
|
+
});
|
|
6156
|
+
}
|
|
6157
|
+
function maintainExecuteFloorMark(db, sessionId, promptId, belowExecute) {
|
|
6158
|
+
failedWrites.get(db)?.delete(sessionId);
|
|
6159
|
+
const state = readExecuteReclaimState(db, sessionId);
|
|
6160
|
+
if (state.floorOrdinal !== null && (belowExecute || promptId !== null && promptId !== state.floorPromptId)) {
|
|
6161
|
+
writeExecuteReclaimState(db, sessionId, { floorOrdinal: null, floorPromptId: null });
|
|
6162
|
+
}
|
|
6163
|
+
}
|
|
6164
|
+
function estimateExecuteReclaimTokens(args) {
|
|
6165
|
+
const eligible = capturePendingDropEligibility(args.targets, args.protectedTagIds);
|
|
6166
|
+
const queued = new Set(args.pendingOps.filter((op) => op.operation === "drop").map((op) => op.tagId));
|
|
6167
|
+
const candidates = args.tags.filter((tag) => tag.status === "active" && queued.has(tag.tagNumber) && eligible.has(tag.tagNumber));
|
|
6168
|
+
const preparationTargets = new Map;
|
|
6169
|
+
for (const tag of candidates) {
|
|
6170
|
+
const target = args.targets.get(tag.tagNumber);
|
|
6171
|
+
if (target?.prepareDrop)
|
|
6172
|
+
preparationTargets.set(tag.tagNumber, target);
|
|
6173
|
+
}
|
|
6174
|
+
const prepared = preparationTargets.size === 0 ? new Set : args.probePreparation?.(preparationTargets) ?? new Set([...preparationTargets].filter(([, target]) => target.prepareDrop?.() !== false).map(([number]) => number));
|
|
6175
|
+
const seed = sessionDecisionCalibration(args.db, args.sessionId);
|
|
6176
|
+
return candidates.reduce((total, tag) => {
|
|
6177
|
+
if (preparationTargets.has(tag.tagNumber) && !prepared.has(tag.tagNumber))
|
|
6178
|
+
return total;
|
|
6179
|
+
const ratio = tag.type === "tool" ? seed.toolsRatio : seed.proseRatio;
|
|
6180
|
+
return total + Math.max(0, (tag.tokenCount ?? Math.ceil(tag.byteSize / 4)) * ratio);
|
|
6181
|
+
}, 0);
|
|
6182
|
+
}
|
|
6183
|
+
function originateExecuteReclaim(args) {
|
|
6184
|
+
if (failedWrites.get(args.db)?.has(args.sessionId))
|
|
6185
|
+
return false;
|
|
6186
|
+
const state = readExecuteReclaimState(args.db, args.sessionId);
|
|
6187
|
+
const heldPasses = args.primaryExecute && args.reclaimableTokens > 0 && !args.alreadyBusting ? state.heldPasses + 1 : 0;
|
|
6188
|
+
if (!writeExecuteReclaimState(args.db, args.sessionId, { heldPasses }))
|
|
6189
|
+
return false;
|
|
6190
|
+
return args.primaryExecute && !args.alreadyBusting && !args.summaryCanCome && args.reclaimableTokens > 0 && (args.usableWindow > 0 && args.reclaimableTokens >= args.usableWindow * 0.02 || heldPasses >= 3);
|
|
6191
|
+
}
|
|
6192
|
+
|
|
5830
6193
|
// src/hooks/magic-context/historian-drain-gate.ts
|
|
5831
6194
|
var loggedWindows = new WeakMap;
|
|
5832
6195
|
function isHistorianDrainBudgetSpent(args) {
|
|
@@ -5978,7 +6341,7 @@ function resolveBoundaryContextLimit(usage, fallbackContextLimit) {
|
|
|
5978
6341
|
}
|
|
5979
6342
|
return 128000;
|
|
5980
6343
|
}
|
|
5981
|
-
function getUnsummarizedTailInfo(db, sessionId, triggerBudget, usage, executeThresholdPercentage, contextLimit, inMemoryTail, taggerFloor = 0) {
|
|
6344
|
+
function getUnsummarizedTailInfo(db, sessionId, triggerBudget, usage, executeThresholdPercentage, contextLimit, inMemoryTail, taggerFloor = 0, liftLivePromptFloor = false) {
|
|
5982
6345
|
return withRawSessionMessageCache2(() => {
|
|
5983
6346
|
try {
|
|
5984
6347
|
const memoryPrimed = inMemoryTail ? primeInMemoryTailRawMessageCache2({
|
|
@@ -6008,7 +6371,8 @@ function getUnsummarizedTailInfo(db, sessionId, triggerBudget, usage, executeThr
|
|
|
6008
6371
|
executeThresholdPercentage,
|
|
6009
6372
|
usage,
|
|
6010
6373
|
usageSource: "live",
|
|
6011
|
-
taggerFloor
|
|
6374
|
+
taggerFloor,
|
|
6375
|
+
liftLivePromptFloor
|
|
6012
6376
|
});
|
|
6013
6377
|
const hasProtectedEligibleHead = boundary.offset < Math.min(boundary.protectedTailStart, boundary.eligibleEndOrdinal);
|
|
6014
6378
|
if (!hasProtectedEligibleHead) {
|
|
@@ -6044,7 +6408,10 @@ function getUnsummarizedTailInfo(db, sessionId, triggerBudget, usage, executeThr
|
|
|
6044
6408
|
function formatProjectedPostDropPercentage(value) {
|
|
6045
6409
|
return value === null ? "none" : `${value.toFixed(1)}%`;
|
|
6046
6410
|
}
|
|
6047
|
-
function checkCompartmentTrigger(db, sessionId, sessionMeta, usage, _previousPercentage, executeThresholdPercentage, triggerBudget, keepReasoningTokens, commitClusterTrigger, preloadedActiveTags, contextLimit, inMemoryTail, taggerFloorOverride, reasoningProjection, reclaimRide, eligiblePendingDropTagIds) {
|
|
6411
|
+
function checkCompartmentTrigger(db, sessionId, sessionMeta, usage, _previousPercentage, executeThresholdPercentage, triggerBudget, keepReasoningTokens, commitClusterTrigger, preloadedActiveTags, contextLimit, inMemoryTail, taggerFloorOverride, reasoningProjection, reclaimRide, eligiblePendingDropTagIds, primaryExecute = false) {
|
|
6412
|
+
if (usage.percentage < executeThresholdPercentage) {
|
|
6413
|
+
writeExecuteReclaimState(db, sessionId, { floorOrdinal: null, floorPromptId: null });
|
|
6414
|
+
}
|
|
6048
6415
|
if (sessionMeta.compartmentInProgress) {
|
|
6049
6416
|
sessionLog2(sessionId, `compartment trigger: skipped — historian already in progress (usage=${usage.percentage.toFixed(1)}%)`);
|
|
6050
6417
|
return { shouldFire: false };
|
|
@@ -6097,7 +6464,22 @@ function checkCompartmentTrigger(db, sessionId, sessionMeta, usage, _previousPer
|
|
|
6097
6464
|
resolvedInMemoryTail = undefined;
|
|
6098
6465
|
}
|
|
6099
6466
|
}
|
|
6100
|
-
|
|
6467
|
+
let tailInfo = getUnsummarizedTailInfo(db, sessionId, triggerBudget, usage, executeThresholdPercentage, contextLimit, resolvedInMemoryTail, taggerFloor);
|
|
6468
|
+
const markState = readExecuteReclaimState(db, sessionId);
|
|
6469
|
+
const mark = markState.floorOrdinal;
|
|
6470
|
+
const livePromptOrdinal = tailInfo.boundarySnapshot?.diagnostics?.livePromptFloor.ordinal;
|
|
6471
|
+
let consumedFloorMark = false;
|
|
6472
|
+
if (mark !== null) {
|
|
6473
|
+
const consumed = writeExecuteReclaimState(db, sessionId, {
|
|
6474
|
+
floorOrdinal: null,
|
|
6475
|
+
floorPromptId: null
|
|
6476
|
+
});
|
|
6477
|
+
if (consumed && mark === livePromptOrdinal && markState.floorPromptId === tailInfo.boundarySnapshot?.diagnostics?.livePromptFloor.messageId && usage.percentage >= executeThresholdPercentage) {
|
|
6478
|
+
consumedFloorMark = true;
|
|
6479
|
+
sessionLog2(sessionId, `compartment trigger: live-prompt floor mark consumed at ${mark}`);
|
|
6480
|
+
tailInfo = getUnsummarizedTailInfo(db, sessionId, triggerBudget, usage, executeThresholdPercentage, contextLimit, resolvedInMemoryTail, taggerFloor, true);
|
|
6481
|
+
}
|
|
6482
|
+
}
|
|
6101
6483
|
if (!tailInfo.hasNewRawHistory) {
|
|
6102
6484
|
try {
|
|
6103
6485
|
const lastCompartmentEnd = getLastCompartmentEndMessage(db, sessionId);
|
|
@@ -6181,7 +6563,21 @@ function checkCompartmentTrigger(db, sessionId, sessionMeta, usage, _previousPer
|
|
|
6181
6563
|
return { shouldFire: false };
|
|
6182
6564
|
}
|
|
6183
6565
|
if (!tailInfo.hasProtectedEligibleHead || !tailInfo.isMeaningful) {
|
|
6184
|
-
|
|
6566
|
+
let floorOnly = false;
|
|
6567
|
+
const boundary = tailInfo.boundarySnapshot;
|
|
6568
|
+
const floor = boundary?.diagnostics?.livePromptFloor;
|
|
6569
|
+
if (!consumedFloorMark && floor?.ordinal && floor.from > floor.to) {
|
|
6570
|
+
const withoutFloor = getUnsummarizedTailInfo(db, sessionId, triggerBudget, usage, executeThresholdPercentage, contextLimit, resolvedInMemoryTail, taggerFloor, true);
|
|
6571
|
+
floorOnly = withoutFloor.hasProtectedEligibleHead && withoutFloor.isMeaningful;
|
|
6572
|
+
if (floorOnly && primaryExecute && usage.percentage >= executeThresholdPercentage && writeExecuteReclaimState(db, sessionId, {
|
|
6573
|
+
floorOrdinal: floor.ordinal,
|
|
6574
|
+
floorPromptId: floor.messageId ?? null
|
|
6575
|
+
})) {
|
|
6576
|
+
sessionLog2(sessionId, `compartment trigger: live-prompt floor mark set at ${floor.ordinal}`);
|
|
6577
|
+
}
|
|
6578
|
+
}
|
|
6579
|
+
const refusal = floorOnly ? `no eligible head (live-prompt floor at ${floor?.ordinal})` : tailInfo.hasProtectedEligibleHead ? "below meaningfulness" : "no eligible head";
|
|
6580
|
+
sessionLog2(sessionId, `compartment trigger: not firing at ${usage.percentage.toFixed(1)}% — ${refusal}; offset=${tailInfo.nextStartOrdinal} protectedStart=${boundary?.protectedTailStart ?? "none"} eligibleEnd=${boundary?.eligibleEndOrdinal ?? "none"} rawTokens=${tailInfo.trueRawEligibleTokens} chunkTokens=${tailInfo.tokenEstimate}`);
|
|
6185
6581
|
return { shouldFire: false };
|
|
6186
6582
|
}
|
|
6187
6583
|
sessionLog2(sessionId, `compartment trigger: proactive fire at ${usage.percentage.toFixed(1)}% (floor=${proactiveTriggerPercentage}% projected post-drop=${formatProjectedPostDropPercentage(projectedPostDropPercentage)} target=${relativePostDropTarget.toFixed(1)}%)`);
|
|
@@ -6434,7 +6830,7 @@ function maybeInjectChannel1Nudge(args, sessionId, tool, output) {
|
|
|
6434
6830
|
evaluable: state.evaluable,
|
|
6435
6831
|
generationInvalidated: state.generationInvalidated
|
|
6436
6832
|
});
|
|
6437
|
-
|
|
6833
|
+
logNudgeEvaluation(sessionId, "tool-completion", formatChannel1Evaluation(decision));
|
|
6438
6834
|
setLastNudgeUndropped(args.db, sessionId, decision.nextLastNudge);
|
|
6439
6835
|
const nextNudgeState = {
|
|
6440
6836
|
...nudgeState,
|
|
@@ -6691,6 +7087,9 @@ function latestAssistantTurnStart(messages) {
|
|
|
6691
7087
|
function latestAssistantTurnMessages(messages) {
|
|
6692
7088
|
return new Set(messages.slice(latestAssistantTurnStart(messages)));
|
|
6693
7089
|
}
|
|
7090
|
+
function isAnthropicThinkingPart(part, familyRoute) {
|
|
7091
|
+
return isRecord(part) && THINKING_TYPES.has(String(part.type ?? part.kind)) && (familyRoute || isRecord(part.metadata) && isRecord(part.metadata.anthropic));
|
|
7092
|
+
}
|
|
6694
7093
|
function hasActiveAnthropicThinkingTurn(messages, provider, model) {
|
|
6695
7094
|
const familyRoute = isAnthropicFamilyRoute(provider, model);
|
|
6696
7095
|
for (const message of messages.slice(latestAssistantTurnStart(messages))) {
|
|
@@ -6699,7 +7098,7 @@ function hasActiveAnthropicThinkingTurn(messages, provider, model) {
|
|
|
6699
7098
|
const parts = content(message);
|
|
6700
7099
|
if (!Array.isArray(parts))
|
|
6701
7100
|
continue;
|
|
6702
|
-
if (parts.some((part) =>
|
|
7101
|
+
if (parts.some((part) => isAnthropicThinkingPart(part, familyRoute)))
|
|
6703
7102
|
return true;
|
|
6704
7103
|
}
|
|
6705
7104
|
return false;
|
|
@@ -7036,96 +7435,26 @@ function resolveHistoryBudgetTokens(historyBudgetPercentage, contextUsage, execu
|
|
|
7036
7435
|
}
|
|
7037
7436
|
|
|
7038
7437
|
// src/features/magic-context/storage-host-instruction-retention.ts
|
|
7039
|
-
var
|
|
7438
|
+
var NAMESPACE2 = "hostInstructionRetention";
|
|
7040
7439
|
var enabled = true;
|
|
7041
7440
|
function hostInstructionRetentionEnabled() {
|
|
7042
7441
|
return enabled;
|
|
7043
7442
|
}
|
|
7044
7443
|
function isHostInstructionRetentionOn(db, sessionId) {
|
|
7045
|
-
const lane = readReplayEnvelope(db, sessionId)[
|
|
7444
|
+
const lane = readReplayEnvelope(db, sessionId)[NAMESPACE2];
|
|
7046
7445
|
return typeof lane === "object" && lane !== null && lane.on === true;
|
|
7047
7446
|
}
|
|
7048
7447
|
function markHostInstructionRetention(db, sessionId) {
|
|
7049
7448
|
return updateReplayDocument(db, sessionId, (doc) => {
|
|
7050
|
-
const lane = doc[
|
|
7449
|
+
const lane = doc[NAMESPACE2];
|
|
7051
7450
|
if (typeof lane === "object" && lane !== null && lane.on === true)
|
|
7052
7451
|
return false;
|
|
7053
7452
|
doc.version = 2;
|
|
7054
|
-
doc[
|
|
7453
|
+
doc[NAMESPACE2] = { on: true };
|
|
7055
7454
|
return true;
|
|
7056
7455
|
});
|
|
7057
7456
|
}
|
|
7058
7457
|
|
|
7059
|
-
// src/hooks/magic-context/pending-drop-eligibility.ts
|
|
7060
|
-
function pendingDropVeto(tagNumber, target, protectedTagIds) {
|
|
7061
|
-
if (protectedTagIds.has(tagNumber))
|
|
7062
|
-
return "protected";
|
|
7063
|
-
if (target?.thinkingDropProtected)
|
|
7064
|
-
return "active_thinking";
|
|
7065
|
-
return null;
|
|
7066
|
-
}
|
|
7067
|
-
function capturePendingDropEligibility(targets, protectedTagIds) {
|
|
7068
|
-
const eligible = new Set;
|
|
7069
|
-
for (const [number, target] of targets) {
|
|
7070
|
-
if (pendingDropVeto(number, target, protectedTagIds))
|
|
7071
|
-
continue;
|
|
7072
|
-
if (target.drop) {
|
|
7073
|
-
if (target.canDrop?.() === true)
|
|
7074
|
-
eligible.add(number);
|
|
7075
|
-
} else {
|
|
7076
|
-
const content = target.getContent?.();
|
|
7077
|
-
if (typeof content === "string" && content.length > `[dropped §${number}§]`.length)
|
|
7078
|
-
eligible.add(number);
|
|
7079
|
-
}
|
|
7080
|
-
}
|
|
7081
|
-
return eligible;
|
|
7082
|
-
}
|
|
7083
|
-
function pendingDropEligibilityKey(db, sessionId, input, protectionInputs) {
|
|
7084
|
-
const digests = input.map((message) => message.contentDigest?.() ?? null);
|
|
7085
|
-
if (digests.some((digest) => digest === null))
|
|
7086
|
-
return null;
|
|
7087
|
-
const revision = db.prepare("SELECT value FROM schema_migrations_meta WHERE key = ?").get(tagRevisionKey(sessionId));
|
|
7088
|
-
if (!revision?.value)
|
|
7089
|
-
return null;
|
|
7090
|
-
return JSON.stringify([
|
|
7091
|
-
input.map((message, index) => [
|
|
7092
|
-
message.id,
|
|
7093
|
-
message.role,
|
|
7094
|
-
message.synthetic,
|
|
7095
|
-
digests[index]
|
|
7096
|
-
]),
|
|
7097
|
-
revision.value,
|
|
7098
|
-
readEpochFloorSnapshot(db, sessionId),
|
|
7099
|
-
sessionDecisionCalibration(db, sessionId).toolsRatio,
|
|
7100
|
-
loadProtectedTailMeta(db, sessionId),
|
|
7101
|
-
[...getMergedReasoningStrippedIds(db, sessionId)].sort(),
|
|
7102
|
-
[...getReasoningRemovalState(db, sessionId).messageIds].sort(),
|
|
7103
|
-
protectionInputs
|
|
7104
|
-
]);
|
|
7105
|
-
}
|
|
7106
|
-
function createPendingDropEligibilityCache() {
|
|
7107
|
-
const sessions = new Map;
|
|
7108
|
-
return {
|
|
7109
|
-
read(sessionId, key) {
|
|
7110
|
-
const previous = sessions.get(sessionId);
|
|
7111
|
-
if (key === null || previous?.key !== key) {
|
|
7112
|
-
sessions.delete(sessionId);
|
|
7113
|
-
return;
|
|
7114
|
-
}
|
|
7115
|
-
return previous.eligible;
|
|
7116
|
-
},
|
|
7117
|
-
record(sessionId, key, eligible) {
|
|
7118
|
-
sessions.delete(sessionId);
|
|
7119
|
-
if (key === null)
|
|
7120
|
-
return;
|
|
7121
|
-
const oldest = sessions.keys().next().value;
|
|
7122
|
-
if (sessions.size >= 64 && oldest !== undefined)
|
|
7123
|
-
sessions.delete(oldest);
|
|
7124
|
-
sessions.set(sessionId, { key, eligible: new Set(eligible) });
|
|
7125
|
-
}
|
|
7126
|
-
};
|
|
7127
|
-
}
|
|
7128
|
-
|
|
7129
7458
|
// src/hooks/magic-context/apply-operations.ts
|
|
7130
7459
|
var RECENT_TOOL_SKELETON_WINDOW = 20;
|
|
7131
7460
|
function buildReplacementContent(tagId) {
|
|
@@ -7411,12 +7740,16 @@ function applyPendingOperations(sessionId, db, targets, protectedTagIds, preload
|
|
|
7411
7740
|
}
|
|
7412
7741
|
} else if (target) {
|
|
7413
7742
|
const replacement = buildReplacementContent(pendingOp.tagId);
|
|
7743
|
+
if (target.canSetContent?.(replacement) === false) {
|
|
7744
|
+
reject("content_unchanged");
|
|
7745
|
+
continue;
|
|
7746
|
+
}
|
|
7414
7747
|
persistDrop();
|
|
7415
7748
|
mutations.push(() => {
|
|
7416
7749
|
const priorContent = target.getContent?.();
|
|
7417
7750
|
const changed = target.setContent(replacement);
|
|
7418
|
-
record(changed);
|
|
7419
7751
|
if (changed) {
|
|
7752
|
+
record(true);
|
|
7420
7753
|
const originalCharacters = typeof priorContent === "string" ? priorContent.length : tagById.get(pendingOp.tagId)?.byteSize ?? replacement.length;
|
|
7421
7754
|
onTagReduced?.({
|
|
7422
7755
|
tagNumber: pendingOp.tagId,
|
|
@@ -7679,14 +8012,14 @@ function foldExecutesThisPass(foldDue, materialized) {
|
|
|
7679
8012
|
}
|
|
7680
8013
|
|
|
7681
8014
|
// src/features/magic-context/storage-caveman-rules.ts
|
|
7682
|
-
var
|
|
8015
|
+
var NAMESPACE3 = "caveman";
|
|
7683
8016
|
var CURRENT_RULES_VERSION = 2;
|
|
7684
8017
|
var ORIGINAL_RULES = {
|
|
7685
8018
|
currentRules: false,
|
|
7686
8019
|
englishWordRules: true,
|
|
7687
8020
|
legacyReasoningTags: new Set
|
|
7688
8021
|
};
|
|
7689
|
-
function
|
|
8022
|
+
function parseState2(lane) {
|
|
7690
8023
|
if (!isRecord(lane) || lane.rules !== CURRENT_RULES_VERSION)
|
|
7691
8024
|
return ORIGINAL_RULES;
|
|
7692
8025
|
const tags = Array.isArray(lane.legacyReasoningTags) ? lane.legacyReasoningTags : [];
|
|
@@ -7698,7 +8031,7 @@ function parseState(lane) {
|
|
|
7698
8031
|
}
|
|
7699
8032
|
function getCavemanReplayState(db, sessionId) {
|
|
7700
8033
|
try {
|
|
7701
|
-
return
|
|
8034
|
+
return parseState2(readReplayEnvelope(db, sessionId)[NAMESPACE3]);
|
|
7702
8035
|
} catch (error) {
|
|
7703
8036
|
if (error instanceof ReplayDocumentError)
|
|
7704
8037
|
return ORIGINAL_RULES;
|
|
@@ -7708,11 +8041,11 @@ function getCavemanReplayState(db, sessionId) {
|
|
|
7708
8041
|
function recordCavemanCurrentRules(db, sessionId, englishWordRules, legacyReasoningTags) {
|
|
7709
8042
|
const tags = [...new Set(legacyReasoningTags)].sort((a, b) => a - b);
|
|
7710
8043
|
const persisted = updateReplayDocument(db, sessionId, (doc) => {
|
|
7711
|
-
const current =
|
|
8044
|
+
const current = parseState2(doc[NAMESPACE3]);
|
|
7712
8045
|
if (current.currentRules && current.englishWordRules === englishWordRules)
|
|
7713
8046
|
return false;
|
|
7714
8047
|
doc.version = 2;
|
|
7715
|
-
doc[
|
|
8048
|
+
doc[NAMESPACE3] = {
|
|
7716
8049
|
rules: CURRENT_RULES_VERSION,
|
|
7717
8050
|
legacyReasoningTags: current.currentRules ? [...current.legacyReasoningTags].sort((a, b) => a - b) : tags,
|
|
7718
8051
|
...englishWordRules ? {} : { englishWordRules: false }
|
|
@@ -8196,70 +8529,6 @@ function isVisibleNoteReadPart(part) {
|
|
|
8196
8529
|
return false;
|
|
8197
8530
|
}
|
|
8198
8531
|
|
|
8199
|
-
// src/hooks/magic-context/postprocess-read-cache.ts
|
|
8200
|
-
var connections = new WeakMap;
|
|
8201
|
-
function snapshot(db, sessionId) {
|
|
8202
|
-
const transaction = db;
|
|
8203
|
-
try {
|
|
8204
|
-
if (transaction.inTransaction || transaction.isTransaction) {
|
|
8205
|
-
connections.delete(db);
|
|
8206
|
-
return { version: -1, changes: -1 };
|
|
8207
|
-
}
|
|
8208
|
-
} catch {
|
|
8209
|
-
connections.delete(db);
|
|
8210
|
-
return { version: -1, changes: -1 };
|
|
8211
|
-
}
|
|
8212
|
-
let connection = connections.get(db);
|
|
8213
|
-
if (!connection) {
|
|
8214
|
-
connection = {
|
|
8215
|
-
stamp: db.prepare("SELECT total_changes() AS changes, data_version AS version FROM pragma_data_version"),
|
|
8216
|
-
sessions: new BoundedSessionMap(100)
|
|
8217
|
-
};
|
|
8218
|
-
connections.set(db, connection);
|
|
8219
|
-
}
|
|
8220
|
-
const stamp = connection.stamp.get();
|
|
8221
|
-
const previous = connection.sessions.get(sessionId);
|
|
8222
|
-
if (previous?.version === stamp.version && previous.changes === stamp.changes) {
|
|
8223
|
-
return previous;
|
|
8224
|
-
}
|
|
8225
|
-
const value = { ...stamp };
|
|
8226
|
-
connection.sessions.set(sessionId, value);
|
|
8227
|
-
return value;
|
|
8228
|
-
}
|
|
8229
|
-
function postprocessTailTags(db, sessionId) {
|
|
8230
|
-
const state = snapshot(db, sessionId);
|
|
8231
|
-
return state.tags ??= getTailHygieneTags2(db, sessionId);
|
|
8232
|
-
}
|
|
8233
|
-
function postprocessOldestTags(db, sessionId, protectedNumbers) {
|
|
8234
|
-
const state = snapshot(db, sessionId);
|
|
8235
|
-
const hints = state.hints;
|
|
8236
|
-
if (hints && hints.protectedNumbers.size === protectedNumbers.size && [...protectedNumbers].every((number) => hints.protectedNumbers.has(number))) {
|
|
8237
|
-
return hints.value;
|
|
8238
|
-
}
|
|
8239
|
-
const value = getOldestActiveUnprotectedToolTags2(db, sessionId, protectedNumbers);
|
|
8240
|
-
state.hints = { protectedNumbers: new Set(protectedNumbers), value };
|
|
8241
|
-
return value;
|
|
8242
|
-
}
|
|
8243
|
-
function postprocessReplaySnapshot(db, sessionId) {
|
|
8244
|
-
const state = snapshot(db, sessionId);
|
|
8245
|
-
const replay = state.replay ??= loadPostprocessReplaySnapshot(db, sessionId);
|
|
8246
|
-
return {
|
|
8247
|
-
...replay,
|
|
8248
|
-
staleReduceStrippedIds: new Set(replay.staleReduceStrippedIds),
|
|
8249
|
-
processedImageStrippedIds: new Set(replay.processedImageStrippedIds),
|
|
8250
|
-
processedImageMarkers: new Map(replay.processedImageMarkers),
|
|
8251
|
-
strippedPlaceholderIds: new Set(replay.strippedPlaceholderIds),
|
|
8252
|
-
hiddenSeamPlaceholderIds: new Set(replay.hiddenSeamPlaceholderIds),
|
|
8253
|
-
mergedReasoningStrippedIds: new Set(replay.mergedReasoningStrippedIds),
|
|
8254
|
-
trailingBlankDecisions: new Map(replay.trailingBlankDecisions),
|
|
8255
|
-
noteNudgeAnchors: structuredClone(replay.noteNudgeAnchors),
|
|
8256
|
-
autoSearchHintDecisions: structuredClone(replay.autoSearchHintDecisions),
|
|
8257
|
-
todoSyntheticAnchor: structuredClone(replay.todoSyntheticAnchor),
|
|
8258
|
-
pendingCompactionMarker: structuredClone(replay.pendingCompactionMarker),
|
|
8259
|
-
compactionMarker: structuredClone(replay.compactionMarker)
|
|
8260
|
-
};
|
|
8261
|
-
}
|
|
8262
|
-
|
|
8263
8532
|
// src/hooks/magic-context/strict-thinking-prefix.ts
|
|
8264
8533
|
function servedPrefixMatches(args) {
|
|
8265
8534
|
const heads = args.messages?.slice(0, 2);
|
|
@@ -9131,6 +9400,10 @@ function tagMessages(sessionId, messages, tagger, db, options = {}) {
|
|
|
9131
9400
|
dropReasoningParts: thinkingParts,
|
|
9132
9401
|
mutationParts: [{ message, part: textPart }],
|
|
9133
9402
|
textPrefix: skipPrefixInjection ? "" : prependTag(tagId, ""),
|
|
9403
|
+
canSetContent: (content) => {
|
|
9404
|
+
const partialEnd = messageId ? getPartialEnds().get(messageId) : undefined;
|
|
9405
|
+
return textPart.text !== content && (partialEnd === undefined || partIndex <= partialEnd);
|
|
9406
|
+
},
|
|
9134
9407
|
setContent: (content, options) => {
|
|
9135
9408
|
if (textPart.text === content)
|
|
9136
9409
|
return false;
|
|
@@ -9404,7 +9677,10 @@ function freezeReasoningOnBustingPass(args) {
|
|
|
9404
9677
|
return { strip: null, persistenceFailed: false };
|
|
9405
9678
|
let persisted = false;
|
|
9406
9679
|
try {
|
|
9407
|
-
persisted = addMergedReasoningStrippedIds(args.db, args.sessionId,
|
|
9680
|
+
persisted = addMergedReasoningStrippedIds(args.db, args.sessionId, [
|
|
9681
|
+
...messageIds.map(thinkingBindingRecoveryFrozenId),
|
|
9682
|
+
...args.compactionOff ? messageIds.map(compactionOffThinkingFrozenId) : []
|
|
9683
|
+
]);
|
|
9408
9684
|
} catch (error) {
|
|
9409
9685
|
sessionLog2(args.sessionId, "proactive thinking strip: persistence threw:", error);
|
|
9410
9686
|
}
|
|
@@ -9430,6 +9706,25 @@ function proactiveStripStartIndex(args) {
|
|
|
9430
9706
|
return divergence;
|
|
9431
9707
|
return divergence ?? lastServed.messages.length;
|
|
9432
9708
|
}
|
|
9709
|
+
function servesThinkingBlock(messages, providerID, modelID) {
|
|
9710
|
+
const familyRoute = isAnthropicFamilyRoute(providerID, modelID);
|
|
9711
|
+
for (const message of messages) {
|
|
9712
|
+
if (message.info.role !== "assistant")
|
|
9713
|
+
continue;
|
|
9714
|
+
for (const part of message.parts) {
|
|
9715
|
+
if (!isAnthropicThinkingPart(part, familyRoute) || part.ignored === true)
|
|
9716
|
+
continue;
|
|
9717
|
+
if (part.type === "redacted_thinking")
|
|
9718
|
+
return true;
|
|
9719
|
+
if (typeof part.text === "string" && part.text !== "")
|
|
9720
|
+
return true;
|
|
9721
|
+
const records = isRecord(part.metadata) ? Object.values(part.metadata) : [];
|
|
9722
|
+
if (records.some((record) => isRecord(record) && record.redactedData !== undefined))
|
|
9723
|
+
return true;
|
|
9724
|
+
}
|
|
9725
|
+
}
|
|
9726
|
+
return false;
|
|
9727
|
+
}
|
|
9433
9728
|
function isPartDroppedBeforeWire(part, providerID) {
|
|
9434
9729
|
if (!modelAcceptsEmptyContent(providerID) || !isRecord(part))
|
|
9435
9730
|
return false;
|
|
@@ -9914,7 +10209,7 @@ function finalizeMessageRepresentation(messages, resolvedProviderID, options) {
|
|
|
9914
10209
|
clearedParts = stripClearedReasoning(targetedMessages.filter((message) => !restoredMessages.has(message)));
|
|
9915
10210
|
}
|
|
9916
10211
|
}
|
|
9917
|
-
const bindingRecoveryParts =
|
|
10212
|
+
const bindingRecoveryParts = stripReasoningFromAssistantIds(messages, resolvedProviderID, options?.frozenThinkingBindingMessageIds ?? new Set, restoredMessages);
|
|
9918
10213
|
const mergedReasoningParts = bindingRecoveryParts + (options?.skipMergedReasoningStrip ? 0 : stripReasoningFromMergedAssistants(messages, resolvedProviderID, {
|
|
9919
10214
|
mutationExemptMessage: options?.reasoningMutationExemptMessage,
|
|
9920
10215
|
frozenMessageIds: options?.mergedReasoningStrippedIds,
|
|
@@ -9991,8 +10286,9 @@ async function runPostTransformPhase(args) {
|
|
|
9991
10286
|
let deferredMaterialize = args.canConsumeDeferredLate && deferredMaterializationWasPending;
|
|
9992
10287
|
let materializationRequested = isExplicitFlush || deferredMaterialize;
|
|
9993
10288
|
const m0M1EnabledForFold = args.m0M1 !== undefined && (!!args.m0M1.projectPath || !!args.m0M1.projectDirectory) && (args.fullFeatureMode || compactionOff);
|
|
9994
|
-
const frozenThinking = new Set(args.activeThinkingTurn ? getMergedReasoningStrippedIds(args.db, args.sessionId) : []);
|
|
9995
|
-
const
|
|
10289
|
+
const frozenThinking = new Set(args.activeThinkingTurn || compactionOff ? getMergedReasoningStrippedIds(args.db, args.sessionId) : []);
|
|
10290
|
+
const compactionOffFrozenThinking = compactionOff ? compactionOffFrozenThinkingIds(frozenThinking) : new Set;
|
|
10291
|
+
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)));
|
|
9996
10292
|
const retainedThinking = args.activeThinkingTurn ? retainedActiveThinkingParts({
|
|
9997
10293
|
messages: args.messages,
|
|
9998
10294
|
providerID: args.resolvedProviderID,
|
|
@@ -10017,15 +10313,22 @@ async function runPostTransformPhase(args) {
|
|
|
10017
10313
|
let freezeM0M1 = args.freezeM0M1 === true || activeThinkingPrefixHold;
|
|
10018
10314
|
let rewritingSignedPrefix = false;
|
|
10019
10315
|
let thinkingReleasedForFit = false;
|
|
10020
|
-
const releaseThinkingForRewrite = (forFit = false) => {
|
|
10316
|
+
const releaseThinkingForRewrite = (forFit = false, stripInCompactionOff = false) => {
|
|
10317
|
+
const stripOffWire = compactionOff && stripInCompactionOff;
|
|
10021
10318
|
const stripped = freezeReasoningOnBustingPass({
|
|
10022
10319
|
db: args.db,
|
|
10023
10320
|
sessionId: args.sessionId,
|
|
10024
10321
|
messages: args.messages,
|
|
10025
|
-
alreadyFrozen: bindingThinking
|
|
10322
|
+
alreadyFrozen: bindingThinking,
|
|
10323
|
+
compactionOff: stripOffWire
|
|
10026
10324
|
});
|
|
10027
10325
|
if (stripped.persistenceFailed)
|
|
10028
10326
|
throw new Error("Cannot persist signed thinking omission before prefix rewrite");
|
|
10327
|
+
if (stripOffWire)
|
|
10328
|
+
for (const id of stripped.strip?.messageIds ?? [])
|
|
10329
|
+
compactionOffFrozenThinking.add(id);
|
|
10330
|
+
for (const id of stripped.strip?.messageIds ?? [])
|
|
10331
|
+
bindingThinking.add(id);
|
|
10029
10332
|
retainedThinking.clear();
|
|
10030
10333
|
protectedThinkingMessages.clear();
|
|
10031
10334
|
activeThinkingTurn = false;
|
|
@@ -10038,6 +10341,10 @@ async function runPostTransformPhase(args) {
|
|
|
10038
10341
|
if (args.forceSignedRebuildForFit && (activeThinkingPrefixHold || activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true)) {
|
|
10039
10342
|
releaseThinkingForRewrite(true);
|
|
10040
10343
|
}
|
|
10344
|
+
if (args.compactionModeTransition === true && args.thinkingBindingRecoveryEnabledForModel === true) {
|
|
10345
|
+
sessionLog2(args.sessionId, "compaction mode switch: stripping signed thinking");
|
|
10346
|
+
releaseThinkingForRewrite(false, true);
|
|
10347
|
+
}
|
|
10041
10348
|
const foldDueDecision = m0M1EnabledForFold && args.m0M1 && !freezeM0M1 ? mustMaterialize({
|
|
10042
10349
|
db: args.db,
|
|
10043
10350
|
sessionId: args.sessionId,
|
|
@@ -10077,6 +10384,7 @@ async function runPostTransformPhase(args) {
|
|
|
10077
10384
|
};
|
|
10078
10385
|
if ((foldDueDecision.value || softRefreshOpportunity || firstRenderBust && activeThinkingPrefixHold) && m0M1EnabledForFold && args.m0M1) {
|
|
10079
10386
|
let committedFoldBustsServedPrefix;
|
|
10387
|
+
let committedFoldChangesHead;
|
|
10080
10388
|
try {
|
|
10081
10389
|
const previousM1 = args.sessionMeta.cachedM1Bytes?.toString("utf8");
|
|
10082
10390
|
const foldResult = injectM0M1({
|
|
@@ -10106,6 +10414,12 @@ async function runPostTransformPhase(args) {
|
|
|
10106
10414
|
m1Text: rendered.m1Bytes.toString(),
|
|
10107
10415
|
muralDataUrl: rendered.muralDataUrl
|
|
10108
10416
|
}) : foldBustsServedPrefix(foldDueDecision.reason, servedPrefixBeforeFold, rendered);
|
|
10417
|
+
committedFoldChangesHead = firstRenderBust ? !servedPrefixMatches({
|
|
10418
|
+
messages: servedBeforeFirstRender,
|
|
10419
|
+
m0Text: rendered.m0Bytes.toString(),
|
|
10420
|
+
m1Text: rendered.m1Bytes.toString(),
|
|
10421
|
+
muralDataUrl: rendered.muralDataUrl
|
|
10422
|
+
}) : foldChangesServedPrefix(servedPrefixBeforeFold, rendered);
|
|
10109
10423
|
if (bustsPrefix) {
|
|
10110
10424
|
if (!conversions.isCurrent(db)) {
|
|
10111
10425
|
throw new MaterializeContentionError({
|
|
@@ -10123,7 +10437,10 @@ async function runPostTransformPhase(args) {
|
|
|
10123
10437
|
});
|
|
10124
10438
|
preparedPrefix = foldResult;
|
|
10125
10439
|
if (activeThinkingPrefixHold && firstRenderBust && committedFoldBustsServedPrefix) {
|
|
10126
|
-
releaseThinkingForRewrite();
|
|
10440
|
+
releaseThinkingForRewrite(false, true);
|
|
10441
|
+
} else if (compactionOff && !activeThinkingPrefixHold && args.thinkingBindingRecoveryEnabledForModel === true && committedFoldChangesHead) {
|
|
10442
|
+
sessionLog2(args.sessionId, "compaction-off fold changed the head: stripping signed thinking");
|
|
10443
|
+
releaseThinkingForRewrite(false, true);
|
|
10127
10444
|
}
|
|
10128
10445
|
prefixPreflightFailed = foldResult.materializationContentionRetryExhausted === true;
|
|
10129
10446
|
foldExecutedThisPass = foldExecutesThisPass(foldDueDecision.value || softRefreshOpportunity, foldResult.m0RematerializedThisPass);
|
|
@@ -10181,12 +10498,30 @@ async function runPostTransformPhase(args) {
|
|
|
10181
10498
|
const heldIdleExpiryRebuild = activeThinkingPrefixHold && args.m0M1?.hardSignals?.cacheExpired === true;
|
|
10182
10499
|
const idleExpiryRebuild = (!freezeM0M1 || activeThinkingPrefixHold) && args.m0M1?.hardSignals?.cacheExpired === true;
|
|
10183
10500
|
const rideSignals = {
|
|
10501
|
+
executeReclaim: false,
|
|
10184
10502
|
subagentExecute: !args.fullFeatureMode && args.schedulerDecision === "execute",
|
|
10185
10503
|
hardFold: rewritingSignedPrefix || foldBustsServedPrefixThisPass || firstRenderBust || idleExpiryRebuild,
|
|
10186
10504
|
force: emergencyDropEligible && (args.contextUsage.percentage >= 95 || args.contextUsageFromEstimate !== true && getEmergencyInputSample(args.db, args.sessionId) === 0),
|
|
10187
10505
|
explicitFlush: isExplicitFlush && hasPendingMaterializationOrigin(args.pendingMaterializationSessions, args.sessionId, "user_flush"),
|
|
10188
10506
|
publishedHistory: !prefixPreflightFailed && (publishedM1RefreshedThisPass || !m0M1EnabledForFold && (args.pendingCompartmentInjection?.compartmentCount ?? 0) > 0 && legacyPublishedHeadChanged(args))
|
|
10189
10507
|
};
|
|
10508
|
+
const protectedToolTags = protectedToolTagNumbers(args.tags, args.protectedTools);
|
|
10509
|
+
rideSignals.executeReclaim = !compactionOff && originateExecuteReclaim({
|
|
10510
|
+
db: args.db,
|
|
10511
|
+
sessionId: args.sessionId,
|
|
10512
|
+
primaryExecute: args.fullFeatureMode && args.schedulerDecision === "execute" && args.contextUsage.percentage < args.forceMaterializationPercentage,
|
|
10513
|
+
alreadyBusting: Object.values(rideSignals).some(Boolean) || args.historyRebuiltThisPass,
|
|
10514
|
+
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,
|
|
10515
|
+
reclaimableTokens: estimateExecuteReclaimTokens({
|
|
10516
|
+
db: args.db,
|
|
10517
|
+
sessionId: args.sessionId,
|
|
10518
|
+
pendingOps,
|
|
10519
|
+
tags: args.tags,
|
|
10520
|
+
targets: newTargets,
|
|
10521
|
+
protectedTagIds: new Set([...args.protectedTagIds, ...protectedToolTags])
|
|
10522
|
+
}),
|
|
10523
|
+
usableWindow: args.usableWindow
|
|
10524
|
+
});
|
|
10190
10525
|
const publishedWorkDrainAllowed = !compactionOff && reclaimRidePermitted(rideSignals, {
|
|
10191
10526
|
signedThinkingHold: activeThinkingPrefixHold,
|
|
10192
10527
|
firstRender: firstRenderBust,
|
|
@@ -10194,7 +10529,7 @@ async function runPostTransformPhase(args) {
|
|
|
10194
10529
|
emergency: emergencyDropEligible
|
|
10195
10530
|
});
|
|
10196
10531
|
const shouldApplyPendingOps = publishedWorkDrainAllowed;
|
|
10197
|
-
const shouldRunHeuristics = publishedWorkDrainAllowed && (rideSignals.publishedHistory || materializationRequested || forceMaterialization || foldBustsServedPrefixThisPass || firstRenderBust || heldIdleExpiryRebuild || emergencyDropEligible || args.schedulerDecision === "execute" && (!alreadyRanThisTurn || !args.fullFeatureMode));
|
|
10532
|
+
const shouldRunHeuristics = publishedWorkDrainAllowed && (rideSignals.publishedHistory || rideSignals.executeReclaim || materializationRequested || forceMaterialization || foldBustsServedPrefixThisPass || firstRenderBust || heldIdleExpiryRebuild || emergencyDropEligible || args.schedulerDecision === "execute" && (!alreadyRanThisTurn || !args.fullFeatureMode));
|
|
10198
10533
|
const isCacheBustingPass = publishedWorkDrainAllowed;
|
|
10199
10534
|
let unheldSignedTurnBust = false;
|
|
10200
10535
|
if (isCacheBustingPass && !activeThinkingPrefixHold && activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true) {
|
|
@@ -10286,17 +10621,28 @@ async function runPostTransformPhase(args) {
|
|
|
10286
10621
|
throw new EmergencyFailClosedError("Magic Context could not read its saved reasoning-removal state for this session", { cause: error });
|
|
10287
10622
|
}
|
|
10288
10623
|
}
|
|
10624
|
+
const heuristicsLogChanged = diagnosticStateChanged(args.sessionId, "heuristics", JSON.stringify([
|
|
10625
|
+
args.currentTurnId,
|
|
10626
|
+
shouldRunHeuristics,
|
|
10627
|
+
shouldRunHeuristics ? null : args.schedulerDeferReason
|
|
10628
|
+
]));
|
|
10629
|
+
const pendingLogChanged = diagnosticStateChanged(args.sessionId, "pending-ops", JSON.stringify([
|
|
10630
|
+
args.currentTurnId,
|
|
10631
|
+
shouldApplyPendingOps,
|
|
10632
|
+
shouldApplyPendingOps ? null : args.schedulerDeferReason,
|
|
10633
|
+
shouldApplyPendingOps ? null : (getPendingOpsCount(args.db, args.sessionId) ?? 0) > 0
|
|
10634
|
+
]));
|
|
10289
10635
|
if (shouldRunHeuristics) {
|
|
10290
10636
|
const subagentRerun = !args.fullFeatureMode && alreadyRanThisTurn && args.schedulerDecision === "execute" && !isExplicitFlush && !forceMaterialization;
|
|
10291
10637
|
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})`;
|
|
10292
10638
|
sessionLog2(args.sessionId, `heuristics WILL RUN — reason=${reason}, context=${args.contextUsage.percentage.toFixed(1)}%, turn=${args.currentTurnId}`);
|
|
10293
|
-
} else if (args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
|
|
10639
|
+
} else if (heuristicsLogChanged && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
|
|
10294
10640
|
sessionLog2(args.sessionId, `heuristics WILL NOT RUN — reason=${args.schedulerDeferReason}`);
|
|
10295
10641
|
}
|
|
10296
10642
|
if (alreadyRanThisTurn && args.schedulerDecision === "execute" && !materializationRequested && args.fullFeatureMode) {
|
|
10297
10643
|
sessionLog2(args.sessionId, `transform: skipping heuristics (already ran for turn ${args.currentTurnId})`);
|
|
10298
10644
|
}
|
|
10299
|
-
if (!shouldApplyPendingOps && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
|
|
10645
|
+
if (!shouldApplyPendingOps && pendingLogChanged && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
|
|
10300
10646
|
sessionLog2(args.sessionId, `pending ops WILL NOT APPLY — reason=${args.schedulerDeferReason} pendingOps=${formatPendingOpsDepth()} context=${args.contextUsage.percentage.toFixed(1)}%`);
|
|
10301
10647
|
}
|
|
10302
10648
|
if (hasPendingUserOps && !shouldApplyPendingOps) {
|
|
@@ -10305,7 +10651,6 @@ async function runPostTransformPhase(args) {
|
|
|
10305
10651
|
let explicitMaterializedSuccessfully = false;
|
|
10306
10652
|
let deferredMaterializedSuccessfully = false;
|
|
10307
10653
|
let pendingOpsDidMutate = false;
|
|
10308
|
-
const protectedToolTags = protectedToolTagNumbers(args.tags, args.protectedTools);
|
|
10309
10654
|
const firstApplicationEdits = { any: false, beforeNewerThinking: false };
|
|
10310
10655
|
const recordFirstApplicationWireEdit = (beforeNewerThinking) => {
|
|
10311
10656
|
firstApplicationEdits.any = true;
|
|
@@ -11041,7 +11386,10 @@ async function runPostTransformPhase(args) {
|
|
|
11041
11386
|
const mergedReasoningStrippedIds = new Set(replaySnapshot?.mergedReasoningStrippedIds ?? []);
|
|
11042
11387
|
const frozenThinkingBindingMessageIds = new Set;
|
|
11043
11388
|
let thinkingBindingRecovery = null;
|
|
11044
|
-
if (
|
|
11389
|
+
if (compactionOff) {
|
|
11390
|
+
for (const id of compactionOffFrozenThinking)
|
|
11391
|
+
frozenThinkingBindingMessageIds.add(id);
|
|
11392
|
+
} else {
|
|
11045
11393
|
try {
|
|
11046
11394
|
for (const id of mergedReasoningStrippedIds) {
|
|
11047
11395
|
if (id.startsWith(THINKING_BINDING_RECOVERY_FROZEN_PREFIX)) {
|
|
@@ -11383,6 +11731,8 @@ async function runPostTransformPhase(args) {
|
|
|
11383
11731
|
});
|
|
11384
11732
|
}
|
|
11385
11733
|
logTransformTiming(args.sessionId, "pp.tailGuard", tTailGuard);
|
|
11734
|
+
if (bustedThisPass)
|
|
11735
|
+
clearExecuteReclaimState(args.db, args.sessionId);
|
|
11386
11736
|
return {
|
|
11387
11737
|
explicitMaterializedSuccessfully,
|
|
11388
11738
|
deferredMaterializedSuccessfully,
|
|
@@ -11403,8 +11753,7 @@ async function runPostTransformPhase(args) {
|
|
|
11403
11753
|
prefixTrimStatus: deliveredPrefix?.prefixTrimStatus ?? null,
|
|
11404
11754
|
thinkingBindingRecovery,
|
|
11405
11755
|
proactiveThinkingStrip,
|
|
11406
|
-
thinkingReleasedForFit
|
|
11407
|
-
openTurnSignedThinkingKept: args.thinkingBindingRecoveryEnabledForModel === true && activeThinkingTurn && !rewritingSignedPrefix
|
|
11756
|
+
thinkingReleasedForFit
|
|
11408
11757
|
};
|
|
11409
11758
|
}
|
|
11410
11759
|
function checkM0MutationDriftAndSignal(args) {
|
|
@@ -11504,6 +11853,35 @@ function describeSystemPromptChange(previous, current) {
|
|
|
11504
11853
|
return `presetChanged=${previous ? previous.preset !== current.preset : "unknown"} elements=[${elements.join("; ")}]`;
|
|
11505
11854
|
}
|
|
11506
11855
|
|
|
11856
|
+
// src/hooks/magic-context/system-prompt-sticky-date.ts
|
|
11857
|
+
var STICKY_DATE_KEY = "systemPromptStickyDate";
|
|
11858
|
+
function readPersistedSystemPromptStickyDate(db, sessionId) {
|
|
11859
|
+
try {
|
|
11860
|
+
const saved = readReplayEnvelope(db, sessionId, "read")[STICKY_DATE_KEY];
|
|
11861
|
+
return typeof saved === "string" && saved.length > 0 ? saved : undefined;
|
|
11862
|
+
} catch (error) {
|
|
11863
|
+
sessionLog2(sessionId, "system prompt sticky date record unreadable:", error);
|
|
11864
|
+
return;
|
|
11865
|
+
}
|
|
11866
|
+
}
|
|
11867
|
+
function persistSystemPromptStickyDate(db, sessionId, stickyDate) {
|
|
11868
|
+
try {
|
|
11869
|
+
const written = updateReplayDocument(db, sessionId, (doc) => {
|
|
11870
|
+
if (doc[STICKY_DATE_KEY] === stickyDate)
|
|
11871
|
+
return false;
|
|
11872
|
+
doc.version = 2;
|
|
11873
|
+
doc[STICKY_DATE_KEY] = stickyDate;
|
|
11874
|
+
return true;
|
|
11875
|
+
});
|
|
11876
|
+
if (!written)
|
|
11877
|
+
sessionLog2(sessionId, "system prompt sticky date record not written");
|
|
11878
|
+
return written;
|
|
11879
|
+
} catch (error) {
|
|
11880
|
+
sessionLog2(sessionId, "system prompt sticky date record write failed:", error);
|
|
11881
|
+
return false;
|
|
11882
|
+
}
|
|
11883
|
+
}
|
|
11884
|
+
|
|
11507
11885
|
// src/hooks/magic-context/system-date-refresh.ts
|
|
11508
11886
|
var channels = new WeakMap;
|
|
11509
11887
|
var outputUpdates = new WeakMap;
|
|
@@ -11574,6 +11952,7 @@ function beginSystemDateRequest(history, sessionId, stage, turnId, identity) {
|
|
|
11574
11952
|
systemDone: false,
|
|
11575
11953
|
messagesSeen: false,
|
|
11576
11954
|
permitted: undefined,
|
|
11955
|
+
signedThinkingKept: undefined,
|
|
11577
11956
|
ambiguous: identity === undefined && (turnId === undefined || sameTurn)
|
|
11578
11957
|
};
|
|
11579
11958
|
const blocked = [...requests.values()].filter((candidate) => !candidate.explicit && candidate.ambiguous && !(candidate.systemSeen && candidate.messagesSeen) && candidate.turnId === turnId).length;
|
|
@@ -11596,6 +11975,10 @@ function systemDateRefreshPermission(history, request) {
|
|
|
11596
11975
|
const current = state(history, request);
|
|
11597
11976
|
return current?.ambiguous ? undefined : current?.permitted;
|
|
11598
11977
|
}
|
|
11978
|
+
function systemDateSignedThinkingKept(history, request) {
|
|
11979
|
+
const current = state(history, request);
|
|
11980
|
+
return current?.ambiguous ? undefined : current?.signedThinkingKept;
|
|
11981
|
+
}
|
|
11599
11982
|
function waitForSystemDateRefresh(history, request, apply) {
|
|
11600
11983
|
const current = state(history, request);
|
|
11601
11984
|
if (!current)
|
|
@@ -11610,7 +11993,7 @@ function retire(history, current) {
|
|
|
11610
11993
|
if (unpairable) {
|
|
11611
11994
|
const apply = current.waiting;
|
|
11612
11995
|
current.waiting = undefined;
|
|
11613
|
-
apply?.(false);
|
|
11996
|
+
apply?.(false, undefined);
|
|
11614
11997
|
}
|
|
11615
11998
|
const channel = channels.get(history);
|
|
11616
11999
|
const requests = channel?.get(current.sessionId);
|
|
@@ -11618,14 +12001,15 @@ function retire(history, current) {
|
|
|
11618
12001
|
if (requests?.size === 0)
|
|
11619
12002
|
channel?.delete(current.sessionId);
|
|
11620
12003
|
}
|
|
11621
|
-
function finishSystemDateRefresh(history, request, permitted) {
|
|
12004
|
+
function finishSystemDateRefresh(history, request, permitted, signedThinkingKept) {
|
|
11622
12005
|
const current = state(history, request);
|
|
11623
12006
|
if (!current)
|
|
11624
12007
|
return;
|
|
11625
12008
|
current.permitted = current.ambiguous ? false : permitted;
|
|
12009
|
+
current.signedThinkingKept = current.ambiguous ? undefined : signedThinkingKept;
|
|
11626
12010
|
const apply = current.waiting;
|
|
11627
12011
|
current.waiting = undefined;
|
|
11628
|
-
apply?.(current.permitted);
|
|
12012
|
+
apply?.(current.permitted, current.signedThinkingKept);
|
|
11629
12013
|
retire(history, current);
|
|
11630
12014
|
}
|
|
11631
12015
|
function finishSystemDateHook(history, request) {
|
|
@@ -11661,6 +12045,15 @@ function createSystemPromptHashHandler(deps) {
|
|
|
11661
12045
|
});
|
|
11662
12046
|
const guidanceEpochs = createPromptSurfaceGuidanceEpochCache(promptSurfaceRuntime);
|
|
11663
12047
|
const stickyDateBySession = new Map;
|
|
12048
|
+
const recordedStickyDateBySession = new Map;
|
|
12049
|
+
const recordedStickyDate = (sessionId) => {
|
|
12050
|
+
let recorded = recordedStickyDateBySession.get(sessionId);
|
|
12051
|
+
if (recorded === undefined) {
|
|
12052
|
+
recorded = readPersistedSystemPromptStickyDate(deps.db, sessionId) ?? null;
|
|
12053
|
+
recordedStickyDateBySession.set(sessionId, recorded);
|
|
12054
|
+
}
|
|
12055
|
+
return recorded ?? undefined;
|
|
12056
|
+
};
|
|
11664
12057
|
const diagnosticPrompts = new Map;
|
|
11665
12058
|
const processSystemPrompt = async (input, output) => {
|
|
11666
12059
|
const sessionId = input.sessionID;
|
|
@@ -11728,20 +12121,47 @@ function createSystemPromptHashHandler(deps) {
|
|
|
11728
12121
|
return;
|
|
11729
12122
|
const previousHash = sessionMetaEarly?.systemPromptHash ?? "";
|
|
11730
12123
|
const hasPersistedHash = previousHash !== "" && previousHash !== "0";
|
|
11731
|
-
|
|
11732
|
-
|
|
11733
|
-
|
|
12124
|
+
const prefixBoundModel = isPrefixBoundThinkingModel(liveModel?.providerID, liveModel?.modelID);
|
|
12125
|
+
let stickyDate = stickyDateBySession.get(sessionId);
|
|
12126
|
+
if (!hasPersistedHash) {
|
|
12127
|
+
const previous = stickyDate ?? recordedStickyDate(sessionId);
|
|
12128
|
+
const live = systemPromptDates(liveSystemContent).live;
|
|
12129
|
+
const fieldCount = (dates) => dates === undefined ? 0 : JSON.parse(dates).length;
|
|
12130
|
+
stickyDate = (!modelKey || prefixBoundModel) && previous !== undefined && live !== undefined && fieldCount(previous) === fieldCount(live) ? previous : undefined;
|
|
12131
|
+
if (stickyDate === undefined)
|
|
12132
|
+
stickyDateBySession.delete(sessionId);
|
|
12133
|
+
else
|
|
12134
|
+
stickyDateBySession.set(sessionId, stickyDate);
|
|
12135
|
+
}
|
|
12136
|
+
if (stickyDate === undefined && hasPersistedHash) {
|
|
12137
|
+
const recorded = recordedStickyDate(sessionId);
|
|
12138
|
+
const live = systemPromptDates(liveSystemContent).live;
|
|
12139
|
+
if (recorded !== undefined && live !== undefined && recorded !== live && systemPromptFingerprint(systemPromptDates(liveSystemContent, recorded).stable, promptSurface.preset) === previousHash) {
|
|
12140
|
+
stickyDate = recorded;
|
|
12141
|
+
stickyDateBySession.set(sessionId, recorded);
|
|
12142
|
+
sessionLog2(sessionId, `system prompt date restored after restart: real=${live}, using=${recorded}`);
|
|
12143
|
+
}
|
|
12144
|
+
}
|
|
12145
|
+
const setStickyDate = (value) => {
|
|
12146
|
+
stickyDateBySession.set(sessionId, value);
|
|
12147
|
+
if (value !== recordedStickyDate(sessionId)) {
|
|
12148
|
+
if (persistSystemPromptStickyDate(deps.db, sessionId, value))
|
|
12149
|
+
recordedStickyDateBySession.set(sessionId, value);
|
|
12150
|
+
}
|
|
12151
|
+
};
|
|
11734
12152
|
const dates = systemPromptDates(liveSystemContent, stickyDate);
|
|
11735
12153
|
const currentDate = dates.live;
|
|
11736
12154
|
const stableCandidate = dates.stable;
|
|
11737
12155
|
const stableCandidateHash = systemPromptFingerprint(stableCandidate, promptSurface.preset);
|
|
11738
12156
|
const contentOrPresetChanged = hasPersistedHash && stableCandidateHash !== previousHash;
|
|
11739
12157
|
const rewritePermission = systemDateRefreshPermission(deps.historyRefreshSessions, dateRequest);
|
|
12158
|
+
const signedThinkingKept = systemDateSignedThinkingKept(deps.historyRefreshSessions, dateRequest);
|
|
12159
|
+
const systemDateMayMove = (rewrite, keptSignedThinking) => (rewrite || idleCacheExpired) && keptSignedThinking !== true;
|
|
11740
12160
|
let deferredDateRefresh = false;
|
|
11741
|
-
if (currentDate && stickyDate && currentDate !== stickyDate &&
|
|
12161
|
+
if (currentDate && stickyDate && currentDate !== stickyDate && (idleCacheExpired ? prefixBoundModel : isCacheBusting) && !contentOrPresetChanged && !requestMessagesFinal) {
|
|
11742
12162
|
const liveElements = [...output.system];
|
|
11743
|
-
deferredDateRefresh = waitForSystemDateRefresh(deps.historyRefreshSessions, dateRequest, (permitted) => {
|
|
11744
|
-
if (!permitted) {
|
|
12163
|
+
deferredDateRefresh = waitForSystemDateRefresh(deps.historyRefreshSessions, dateRequest, (permitted, keptSignedThinking) => {
|
|
12164
|
+
if (!systemDateMayMove(permitted, keptSignedThinking)) {
|
|
11745
12165
|
deps.systemPromptRefreshSessions.add(sessionId);
|
|
11746
12166
|
return;
|
|
11747
12167
|
}
|
|
@@ -11754,7 +12174,7 @@ function createSystemPromptHashHandler(deps) {
|
|
|
11754
12174
|
cachedM0SystemHash: hash,
|
|
11755
12175
|
systemPromptTokens: estimateTokens(content)
|
|
11756
12176
|
});
|
|
11757
|
-
|
|
12177
|
+
setStickyDate(currentDate);
|
|
11758
12178
|
output.system.splice(0, output.system.length, ...liveElements);
|
|
11759
12179
|
publishSystemDateOutput(output.system);
|
|
11760
12180
|
deps.systemPromptRefreshSessions.delete(sessionId);
|
|
@@ -11765,12 +12185,12 @@ function createSystemPromptHashHandler(deps) {
|
|
|
11765
12185
|
}
|
|
11766
12186
|
});
|
|
11767
12187
|
}
|
|
11768
|
-
const dateMayAdvance =
|
|
12188
|
+
const dateMayAdvance = contentOrPresetChanged || !deferredDateRefresh && systemDateMayMove(isCacheBusting && (dateRequest ? rewritePermission === true : rewritePermission !== false), signedThinkingKept);
|
|
11769
12189
|
if (currentDate && !stickyDate) {
|
|
11770
|
-
|
|
12190
|
+
setStickyDate(currentDate);
|
|
11771
12191
|
} else if (currentDate && stickyDate && currentDate !== stickyDate) {
|
|
11772
12192
|
if (dateMayAdvance) {
|
|
11773
|
-
|
|
12193
|
+
setStickyDate(currentDate);
|
|
11774
12194
|
sessionLog2(sessionId, `system prompt date updated: ${stickyDate} → ${currentDate} (cache-busting pass)`);
|
|
11775
12195
|
} else {
|
|
11776
12196
|
let offset = 0;
|
|
@@ -11828,7 +12248,7 @@ function createSystemPromptHashHandler(deps) {
|
|
|
11828
12248
|
sessionLog2(sessionId, "system prompt meta persist failed (fail-open):", error);
|
|
11829
12249
|
}
|
|
11830
12250
|
}
|
|
11831
|
-
if (isCacheBusting && !deferredDateRefresh && (contentOrPresetChanged || !currentDate || currentDate === stickyDate || !dateRequest || rewritePermission === true)) {
|
|
12251
|
+
if (isCacheBusting && !deferredDateRefresh && (contentOrPresetChanged || !currentDate || currentDate === stickyDate || !dateRequest || rewritePermission === true && signedThinkingKept !== true)) {
|
|
11832
12252
|
deps.systemPromptRefreshSessions.delete(sessionId);
|
|
11833
12253
|
}
|
|
11834
12254
|
};
|
|
@@ -11843,6 +12263,7 @@ function createSystemPromptHashHandler(deps) {
|
|
|
11843
12263
|
handler,
|
|
11844
12264
|
clearSession: (sessionId) => {
|
|
11845
12265
|
diagnosticPrompts.delete(sessionId);
|
|
12266
|
+
recordedStickyDateBySession.delete(sessionId);
|
|
11846
12267
|
clearSystemDateRefresh(deps.historyRefreshSessions, sessionId);
|
|
11847
12268
|
guidanceEpochs.clear(sessionId);
|
|
11848
12269
|
clearSystemPromptHashSession(sessionId, {
|
|
@@ -18324,8 +18745,8 @@ async function runCompartmentPhaseImpl(args) {
|
|
|
18324
18745
|
}
|
|
18325
18746
|
return "completed";
|
|
18326
18747
|
}
|
|
18327
|
-
if (!historianRunnable && args.sessionMeta.compartmentInProgress) {
|
|
18328
|
-
sessionLog2(args.sessionId, "transform: historian
|
|
18748
|
+
if ((!historianRunnable || !args.canRunCompartments && !getActiveCompartmentRun(args.sessionId)) && args.sessionMeta.compartmentInProgress) {
|
|
18749
|
+
sessionLog2(args.sessionId, "transform: historian unavailable; clearing stale compartmentInProgress flag");
|
|
18329
18750
|
updateSessionMeta(args.db, args.sessionId, { compartmentInProgress: false });
|
|
18330
18751
|
compartmentInProgress = false;
|
|
18331
18752
|
}
|
|
@@ -18576,8 +18997,10 @@ function createTransform(deps) {
|
|
|
18576
18997
|
const loadedSessions = new Set;
|
|
18577
18998
|
const prefixHoldLogTurnIds = new Map;
|
|
18578
18999
|
const thinkingFitRetries = new Set;
|
|
19000
|
+
const compactionModeTransitionPending = new Set;
|
|
18579
19001
|
const clearSessionLogState = (sessionId) => {
|
|
18580
19002
|
prefixHoldLogTurnIds.delete(sessionId);
|
|
19003
|
+
clearDiagnosticLogState(sessionId);
|
|
18581
19004
|
};
|
|
18582
19005
|
const unmanagedOverWindowSessions = new Set;
|
|
18583
19006
|
const rustModeTransform = deps.transformMode === "rust" && deps.rustModeModuleClient ? createRustModeTransform(deps, {
|
|
@@ -18626,6 +19049,11 @@ function createTransform(deps) {
|
|
|
18626
19049
|
const tLkgEntry = performance.now();
|
|
18627
19050
|
const lkgInput = deps.transformMode === "rust" ? [] : projectEntry(sessionId, messages);
|
|
18628
19051
|
const recovery = deps.compactionOff || deps.transformMode === "rust" ? {} : readLkgRecoveryPrefix(sessionId, lkgInput, messages, deps.db);
|
|
19052
|
+
const persistedUntaggedInputIds = deps.compactionOff || deps.transformMode === "rust" ? [] : readPersistedLkgUntaggedInputIds(deps.db, sessionId);
|
|
19053
|
+
const untaggedReplayIds = new Set([
|
|
19054
|
+
...recovery.prefix?.untaggedInputIds ?? [],
|
|
19055
|
+
...persistedUntaggedInputIds
|
|
19056
|
+
]);
|
|
18629
19057
|
logTransformTiming(sessionId, "lkg.entryProjection", tLkgEntry, deps.transformMode === "rust" || !entryReuse ? undefined : `reused=${entryReuse.reused} retained=${entryReuse.retained} retainedBytes=${entryReuse.retainedBytes}`);
|
|
18630
19058
|
const resolvedSessionId = sessionId;
|
|
18631
19059
|
const runNotificationParams = (sid) => {
|
|
@@ -18713,6 +19141,7 @@ function createTransform(deps) {
|
|
|
18713
19141
|
const hasTransitionEffects = transition.recordToWrite !== null || transition.notice !== null || transition.invalidatedM0Baseline || transition.clearedCompartmentInProgress || transition.historianCatchUpSignaled;
|
|
18714
19142
|
if (hasTransitionEffects) {
|
|
18715
19143
|
if (transition.invalidatedM0Baseline) {
|
|
19144
|
+
compactionModeTransitionPending.add(sessionId);
|
|
18716
19145
|
sessionMeta = {
|
|
18717
19146
|
...sessionMeta,
|
|
18718
19147
|
cachedM0Bytes: null,
|
|
@@ -19045,6 +19474,8 @@ function createTransform(deps) {
|
|
|
19045
19474
|
contextLimit: boundaryContextLimit
|
|
19046
19475
|
});
|
|
19047
19476
|
let _boundarySnapshotCache;
|
|
19477
|
+
if (fullFeatureMode && !compactionOff)
|
|
19478
|
+
maintainExecuteFloorMark(db, sessionId, currentTurnId, boundaryUsageForProtectedTail.percentage < boundaryExecuteThreshold);
|
|
19048
19479
|
const getRunnableBoundaryForCompartment = (emergencyTailScale) => {
|
|
19049
19480
|
if (!canRunCompartments)
|
|
19050
19481
|
return null;
|
|
@@ -19170,8 +19601,9 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
19170
19601
|
recordedSessionProjectIdentity.set(sessionId, sessionIdentityForBinding);
|
|
19171
19602
|
}
|
|
19172
19603
|
const taggerFloor = compactionOff ? 0 : deriveTaggerLoadFloor(messages, sessionId, db);
|
|
19173
|
-
|
|
19174
|
-
|
|
19604
|
+
const tagFloorMode = compactionOff || messages.length === 0 ? "inactive" : taggerFloor === 0 ? "fallback" : "scoped";
|
|
19605
|
+
if (diagnosticStateChanged(sessionId, "tag-floor", tagFloorMode) && tagFloorMode !== "inactive") {
|
|
19606
|
+
sessionLog2(sessionId, taggerFloor === 0 ? `tag floor: 0 (full-scan fallback) — no scoped floor above the safety margin across ${messages.length} msgs` : `tag floor: ${taggerFloor} (scoped load)`);
|
|
19175
19607
|
}
|
|
19176
19608
|
const ownerRatio = sessionDecisionCalibration(db, sessionId).proseRatio;
|
|
19177
19609
|
noteTransformPassForExactOrdinalReads(sessionId);
|
|
@@ -19208,7 +19640,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
19208
19640
|
idleExpiry: false,
|
|
19209
19641
|
emergency: contextUsageEarly.percentage >= forceMaterializationPercentage
|
|
19210
19642
|
}
|
|
19211
|
-
}, pendingDropEligibility.read(sessionId, dropProjectionKey()));
|
|
19643
|
+
}, pendingDropEligibility.read(sessionId, dropProjectionKey()), schedulerDecision === "execute");
|
|
19212
19644
|
if (triggerResult.shouldFire) {
|
|
19213
19645
|
sessionLog2(sessionId, `compartment trigger: firing (reason=${triggerResult.reason})`);
|
|
19214
19646
|
updateSessionMeta(db, sessionId, { compartmentInProgress: true });
|
|
@@ -19259,10 +19691,11 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
19259
19691
|
let taggingSucceeded = false;
|
|
19260
19692
|
let recoveryBatch = null;
|
|
19261
19693
|
let recoveryNormalized = false;
|
|
19262
|
-
const
|
|
19694
|
+
const untaggedReplayTailServed = !!recovery.prefix || untaggedReplayIds.size > 0 && messages.some((message) => untaggedReplayIds.has(message.info.id ?? ""));
|
|
19695
|
+
const normalizeRecoveryTail = untaggedReplayTailServed ? () => {
|
|
19263
19696
|
if (recoveryNormalized)
|
|
19264
19697
|
return;
|
|
19265
|
-
const tail = messages.filter((message) =>
|
|
19698
|
+
const tail = messages.filter((message) => untaggedReplayIds.has(message.info.id ?? ""));
|
|
19266
19699
|
const tagged = tagMessages(sessionId, tail, deps.tagger, db, {
|
|
19267
19700
|
skipPrefixInjection: !ctxReduceCallable,
|
|
19268
19701
|
servedMessages: messages,
|
|
@@ -19288,7 +19721,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
19288
19721
|
const messagesForTagging = messagesBeforeInitialPrepare && hiddenMessagesAtCompactionSeam.length > 0 ? messagesBeforeInitialPrepare : messages;
|
|
19289
19722
|
const canAdoptScopedToolSweep = isCacheBusting || canConsumeDeferredEarly;
|
|
19290
19723
|
const scopedToolSweep = useScopedToolSweep(db, sessionId, canAdoptScopedToolSweep) ? true : createPreAdoptionToolSweepResolver(db, sessionId);
|
|
19291
|
-
const result = tagMessages(sessionId,
|
|
19724
|
+
const result = tagMessages(sessionId, untaggedReplayIds.size > 0 ? messagesForTagging.filter((message) => !untaggedReplayIds.has(message.info.id ?? "")) : messagesForTagging, deps.tagger, db, {
|
|
19292
19725
|
skipPrefixInjection,
|
|
19293
19726
|
scopedToolSweep,
|
|
19294
19727
|
servedMessages: messages,
|
|
@@ -19578,6 +20011,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
19578
20011
|
activeThinkingPrefixHold,
|
|
19579
20012
|
directoryPrefixHold: unresolvedDirectoryHold,
|
|
19580
20013
|
forceSignedRebuildForFit: thinkingFitRetries.has(sessionId) || !!recovery.rebuildReason,
|
|
20014
|
+
compactionModeTransition: compactionModeTransitionPending.has(sessionId),
|
|
19581
20015
|
readLastServedMessages: () => {
|
|
19582
20016
|
const slot = getInMemorySlot(sessionId) ?? loadPersistedLkgSlot(db, sessionId);
|
|
19583
20017
|
try {
|
|
@@ -19635,6 +20069,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
19635
20069
|
hardSignals: m0HardSignals
|
|
19636
20070
|
}
|
|
19637
20071
|
});
|
|
20072
|
+
compactionModeTransitionPending.delete(sessionId);
|
|
19638
20073
|
if (recovery.prefix && !recoveryNormalized) {
|
|
19639
20074
|
const priorIds = new Set(recovery.prefix.inputs.map((input) => input.id));
|
|
19640
20075
|
const newIds = new Set(lkgInput.flatMap((input) => input.id && !priorIds.has(input.id) ? [input.id] : []));
|
|
@@ -19646,7 +20081,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
19646
20081
|
postTransformResult.bustedThisPass = true;
|
|
19647
20082
|
passOutcome.markFinalized();
|
|
19648
20083
|
const finalWireTail = describeFinalWireTail(messages);
|
|
19649
|
-
const signedFitPreviouslyRefused = !compactionOff && getMergedReasoningStrippedIds(db, sessionId).has(SIGNED_FIT_REFUSED_MARKER);
|
|
20084
|
+
const signedFitPreviouslyRefused = !compactionOff && activeThinkingPrefixHold && getMergedReasoningStrippedIds(db, sessionId).has(SIGNED_FIT_REFUSED_MARKER);
|
|
19650
20085
|
let finalWireEstimate;
|
|
19651
20086
|
if (postTransformResult.bustedThisPass) {
|
|
19652
20087
|
try {
|
|
@@ -19807,7 +20242,13 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
19807
20242
|
if (!finalWireEstimate) {
|
|
19808
20243
|
sessionLog2(sessionId, `transform: final-wire telemetry estimate=unavailable trusted=false conversation=unknown tools=unknown system=unknown toolDefinitions=unknown tail=${finalWireTail}`);
|
|
19809
20244
|
}
|
|
19810
|
-
|
|
20245
|
+
if (!compactionOff) {
|
|
20246
|
+
const stillUntagged = untaggedReplayTailServed && !recoveryNormalized ? [...untaggedReplayIds] : [];
|
|
20247
|
+
if (JSON.stringify([...new Set(stillUntagged)].sort()) !== JSON.stringify([...new Set(persistedUntaggedInputIds)].sort()) && !persistLkgUntaggedInputIds(db, sessionId, stillUntagged))
|
|
20248
|
+
throw new Error("Cannot persist the last-good untagged-message record");
|
|
20249
|
+
}
|
|
20250
|
+
const signedThinkingServed = isPrefixBoundThinkingModel(modelForBudget?.providerID, modelForBudget?.modelID) && servesThinkingBlock(messages, modelForBudget?.providerID, modelForBudget?.modelID);
|
|
20251
|
+
finishSystemDateRefresh(deps.historyRefreshSessions, dateRequest, postTransformResult.bustedThisPass && !activeThinkingPrefixHold && !signedThinkingServed || postTransformResult.thinkingReleasedForFit === true, signedThinkingServed);
|
|
19811
20252
|
if (activeThinkingPrefixHold && !postTransformResult.thinkingReleasedForFit && sessionMeta.cachedM0Bytes != null && sessionMeta.cachedM1Bytes != null) {
|
|
19812
20253
|
recordHeldHeadForRequest(sessionId, currentLkgRequestIdentity(sessionId), (ownsHistory) => deferDeliveredSystemRefresh(deps, sessionId, ownsHistory));
|
|
19813
20254
|
}
|
|
@@ -19965,7 +20406,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
19965
20406
|
postReduceGraceBaselineU: channel1State.postReduceGraceBaselineU,
|
|
19966
20407
|
postReduceGracePreLevel: channel1State.postReduceGracePreLevel
|
|
19967
20408
|
});
|
|
19968
|
-
|
|
20409
|
+
logNudgeEvaluation(sessionId, "transform", formatChannel1Evaluation(channel1Decision));
|
|
19969
20410
|
const channel2Evaluation = evaluateChannel2(channelBaseline);
|
|
19970
20411
|
const leaseBefore = getChannel2NudgeState(db, sessionId);
|
|
19971
20412
|
if (channelBaseline.evaluable && !channelBaseline.generationInvalidated && !channelBaseline.reducedSinceRefresh) {
|
|
@@ -19976,7 +20417,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
19976
20417
|
}
|
|
19977
20418
|
}
|
|
19978
20419
|
const leaseAfter = getChannel2NudgeState(db, sessionId);
|
|
19979
|
-
|
|
20420
|
+
logNudgeEvaluation(sessionId, "transform", formatChannel2Evaluation(channel2Evaluation, {
|
|
19980
20421
|
leaseBefore,
|
|
19981
20422
|
leaseAfter,
|
|
19982
20423
|
gateHoldReason: channelBaseline.reducedSinceRefresh ? "recent-reduce-refresh" : undefined
|
|
@@ -20355,7 +20796,8 @@ function tryMessagesTransformLkgReplay(args) {
|
|
|
20355
20796
|
sessionId,
|
|
20356
20797
|
entry,
|
|
20357
20798
|
messages: replay.messages,
|
|
20358
|
-
...keys
|
|
20799
|
+
...keys,
|
|
20800
|
+
db
|
|
20359
20801
|
}))
|
|
20360
20802
|
return false;
|
|
20361
20803
|
retirePendingSystemPromptDelivery(sessionId);
|
|
@@ -21944,7 +22386,7 @@ function loadRegistrationConfig(directory) {
|
|
|
21944
22386
|
configCache.delete(directory);
|
|
21945
22387
|
return detailed;
|
|
21946
22388
|
}
|
|
21947
|
-
async function ensureProjectRegisteredFromOpenCodeDirectory(directory, db) {
|
|
22389
|
+
async function ensureProjectRegisteredFromOpenCodeDirectory(directory, db, options = {}) {
|
|
21948
22390
|
const detailed = loadRegistrationConfig(directory);
|
|
21949
22391
|
const projectIdentity = resolveProjectIdentityForSession(directory, detailed.config.allow_home_project);
|
|
21950
22392
|
if (!projectIdentity)
|
|
@@ -21965,6 +22407,9 @@ async function ensureProjectRegisteredFromOpenCodeDirectory(directory, db) {
|
|
|
21965
22407
|
memoryEnabled: detailed.config.memory.enabled,
|
|
21966
22408
|
gitCommitEnabled: detailed.config.memory.git_commit_indexing.enabled
|
|
21967
22409
|
};
|
|
22410
|
+
if (options.preflightLocalPooling && routing.primary.provider === "local") {
|
|
22411
|
+
await preflightLocalEmbeddingPooling(routing.primary.model ?? "Xenova/all-MiniLM-L6-v2");
|
|
22412
|
+
}
|
|
21968
22413
|
const before = getProjectEmbeddingSnapshot2(projectIdentity);
|
|
21969
22414
|
const registered = registerProjectEmbedding2(db, projectIdentity, routing.primary, features, directory);
|
|
21970
22415
|
if (!before || before.providerIdentity !== registered.providerIdentity || before.runtimeFingerprint !== registered.runtimeFingerprint)
|
|
@@ -22895,6 +23340,7 @@ function buildDebugMemoryUsage(runtimeHolders = {}) {
|
|
|
22895
23340
|
const lkg = getLkgSlotHeapStats();
|
|
22896
23341
|
const tagger = runtimeHolders.taggerCache ?? EMPTY_TAGGER_HEAP_STATS;
|
|
22897
23342
|
const wire = runtimeHolders.wireCache ?? EMPTY_WIRE_HEAP_STATS;
|
|
23343
|
+
const replay = runtimeHolders.generateReplay ?? { totalBytes: 0, sessions: [] };
|
|
22898
23344
|
const messageIndexQueue = getMessageIndexQueueHeapStats();
|
|
22899
23345
|
const sessions = new Map;
|
|
22900
23346
|
const session = (sessionId) => {
|
|
@@ -22908,7 +23354,8 @@ function buildDebugMemoryUsage(runtimeHolders = {}) {
|
|
|
22908
23354
|
wireRawMessages: 0,
|
|
22909
23355
|
wireMessages: 0,
|
|
22910
23356
|
wireContentSnapshots: 0,
|
|
22911
|
-
wireEstimatedBytes: 0
|
|
23357
|
+
wireEstimatedBytes: 0,
|
|
23358
|
+
generateReplayBytes: 0
|
|
22912
23359
|
};
|
|
22913
23360
|
sessions.set(sessionId, current);
|
|
22914
23361
|
}
|
|
@@ -22928,6 +23375,8 @@ function buildDebugMemoryUsage(runtimeHolders = {}) {
|
|
|
22928
23375
|
target.wireContentSnapshots += entry.rawContentSnapshots;
|
|
22929
23376
|
target.wireEstimatedBytes += entry.estimatedBytes;
|
|
22930
23377
|
}
|
|
23378
|
+
for (const entry of replay.sessions)
|
|
23379
|
+
session(entry.sessionId).generateReplayBytes += entry.bytes;
|
|
22931
23380
|
return {
|
|
22932
23381
|
pid: process.pid,
|
|
22933
23382
|
bunVersion: typeof Bun !== "undefined" && typeof Bun.version === "string" ? Bun.version : "unavailable",
|
|
@@ -22958,6 +23407,10 @@ function buildDebugMemoryUsage(runtimeHolders = {}) {
|
|
|
22958
23407
|
estimatedBytes: wire.estimatedBytes
|
|
22959
23408
|
},
|
|
22960
23409
|
compartmentMirrors: { entries: 0 },
|
|
23410
|
+
generateReplay: {
|
|
23411
|
+
sessionCount: replay.sessions.length,
|
|
23412
|
+
estimatedBytes: replay.totalBytes
|
|
23413
|
+
},
|
|
22961
23414
|
messageIndexQueue,
|
|
22962
23415
|
sessions: [...sessions.values()].sort((a, b) => a.sessionId.localeCompare(b.sessionId))
|
|
22963
23416
|
}
|
|
@@ -23174,9 +23627,9 @@ function registerRpcHandlers(rpcServer, args) {
|
|
|
23174
23627
|
return { count: buildCompartmentCount(db, sessionId, moduleStatus) };
|
|
23175
23628
|
});
|
|
23176
23629
|
const buildManagedCtx = async (db) => {
|
|
23177
|
-
const { deriveHistorianChunkTokens, resolveHistorianContextLimit } = await importPluginModule(() => import("./derive-budgets-
|
|
23178
|
-
const { resolveHistorianModel } = await importPluginModule(() => import("./model-resolution-
|
|
23179
|
-
const { userObservationCollectionEnabled, userObservationsRequested } = await importPluginModule(() => import("./task-config-
|
|
23630
|
+
const { deriveHistorianChunkTokens, resolveHistorianContextLimit } = await importPluginModule(() => import("./derive-budgets-knf763tt.js"));
|
|
23631
|
+
const { resolveHistorianModel } = await importPluginModule(() => import("./model-resolution-280gmqvd.js"));
|
|
23632
|
+
const { userObservationCollectionEnabled, userObservationsRequested } = await importPluginModule(() => import("./task-config-7md27rx8.js"));
|
|
23180
23633
|
const DEFAULT_HISTORIAN_TIMEOUT_MS = 10 * 60 * 1000;
|
|
23181
23634
|
const runConfig = historianRunConfig(config, currentPluginConfigReader(directory)?.poll().effective ?? config);
|
|
23182
23635
|
const historianModel = resolveHistorianModel(runConfig, "opencode");
|
|
@@ -23207,7 +23660,7 @@ function registerRpcHandlers(rpcServer, args) {
|
|
|
23207
23660
|
return { ok: false, error: "no session" };
|
|
23208
23661
|
const readDirectory = args.readSessionDirectory;
|
|
23209
23662
|
if (readDirectory) {
|
|
23210
|
-
const { handoffHistoryWork } = await import("./history-owner-
|
|
23663
|
+
const { handoffHistoryWork } = await import("./history-owner-ad0crnrn.js");
|
|
23211
23664
|
const handed = await handoffHistoryWork({
|
|
23212
23665
|
storageDir: args.storageDir ?? getMagicContextStorageDir(),
|
|
23213
23666
|
directory,
|
|
@@ -23226,8 +23679,8 @@ function registerRpcHandlers(rpcServer, args) {
|
|
|
23226
23679
|
const db = readDatabase();
|
|
23227
23680
|
if (!db)
|
|
23228
23681
|
return { ok: false, error: "db unavailable" };
|
|
23229
|
-
const { runManagedRecomp } = await importPluginModule(() => import("./recomp-orchestrator-
|
|
23230
|
-
const { sendIgnoredMessage } = await importPluginModule(() => import("./send-session-notification-
|
|
23682
|
+
const { runManagedRecomp } = await importPluginModule(() => import("./recomp-orchestrator-47m4hv5g.js"));
|
|
23683
|
+
const { sendIgnoredMessage } = await importPluginModule(() => import("./send-session-notification-nwvrv34d.js"));
|
|
23231
23684
|
log2(`[rpc] recomp requested for session ${sessionId}`);
|
|
23232
23685
|
if (!args.client && !args.hiddenCompletionExecutor) {
|
|
23233
23686
|
return {
|
|
@@ -23285,7 +23738,7 @@ function registerRpcHandlers(rpcServer, args) {
|
|
|
23285
23738
|
rpcServer.handle("wrapup", async (params) => {
|
|
23286
23739
|
const readDirectory = args.readSessionDirectory;
|
|
23287
23740
|
if (readDirectory && params.sessionId) {
|
|
23288
|
-
const { handoffHistoryWork } = await import("./history-owner-
|
|
23741
|
+
const { handoffHistoryWork } = await import("./history-owner-ad0crnrn.js");
|
|
23289
23742
|
const sessionId = String(params.sessionId);
|
|
23290
23743
|
const handed = await handoffHistoryWork({
|
|
23291
23744
|
storageDir: args.storageDir ?? getMagicContextStorageDir(),
|
|
@@ -23311,7 +23764,7 @@ function registerRpcHandlers(rpcServer, args) {
|
|
|
23311
23764
|
const db = readDatabase();
|
|
23312
23765
|
if (!db)
|
|
23313
23766
|
return { ok: false, error: "db unavailable" };
|
|
23314
|
-
const { runManagedWrapup } = await importPluginModule(() => import("./wrapup-orchestrator-
|
|
23767
|
+
const { runManagedWrapup } = await importPluginModule(() => import("./wrapup-orchestrator-639whfhq.js"));
|
|
23315
23768
|
const model = liveSessionState.liveModelBySession.get(sessionId);
|
|
23316
23769
|
const contextLimit = model ? resolveContextLimit(model.providerID, model.modelID, { db, sessionID: sessionId }) : 128000;
|
|
23317
23770
|
const ctx = {
|
|
@@ -23396,8 +23849,17 @@ function subagentToolRefusal(db, toolId, sessionId, isInternalChild = () => fals
|
|
|
23396
23849
|
function hideSubagentTools(draft, db) {
|
|
23397
23850
|
if (!getOrCreateSessionMeta(db, draft.sessionID).isSubagent)
|
|
23398
23851
|
return;
|
|
23852
|
+
removePrimaryOnlyTools(draft.tools);
|
|
23853
|
+
}
|
|
23854
|
+
function removePrimaryOnlyTools(tools) {
|
|
23399
23855
|
for (const id of PRIMARY_ONLY_TOOLS)
|
|
23400
|
-
delete
|
|
23856
|
+
delete tools[id];
|
|
23857
|
+
}
|
|
23858
|
+
function storedSubagentMode(db, sessionId) {
|
|
23859
|
+
const row = db.prepare("SELECT is_subagent FROM session_meta WHERE session_id = ?").get(sessionId);
|
|
23860
|
+
if (!row || typeof row.is_subagent !== "number")
|
|
23861
|
+
return;
|
|
23862
|
+
return row.is_subagent === 1;
|
|
23401
23863
|
}
|
|
23402
23864
|
|
|
23403
23865
|
// src/shared/conflict-detector.ts
|
|
@@ -24746,18 +25208,56 @@ function containsHostInstance(value) {
|
|
|
24746
25208
|
return false;
|
|
24747
25209
|
}
|
|
24748
25210
|
function clonePreservingInstances(value) {
|
|
24749
|
-
|
|
25211
|
+
return cloneCounting(value, undefined);
|
|
25212
|
+
}
|
|
25213
|
+
function clonePreservingInstancesMeasured(value) {
|
|
25214
|
+
const meter = { bytes: 0 };
|
|
25215
|
+
const copy = cloneCounting(value, meter);
|
|
25216
|
+
return { copy, bytes: meter.bytes };
|
|
25217
|
+
}
|
|
25218
|
+
function cloneCounting(value, meter) {
|
|
25219
|
+
if (isHostInstance(value)) {
|
|
25220
|
+
if (meter)
|
|
25221
|
+
meter.bytes += instanceBytes(value, new WeakSet);
|
|
24750
25222
|
return value;
|
|
24751
|
-
|
|
24752
|
-
|
|
25223
|
+
}
|
|
25224
|
+
if (Array.isArray(value)) {
|
|
25225
|
+
if (meter)
|
|
25226
|
+
meter.bytes += 16 + 8 * value.length;
|
|
25227
|
+
return value.map((entry) => cloneCounting(entry, meter));
|
|
25228
|
+
}
|
|
24753
25229
|
if (value && typeof value === "object") {
|
|
24754
25230
|
const copy = {};
|
|
24755
|
-
|
|
24756
|
-
|
|
25231
|
+
if (meter)
|
|
25232
|
+
meter.bytes += 32;
|
|
25233
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
25234
|
+
if (meter)
|
|
25235
|
+
meter.bytes += 16;
|
|
25236
|
+
copy[key] = cloneCounting(entry, meter);
|
|
25237
|
+
}
|
|
24757
25238
|
return copy;
|
|
24758
25239
|
}
|
|
25240
|
+
if (meter)
|
|
25241
|
+
meter.bytes += typeof value === "string" ? 2 * value.length : 8;
|
|
24759
25242
|
return value;
|
|
24760
25243
|
}
|
|
25244
|
+
function instanceBytes(value, seen) {
|
|
25245
|
+
if (typeof value === "string")
|
|
25246
|
+
return 2 * value.length;
|
|
25247
|
+
if (!value || typeof value !== "object")
|
|
25248
|
+
return 8;
|
|
25249
|
+
if (seen.has(value))
|
|
25250
|
+
return 0;
|
|
25251
|
+
seen.add(value);
|
|
25252
|
+
if (ArrayBuffer.isView(value))
|
|
25253
|
+
return value.byteLength;
|
|
25254
|
+
if (value instanceof ArrayBuffer)
|
|
25255
|
+
return value.byteLength;
|
|
25256
|
+
let bytes = 32;
|
|
25257
|
+
for (const entry of Object.values(value))
|
|
25258
|
+
bytes += 16 + instanceBytes(entry, seen);
|
|
25259
|
+
return bytes;
|
|
25260
|
+
}
|
|
24761
25261
|
function contentKey(value) {
|
|
24762
25262
|
const plain = (entry) => {
|
|
24763
25263
|
if (ArrayBuffer.isView(entry)) {
|
|
@@ -24813,7 +25313,7 @@ function rebuildFileContent(value, output, attachments) {
|
|
|
24813
25313
|
rebuilt.unshift({ type: "text", text: output });
|
|
24814
25314
|
return { type: "content", value: rebuilt };
|
|
24815
25315
|
}
|
|
24816
|
-
function adaptPayload(draft, admittedIDs = new Set, messageTimes = new Map) {
|
|
25316
|
+
function adaptPayload(draft, admittedIDs = new Set, messageTimes = new Map, hiddenTimes = false) {
|
|
24817
25317
|
const existingHeads = new Map(draft.messages.filter((m) => HEAD_IDS.some((id) => m.id === id)).map((m) => [m.id, m]));
|
|
24818
25318
|
const source = draft.messages.filter((m) => !existingHeads.has(m.id));
|
|
24819
25319
|
const results = new Map;
|
|
@@ -24932,6 +25432,16 @@ function adaptPayload(draft, admittedIDs = new Set, messageTimes = new Map) {
|
|
|
24932
25432
|
},
|
|
24933
25433
|
parts
|
|
24934
25434
|
};
|
|
25435
|
+
if (hiddenTimes && mapped.info.time !== undefined) {
|
|
25436
|
+
const time = mapped.info.time;
|
|
25437
|
+
delete mapped.info.time;
|
|
25438
|
+
Object.defineProperty(mapped.info, "time", {
|
|
25439
|
+
value: time,
|
|
25440
|
+
enumerable: false,
|
|
25441
|
+
configurable: true,
|
|
25442
|
+
writable: true
|
|
25443
|
+
});
|
|
25444
|
+
}
|
|
24935
25445
|
originals.set(mapped, message);
|
|
24936
25446
|
if (isCoveredInstructionRow(message))
|
|
24937
25447
|
markCoveredInstructionRow(mapped.info);
|
|
@@ -26432,10 +26942,12 @@ function assistantText(row) {
|
|
|
26432
26942
|
|
|
26433
26943
|
class HiddenProviderError extends Error {
|
|
26434
26944
|
settled;
|
|
26945
|
+
hostError;
|
|
26435
26946
|
constructor(detail, options = {}) {
|
|
26436
26947
|
super(`Hidden completion provider error: ${detail}`);
|
|
26437
26948
|
this.name = "HiddenProviderError";
|
|
26438
26949
|
this.settled = options.settled ?? true;
|
|
26950
|
+
this.hostError = options.hostError;
|
|
26439
26951
|
}
|
|
26440
26952
|
}
|
|
26441
26953
|
function requestModel(request, current) {
|
|
@@ -26499,7 +27011,9 @@ async function awaitAssistantRow(openReader, readSessionError, localFailure, chi
|
|
|
26499
27011
|
`terminal_row=${errorText(newIdle)}`,
|
|
26500
27012
|
`session_error=${sessionError === undefined ? "unavailable" : errorText(sessionError)}`
|
|
26501
27013
|
];
|
|
26502
|
-
throw sessionError === undefined || !isProviderFailure(sessionError) ? new Error(`Hidden completion failed: ${details.join("; ")}
|
|
27014
|
+
throw sessionError === undefined || !isProviderFailure(sessionError) ? new Error(`Hidden completion failed: ${details.join("; ")}`, {
|
|
27015
|
+
cause: sessionError
|
|
27016
|
+
}) : new HiddenProviderError(details.join("; "), { hostError: sessionError });
|
|
26503
27017
|
}
|
|
26504
27018
|
if (outcome === "succeeded" && newAssistant)
|
|
26505
27019
|
return newAssistant;
|
|
@@ -26513,7 +27027,9 @@ async function awaitAssistantRow(openReader, readSessionError, localFailure, chi
|
|
|
26513
27027
|
`terminal_row=${errorText(newAssistant)}`,
|
|
26514
27028
|
`session_error=${sessionError === undefined ? "unavailable" : errorText(sessionError)}`
|
|
26515
27029
|
];
|
|
26516
|
-
throw sessionError === undefined || !isProviderFailure(sessionError) ? new Error(`Hidden completion failed: ${details.join("; ")}
|
|
27030
|
+
throw sessionError === undefined || !isProviderFailure(sessionError) ? new Error(`Hidden completion failed: ${details.join("; ")}`, {
|
|
27031
|
+
cause: sessionError
|
|
27032
|
+
}) : new HiddenProviderError(details.join("; "), { hostError: sessionError });
|
|
26517
27033
|
}
|
|
26518
27034
|
if (newAssistant.data.error !== undefined) {
|
|
26519
27035
|
throw new HiddenProviderError(errorText(newAssistant.data.error), {
|
|
@@ -26668,7 +27184,13 @@ async function createV2HiddenCompletionExecutor(host, options) {
|
|
|
26668
27184
|
const head = await resolveHead(identity);
|
|
26669
27185
|
const active = await lifecycle.open(identity, role, head);
|
|
26670
27186
|
openedChild = active;
|
|
26671
|
-
const
|
|
27187
|
+
const configuredModel = toModelEntry(identity.model);
|
|
27188
|
+
const handle = {
|
|
27189
|
+
id: active.id,
|
|
27190
|
+
childSessionId: active.id,
|
|
27191
|
+
attemptedModel: modelKey(head),
|
|
27192
|
+
...configuredModel?.sourceConfigKey ? { modelConfigKey: configuredModel.sourceConfigKey } : {}
|
|
27193
|
+
};
|
|
26672
27194
|
const tokenBudget = identity.metadata?.tokenBudget;
|
|
26673
27195
|
const run = {
|
|
26674
27196
|
identity,
|
|
@@ -26699,6 +27221,7 @@ async function createV2HiddenCompletionExecutor(host, options) {
|
|
|
26699
27221
|
}
|
|
26700
27222
|
},
|
|
26701
27223
|
async attempt(handle, request) {
|
|
27224
|
+
const startedAt = Date.now();
|
|
26702
27225
|
const run = runs.get(handle);
|
|
26703
27226
|
if (!run)
|
|
26704
27227
|
throw new Error("Unknown hidden completion run");
|
|
@@ -26716,6 +27239,10 @@ async function createV2HiddenCompletionExecutor(host, options) {
|
|
|
26716
27239
|
throw new Error("Hidden completion prompt aborted");
|
|
26717
27240
|
}
|
|
26718
27241
|
const requested = await validateVariant(requestModel(request, run.child.model));
|
|
27242
|
+
const requestedRef = modelKey(requested);
|
|
27243
|
+
const configuredModel = [run.identity.model, ...run.identity.configuredModels ?? []].map(toModelEntry).find((entry) => entry?.model === requestedRef);
|
|
27244
|
+
handle.attemptedModel = requestedRef;
|
|
27245
|
+
handle.modelConfigKey = configuredModel?.sourceConfigKey ?? handle.modelConfigKey;
|
|
26719
27246
|
if (run.identity.kind !== "dreamer-task" && request.body.temperature === undefined) {
|
|
26720
27247
|
const configured = options.historianTemperature?.();
|
|
26721
27248
|
if (typeof configured === "number" && Number.isFinite(configured))
|
|
@@ -26810,6 +27337,22 @@ async function createV2HiddenCompletionExecutor(host, options) {
|
|
|
26810
27337
|
abortReject = reject;
|
|
26811
27338
|
});
|
|
26812
27339
|
const onAbort = () => {
|
|
27340
|
+
const reason = request.signal?.reason;
|
|
27341
|
+
if (reason instanceof ModelProducedNoOutputError && run.identity.kind === "dreamer-task") {
|
|
27342
|
+
recordChildInvocation({
|
|
27343
|
+
db: options.db,
|
|
27344
|
+
parentSessionId: run.identity.parentSessionId ?? options.projectIdentity,
|
|
27345
|
+
parentInvocationId: run.identity.parentInvocationId,
|
|
27346
|
+
harness: "opencode2",
|
|
27347
|
+
subagent: "dreamer",
|
|
27348
|
+
task: run.identity.title.replace(/^magic-context-dream-/, ""),
|
|
27349
|
+
startedAt,
|
|
27350
|
+
status: "timed_out",
|
|
27351
|
+
error: reason,
|
|
27352
|
+
providerId: requested.providerID,
|
|
27353
|
+
modelId: requested.modelID
|
|
27354
|
+
});
|
|
27355
|
+
}
|
|
26813
27356
|
interruptAndRetire(run, "prompt-aborted").finally(() => abortReject(new Error("Hidden completion prompt aborted")));
|
|
26814
27357
|
};
|
|
26815
27358
|
const deadlineTimer = setTimeout(() => {
|
|
@@ -26838,6 +27381,9 @@ async function createV2HiddenCompletionExecutor(host, options) {
|
|
|
26838
27381
|
})
|
|
26839
27382
|
};
|
|
26840
27383
|
inFlight.add(entry);
|
|
27384
|
+
const stopWatching = host.watchModelActivity?.(run.child.id, () => noteModelOutputReceived(request.signal));
|
|
27385
|
+
if (stopWatching)
|
|
27386
|
+
noteModelActivityMonitored(request.signal);
|
|
26841
27387
|
try {
|
|
26842
27388
|
await Promise.race([
|
|
26843
27389
|
host.prompt({ sessionID: run.child.id, text: marker }),
|
|
@@ -26893,12 +27439,20 @@ async function createV2HiddenCompletionExecutor(host, options) {
|
|
|
26893
27439
|
usage: reportedUsage ? usage : meter(system, promptText(request), text ?? ""),
|
|
26894
27440
|
lengthCapped: ["length", "max_tokens"].includes(row.data.finish ?? ""),
|
|
26895
27441
|
providerId: row.data.model?.providerID ?? requested.providerID,
|
|
26896
|
-
modelId: row.data.model?.id ?? requested.modelID
|
|
27442
|
+
modelId: row.data.model?.id ?? requested.modelID,
|
|
27443
|
+
attemptedModel: requestedRef,
|
|
27444
|
+
modelConfigKey: handle.modelConfigKey
|
|
26897
27445
|
};
|
|
26898
27446
|
if (!run.child.ever_settled)
|
|
26899
27447
|
run.child = lifecycle.markEverSettled(run.child);
|
|
26900
27448
|
} catch (caught) {
|
|
26901
27449
|
const error = attempt.budgetExceeded ?? attempt.stepLimit ?? attempt.refusal ?? caught;
|
|
27450
|
+
const hostError = error instanceof HiddenProviderError ? error.hostError : error instanceof Error && error.message.startsWith("Hidden completion failed:") ? error.cause : undefined;
|
|
27451
|
+
annotateSubagentInvocationError(error, {
|
|
27452
|
+
attemptedModel: handle.attemptedModel,
|
|
27453
|
+
modelConfigKey: handle.modelConfigKey,
|
|
27454
|
+
...hostError === undefined ? {} : { hostError }
|
|
27455
|
+
});
|
|
26902
27456
|
run.failed = true;
|
|
26903
27457
|
if (!(error instanceof HiddenProviderError)) {
|
|
26904
27458
|
run.unsettledFailure = true;
|
|
@@ -26912,6 +27466,7 @@ async function createV2HiddenCompletionExecutor(host, options) {
|
|
|
26912
27466
|
}
|
|
26913
27467
|
throw error;
|
|
26914
27468
|
} finally {
|
|
27469
|
+
stopWatching?.();
|
|
26915
27470
|
clearTimeout(deadlineTimer);
|
|
26916
27471
|
if (budgetPoll)
|
|
26917
27472
|
clearInterval(budgetPoll);
|
|
@@ -26967,6 +27522,30 @@ async function createV2HiddenCompletionExecutor(host, options) {
|
|
|
26967
27522
|
};
|
|
26968
27523
|
}
|
|
26969
27524
|
|
|
27525
|
+
// src/v2/hidden-model-activity.ts
|
|
27526
|
+
class HiddenModelActivity {
|
|
27527
|
+
watchers = new Map;
|
|
27528
|
+
watch(sessionID, onOutput) {
|
|
27529
|
+
this.watchers.set(sessionID, onOutput);
|
|
27530
|
+
return () => {
|
|
27531
|
+
if (this.watchers.get(sessionID) === onOutput)
|
|
27532
|
+
this.watchers.delete(sessionID);
|
|
27533
|
+
};
|
|
27534
|
+
}
|
|
27535
|
+
observe(event) {
|
|
27536
|
+
if (!isRecord(event) || !isRecord(event.data))
|
|
27537
|
+
return;
|
|
27538
|
+
const { sessionID, delta, text } = event.data;
|
|
27539
|
+
if (typeof sessionID !== "string")
|
|
27540
|
+
return;
|
|
27541
|
+
const streamed = ["session.text.delta", "session.reasoning.delta", "session.tool.input.delta"].includes(String(event.type)) && typeof delta === "string" && delta.length > 0;
|
|
27542
|
+
const ended = ["session.text.ended", "session.reasoning.ended"].includes(String(event.type)) && typeof text === "string" && text.length > 0;
|
|
27543
|
+
if (streamed || ended || event.type === "session.tool.input.started") {
|
|
27544
|
+
this.watchers.get(sessionID)?.();
|
|
27545
|
+
}
|
|
27546
|
+
}
|
|
27547
|
+
}
|
|
27548
|
+
|
|
26970
27549
|
// src/v2/hooks/channel2.ts
|
|
26971
27550
|
import { randomBytes as randomBytes2 } from "node:crypto";
|
|
26972
27551
|
var pendingCandidates = new WeakMap;
|
|
@@ -27832,7 +28411,9 @@ async function compressOneChunk(args, chunk, sliceMs, signal) {
|
|
|
27832
28411
|
status: "completed",
|
|
27833
28412
|
tokens: run.output.usage,
|
|
27834
28413
|
providerId: run.output.providerId,
|
|
27835
|
-
modelId: run.output.modelId
|
|
28414
|
+
modelId: run.output.modelId,
|
|
28415
|
+
attemptedModel: args.model,
|
|
28416
|
+
configuredModels: args.fallbackModels
|
|
27836
28417
|
});
|
|
27837
28418
|
}
|
|
27838
28419
|
stage = "apply";
|
|
@@ -27999,6 +28580,7 @@ async function applyCuesThroughModule(args, chunk, manifestText, signal) {
|
|
|
27999
28580
|
}
|
|
28000
28581
|
|
|
28001
28582
|
// src/features/magic-context/dreamer/hidden-single-shot.ts
|
|
28583
|
+
var DREAMER_FIRST_OUTPUT_TIMEOUT_MS = 90000;
|
|
28002
28584
|
async function runHiddenSingleShotPrompt(args) {
|
|
28003
28585
|
const system = withContentLanguageDirective(args.system, args.language);
|
|
28004
28586
|
const opening = args.executor.open({
|
|
@@ -28023,6 +28605,7 @@ async function runHiddenSingleShotPrompt(args) {
|
|
|
28023
28605
|
});
|
|
28024
28606
|
}).catch(() => {});
|
|
28025
28607
|
const handle = await raceWithSignal(opening, args.signal);
|
|
28608
|
+
let completion;
|
|
28026
28609
|
args.onOpened?.(handle.id);
|
|
28027
28610
|
let promptSettled = false;
|
|
28028
28611
|
try {
|
|
@@ -28040,10 +28623,14 @@ async function runHiddenSingleShotPrompt(args) {
|
|
|
28040
28623
|
}, {
|
|
28041
28624
|
transport: Object.assign((request) => args.executor.attempt(handle, request), { childSessionId: handle.childSessionId }),
|
|
28042
28625
|
timeoutMs: args.timeoutMs,
|
|
28626
|
+
...args.firstOutputTimeoutMs !== undefined ? { firstOutputTimeoutMs: args.firstOutputTimeoutMs } : {},
|
|
28043
28627
|
...args.signal ? { signal: args.signal } : {},
|
|
28044
28628
|
fallbackModels: args.fallbackModels,
|
|
28045
28629
|
callContext: args.callContext,
|
|
28046
|
-
fetchOutput: () =>
|
|
28630
|
+
fetchOutput: async () => {
|
|
28631
|
+
completion = await args.executor.collect(handle, 50);
|
|
28632
|
+
return completion;
|
|
28633
|
+
},
|
|
28047
28634
|
validateOutput: (completion) => {
|
|
28048
28635
|
const tokens = completion.tokenLog ?? runTokenLog(undefined);
|
|
28049
28636
|
sessionLog2(args.parentSessionId ?? "dreamer", `${args.callContext} response_chars=${(completion.text ?? completion.reasoning ?? "").length} ${formatRunTokenLog(tokens)}`);
|
|
@@ -28059,6 +28646,12 @@ async function runHiddenSingleShotPrompt(args) {
|
|
|
28059
28646
|
promptSettled = true;
|
|
28060
28647
|
return { validated: run.validated, completion: run.output, childSessionId: handle.id };
|
|
28061
28648
|
} catch (error) {
|
|
28649
|
+
const configuredModel = toModelEntry(args.model);
|
|
28650
|
+
annotateSubagentInvocationError(error, {
|
|
28651
|
+
attemptedModel: completion?.attemptedModel ?? handle.attemptedModel ?? configuredModel?.model,
|
|
28652
|
+
modelConfigKey: completion?.modelConfigKey ?? handle.modelConfigKey ?? configuredModel?.sourceConfigKey,
|
|
28653
|
+
...completion?.hostError === undefined ? {} : { hostError: completion.hostError }
|
|
28654
|
+
});
|
|
28062
28655
|
if (args.onFailureOutput) {
|
|
28063
28656
|
let timer;
|
|
28064
28657
|
try {
|
|
@@ -28386,6 +28979,8 @@ If no promotions are warranted, return empty arrays. Always consume reviewed can
|
|
|
28386
28979
|
startedAt,
|
|
28387
28980
|
status: params.status,
|
|
28388
28981
|
messages: params.messages,
|
|
28982
|
+
attemptedModel: args.model,
|
|
28983
|
+
configuredModels: args.fallbackModels,
|
|
28389
28984
|
error: params.error
|
|
28390
28985
|
});
|
|
28391
28986
|
};
|
|
@@ -28893,6 +29488,7 @@ async function classifyOneChunk(args, chunk, anchors, sliceMs, signal) {
|
|
|
28893
29488
|
}, {
|
|
28894
29489
|
transport: Object.assign((request) => executor.attempt(opened, request), { childSessionId: opened.childSessionId }),
|
|
28895
29490
|
timeoutMs: sliceMs,
|
|
29491
|
+
firstOutputTimeoutMs: args.firstOutputTimeoutMs ?? DREAMER_FIRST_OUTPUT_TIMEOUT_MS,
|
|
28896
29492
|
signal,
|
|
28897
29493
|
fallbackModels: args.fallbackModels,
|
|
28898
29494
|
callContext: "dreamer:classify-memories",
|
|
@@ -29172,6 +29768,8 @@ function recordInvocation(args, startedAt, params) {
|
|
|
29172
29768
|
startedAt,
|
|
29173
29769
|
status: params.status,
|
|
29174
29770
|
messages: params.messages,
|
|
29771
|
+
attemptedModel: args.model,
|
|
29772
|
+
configuredModels: args.fallbackModels,
|
|
29175
29773
|
...params.completion && !params.completion.messages ? {
|
|
29176
29774
|
tokens: params.completion.usage,
|
|
29177
29775
|
providerId: params.completion.providerId,
|
|
@@ -29897,6 +30495,8 @@ Remember: output only the JSON object described by the system prompt.`;
|
|
|
29897
30495
|
startedAt,
|
|
29898
30496
|
status: params.status,
|
|
29899
30497
|
messages: params.messages,
|
|
30498
|
+
attemptedModel: args.model,
|
|
30499
|
+
configuredModels: args.fallbackModels,
|
|
29900
30500
|
error: params.error
|
|
29901
30501
|
});
|
|
29902
30502
|
};
|
|
@@ -30701,6 +31301,8 @@ async function confirmReadOnly(args, noteId, content, surfaceCondition, leaseSig
|
|
|
30701
31301
|
startedAt,
|
|
30702
31302
|
status: params.status,
|
|
30703
31303
|
messages: params.messages,
|
|
31304
|
+
attemptedModel: args.model,
|
|
31305
|
+
configuredModels: args.fallbackModels,
|
|
30704
31306
|
error: params.error
|
|
30705
31307
|
});
|
|
30706
31308
|
};
|
|
@@ -31367,6 +31969,7 @@ async function mapOneBatch(args, batch, sliceMs, signal) {
|
|
|
31367
31969
|
model: args.model,
|
|
31368
31970
|
fallbackModels: args.fallbackModels,
|
|
31369
31971
|
timeoutMs: sliceMs,
|
|
31972
|
+
firstOutputTimeoutMs: args.firstOutputTimeoutMs ?? DREAMER_FIRST_OUTPUT_TIMEOUT_MS,
|
|
31370
31973
|
signal,
|
|
31371
31974
|
onOpened: () => {
|
|
31372
31975
|
stage = "prompt";
|
|
@@ -31421,6 +32024,7 @@ async function mapOneBatch(args, batch, sliceMs, signal) {
|
|
|
31421
32024
|
onBudgetUpdate
|
|
31422
32025
|
}),
|
|
31423
32026
|
timeoutMs: sliceMs,
|
|
32027
|
+
firstOutputTimeoutMs: args.firstOutputTimeoutMs ?? DREAMER_FIRST_OUTPUT_TIMEOUT_MS,
|
|
31424
32028
|
signal,
|
|
31425
32029
|
fallbackModels: args.fallbackModels,
|
|
31426
32030
|
callContext: "dreamer:map-memories",
|
|
@@ -31613,12 +32217,14 @@ function recordInvocation2(args, startedAt, params) {
|
|
|
31613
32217
|
recordChildInvocation({
|
|
31614
32218
|
db: args.db,
|
|
31615
32219
|
parentSessionId: args.parentSessionId,
|
|
31616
|
-
harness: "opencode",
|
|
32220
|
+
harness: args.hiddenCompletionExecutor?.capabilities.harness ?? "opencode",
|
|
31617
32221
|
subagent: "dreamer",
|
|
31618
32222
|
task: "map-memories",
|
|
31619
32223
|
startedAt,
|
|
31620
32224
|
status: params.status,
|
|
31621
32225
|
messages: params.messages,
|
|
32226
|
+
attemptedModel: args.model,
|
|
32227
|
+
configuredModels: args.fallbackModels,
|
|
31622
32228
|
error: params.error
|
|
31623
32229
|
});
|
|
31624
32230
|
}
|
|
@@ -32243,12 +32849,14 @@ function recordInvocation3(args, startedAt, params) {
|
|
|
32243
32849
|
recordChildInvocation({
|
|
32244
32850
|
db: args.db,
|
|
32245
32851
|
parentSessionId: args.parentSessionId,
|
|
32246
|
-
harness: "opencode",
|
|
32852
|
+
harness: args.hiddenCompletionExecutor?.capabilities.harness ?? "opencode",
|
|
32247
32853
|
subagent: "dreamer",
|
|
32248
32854
|
task: "refresh-primers",
|
|
32249
32855
|
startedAt,
|
|
32250
32856
|
status: params.status,
|
|
32251
32857
|
messages: params.messages,
|
|
32858
|
+
attemptedModel: args.model,
|
|
32859
|
+
configuredModels: args.fallbackModels,
|
|
32252
32860
|
error: params.error
|
|
32253
32861
|
});
|
|
32254
32862
|
}
|
|
@@ -33498,6 +34106,7 @@ async function verifyOneBatch(args, batch, sliceMs, signal) {
|
|
|
33498
34106
|
fallbackModels: args.fallbackModels,
|
|
33499
34107
|
language: args.language,
|
|
33500
34108
|
timeoutMs: sliceMs,
|
|
34109
|
+
firstOutputTimeoutMs: args.firstOutputTimeoutMs ?? DREAMER_FIRST_OUTPUT_TIMEOUT_MS,
|
|
33501
34110
|
signal: batchSignal,
|
|
33502
34111
|
onFailureOutput: (completion) => {
|
|
33503
34112
|
failedCompletion = completion;
|
|
@@ -33555,6 +34164,7 @@ async function verifyOneBatch(args, batch, sliceMs, signal) {
|
|
|
33555
34164
|
onBudgetUpdate
|
|
33556
34165
|
}),
|
|
33557
34166
|
timeoutMs: sliceMs,
|
|
34167
|
+
firstOutputTimeoutMs: args.firstOutputTimeoutMs ?? DREAMER_FIRST_OUTPUT_TIMEOUT_MS,
|
|
33558
34168
|
signal: batchSignal,
|
|
33559
34169
|
fallbackModels: args.fallbackModels,
|
|
33560
34170
|
callContext: "dreamer:verify",
|
|
@@ -33847,12 +34457,14 @@ function recordInvocation4(args, startedAt, params) {
|
|
|
33847
34457
|
recordChildInvocation({
|
|
33848
34458
|
db: args.db,
|
|
33849
34459
|
parentSessionId: args.parentSessionId,
|
|
33850
|
-
harness: "opencode",
|
|
34460
|
+
harness: args.hiddenCompletionExecutor?.capabilities.harness ?? "opencode",
|
|
33851
34461
|
subagent: "dreamer",
|
|
33852
34462
|
task: args.forceBroad ? "verify-broad" : "verify",
|
|
33853
34463
|
startedAt,
|
|
33854
34464
|
status: params.status,
|
|
33855
34465
|
messages: params.messages,
|
|
34466
|
+
attemptedModel: args.model,
|
|
34467
|
+
configuredModels: args.fallbackModels,
|
|
33856
34468
|
error: params.error
|
|
33857
34469
|
});
|
|
33858
34470
|
}
|
|
@@ -34728,6 +35340,25 @@ async function runRetrospectiveTask(config, ctx, helpers) {
|
|
|
34728
35340
|
let childSessionId = null;
|
|
34729
35341
|
let hiddenHandle = null;
|
|
34730
35342
|
let promptSettled = false;
|
|
35343
|
+
let invocationRecorded = false;
|
|
35344
|
+
const recordInvocation = (status, messages, error) => {
|
|
35345
|
+
if (!parent || !childSessionId || invocationRecorded)
|
|
35346
|
+
return;
|
|
35347
|
+
invocationRecorded = true;
|
|
35348
|
+
recordChildInvocation({
|
|
35349
|
+
db,
|
|
35350
|
+
parentSessionId: parent,
|
|
35351
|
+
harness: deps.hiddenCompletionExecutor?.capabilities.harness ?? "opencode",
|
|
35352
|
+
subagent: "dreamer",
|
|
35353
|
+
task: config.task,
|
|
35354
|
+
startedAt: helpers.invocationStartedAt,
|
|
35355
|
+
status,
|
|
35356
|
+
messages,
|
|
35357
|
+
attemptedModel: config.model,
|
|
35358
|
+
configuredModels: config.fallbackModels,
|
|
35359
|
+
error
|
|
35360
|
+
});
|
|
35361
|
+
};
|
|
34731
35362
|
try {
|
|
34732
35363
|
if (deps.hiddenCompletionExecutor) {
|
|
34733
35364
|
hiddenHandle = await deps.hiddenCompletionExecutor.open({
|
|
@@ -34812,18 +35443,8 @@ async function runRetrospectiveTask(config, ctx, helpers) {
|
|
|
34812
35443
|
return { ...run, output };
|
|
34813
35444
|
};
|
|
34814
35445
|
const finish = (run, watermark) => {
|
|
34815
|
-
if (
|
|
34816
|
-
|
|
34817
|
-
db,
|
|
34818
|
-
parentSessionId: parent,
|
|
34819
|
-
harness: "opencode",
|
|
34820
|
-
subagent: "dreamer",
|
|
34821
|
-
task: config.task,
|
|
34822
|
-
startedAt: helpers.invocationStartedAt,
|
|
34823
|
-
status: "completed",
|
|
34824
|
-
messages: run.output
|
|
34825
|
-
});
|
|
34826
|
-
}
|
|
35446
|
+
if (run)
|
|
35447
|
+
recordInvocation("completed", run.output);
|
|
34827
35448
|
return completedWindow(watermark);
|
|
34828
35449
|
};
|
|
34829
35450
|
const userLines = renderGateUserLines(messages);
|
|
@@ -34916,6 +35537,7 @@ async function runRetrospectiveTask(config, ctx, helpers) {
|
|
|
34916
35537
|
log2(`[dreamer] retrospective: flagged=${flagged.length} learnings=${learnings.length} memory=${applied.memoryWritten} observations=${applied.observationsInserted} dropped=${applied.observationsDropped} rejected=${applied.rejected.length}`);
|
|
34917
35538
|
return finish(deepenRun, scan.maxScannedTs);
|
|
34918
35539
|
} catch (error) {
|
|
35540
|
+
recordInvocation(abortController.signal.aborted ? "aborted" : failedInvocationStatus(error), undefined, error);
|
|
34919
35541
|
if (!detectOverflow(error).isOverflow)
|
|
34920
35542
|
throw error;
|
|
34921
35543
|
const failures = (activeOverflow?.failures ?? 0) + 1;
|
|
@@ -34987,6 +35609,25 @@ async function runAgenticTask(config, ctx, helpers) {
|
|
|
34987
35609
|
let childSessionId = null;
|
|
34988
35610
|
let promptSettled = false;
|
|
34989
35611
|
let expiredArchived = 0;
|
|
35612
|
+
let invocationRecorded = false;
|
|
35613
|
+
const recordInvocation = (status, messages, error) => {
|
|
35614
|
+
if (!parent || !childSessionId || invocationRecorded)
|
|
35615
|
+
return;
|
|
35616
|
+
invocationRecorded = true;
|
|
35617
|
+
recordChildInvocation({
|
|
35618
|
+
db,
|
|
35619
|
+
parentSessionId: parent,
|
|
35620
|
+
harness: deps.hiddenCompletionExecutor?.capabilities.harness ?? "opencode",
|
|
35621
|
+
subagent: "dreamer",
|
|
35622
|
+
task,
|
|
35623
|
+
startedAt: invocationStartedAt,
|
|
35624
|
+
status,
|
|
35625
|
+
messages,
|
|
35626
|
+
attemptedModel: config.model,
|
|
35627
|
+
configuredModels: config.fallbackModels,
|
|
35628
|
+
error
|
|
35629
|
+
});
|
|
35630
|
+
};
|
|
34990
35631
|
try {
|
|
34991
35632
|
let curateMemories;
|
|
34992
35633
|
let curateCategory;
|
|
@@ -35075,6 +35716,9 @@ async function runAgenticTask(config, ctx, helpers) {
|
|
|
35075
35716
|
callContext: `dreamer:${task}`,
|
|
35076
35717
|
metadata: { tokenBudget: config.tokenBudget, onBudgetUpdate },
|
|
35077
35718
|
allowEmpty: task === "curate",
|
|
35719
|
+
onOpened: (sessionId) => {
|
|
35720
|
+
childSessionId = sessionId;
|
|
35721
|
+
},
|
|
35078
35722
|
model: config.model,
|
|
35079
35723
|
fallbackModels: config.fallbackModels,
|
|
35080
35724
|
language: task === "curate" ? config.language ?? deps.language : undefined,
|
|
@@ -35190,18 +35834,7 @@ async function runAgenticTask(config, ctx, helpers) {
|
|
|
35190
35834
|
helpers.reportProgress(curateRefused, curateRefused);
|
|
35191
35835
|
log2(`[dreamer] curate safety summary: refused=${curateRefused}`);
|
|
35192
35836
|
}
|
|
35193
|
-
|
|
35194
|
-
recordChildInvocation({
|
|
35195
|
-
db,
|
|
35196
|
-
parentSessionId: parent,
|
|
35197
|
-
harness: "opencode",
|
|
35198
|
-
subagent: "dreamer",
|
|
35199
|
-
task,
|
|
35200
|
-
startedAt: invocationStartedAt,
|
|
35201
|
-
status: "completed",
|
|
35202
|
-
messages: run.output
|
|
35203
|
-
});
|
|
35204
|
-
}
|
|
35837
|
+
recordInvocation("completed", run.output);
|
|
35205
35838
|
if (task === "maintain-docs" && docsHashes && changes) {
|
|
35206
35839
|
try {
|
|
35207
35840
|
if (run.validated === "[]") {
|
|
@@ -35255,6 +35888,9 @@ async function runAgenticTask(config, ctx, helpers) {
|
|
|
35255
35888
|
}
|
|
35256
35889
|
} : {}
|
|
35257
35890
|
};
|
|
35891
|
+
} catch (error) {
|
|
35892
|
+
recordInvocation(abortController.signal.aborted ? "aborted" : failedInvocationStatus(error), undefined, error);
|
|
35893
|
+
throw error;
|
|
35258
35894
|
} finally {
|
|
35259
35895
|
heartbeat.stop();
|
|
35260
35896
|
if (childSessionId)
|
|
@@ -36517,26 +37153,70 @@ function generateReplayAnchor(messages) {
|
|
|
36517
37153
|
return;
|
|
36518
37154
|
return { id, tail: clonePreservingInstances(messages.slice(index + 1)) };
|
|
36519
37155
|
}
|
|
37156
|
+
var DEFAULT_GENERATE_REPLAY_LIMITS = Object.freeze({
|
|
37157
|
+
maxSessions: 16,
|
|
37158
|
+
sessionMaxBytes: 128 * 1024 * 1024,
|
|
37159
|
+
totalMaxBytes: 256 * 1024 * 1024
|
|
37160
|
+
});
|
|
36520
37161
|
|
|
36521
37162
|
class V2GenerateReplay {
|
|
36522
37163
|
prefixes = new Map;
|
|
37164
|
+
totalBytes = 0;
|
|
37165
|
+
limits;
|
|
37166
|
+
constructor(limits = DEFAULT_GENERATE_REPLAY_LIMITS) {
|
|
37167
|
+
if (!Number.isSafeInteger(limits.maxSessions) || limits.maxSessions < 1 || !Number.isSafeInteger(limits.sessionMaxBytes) || limits.sessionMaxBytes < 1 || !Number.isSafeInteger(limits.totalMaxBytes) || limits.totalMaxBytes < 1)
|
|
37168
|
+
throw new Error("Generate replay limits must be positive integers");
|
|
37169
|
+
this.limits = { ...limits };
|
|
37170
|
+
}
|
|
36523
37171
|
capture(draft, anchor) {
|
|
37172
|
+
this.forget(draft.sessionID);
|
|
36524
37173
|
if (!anchor) {
|
|
36525
|
-
this.prefixes.delete(draft.sessionID);
|
|
36526
37174
|
sessionLog2(draft.sessionID, "generate replay capture skipped: no-anchor");
|
|
36527
37175
|
return;
|
|
36528
37176
|
}
|
|
37177
|
+
const parts = {
|
|
37178
|
+
anchor: clonePreservingInstancesMeasured(anchor),
|
|
37179
|
+
system: clonePreservingInstancesMeasured(draft.system),
|
|
37180
|
+
messages: clonePreservingInstancesMeasured(draft.messages),
|
|
37181
|
+
tools: clonePreservingInstancesMeasured(draft.tools)
|
|
37182
|
+
};
|
|
37183
|
+
const bytes = 256 + parts.anchor.bytes + parts.system.bytes + parts.messages.bytes + parts.tools.bytes;
|
|
37184
|
+
if (bytes > this.limits.sessionMaxBytes || bytes > this.limits.totalMaxBytes) {
|
|
37185
|
+
sessionLog2(draft.sessionID, `generate replay capture skipped: over-session-cap (${bytes} > ${Math.min(this.limits.sessionMaxBytes, this.limits.totalMaxBytes)} bytes)`);
|
|
37186
|
+
return;
|
|
37187
|
+
}
|
|
37188
|
+
while (this.prefixes.size > 0 && (this.prefixes.size >= this.limits.maxSessions || this.totalBytes + bytes > this.limits.totalMaxBytes)) {
|
|
37189
|
+
const oldest = this.prefixes.keys().next().value;
|
|
37190
|
+
if (oldest === undefined)
|
|
37191
|
+
break;
|
|
37192
|
+
this.forget(oldest);
|
|
37193
|
+
}
|
|
36529
37194
|
this.prefixes.set(draft.sessionID, {
|
|
36530
|
-
anchor:
|
|
37195
|
+
anchor: parts.anchor.copy,
|
|
36531
37196
|
model: `${draft.model.providerID}/${draft.model.id}`,
|
|
36532
37197
|
agent: draft.agent,
|
|
36533
|
-
system:
|
|
36534
|
-
messages:
|
|
36535
|
-
tools:
|
|
37198
|
+
system: parts.system.copy,
|
|
37199
|
+
messages: parts.messages.copy,
|
|
37200
|
+
tools: parts.tools.copy,
|
|
37201
|
+
bytes
|
|
36536
37202
|
});
|
|
37203
|
+
this.totalBytes += bytes;
|
|
36537
37204
|
}
|
|
36538
37205
|
forget(sessionID) {
|
|
37206
|
+
const prefix = this.prefixes.get(sessionID);
|
|
37207
|
+
if (!prefix)
|
|
37208
|
+
return;
|
|
36539
37209
|
this.prefixes.delete(sessionID);
|
|
37210
|
+
this.totalBytes -= prefix.bytes;
|
|
37211
|
+
}
|
|
37212
|
+
stats() {
|
|
37213
|
+
return {
|
|
37214
|
+
totalBytes: this.totalBytes,
|
|
37215
|
+
sessions: [...this.prefixes].map(([sessionId, prefix]) => ({
|
|
37216
|
+
sessionId,
|
|
37217
|
+
bytes: prefix.bytes
|
|
37218
|
+
}))
|
|
37219
|
+
};
|
|
36540
37220
|
}
|
|
36541
37221
|
apply(draft) {
|
|
36542
37222
|
const prefix = this.prefixes.get(draft.sessionID);
|
|
@@ -36546,6 +37226,8 @@ class V2GenerateReplay {
|
|
|
36546
37226
|
};
|
|
36547
37227
|
if (!prefix)
|
|
36548
37228
|
return skip("no-prefix");
|
|
37229
|
+
this.prefixes.delete(draft.sessionID);
|
|
37230
|
+
this.prefixes.set(draft.sessionID, prefix);
|
|
36549
37231
|
if (prefix.model !== `${draft.model.providerID}/${draft.model.id}`)
|
|
36550
37232
|
return skip("model-mismatch");
|
|
36551
37233
|
if (prefix.agent !== draft.agent)
|
|
@@ -36589,21 +37271,25 @@ function identity(slot) {
|
|
|
36589
37271
|
|
|
36590
37272
|
class V2LkgSystemReplay {
|
|
36591
37273
|
systems = new BoundedSessionMap(1000);
|
|
36592
|
-
capture(sessionId, slot, input, served) {
|
|
37274
|
+
capture(sessionId, slot, input, served, head) {
|
|
36593
37275
|
this.systems.set(sessionId, {
|
|
36594
37276
|
slot: identity(slot),
|
|
36595
|
-
input:
|
|
36596
|
-
served: structuredClone(served)
|
|
37277
|
+
input: hostInputKey(input),
|
|
37278
|
+
served: structuredClone(served),
|
|
37279
|
+
head: head ? structuredClone(head) : null
|
|
36597
37280
|
});
|
|
36598
37281
|
}
|
|
36599
37282
|
restore(sessionId, slot, input, target) {
|
|
36600
37283
|
const saved = this.systems.get(sessionId);
|
|
36601
|
-
if (!slot || !saved || saved.slot !== identity(slot) || saved.input !==
|
|
36602
|
-
return
|
|
37284
|
+
if (!slot || !saved || saved.slot !== identity(slot) || saved.input !== hostInputKey(input))
|
|
37285
|
+
return;
|
|
36603
37286
|
target.splice(0, target.length, ...structuredClone(saved.served));
|
|
36604
|
-
return
|
|
37287
|
+
return { head: saved.head ? structuredClone(saved.head) : null };
|
|
36605
37288
|
}
|
|
36606
37289
|
}
|
|
37290
|
+
function hostInputKey(input) {
|
|
37291
|
+
return JSON.stringify({ system: input.system, checkpoint: input.checkpoint });
|
|
37292
|
+
}
|
|
36607
37293
|
|
|
36608
37294
|
// src/v2/hooks/model-limit-cache.ts
|
|
36609
37295
|
var warmStarted = false;
|
|
@@ -49634,6 +50320,7 @@ function renderItemByTag(db, sessionId, number, textIndexDomain = "part") {
|
|
|
49634
50320
|
}
|
|
49635
50321
|
|
|
49636
50322
|
// src/tools/ctx-expand/tools.ts
|
|
50323
|
+
var CTX_EXPAND_RUST_TAG_REFUSAL = "Tag lookup isn't available on this session: its §N§ tags are numbered by the Rust transform engine and ctx_expand cannot resolve those numbers, so no content was returned. Expand by message instead: ctx_expand(message=<ordinal>) or ctx_expand(start=<ordinal>, end=<ordinal>), using ordinals from a <session-history> heading or a ctx_search hit.";
|
|
49637
50324
|
var ctxExpandArgsShape = {
|
|
49638
50325
|
tag: tool.schema.union([tool.schema.number(), tool.schema.string()]).optional().describe("Tag number from a §N§ tag or a [dropped §N§] placeholder, not a message ordinal. Returns that one item in full. Use alone."),
|
|
49639
50326
|
start: tool.schema.number().optional().describe("First message ordinal of the range (a <session-history> heading's start, or a ctx_search hit), not a tag number."),
|
|
@@ -49656,9 +50343,12 @@ function createCtxExpandTool(deps) {
|
|
|
49656
50343
|
message: "number"
|
|
49657
50344
|
});
|
|
49658
50345
|
const sessionId = toolContext.sessionID;
|
|
50346
|
+
const mode = resolveCtxExpandMode(args, "positive");
|
|
50347
|
+
if (mode.kind === "tag" && deps.transformMode === "rust") {
|
|
50348
|
+
return CTX_EXPAND_RUST_TAG_REFUSAL;
|
|
50349
|
+
}
|
|
49659
50350
|
if (!await prepareRawSessionOrdinals2(sessionId))
|
|
49660
50351
|
return "Session ordinals are warming in the background. Retry ctx_expand shortly; no approximate ordinal was served.";
|
|
49661
|
-
const mode = resolveCtxExpandMode(args, "positive");
|
|
49662
50352
|
if (mode.kind === "error") {
|
|
49663
50353
|
return mode.message;
|
|
49664
50354
|
}
|
|
@@ -51233,7 +51923,7 @@ function createCtxReduceTool(deps) {
|
|
|
51233
51923
|
args = unwrapImitatedReducedArgs(args, ["drop"], { drop: "string" });
|
|
51234
51924
|
const sessionId = toolContext.sessionID;
|
|
51235
51925
|
if (!args.drop) {
|
|
51236
|
-
return
|
|
51926
|
+
return `Error: 'drop' must be provided as a string of tag numbers, for example {"drop": "3-5,8"}.`;
|
|
51237
51927
|
}
|
|
51238
51928
|
const rustReduce = deps.rustToolBackends?.reduce;
|
|
51239
51929
|
if (rustReduce) {
|
|
@@ -51518,6 +52208,7 @@ function createCtxSearchTool(deps) {
|
|
|
51518
52208
|
explicitSearch: true,
|
|
51519
52209
|
rerankConnectionFile: deps.rerankConnectionFile,
|
|
51520
52210
|
searchMessageHistory: (request) => searchMessageHistoryOffThread(deps.db, request),
|
|
52211
|
+
signal: toolContext.abort,
|
|
51521
52212
|
...dateRange
|
|
51522
52213
|
});
|
|
51523
52214
|
return formatSearchResults2(query, results, toolContext.sessionID, diagnostics);
|
|
@@ -51545,7 +52236,11 @@ async function registerTools(context, db, config, rustToolBackends, isInternalCh
|
|
|
51545
52236
|
getProtectionWindow: (sessionID) => getProtectionWindowForSession(db, sessionID, getObservedEpochFloor(db, sessionID)),
|
|
51546
52237
|
...rustToolBackends ? { rustToolBackends } : {}
|
|
51547
52238
|
}) : {},
|
|
51548
|
-
...createCtxExpandTools({
|
|
52239
|
+
...createCtxExpandTools({
|
|
52240
|
+
db,
|
|
52241
|
+
expandTools: config.historian?.expand_tools,
|
|
52242
|
+
transformMode: config.transform_mode
|
|
52243
|
+
}),
|
|
51549
52244
|
...createCtxNoteTools({
|
|
51550
52245
|
...project,
|
|
51551
52246
|
dreamerEnabled: isDreamerRunnable(config),
|
|
@@ -51632,6 +52327,13 @@ function bindV2TransformDecision(args) {
|
|
|
51632
52327
|
}
|
|
51633
52328
|
|
|
51634
52329
|
// src/hooks/magic-context/auto-embed-session.ts
|
|
52330
|
+
function localPoolingPreflightPending(projectIdentity) {
|
|
52331
|
+
const snapshot = getProjectEmbeddingSnapshot2(projectIdentity);
|
|
52332
|
+
if (snapshot?.provider !== "local")
|
|
52333
|
+
return false;
|
|
52334
|
+
const metadata = getCachedLocalEmbeddingPooling(snapshot.model);
|
|
52335
|
+
return !metadata || metadata.status === "unresolved";
|
|
52336
|
+
}
|
|
51635
52337
|
function embeddingIdentity(projectIdentity) {
|
|
51636
52338
|
const snapshot = getProjectEmbeddingSnapshot2(projectIdentity);
|
|
51637
52339
|
return JSON.stringify([
|
|
@@ -51652,7 +52354,8 @@ function maybeAutoEmbedSessionBackfill(deps, sessionId) {
|
|
|
51652
52354
|
invalidateAutoEmbedSession(sessionId);
|
|
51653
52355
|
autoEmbedIdentityBySession.set(sessionId, identity);
|
|
51654
52356
|
}
|
|
51655
|
-
|
|
52357
|
+
const poolingPreflightPending = localPoolingPreflightPending(deps.projectIdentity);
|
|
52358
|
+
if (embedPauseBySession.has(sessionId) || embedRunStateBySession.has(sessionId) || Date.now() < (autoEmbedRetryAfterBySession.get(sessionId) ?? 0) || autoEmbedAttemptedBySession.has(sessionId) && !poolingPreflightPending)
|
|
51656
52359
|
return;
|
|
51657
52360
|
const controller = new AbortController;
|
|
51658
52361
|
embedRunStateBySession.set(sessionId, controller);
|
|
@@ -51662,6 +52365,7 @@ function maybeAutoEmbedSessionBackfill(deps, sessionId) {
|
|
|
51662
52365
|
let started = false;
|
|
51663
52366
|
let reason = "error";
|
|
51664
52367
|
let registeredIdentity = identity;
|
|
52368
|
+
let poolingPendingAfterRegistration = poolingPreflightPending;
|
|
51665
52369
|
try {
|
|
51666
52370
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
51667
52371
|
if (controller.signal.aborted)
|
|
@@ -51669,6 +52373,7 @@ function maybeAutoEmbedSessionBackfill(deps, sessionId) {
|
|
|
51669
52373
|
await deps.ensureRegistered();
|
|
51670
52374
|
if (controller.signal.aborted)
|
|
51671
52375
|
return;
|
|
52376
|
+
poolingPendingAfterRegistration = localPoolingPreflightPending(deps.projectIdentity);
|
|
51672
52377
|
markActive();
|
|
51673
52378
|
registeredIdentity = embeddingIdentity(deps.projectIdentity);
|
|
51674
52379
|
autoEmbedIdentityBySession.set(sessionId, registeredIdentity);
|
|
@@ -51676,7 +52381,9 @@ function maybeAutoEmbedSessionBackfill(deps, sessionId) {
|
|
|
51676
52381
|
if (controller.signal.aborted || !coverage.enabled)
|
|
51677
52382
|
return;
|
|
51678
52383
|
if (coverage.embedded === coverage.total) {
|
|
51679
|
-
complete =
|
|
52384
|
+
complete = !poolingPendingAfterRegistration;
|
|
52385
|
+
if (!complete)
|
|
52386
|
+
retryDelay = 60000;
|
|
51680
52387
|
return;
|
|
51681
52388
|
}
|
|
51682
52389
|
const model = getProjectEmbeddingSnapshot2(deps.projectIdentity)?.model;
|
|
@@ -51685,8 +52392,11 @@ function maybeAutoEmbedSessionBackfill(deps, sessionId) {
|
|
|
51685
52392
|
const outcome = await embedSessionCompartmentChunks2(deps.db, deps.projectIdentity, sessionId, { signal: controller.signal, automatic: true });
|
|
51686
52393
|
reason = outcome.status;
|
|
51687
52394
|
const after = await getAutoEmbeddingSessionCoverage2(deps.db, deps.projectIdentity, sessionId);
|
|
51688
|
-
complete = after.enabled && after.embedded === after.total;
|
|
51689
|
-
if (
|
|
52395
|
+
complete = after.enabled && after.embedded === after.total && !poolingPendingAfterRegistration;
|
|
52396
|
+
if (poolingPendingAfterRegistration) {
|
|
52397
|
+
retryDelay = 60000;
|
|
52398
|
+
reason = "pooling metadata unavailable";
|
|
52399
|
+
} else if (!complete && outcome.status !== "busy" && outcome.status !== "aborted") {
|
|
51690
52400
|
retryDelay = 60000;
|
|
51691
52401
|
if (outcome.status === "nothing" || outcome.status === "done")
|
|
51692
52402
|
reason = "deferred";
|
|
@@ -51842,6 +52552,26 @@ function persistV2UsageReading(args) {
|
|
|
51842
52552
|
// src/v2/hooks/context.ts
|
|
51843
52553
|
class V2LkgAdmissionReplay extends Error {
|
|
51844
52554
|
}
|
|
52555
|
+
function applyCheckpointHead(draft, head) {
|
|
52556
|
+
const { checkpoint, submitted } = head;
|
|
52557
|
+
const first = draft.messages.find((message) => message.id === HEAD_IDS[0]);
|
|
52558
|
+
const baseline = first?.content.find((part) => part.type === "text")?.text;
|
|
52559
|
+
if (typeof baseline !== "string")
|
|
52560
|
+
return false;
|
|
52561
|
+
for (const part of checkpoint.content)
|
|
52562
|
+
if (part.type === "text" && typeof part.text === "string") {
|
|
52563
|
+
part.text = part.text.replace(`<summary>
|
|
52564
|
+
${submitted}
|
|
52565
|
+
</summary>`, `<summary>
|
|
52566
|
+
${baseline}
|
|
52567
|
+
</summary>`);
|
|
52568
|
+
}
|
|
52569
|
+
const volatile = draft.messages.find((message) => message.id === HEAD_IDS[1]);
|
|
52570
|
+
if (volatile && first)
|
|
52571
|
+
volatile.content.push(...first.content.filter((part) => part.type !== "text"));
|
|
52572
|
+
draft.messages.splice(0, draft.messages.length, checkpoint, ...draft.messages.filter((message) => message !== first));
|
|
52573
|
+
return true;
|
|
52574
|
+
}
|
|
51845
52575
|
var HIDDEN_SESSION_ERROR_GRACE_MS = 50;
|
|
51846
52576
|
var STORE_POOL_DISPOSE_WAIT_MS = 1000;
|
|
51847
52577
|
function isBlockingV2TransformError(error) {
|
|
@@ -52074,6 +52804,7 @@ async function registerContext(context) {
|
|
|
52074
52804
|
const queriedModels = new Set;
|
|
52075
52805
|
const rawLimits = new Map;
|
|
52076
52806
|
const hiddenSessionErrors = new Map;
|
|
52807
|
+
const hiddenModelActivity = new HiddenModelActivity;
|
|
52077
52808
|
const liveModels = new Map;
|
|
52078
52809
|
const promptSurfaceRuntime = createPromptSurfaceRuntime({
|
|
52079
52810
|
harness: "opencode2",
|
|
@@ -52168,6 +52899,7 @@ async function registerContext(context) {
|
|
|
52168
52899
|
await cleanupLegacyOnce(database);
|
|
52169
52900
|
return createV2HiddenCompletionExecutor({
|
|
52170
52901
|
...context.session,
|
|
52902
|
+
watchModelActivity: (sessionID, onOutput) => hiddenModelActivity.watch(sessionID, onOutput),
|
|
52171
52903
|
get: async (input) => {
|
|
52172
52904
|
const session = await context.session.get(input);
|
|
52173
52905
|
const error = hiddenSessionErrors.get(input.sessionID);
|
|
@@ -52509,6 +53241,7 @@ async function registerContext(context) {
|
|
|
52509
53241
|
break;
|
|
52510
53242
|
const event = value;
|
|
52511
53243
|
try {
|
|
53244
|
+
hiddenModelActivity.observe(event);
|
|
52512
53245
|
if (event.type === "provider.updated" || event.type === "model.updated") {
|
|
52513
53246
|
queriedModels.clear();
|
|
52514
53247
|
continue;
|
|
@@ -52543,34 +53276,47 @@ async function registerContext(context) {
|
|
|
52543
53276
|
if (event.type === "session.deleted") {
|
|
52544
53277
|
clearLkgMeasuredRequest(sessionID);
|
|
52545
53278
|
deletedSessions.add(sessionID);
|
|
52546
|
-
|
|
52547
|
-
|
|
52548
|
-
|
|
52549
|
-
|
|
53279
|
+
const failures = [];
|
|
53280
|
+
try {
|
|
53281
|
+
transform?.clearSessionLogState(sessionID);
|
|
53282
|
+
if (db) {
|
|
53283
|
+
markSessionCleanupPending(db, sessionID);
|
|
53284
|
+
clearSession(db, sessionID, false, true);
|
|
53285
|
+
}
|
|
53286
|
+
} catch (error) {
|
|
53287
|
+
failures.push(error);
|
|
52550
53288
|
}
|
|
52551
|
-
|
|
52552
|
-
|
|
52553
|
-
|
|
52554
|
-
|
|
52555
|
-
|
|
52556
|
-
|
|
52557
|
-
|
|
52558
|
-
|
|
52559
|
-
|
|
52560
|
-
|
|
52561
|
-
|
|
52562
|
-
|
|
52563
|
-
|
|
52564
|
-
|
|
52565
|
-
|
|
52566
|
-
|
|
52567
|
-
|
|
52568
|
-
|
|
52569
|
-
|
|
52570
|
-
|
|
52571
|
-
|
|
52572
|
-
|
|
52573
|
-
|
|
53289
|
+
try {
|
|
53290
|
+
rawProviders.get(sessionID)?.();
|
|
53291
|
+
rawProviders.delete(sessionID);
|
|
53292
|
+
usage.delete(sessionID);
|
|
53293
|
+
hiddenSessionErrors.delete(sessionID);
|
|
53294
|
+
storageNoticeBySession.delete(sessionID);
|
|
53295
|
+
liveModels.delete(sessionID);
|
|
53296
|
+
variants.delete(sessionID);
|
|
53297
|
+
agents.delete(sessionID);
|
|
53298
|
+
channel1.delete(sessionID);
|
|
53299
|
+
commitSeenLastPass.delete(sessionID);
|
|
53300
|
+
clearEmbedSessionState(sessionID);
|
|
53301
|
+
historyRefreshSessions.delete(sessionID);
|
|
53302
|
+
clearPendingMaterialization(pendingMaterializationSessions, sessionID);
|
|
53303
|
+
lastHeuristicsTurnId.delete(sessionID);
|
|
53304
|
+
restoredRows.forget(sessionID);
|
|
53305
|
+
if (nativeFoldReplay)
|
|
53306
|
+
await nativeFoldReplay.forget(sessionID);
|
|
53307
|
+
else
|
|
53308
|
+
await forgetNativeFoldProvenance(context.storage, sessionID);
|
|
53309
|
+
generateReplay.forget(sessionID);
|
|
53310
|
+
systemPromptRefreshSessions.delete(sessionID);
|
|
53311
|
+
systemPrompt?.clearSession(sessionID);
|
|
53312
|
+
tagger.cleanup(sessionID);
|
|
53313
|
+
} catch (error) {
|
|
53314
|
+
failures.push(error);
|
|
53315
|
+
}
|
|
53316
|
+
if (failures.length === 1)
|
|
53317
|
+
throw failures[0];
|
|
53318
|
+
if (failures.length > 1)
|
|
53319
|
+
throw new AggregateError(failures, "session deletion failed in both the store clear and the in-memory cleanup");
|
|
52574
53320
|
continue;
|
|
52575
53321
|
}
|
|
52576
53322
|
if (event.type !== "session.execution.succeeded")
|
|
@@ -52688,6 +53434,42 @@ async function registerContext(context) {
|
|
|
52688
53434
|
reader.close();
|
|
52689
53435
|
}
|
|
52690
53436
|
});
|
|
53437
|
+
const temporalTimes = config.temporal_awareness === true;
|
|
53438
|
+
const anchorTimesOnly = !temporalTimes && !rustModeModuleClient;
|
|
53439
|
+
const timeIds = (messages) => {
|
|
53440
|
+
if (temporalTimes)
|
|
53441
|
+
return messages.flatMap((message) => message.id ? [message.id] : []);
|
|
53442
|
+
if (!anchorTimesOnly)
|
|
53443
|
+
return [];
|
|
53444
|
+
const ids = [];
|
|
53445
|
+
for (const message of [...messages].reverse()) {
|
|
53446
|
+
if (message.id)
|
|
53447
|
+
ids.push(message.id);
|
|
53448
|
+
if (message.role === "assistant")
|
|
53449
|
+
break;
|
|
53450
|
+
}
|
|
53451
|
+
return ids;
|
|
53452
|
+
};
|
|
53453
|
+
const restoreAfterCheckpoint = (args) => {
|
|
53454
|
+
const { db, reader, draft, cut, boundaryRepair } = args;
|
|
53455
|
+
const moduleBoundaryID = rustModeModuleClient ? getPersistedCompactionMarkerState(db, draft.sessionID)?.boundaryMessageId ?? null : null;
|
|
53456
|
+
const moduleBoundarySeq = moduleBoundaryID ? reader.sequenceForId(draft.sessionID, moduleBoundaryID) : undefined;
|
|
53457
|
+
const boundaryID = db.prepare("SELECT cached_m0_last_baseline_end_message_id AS id FROM session_meta WHERE session_id = ?").get(draft.sessionID)?.id ?? (boundaryRepair?.kind === "repaired" || boundaryRepair?.kind === "baseline-reset" ? boundaryRepair.anchorEndMessageId : null);
|
|
53458
|
+
const servedBoundary = boundaryID ? servedBoundaryRow(reader, draft.sessionID, boundaryID) : null;
|
|
53459
|
+
const boundary = (nativeFoldReplay?.sourceChanged(draft.sessionID) && !rustModeModuleClient ? (reader.earliestSequence(draft.sessionID) ?? 0) - 1 : undefined) ?? (moduleBoundarySeq !== undefined ? moduleBoundarySeq - 1 : undefined) ?? servedBoundary?.seq ?? reader.sequenceForId(draft.sessionID, boundaryID) ?? (reader.earliestSequence(draft.sessionID) ?? 0) - 1;
|
|
53460
|
+
if (moduleBoundarySeq !== undefined)
|
|
53461
|
+
sessionLog2(draft.sessionID, `v2 restore: from the module boundary ${moduleBoundaryID} to the host checkpoint`);
|
|
53462
|
+
const present = new Set(args.messages.map((message) => message.id));
|
|
53463
|
+
const restored = restoredRows.rows(reader, draft.sessionID, boundary, cut.seq).filter((row) => !present.has(row.id)).flatMap((row) => restoreRow(row, draft.model, hostUsesMediaAssets() ? {
|
|
53464
|
+
asset: hostMediaAsset,
|
|
53465
|
+
unavailable: (detail) => sessionLog2(draft.sessionID, `v2 restore: attachment replaced by a note row=${detail.rowID} name=${JSON.stringify(detail.name ?? null)} mediaType=${detail.mediaType} reason=${JSON.stringify(detail.reason)}`)
|
|
53466
|
+
} : undefined));
|
|
53467
|
+
return [
|
|
53468
|
+
...rustModeModuleClient ? [] : coveredInstructionRows(reader, draft.sessionID, Math.min(boundary, cut.seq), draft.model),
|
|
53469
|
+
...restored,
|
|
53470
|
+
...args.messages.filter((message) => message !== args.incoming)
|
|
53471
|
+
];
|
|
53472
|
+
};
|
|
52691
53473
|
const runManagedContext = async (draft) => {
|
|
52692
53474
|
rememberHostMedia(draft.messages);
|
|
52693
53475
|
if (hiddenChildHook.apply(draft))
|
|
@@ -52699,12 +53481,18 @@ async function registerContext(context) {
|
|
|
52699
53481
|
return;
|
|
52700
53482
|
const systemAtEntry = structuredClone(draft.system);
|
|
52701
53483
|
const slotAtEntry = getSlot(draft.sessionID);
|
|
53484
|
+
let checkpointAtEntry;
|
|
53485
|
+
let replayHead;
|
|
53486
|
+
const hostInput = () => checkpointAtEntry === undefined ? undefined : { system: systemAtEntry, checkpoint: checkpointAtEntry };
|
|
52702
53487
|
const restoreLkgSystem = () => {
|
|
52703
53488
|
retirePendingSystemPromptDelivery(draft.sessionID);
|
|
52704
|
-
|
|
53489
|
+
const input = hostInput();
|
|
53490
|
+
const restored = input && lkgSystems.restore(draft.sessionID, getSlot(draft.sessionID), input, draft.system);
|
|
53491
|
+
if (!restored) {
|
|
52705
53492
|
sessionLog2(draft.sessionID, "lkg_system_state_mismatch");
|
|
52706
53493
|
throw new Error("LKG system identity is unavailable or changed");
|
|
52707
53494
|
}
|
|
53495
|
+
replayHead = restored.head;
|
|
52708
53496
|
};
|
|
52709
53497
|
const isMagicContextSynthetic = (id) => isAdmittedSynthetic(context, draft.sessionID, id);
|
|
52710
53498
|
const newest = draft.messages.at(-1);
|
|
@@ -52713,6 +53501,24 @@ async function registerContext(context) {
|
|
|
52713
53501
|
return;
|
|
52714
53502
|
}
|
|
52715
53503
|
await dropStorageNotices(draft.messages, isMagicContextSynthetic);
|
|
53504
|
+
const hostMessagesAtEntry = [...draft.messages];
|
|
53505
|
+
const passTimes = new Map;
|
|
53506
|
+
const readTimes = (reader, messages) => {
|
|
53507
|
+
const ids = timeIds(messages);
|
|
53508
|
+
const missing = ids.filter((id) => !passTimes.has(id));
|
|
53509
|
+
if (missing.length > 0) {
|
|
53510
|
+
const read = reader.messageTimes(draft.sessionID, missing);
|
|
53511
|
+
for (const id of missing)
|
|
53512
|
+
passTimes.set(id, read.get(id) ?? null);
|
|
53513
|
+
}
|
|
53514
|
+
const times = new Map;
|
|
53515
|
+
for (const id of ids) {
|
|
53516
|
+
const time = passTimes.get(id);
|
|
53517
|
+
if (time)
|
|
53518
|
+
times.set(id, time);
|
|
53519
|
+
}
|
|
53520
|
+
return times;
|
|
53521
|
+
};
|
|
52716
53522
|
liveModels.set(draft.sessionID, {
|
|
52717
53523
|
providerID: draft.model.providerID,
|
|
52718
53524
|
modelID: draft.model.id
|
|
@@ -52724,8 +53530,9 @@ async function registerContext(context) {
|
|
|
52724
53530
|
applyV2PromptSurfaceTools(draft, promptSurfaceRuntime, config.prompt_surface, isSmartNoteSurfaceAvailable(config));
|
|
52725
53531
|
const admissionDb = db ?? storage.current();
|
|
52726
53532
|
const replayFits = (messages) => {
|
|
52727
|
-
const system =
|
|
52728
|
-
|
|
53533
|
+
const system = [];
|
|
53534
|
+
const input = hostInput();
|
|
53535
|
+
if (!admissionDb || !draft.tools || !input || !lkgSystems.restore(draft.sessionID, getSlot(draft.sessionID), input, system))
|
|
52729
53536
|
return false;
|
|
52730
53537
|
const limit = lkgReplayLimit({
|
|
52731
53538
|
db: admissionDb,
|
|
@@ -52760,14 +53567,75 @@ async function registerContext(context) {
|
|
|
52760
53567
|
})
|
|
52761
53568
|
}).fit === "under";
|
|
52762
53569
|
};
|
|
53570
|
+
const buildReplayInput = async () => {
|
|
53571
|
+
let messages = [...hostMessagesAtEntry];
|
|
53572
|
+
const admitted = new Set;
|
|
53573
|
+
let times;
|
|
53574
|
+
try {
|
|
53575
|
+
const reader = openStoreReader();
|
|
53576
|
+
try {
|
|
53577
|
+
const cut = reader.latestCompaction(draft.sessionID);
|
|
53578
|
+
const localCut = cut && isLocalCheckpoint(cut) ? cut : undefined;
|
|
53579
|
+
const incoming = localCut && messages.find((message) => message.id === localCut.id);
|
|
53580
|
+
if (localCut && !incoming || cut && nativeFoldReplay)
|
|
53581
|
+
return;
|
|
53582
|
+
checkpointAtEntry = incoming || null;
|
|
53583
|
+
const modeDb = db ?? storage.current();
|
|
53584
|
+
const subagent = modeDb ? storedSubagentMode(modeDb, draft.sessionID) : undefined;
|
|
53585
|
+
if (subagent === undefined)
|
|
53586
|
+
return;
|
|
53587
|
+
if (subagent)
|
|
53588
|
+
removePrimaryOnlyTools(draft.tools);
|
|
53589
|
+
if (!rustModeModuleClient) {
|
|
53590
|
+
const candidates = syntheticCandidates(context, draft.sessionID, reader.syntheticMessageIDs(draft.sessionID));
|
|
53591
|
+
for (const message of messages)
|
|
53592
|
+
if (message.id && candidates.has(message.id) && await isAdmittedSynthetic(context, draft.sessionID, message.id))
|
|
53593
|
+
admitted.add(message.id);
|
|
53594
|
+
const replayDb = db ?? storage.current();
|
|
53595
|
+
if (localCut && incoming && replayDb)
|
|
53596
|
+
messages = restoreAfterCheckpoint({
|
|
53597
|
+
db: replayDb,
|
|
53598
|
+
reader,
|
|
53599
|
+
draft,
|
|
53600
|
+
messages,
|
|
53601
|
+
cut: localCut,
|
|
53602
|
+
incoming,
|
|
53603
|
+
boundaryRepair: undefined
|
|
53604
|
+
});
|
|
53605
|
+
else if (localCut)
|
|
53606
|
+
return;
|
|
53607
|
+
times = readTimes(reader, messages);
|
|
53608
|
+
}
|
|
53609
|
+
} finally {
|
|
53610
|
+
reader.close();
|
|
53611
|
+
}
|
|
53612
|
+
} catch (error) {
|
|
53613
|
+
sessionLog2(draft.sessionID, "lkg replay input unavailable", error);
|
|
53614
|
+
return;
|
|
53615
|
+
}
|
|
53616
|
+
const replayDraft = { ...draft, messages };
|
|
53617
|
+
return {
|
|
53618
|
+
draft: replayDraft,
|
|
53619
|
+
mapped: adaptPayload(replayDraft, admitted, times, anchorTimesOnly)
|
|
53620
|
+
};
|
|
53621
|
+
};
|
|
53622
|
+
const adoptReplay = (replayed) => {
|
|
53623
|
+
if (replayed !== draft)
|
|
53624
|
+
draft.messages.splice(0, draft.messages.length, ...replayed.messages);
|
|
53625
|
+
if (replayHead)
|
|
53626
|
+
applyCheckpointHead(draft, replayHead);
|
|
53627
|
+
};
|
|
52763
53628
|
let postFold = false;
|
|
52764
53629
|
try {
|
|
52765
53630
|
if (!compactionOff && admissionDb)
|
|
52766
53631
|
await withAsyncPrivilegedWriter2(admissionDb, () => {
|
|
52767
53632
|
return;
|
|
52768
53633
|
}, {
|
|
52769
|
-
beforeRetry: (error) => {
|
|
52770
|
-
const
|
|
53634
|
+
beforeRetry: async (error) => {
|
|
53635
|
+
const input = await buildReplayInput();
|
|
53636
|
+
if (!input)
|
|
53637
|
+
return;
|
|
53638
|
+
const { mapped } = input;
|
|
52771
53639
|
if (tryMessagesTransformLkgReplay({
|
|
52772
53640
|
output: mapped,
|
|
52773
53641
|
sessionId: draft.sessionID,
|
|
@@ -52778,6 +53646,7 @@ async function registerContext(context) {
|
|
|
52778
53646
|
onLkgReplay: restoreLkgSystem
|
|
52779
53647
|
})) {
|
|
52780
53648
|
mapped.commit();
|
|
53649
|
+
adoptReplay(input.draft);
|
|
52781
53650
|
throw new V2LkgAdmissionReplay;
|
|
52782
53651
|
}
|
|
52783
53652
|
}
|
|
@@ -52972,6 +53841,7 @@ async function registerContext(context) {
|
|
|
52972
53841
|
postFold = cut !== undefined;
|
|
52973
53842
|
if (localCut && !incoming)
|
|
52974
53843
|
throw new Error("The host checkpoint disappeared from the context draft");
|
|
53844
|
+
checkpointAtEntry = incoming || null;
|
|
52975
53845
|
let nativeRestored;
|
|
52976
53846
|
if (cut && nativeFoldReplay && await nativeFoldReplay.admits(draft.sessionID, cut, reader)) {
|
|
52977
53847
|
try {
|
|
@@ -53013,22 +53883,17 @@ async function registerContext(context) {
|
|
|
53013
53883
|
checkpoint = structuredClone(identity.rendered ?? incoming);
|
|
53014
53884
|
submitted = identity.rendered ? identity.renderedSummary ?? identity.submitted : cut.data.summary ?? "";
|
|
53015
53885
|
}
|
|
53016
|
-
|
|
53017
|
-
|
|
53018
|
-
|
|
53019
|
-
|
|
53020
|
-
|
|
53021
|
-
|
|
53022
|
-
|
|
53023
|
-
|
|
53024
|
-
|
|
53025
|
-
|
|
53026
|
-
|
|
53027
|
-
} : undefined));
|
|
53028
|
-
draft.messages.splice(0, draft.messages.length, ...rustModeModuleClient ? [] : coveredInstructionRows(reader, draft.sessionID, Math.min(boundary, cut.seq), draft.model), ...restored, ...draft.messages.filter((message) => message !== incoming));
|
|
53029
|
-
}
|
|
53030
|
-
if (config.temporal_awareness === true)
|
|
53031
|
-
messageTimes = reader.messageTimes(draft.sessionID, draft.messages.flatMap((message) => message.id ? [message.id] : []));
|
|
53886
|
+
draft.messages.splice(0, draft.messages.length, ...restoreAfterCheckpoint({
|
|
53887
|
+
db,
|
|
53888
|
+
reader,
|
|
53889
|
+
draft,
|
|
53890
|
+
messages: draft.messages,
|
|
53891
|
+
cut: localCut,
|
|
53892
|
+
incoming,
|
|
53893
|
+
boundaryRepair
|
|
53894
|
+
}));
|
|
53895
|
+
}
|
|
53896
|
+
messageTimes = readTimes(reader, draft.messages);
|
|
53032
53897
|
} finally {
|
|
53033
53898
|
reader.close();
|
|
53034
53899
|
}
|
|
@@ -53045,7 +53910,7 @@ async function registerContext(context) {
|
|
|
53045
53910
|
nativeFoldReplay.invalidate(draft.sessionID, true);
|
|
53046
53911
|
}
|
|
53047
53912
|
}
|
|
53048
|
-
const mapped = adaptPayload(draft, admitted, messageTimes);
|
|
53913
|
+
const mapped = adaptPayload(draft, admitted, messageTimes, anchorTimesOnly);
|
|
53049
53914
|
bindSystemDateRequestIdentity(mapped, draft);
|
|
53050
53915
|
await createMessagesTransformHandler({
|
|
53051
53916
|
magicContext: { "experimental.chat.messages.transform": transform },
|
|
@@ -53062,24 +53927,9 @@ async function registerContext(context) {
|
|
|
53062
53927
|
if (db) {
|
|
53063
53928
|
await deliverPendingChannel2(context, db, draft.sessionID, channel1.get(draft.sessionID));
|
|
53064
53929
|
}
|
|
53065
|
-
|
|
53066
|
-
|
|
53067
|
-
|
|
53068
|
-
if (typeof baseline === "string") {
|
|
53069
|
-
for (const part of checkpoint.content)
|
|
53070
|
-
if (part.type === "text" && typeof part.text === "string") {
|
|
53071
|
-
part.text = part.text.replace(`<summary>
|
|
53072
|
-
${submitted}
|
|
53073
|
-
</summary>`, `<summary>
|
|
53074
|
-
${baseline}
|
|
53075
|
-
</summary>`);
|
|
53076
|
-
}
|
|
53077
|
-
const volatile = draft.messages.find((message) => message.id === HEAD_IDS[1]);
|
|
53078
|
-
if (volatile && head)
|
|
53079
|
-
volatile.content.push(...head.content.filter((part) => part.type !== "text"));
|
|
53080
|
-
draft.messages.splice(0, draft.messages.length, checkpoint, ...draft.messages.filter((message) => message !== head));
|
|
53081
|
-
}
|
|
53082
|
-
}
|
|
53930
|
+
const head = replayHead !== undefined ? replayHead : checkpoint && submitted !== undefined ? { checkpoint, submitted } : null;
|
|
53931
|
+
const servedHead = head && structuredClone(head);
|
|
53932
|
+
const headApplied = head ? applyCheckpointHead(draft, head) : false;
|
|
53083
53933
|
if (nativeMessages && !checkpoint) {
|
|
53084
53934
|
try {
|
|
53085
53935
|
await nativeFoldReplay?.capture(draft, nativeMessages);
|
|
@@ -53090,7 +53940,7 @@ ${baseline}
|
|
|
53090
53940
|
}
|
|
53091
53941
|
const capturedSlot = getSlot(draft.sessionID);
|
|
53092
53942
|
if (capturedSlot && (!slotAtEntry || capturedSlot.capturedAt !== slotAtEntry.capturedAt || capturedSlot.captureSequence !== slotAtEntry.captureSequence || capturedSlot.jsonPrefix !== slotAtEntry.jsonPrefix)) {
|
|
53093
|
-
lkgSystems.capture(draft.sessionID, capturedSlot, systemAtEntry, draft.system);
|
|
53943
|
+
lkgSystems.capture(draft.sessionID, capturedSlot, { system: systemAtEntry, checkpoint: checkpointAtEntry ?? null }, draft.system, headApplied ? servedHead : null);
|
|
53094
53944
|
}
|
|
53095
53945
|
} catch (error) {
|
|
53096
53946
|
if (error instanceof V2LkgAdmissionReplay)
|
|
@@ -53099,8 +53949,11 @@ ${baseline}
|
|
|
53099
53949
|
throw error;
|
|
53100
53950
|
if (!compactionOff && (isTransientSqliteError2(error) || error instanceof StorageBusyRefusalError)) {
|
|
53101
53951
|
if (isTransientSqliteError2(error)) {
|
|
53102
|
-
const
|
|
53952
|
+
const input = await buildReplayInput();
|
|
53103
53953
|
try {
|
|
53954
|
+
if (!input)
|
|
53955
|
+
throw new StorageBusyRefusalError(error, "v2-context");
|
|
53956
|
+
const { mapped } = input;
|
|
53104
53957
|
await createMessagesTransformHandler({
|
|
53105
53958
|
replayFits,
|
|
53106
53959
|
onLkgReplay: restoreLkgSystem,
|
|
@@ -53112,6 +53965,7 @@ ${baseline}
|
|
|
53112
53965
|
}
|
|
53113
53966
|
})({}, mapped);
|
|
53114
53967
|
mapped.commit();
|
|
53968
|
+
adoptReplay(input.draft);
|
|
53115
53969
|
return;
|
|
53116
53970
|
} catch (replayError) {
|
|
53117
53971
|
if (!(replayError instanceof StorageBusyRefusalError))
|
|
@@ -53193,7 +54047,8 @@ ${baseline}
|
|
|
53193
54047
|
return null;
|
|
53194
54048
|
}
|
|
53195
54049
|
},
|
|
53196
|
-
storageDir
|
|
54050
|
+
storageDir,
|
|
54051
|
+
getDebugMemoryHolders: () => ({ generateReplay: generateReplay.stats() })
|
|
53197
54052
|
});
|
|
53198
54053
|
rpcServer.handle("dream", async (params) => {
|
|
53199
54054
|
const sessionId = String(params.sessionId ?? "");
|