@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.
Files changed (296) hide show
  1. package/dist/auto-search-worker.js +53 -10
  2. package/dist/chunk-embedding-write-worker.js +30 -23
  3. package/dist/{compaction-marker-candidates-n4krhat4.js → compaction-marker-candidates-b2q30cft.js} +3 -3
  4. package/dist/compaction-marker-candidates-worker.js +2 -2
  5. package/dist/compartment-chunk-embedding-va090as0.js +65 -0
  6. package/dist/config/schema/magic-context.d.ts +6 -6
  7. package/dist/{conflict-warning-hook-4pmz879v.js → conflict-warning-hook-frp3z2wk.js} +9 -8
  8. package/dist/{context-m897gfp9.js → context-mkece1db.js} +460 -135
  9. package/dist/{derive-budgets-zn7yzd2d.js → derive-budgets-pqybnx09.js} +2 -2
  10. package/dist/embedding-backfill-gy3p78py.js +25 -0
  11. package/dist/embedding-worker-process.js +2 -2
  12. package/dist/embedding-worker.js +5 -5
  13. package/dist/features/magic-context/chunk-embedding-writer.d.ts.map +1 -1
  14. package/dist/features/magic-context/compartment-chunk-embedding.d.ts +44 -1
  15. package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
  16. package/dist/features/magic-context/dreamer/classify.d.ts +3 -0
  17. package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
  18. package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts +11 -0
  19. package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts.map +1 -1
  20. package/dist/features/magic-context/dreamer/map-memories.d.ts +3 -0
  21. package/dist/features/magic-context/dreamer/map-memories.d.ts.map +1 -1
  22. package/dist/features/magic-context/dreamer/task-config.d.ts.map +1 -1
  23. package/dist/features/magic-context/dreamer/task-scheduler.d.ts +2 -0
  24. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  25. package/dist/features/magic-context/dreamer/verify.d.ts +3 -0
  26. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  27. package/dist/features/magic-context/memory/embedding-identity.d.ts.map +1 -1
  28. package/dist/features/magic-context/memory/embedding-local.d.ts +1 -0
  29. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  30. package/dist/features/magic-context/memory/local-embedding-pooling.d.ts +22 -0
  31. package/dist/features/magic-context/memory/local-embedding-pooling.d.ts.map +1 -0
  32. package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
  33. package/dist/features/magic-context/message-index.d.ts +2 -0
  34. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  35. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  36. package/dist/features/magic-context/mural/compress-cues.d.ts.map +1 -1
  37. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  38. package/dist/features/magic-context/search.d.ts +27 -0
  39. package/dist/features/magic-context/search.d.ts.map +1 -1
  40. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  41. package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
  42. package/dist/features/magic-context/storage-meta-persisted.d.ts +14 -0
  43. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  44. package/dist/features/magic-context/subagent-token-capture.d.ts +20 -0
  45. package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -1
  46. package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
  47. package/dist/{history-owner-xp3pngv7.js → history-owner-36wp3mkb.js} +2 -2
  48. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  49. package/dist/hooks/magic-context/auto-embed-session.d.ts.map +1 -1
  50. package/dist/hooks/magic-context/auto-search-hint.d.ts +7 -1
  51. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
  52. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  53. package/dist/hooks/magic-context/auto-search-worker-client.d.ts +33 -6
  54. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
  55. package/dist/hooks/magic-context/auto-search-worker-evaluation.fixture.d.ts +2 -0
  56. package/dist/hooks/magic-context/auto-search-worker-evaluation.fixture.d.ts.map +1 -0
  57. package/dist/hooks/magic-context/cache-busting-signals.d.ts +5 -2
  58. package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -1
  59. package/dist/hooks/magic-context/channel2-delivery.d.ts.map +1 -1
  60. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  61. package/dist/hooks/magic-context/compartment-runner-types.d.ts +5 -0
  62. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  63. package/dist/hooks/magic-context/compartment-trigger.d.ts +1 -1
  64. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  65. package/dist/hooks/magic-context/diagnostic-log-state.d.ts +4 -0
  66. package/dist/hooks/magic-context/diagnostic-log-state.d.ts.map +1 -0
  67. package/dist/hooks/magic-context/execute-reclaim.d.ts +35 -0
  68. package/dist/hooks/magic-context/execute-reclaim.d.ts.map +1 -0
  69. package/dist/hooks/magic-context/hook-handlers.d.ts.map +1 -1
  70. package/dist/hooks/magic-context/hook.d.ts +1 -3
  71. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  72. package/dist/hooks/magic-context/latest-assistant-turn.d.ts +8 -0
  73. package/dist/hooks/magic-context/latest-assistant-turn.d.ts.map +1 -1
  74. package/dist/hooks/magic-context/lkg-recovery-fence.d.ts +5 -0
  75. package/dist/hooks/magic-context/lkg-recovery-fence.d.ts.map +1 -1
  76. package/dist/hooks/magic-context/lkg-recovery-prefix.d.ts +13 -0
  77. package/dist/hooks/magic-context/lkg-recovery-prefix.d.ts.map +1 -1
  78. package/dist/hooks/magic-context/nudge-evaluation-log.d.ts +3 -0
  79. package/dist/hooks/magic-context/nudge-evaluation-log.d.ts.map +1 -0
  80. package/dist/hooks/magic-context/pending-drop-eligibility.d.ts.map +1 -1
  81. package/dist/hooks/magic-context/protected-tail-boundary.d.ts +4 -0
  82. package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -1
  83. package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts.map +1 -1
  84. package/dist/hooks/magic-context/system-date-refresh.d.ts +15 -2
  85. package/dist/hooks/magic-context/system-date-refresh.d.ts.map +1 -1
  86. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  87. package/dist/hooks/magic-context/system-prompt-sticky-date.d.ts +10 -0
  88. package/dist/hooks/magic-context/system-prompt-sticky-date.d.ts.map +1 -0
  89. package/dist/hooks/magic-context/tag-messages.d.ts +2 -0
  90. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  91. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  92. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +23 -6
  93. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  94. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  95. package/dist/{index-bjcnntmz.js → index-0wthn7fp.js} +468 -18
  96. package/dist/{index-kq82mtg0.js → index-11zf2wwc.js} +3 -3
  97. package/dist/{index-b5vqckbw.js → index-153r2q6z.js} +314 -127
  98. package/dist/{index-v8awdgvd.js → index-1pefp8ar.js} +5 -5
  99. package/dist/{v2/server-beht37jy.js → index-1zx2pa5d.js} +1 -1
  100. package/dist/{index-ze7mvk54.js → index-2yhtnfcf.js} +75 -57
  101. package/dist/{index-cf74k5ak.js → index-305y133n.js} +4 -4
  102. package/dist/{index-s734jcsr.js → index-35qc6606.js} +9 -3
  103. package/dist/{index-x4njr8df.js → index-48stjd56.js} +105 -19
  104. package/dist/{index-24jbw52d.js → index-4n7w9rad.js} +6 -6
  105. package/dist/{index-kee4kn5j.js → index-4pnsgvfk.js} +1 -1
  106. package/dist/{v2/server-8cd2j99z.js → index-5kym00ag.js} +32 -13
  107. package/dist/{index-4s3t0nd0.js → index-616rsjrv.js} +2 -2
  108. package/dist/{index-e4xv8890.js → index-67nyj0gy.js} +507 -210
  109. package/dist/{index-6x57ar45.js → index-adk2z5d8.js} +3 -3
  110. package/dist/{index-c5pytzne.js → index-b88dwwrh.js} +1 -1
  111. package/dist/{index-rr2bb45z.js → index-c4b76d4t.js} +2 -2
  112. package/dist/{index-nj7yykkx.js → index-c7phnbvk.js} +1 -1
  113. package/dist/index-cpjk5jd2.js +82 -0
  114. package/dist/{index-6s5941tm.js → index-d6rp4dxh.js} +5 -5
  115. package/dist/{index-s7j8tvhv.js → index-dc8hy95c.js} +69 -17
  116. package/dist/{index-j75v2476.js → index-h7tgn49j.js} +12 -15
  117. package/dist/{index-ke416mdc.js → index-j76ah6d7.js} +2 -2
  118. package/dist/{index-r4nkrs05.js → index-jfh3cktr.js} +4 -4
  119. package/dist/{index-a6mc0v4d.js → index-jmycsey7.js} +3 -3
  120. package/dist/{index-24fezq97.js → index-jr5na10t.js} +4 -4
  121. package/dist/{index-s74zqahq.js → index-kc9pn495.js} +4 -4
  122. package/dist/{index-p5y3k4g7.js → index-nda0zgna.js} +2 -1
  123. package/dist/{index-jn12fvvh.js → index-neb2jaed.js} +3 -3
  124. package/dist/{index-qn7xstt2.js → index-pnjwa6qa.js} +6 -7
  125. package/dist/{index-fgncb0ng.js → index-rmd0069m.js} +11 -11
  126. package/dist/{index-y9f76s3f.js → index-rrv26qjz.js} +1 -1
  127. package/dist/{index-v10f1rjv.js → index-spwjbkc7.js} +1 -1
  128. package/dist/{index-k29z4aqh.js → index-t5pck3ss.js} +1 -1
  129. package/dist/{index-936py2wm.js → index-t7hx3qcb.js} +361 -113
  130. package/dist/{index-s1ex9y6p.js → index-v7r4td4c.js} +464 -79
  131. package/dist/{index-2vxtcb95.js → index-vkc1ca9p.js} +2 -2
  132. package/dist/{index-rmwykbbb.js → index-x4k3f4mf.js} +33 -10
  133. package/dist/{index-bp5083x2.js → index-x9k3mqrf.js} +1 -1
  134. package/dist/{index-n37sebck.js → index-y4a3nhtk.js} +1 -1
  135. package/dist/index.js +57 -50
  136. package/dist/{logger-jm3sqqzr.js → logger-94kew5wm.js} +1 -1
  137. package/dist/{message-fts-rowid-map-17s0dfn4.js → message-fts-rowid-map-22tevnnj.js} +6 -5
  138. package/dist/{message-index-66jv6fh4.js → message-index-5qxcz6h7.js} +16 -15
  139. package/dist/{message-index-bounded-n1frdn85.js → message-index-bounded-n0m0t7tv.js} +16 -15
  140. package/dist/{message-time-backfill-73mmm76q.js → message-time-backfill-0myx7fz3.js} +3 -3
  141. package/dist/migration-worker.js +13 -12
  142. package/dist/{model-resolution-nx97z3x7.js → model-resolution-280gmqvd.js} +1 -1
  143. package/dist/plugin/embedding-bootstrap.d.ts +3 -1
  144. package/dist/plugin/embedding-bootstrap.d.ts.map +1 -1
  145. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  146. package/dist/plugin/messages-transform.d.ts.map +1 -1
  147. package/dist/plugin/rpc-handlers.d.ts +8 -0
  148. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  149. package/dist/plugin/subagent-tool-policy.d.ts +9 -0
  150. package/dist/plugin/subagent-tool-policy.d.ts.map +1 -1
  151. package/dist/plugin/tool-registry.d.ts.map +1 -1
  152. package/dist/{project-embedding-registry-z74mhqkf.js → project-embedding-registry-s2pqgec9.js} +13 -12
  153. package/dist/raw-ordinal-warmup-worker.js +136 -101
  154. package/dist/{read-session-chunk-v06g3vka.js → read-session-chunk-0a8vdyqp.js} +11 -10
  155. package/dist/{read-session-raw-rsc8c7qy.js → read-session-raw-y5cszf0b.js} +4 -3
  156. package/dist/recomp-orchestrator-61vyha9j.js +62 -0
  157. package/dist/{safe-notification-target-1szv1k5k.js → safe-notification-target-mkr9yzvr.js} +2 -2
  158. package/dist/{search-archive-4d53y23e.js → search-archive-8q9s49p5.js} +12 -11
  159. package/dist/{search-nkf271d4.js → search-v1y9ejws.js} +25 -24
  160. package/dist/{send-session-notification-6ve0e8p4.js → send-session-notification-0k6qzydk.js} +7 -6
  161. package/dist/shared/logger.d.ts.map +1 -1
  162. package/dist/shared/model-resolution.d.ts +2 -0
  163. package/dist/shared/model-resolution.d.ts.map +1 -1
  164. package/dist/shared/model-suggestion-retry.d.ts +30 -1
  165. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  166. package/dist/shared/prompt-async-transport.d.ts +3 -0
  167. package/dist/shared/prompt-async-transport.d.ts.map +1 -1
  168. package/dist/shared/rpc-types.d.ts +7 -0
  169. package/dist/shared/rpc-types.d.ts.map +1 -1
  170. package/dist/shared/sqlite.d.ts +1 -1
  171. package/dist/shared/sqlite.d.ts.map +1 -1
  172. package/dist/shared/subagent-runner.d.ts +2 -0
  173. package/dist/shared/subagent-runner.d.ts.map +1 -1
  174. package/dist/shared/worker-shutdown.d.ts +68 -0
  175. package/dist/shared/worker-shutdown.d.ts.map +1 -0
  176. package/dist/shared/worker-shutdown.fixture.d.ts +2 -0
  177. package/dist/shared/worker-shutdown.fixture.d.ts.map +1 -0
  178. package/dist/{sqlite-zf72c52d.js → sqlite-1rpvw2rj.js} +1 -1
  179. package/dist/{storage-memory-y3qmy00r.js → storage-memory-nm7v82mj.js} +2 -2
  180. package/dist/{storage-tags-r7k9tjcv.js → storage-tags-r6nk29n4.js} +5 -5
  181. package/dist/{task-config-x3qmayd2.js → task-config-t6bpyka7.js} +2 -2
  182. package/dist/tools/ctx-expand/rust-mode-tag.test-support.d.ts +15 -0
  183. package/dist/tools/ctx-expand/rust-mode-tag.test-support.d.ts.map +1 -0
  184. package/dist/tools/ctx-expand/tools.d.ts +11 -0
  185. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  186. package/dist/tools/ctx-search/tools.d.ts.map +1 -1
  187. package/dist/{transform-postprocess-phase-zpgav0h7.js → transform-postprocess-phase-vtrgb7m6.js} +34 -31
  188. package/dist/v2/auto-search-worker.js +53 -10
  189. package/dist/v2/chunk-embedding-write-worker.js +30 -23
  190. package/dist/v2/{compaction-marker-candidates-ebx3388k.js → compaction-marker-candidates-cfab70cs.js} +3 -3
  191. package/dist/v2/compaction-marker-candidates-worker.js +2 -2
  192. package/dist/v2/compartment-chunk-embedding-nbdqx1td.js +64 -0
  193. package/dist/v2/{context-f2xh7ba4.js → context-cc33tv2z.js} +1259 -404
  194. package/dist/v2/{derive-budgets-2zh4gm2c.js → derive-budgets-knf763tt.js} +3 -3
  195. package/dist/v2/embedding-backfill-yxv2h5mc.js +24 -0
  196. package/dist/v2/embedding-worker-process.js +2 -2
  197. package/dist/v2/embedding-worker.js +5 -5
  198. package/dist/v2/hidden-child-record.d.ts +2 -0
  199. package/dist/v2/hidden-child-record.d.ts.map +1 -1
  200. package/dist/v2/hidden-completion.d.ts +2 -0
  201. package/dist/v2/hidden-completion.d.ts.map +1 -1
  202. package/dist/v2/hidden-model-activity.d.ts +7 -0
  203. package/dist/v2/hidden-model-activity.d.ts.map +1 -0
  204. package/dist/v2/{history-owner-42e16w0n.js → history-owner-ad0crnrn.js} +2 -2
  205. package/dist/v2/hooks/context.d.ts.map +1 -1
  206. package/dist/v2/hooks/generate.d.ts +36 -1
  207. package/dist/v2/hooks/generate.d.ts.map +1 -1
  208. package/dist/v2/hooks/lkg-system.d.ts +35 -4
  209. package/dist/v2/hooks/lkg-system.d.ts.map +1 -1
  210. package/dist/v2/hooks/payload.d.ts +16 -1
  211. package/dist/v2/hooks/payload.d.ts.map +1 -1
  212. package/dist/v2/hooks/tools.d.ts.map +1 -1
  213. package/dist/v2/{logger-7qt02bnb.js → logger-p34mjtja.js} +1 -1
  214. package/dist/v2/{message-fts-rowid-map-wfx67gfd.js → message-fts-rowid-map-dg12wymk.js} +6 -5
  215. package/dist/v2/{message-index-bounded-w3hfm29z.js → message-index-bounded-f4e01xk0.js} +16 -15
  216. package/dist/v2/{message-index-48f7hw7a.js → message-index-ydzrp6y6.js} +16 -15
  217. package/dist/v2/{message-time-backfill-04t0km1z.js → message-time-backfill-ddh8n9gy.js} +3 -3
  218. package/dist/v2/migration-worker.js +13 -12
  219. package/dist/v2/{model-resolution-nx97z3x7.js → model-resolution-280gmqvd.js} +1 -1
  220. package/dist/v2/{project-embedding-registry-gnkj56xp.js → project-embedding-registry-deza9ksw.js} +13 -12
  221. package/dist/v2/raw-ordinal-warmup-worker.js +136 -101
  222. package/dist/v2/{read-session-chunk-zpgmxwte.js → read-session-chunk-8cxfagky.js} +11 -10
  223. package/dist/v2/{read-session-raw-yaegtjzh.js → read-session-raw-1nrrecvx.js} +4 -3
  224. package/dist/v2/recomp-orchestrator-47m4hv5g.js +61 -0
  225. package/dist/v2/{safe-notification-target-qg7n2s77.js → safe-notification-target-khnzg57c.js} +2 -2
  226. package/dist/v2/{search-archive-vv48s2aa.js → search-archive-e80cvc09.js} +12 -11
  227. package/dist/v2/{search-kza414f0.js → search-fjz746zr.js} +25 -24
  228. package/dist/v2/{send-session-notification-3pxn658x.js → send-session-notification-nwvrv34d.js} +7 -6
  229. package/dist/v2/{server-8by8qfec.js → server-0epqaxhd.js} +75 -57
  230. package/dist/v2/{server-pwv4ezb0.js → server-168pb207.js} +1 -1
  231. package/dist/v2/{server-h0410h0v.js → server-1bw1wcbp.js} +1 -1
  232. package/dist/{index-beht37jy.js → v2/server-1zx2pa5d.js} +1 -1
  233. package/dist/v2/{server-a9xqj88f.js → server-230fnbws.js} +4 -4
  234. package/dist/v2/{server-tbe1femw.js → server-29qp8nz4.js} +1 -1
  235. package/dist/v2/{server-tgnbmwah.js → server-3mz2qh5a.js} +1 -1
  236. package/dist/v2/{server-hy3d3vsx.js → server-4nw4fqhr.js} +2 -2
  237. package/dist/v2/{server-qv7f0hhe.js → server-4sxjs6hn.js} +5 -5
  238. package/dist/v2/{server-34kwfsr4.js → server-53eh1r8r.js} +2 -2
  239. package/dist/v2/{server-xj136kt8.js → server-55rgxfrw.js} +9 -3
  240. package/dist/v2/{server-nj659894.js → server-5arr9ecn.js} +2 -2
  241. package/dist/{index-8cd2j99z.js → v2/server-5kym00ag.js} +32 -13
  242. package/dist/v2/{server-2ehj0bw7.js → server-63fqdghs.js} +106 -20
  243. package/dist/v2/{server-f2xf5gcb.js → server-6495nmn9.js} +12 -15
  244. package/dist/v2/{server-qd11g795.js → server-92g7d776.js} +2 -1
  245. package/dist/v2/{server-gpvay0xz.js → server-9x0kmta4.js} +6 -7
  246. package/dist/v2/{server-27gq4mfz.js → server-a3dwxfgd.js} +4 -4
  247. package/dist/v2/{server-6tmj0s7j.js → server-af2pght7.js} +3 -3
  248. package/dist/v2/{server-1wy7b9de.js → server-br1x0tev.js} +3 -3
  249. package/dist/v2/{server-n1prf1g6.js → server-brj8j2gk.js} +2 -2
  250. package/dist/v2/{server-bfpda1tb.js → server-c7dxxsj7.js} +466 -81
  251. package/dist/v2/server-cpjk5jd2.js +82 -0
  252. package/dist/v2/{server-g3qma5c0.js → server-dj7tz4ph.js} +2 -2
  253. package/dist/v2/{server-xhab8jx8.js → server-ej96a39v.js} +33 -10
  254. package/dist/v2/{server-6pmqg9m4.js → server-gyy4k6mf.js} +1 -1
  255. package/dist/v2/{server-a2eqhkxr.js → server-hqzyq8n4.js} +11 -11
  256. package/dist/v2/{server-h1v0pyxb.js → server-j4jnp9b5.js} +468 -18
  257. package/dist/v2/{server-da07v4xp.js → server-k3t06fxr.js} +1 -1
  258. package/dist/v2/{server-1nyybqan.js → server-m91f9m5s.js} +69 -17
  259. package/dist/v2/{server-rmygf5pn.js → server-ne8arh8t.js} +2 -2
  260. package/dist/v2/{server-my7k4eds.js → server-vn2nwcv6.js} +5 -5
  261. package/dist/v2/{server-46neh5fa.js → server-wyawsa88.js} +314 -127
  262. package/dist/v2/{server-zzkj2fch.js → server-xsryvyf6.js} +4 -4
  263. package/dist/v2/{server-n37sebck.js → server-y4a3nhtk.js} +1 -1
  264. package/dist/v2/{server-d04vrx0j.js → server-ygtykank.js} +2 -2
  265. package/dist/v2/server.js +6 -6
  266. package/dist/v2/{sqlite-zf72c52d.js → sqlite-1rpvw2rj.js} +1 -1
  267. package/dist/v2/{storage-memory-y3qmy00r.js → storage-memory-nm7v82mj.js} +2 -2
  268. package/dist/v2/{storage-tags-3wdb8zph.js → storage-tags-ss08kj5r.js} +5 -5
  269. package/dist/v2/store-reader.d.ts +8 -0
  270. package/dist/v2/store-reader.d.ts.map +1 -1
  271. package/dist/v2/{task-config-nvz8mapa.js → task-config-7md27rx8.js} +2 -2
  272. package/dist/v2/{wrapup-orchestrator-psqz7yh0.js → wrapup-orchestrator-639whfhq.js} +32 -31
  273. package/dist/wrapup-orchestrator-mnvt2g8m.js +49 -0
  274. package/package.json +1 -1
  275. package/src/config/index.test.ts +28 -6
  276. package/src/shared/logger.test.ts +42 -1
  277. package/src/shared/logger.ts +11 -13
  278. package/src/shared/model-resolution.test.ts +67 -12
  279. package/src/shared/model-resolution.ts +43 -16
  280. package/src/shared/model-suggestion-retry.test.ts +166 -0
  281. package/src/shared/model-suggestion-retry.ts +165 -14
  282. package/src/shared/prompt-async-transport.test.ts +107 -0
  283. package/src/shared/prompt-async-transport.ts +86 -3
  284. package/src/shared/rpc-types.ts +7 -0
  285. package/src/shared/sqlite-busy-budget-review.test.ts +6 -1
  286. package/src/shared/sqlite.ts +4 -2
  287. package/src/shared/subagent-runner.ts +2 -0
  288. package/src/shared/worker-shutdown-fence.test.ts +87 -0
  289. package/src/shared/worker-shutdown.fixture.ts +25 -0
  290. package/src/shared/worker-shutdown.test.ts +127 -0
  291. package/src/shared/worker-shutdown.ts +160 -0
  292. package/dist/embedding-backfill-fmz50tsy.js +0 -24
  293. package/dist/recomp-orchestrator-ghpk2dtq.js +0 -61
  294. package/dist/v2/embedding-backfill-7c7yr69y.js +0 -23
  295. package/dist/v2/recomp-orchestrator-4vfxej9t.js +0 -60
  296. 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-nj659894.js";
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-f2xf5gcb.js";
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-tbe1femw.js";
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-qd11g795.js";
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-bfpda1tb.js";
289
+ } from "./server-c7dxxsj7.js";
284
290
  import {
285
291
  resolveHistorianModel2
286
- } from "./server-8cd2j99z.js";
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-a2eqhkxr.js";
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-rmygf5pn.js";
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-xhab8jx8.js";
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-8by8qfec.js";
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-tgnbmwah.js";
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-6tmj0s7j.js";
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-beht37jy.js";
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-xj136kt8.js";
589
- import"./server-1wy7b9de.js";
599
+ } from "./server-55rgxfrw.js";
600
+ import"./server-br1x0tev.js";
590
601
  import {
591
- deleteChunkEmbedBackoffForSession
592
- } from "./server-46neh5fa.js";
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-da07v4xp.js";
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-2ehj0bw7.js";
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-pwv4ezb0.js";
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-27gq4mfz.js";
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-n1prf1g6.js";
755
+ } from "./server-brj8j2gk.js";
744
756
  import {
745
757
  getCurrentToolSetHash,
746
758
  recordToolDefinition,
747
759
  getMeasuredToolDefinitionTokens
748
- } from "./server-g3qma5c0.js";
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-gpvay0xz.js";
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-my7k4eds.js";
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-34kwfsr4.js";
815
- import"./server-d04vrx0j.js";
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-hy3d3vsx.js";
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-h1v0pyxb.js";
850
+ } from "./server-j4jnp9b5.js";
837
851
  import {
838
852
  cosineSimilarity
839
- } from "./server-zzkj2fch.js";
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-n37sebck.js";
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-h0410h0v.js";
886
+ import"./server-1bw1wcbp.js";
873
887
  import {
874
888
  flushIgnoredMessages2,
875
889
  sendStatusNotification2
876
- } from "./server-a9xqj88f.js";
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-1nyybqan.js";
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-qv7f0hhe.js";
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-6pmqg9m4.js";
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
- deleteChunkEmbedBackoffForSession(db, sessionId);
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
- return results.filter((result) => (result.relevanceScore ?? result.score) >= threshold);
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
- worker.terminate();
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
- const finish = (results, error) => {
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 (error || signal.aborted || entry.href !== defaultAutoSearchWorkerEntry().href)
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 release = slot.release;
4469
+ const free = slot.release;
4404
4470
  slot.busy = undefined;
4405
4471
  slot.release = undefined;
4406
- release?.();
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 abort = () => finish([]);
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 (settled)
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
- try {
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
- response.result = await (job === "backfill" ? embedTextForProject2(projectPath, reply.text, signal, "query") : boundedHintEmbedding(embedQuery, reply.text, signal)) ?? null;
4444
- else {
4445
- const passage = await embedBatchForProject2(projectPath, reply.texts, signal, reply.purpose);
4446
- const current = getProjectEmbeddingSnapshot2(projectPath);
4447
- response.passage = passage && current ? {
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 (!settled && !signal?.aborted) {
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
- worker?.terminate();
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 score ${results[0].score.toFixed(3)})`);
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
- const tailInfo = getUnsummarizedTailInfo(db, sessionId, triggerBudget, usage, executeThresholdPercentage, contextLimit, resolvedInMemoryTail, taggerFloor);
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
- sessionLog2(sessionId, `compartment trigger: not firing at ${usage.percentage.toFixed(1)}% because unsummarized tail from ${tailInfo.nextStartOrdinal} is too small`);
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
- sessionLog2(sessionId, formatChannel1Evaluation(decision));
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) => isRecord(part) && THINKING_TYPES.has(String(part.type ?? part.kind)) && (familyRoute || isRecord(part.metadata) && isRecord(part.metadata.anthropic))))
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 NAMESPACE = "hostInstructionRetention";
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)[NAMESPACE];
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[NAMESPACE];
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[NAMESPACE] = { on: true };
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 NAMESPACE2 = "caveman";
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 parseState(lane) {
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 parseState(readReplayEnvelope(db, sessionId)[NAMESPACE2]);
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 = parseState(doc[NAMESPACE2]);
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[NAMESPACE2] = {
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, messageIds.map(thinkingBindingRecoveryFrozenId));
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 = options?.skipMergedReasoningStrip ? 0 : stripReasoningFromAssistantIds(messages, resolvedProviderID, options?.frozenThinkingBindingMessageIds ?? new Set, restoredMessages);
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 bindingThinking = new Set([...frozenThinking].filter((id) => id.startsWith(THINKING_BINDING_RECOVERY_FROZEN_PREFIX)).map((id) => id.slice(THINKING_BINDING_RECOVERY_FROZEN_PREFIX.length)));
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 (!compactionOff) {
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
- if (!hasPersistedHash)
11732
- stickyDateBySession.delete(sessionId);
11733
- const stickyDate = stickyDateBySession.get(sessionId);
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 && isCacheBusting && !idleCacheExpired && !contentOrPresetChanged && !requestMessagesFinal) {
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
- stickyDateBySession.set(sessionId, currentDate);
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 = idleCacheExpired || contentOrPresetChanged || isCacheBusting && !deferredDateRefresh && (dateRequest ? rewritePermission === true : rewritePermission !== false);
12188
+ const dateMayAdvance = contentOrPresetChanged || !deferredDateRefresh && systemDateMayMove(isCacheBusting && (dateRequest ? rewritePermission === true : rewritePermission !== false), signedThinkingKept);
11769
12189
  if (currentDate && !stickyDate) {
11770
- stickyDateBySession.set(sessionId, currentDate);
12190
+ setStickyDate(currentDate);
11771
12191
  } else if (currentDate && stickyDate && currentDate !== stickyDate) {
11772
12192
  if (dateMayAdvance) {
11773
- stickyDateBySession.set(sessionId, currentDate);
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 disabled; clearing stale compartmentInProgress flag");
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
- if (!compactionOff && taggerFloor === 0 && messages.length > 0) {
19174
- sessionLog2(sessionId, `tag floor: 0 (full-scan fallback) — no leading wire message resolved a tag across ${messages.length} msgs`);
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 normalizeRecoveryTail = recovery.prefix ? () => {
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) => recovery.prefix?.untaggedInputIds.has(message.info.id ?? ""));
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, recovery.prefix ? messagesForTagging.filter((message) => !recovery.prefix?.untaggedInputIds.has(message.info.id ?? "")) : messagesForTagging, deps.tagger, db, {
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
- finishSystemDateRefresh(deps.historyRefreshSessions, dateRequest, postTransformResult.bustedThisPass && !activeThinkingPrefixHold && postTransformResult.openTurnSignedThinkingKept !== true || postTransformResult.thinkingReleasedForFit === true);
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
- sessionLog2(sessionId, formatChannel1Evaluation(channel1Decision));
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
- sessionLog2(sessionId, formatChannel2Evaluation(channel2Evaluation, {
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-2zh4gm2c.js"));
23178
- const { resolveHistorianModel } = await importPluginModule(() => import("./model-resolution-nx97z3x7.js"));
23179
- const { userObservationCollectionEnabled, userObservationsRequested } = await importPluginModule(() => import("./task-config-nvz8mapa.js"));
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-42e16w0n.js");
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-4vfxej9t.js"));
23230
- const { sendIgnoredMessage } = await importPluginModule(() => import("./send-session-notification-3pxn658x.js"));
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-42e16w0n.js");
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-psqz7yh0.js"));
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 draft.tools[id];
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
- if (isHostInstance(value))
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
- if (Array.isArray(value))
24752
- return value.map(clonePreservingInstances);
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
- for (const [key, entry] of Object.entries(value))
24756
- copy[key] = clonePreservingInstances(entry);
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("; ")}`) : new HiddenProviderError(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("; ")}`) : new HiddenProviderError(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 handle = { id: active.id, childSessionId: active.id };
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: () => args.executor.collect(handle, 50),
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 (parent && run) {
34816
- recordChildInvocation({
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
- if (parent) {
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: clonePreservingInstances(anchor),
37195
+ anchor: parts.anchor.copy,
36531
37196
  model: `${draft.model.providerID}/${draft.model.id}`,
36532
37197
  agent: draft.agent,
36533
- system: clonePreservingInstances(draft.system),
36534
- messages: clonePreservingInstances(draft.messages),
36535
- tools: clonePreservingInstances(draft.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: JSON.stringify(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 !== JSON.stringify(input))
36602
- return false;
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 true;
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 "Error: 'drop' must be provided.";
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({ db, expandTools: config.historian?.expand_tools }),
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
- if (autoEmbedAttemptedBySession.has(sessionId) || embedPauseBySession.has(sessionId) || embedRunStateBySession.has(sessionId) || Date.now() < (autoEmbedRetryAfterBySession.get(sessionId) ?? 0))
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 = true;
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 (!complete && outcome.status !== "busy" && outcome.status !== "aborted") {
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
- transform?.clearSessionLogState(sessionID);
52547
- if (db) {
52548
- markSessionCleanupPending(db, sessionID);
52549
- clearSession(db, sessionID);
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
- rawProviders.get(sessionID)?.();
52552
- rawProviders.delete(sessionID);
52553
- usage.delete(sessionID);
52554
- hiddenSessionErrors.delete(sessionID);
52555
- storageNoticeBySession.delete(sessionID);
52556
- liveModels.delete(sessionID);
52557
- variants.delete(sessionID);
52558
- agents.delete(sessionID);
52559
- channel1.delete(sessionID);
52560
- commitSeenLastPass.delete(sessionID);
52561
- clearEmbedSessionState(sessionID);
52562
- historyRefreshSessions.delete(sessionID);
52563
- clearPendingMaterialization(pendingMaterializationSessions, sessionID);
52564
- lastHeuristicsTurnId.delete(sessionID);
52565
- restoredRows.forget(sessionID);
52566
- if (nativeFoldReplay)
52567
- await nativeFoldReplay.forget(sessionID);
52568
- else
52569
- await forgetNativeFoldProvenance(context.storage, sessionID);
52570
- generateReplay.forget(sessionID);
52571
- systemPromptRefreshSessions.delete(sessionID);
52572
- systemPrompt?.clearSession(sessionID);
52573
- tagger.cleanup(sessionID);
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
- if (!lkgSystems.restore(draft.sessionID, getSlot(draft.sessionID), systemAtEntry, draft.system)) {
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 = structuredClone(draft.system);
52728
- if (!admissionDb || !draft.tools || !lkgSystems.restore(draft.sessionID, getSlot(draft.sessionID), draft.system, system))
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 mapped = adaptPayload(draft);
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
- const moduleBoundaryID = rustModeModuleClient ? getPersistedCompactionMarkerState(db, draft.sessionID)?.boundaryMessageId ?? null : null;
53017
- const moduleBoundarySeq = moduleBoundaryID ? reader.sequenceForId(draft.sessionID, moduleBoundaryID) : undefined;
53018
- 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);
53019
- const servedBoundary = boundaryID ? servedBoundaryRow(reader, draft.sessionID, boundaryID) : null;
53020
- 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;
53021
- if (moduleBoundarySeq !== undefined)
53022
- sessionLog2(draft.sessionID, `v2 restore: from the module boundary ${moduleBoundaryID} to the host checkpoint`);
53023
- const present = new Set(draft.messages.map((message) => message.id));
53024
- const restored = restoredRows.rows(reader, draft.sessionID, boundary, cut.seq).filter((row) => !present.has(row.id)).flatMap((row) => restoreRow(row, draft.model, hostUsesMediaAssets() ? {
53025
- asset: hostMediaAsset,
53026
- 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)}`)
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
- if (checkpoint && submitted !== undefined) {
53066
- const head = draft.messages.find((message) => message.id === HEAD_IDS[0]);
53067
- const baseline = head?.content.find((part) => part.type === "text")?.text;
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 mapped = adaptPayload(draft);
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 ?? "");