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