@cortexkit/opencode-magic-context 0.49.19 → 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 (271) hide show
  1. package/dist/auto-search-worker.js +48 -9
  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-j31m2dv7.js → context-mkece1db.js} +455 -134
  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/hidden-single-shot.d.ts.map +1 -1
  17. package/dist/features/magic-context/dreamer/task-config.d.ts.map +1 -1
  18. package/dist/features/magic-context/dreamer/task-scheduler.d.ts +2 -0
  19. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  20. package/dist/features/magic-context/memory/embedding-identity.d.ts.map +1 -1
  21. package/dist/features/magic-context/memory/embedding-local.d.ts +1 -0
  22. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  23. package/dist/features/magic-context/memory/local-embedding-pooling.d.ts +22 -0
  24. package/dist/features/magic-context/memory/local-embedding-pooling.d.ts.map +1 -0
  25. package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
  26. package/dist/features/magic-context/message-index.d.ts +2 -0
  27. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  28. package/dist/features/magic-context/mural/compress-cues.d.ts.map +1 -1
  29. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  30. package/dist/features/magic-context/search.d.ts +27 -0
  31. package/dist/features/magic-context/search.d.ts.map +1 -1
  32. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  33. package/dist/features/magic-context/storage-meta-persisted.d.ts +1 -0
  34. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  35. package/dist/features/magic-context/subagent-token-capture.d.ts +20 -0
  36. package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -1
  37. package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
  38. package/dist/{history-owner-xp3pngv7.js → history-owner-36wp3mkb.js} +2 -2
  39. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  40. package/dist/hooks/magic-context/auto-embed-session.d.ts.map +1 -1
  41. package/dist/hooks/magic-context/auto-search-hint.d.ts +7 -1
  42. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
  43. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  44. package/dist/hooks/magic-context/auto-search-worker-client.d.ts +33 -6
  45. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
  46. package/dist/hooks/magic-context/cache-busting-signals.d.ts +5 -2
  47. package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -1
  48. package/dist/hooks/magic-context/channel2-delivery.d.ts.map +1 -1
  49. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  50. package/dist/hooks/magic-context/compartment-runner-types.d.ts +5 -0
  51. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  52. package/dist/hooks/magic-context/compartment-trigger.d.ts +1 -1
  53. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  54. package/dist/hooks/magic-context/diagnostic-log-state.d.ts +4 -0
  55. package/dist/hooks/magic-context/diagnostic-log-state.d.ts.map +1 -0
  56. package/dist/hooks/magic-context/execute-reclaim.d.ts +35 -0
  57. package/dist/hooks/magic-context/execute-reclaim.d.ts.map +1 -0
  58. package/dist/hooks/magic-context/hook-handlers.d.ts.map +1 -1
  59. package/dist/hooks/magic-context/hook.d.ts +1 -3
  60. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  61. package/dist/hooks/magic-context/latest-assistant-turn.d.ts +8 -0
  62. package/dist/hooks/magic-context/latest-assistant-turn.d.ts.map +1 -1
  63. package/dist/hooks/magic-context/lkg-recovery-fence.d.ts +5 -0
  64. package/dist/hooks/magic-context/lkg-recovery-fence.d.ts.map +1 -1
  65. package/dist/hooks/magic-context/nudge-evaluation-log.d.ts +3 -0
  66. package/dist/hooks/magic-context/nudge-evaluation-log.d.ts.map +1 -0
  67. package/dist/hooks/magic-context/pending-drop-eligibility.d.ts.map +1 -1
  68. package/dist/hooks/magic-context/protected-tail-boundary.d.ts +4 -0
  69. package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -1
  70. package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts.map +1 -1
  71. package/dist/hooks/magic-context/system-date-refresh.d.ts +5 -5
  72. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  73. package/dist/hooks/magic-context/system-prompt-sticky-date.d.ts +10 -0
  74. package/dist/hooks/magic-context/system-prompt-sticky-date.d.ts.map +1 -0
  75. package/dist/hooks/magic-context/tag-messages.d.ts +2 -0
  76. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  77. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  78. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +21 -6
  79. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  80. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  81. package/dist/{index-bjcnntmz.js → index-0wthn7fp.js} +468 -18
  82. package/dist/{index-kq82mtg0.js → index-11zf2wwc.js} +3 -3
  83. package/dist/{index-b5vqckbw.js → index-153r2q6z.js} +314 -127
  84. package/dist/{index-3h4dp9wb.js → index-1pefp8ar.js} +5 -5
  85. package/dist/{index-beht37jy.js → index-1zx2pa5d.js} +1 -1
  86. package/dist/{index-ze7mvk54.js → index-2yhtnfcf.js} +75 -57
  87. package/dist/{index-cf74k5ak.js → index-305y133n.js} +4 -4
  88. package/dist/{index-s734jcsr.js → index-35qc6606.js} +9 -3
  89. package/dist/{index-se4m2g6w.js → index-48stjd56.js} +105 -19
  90. package/dist/{index-4911rn0b.js → index-4n7w9rad.js} +6 -6
  91. package/dist/{index-kee4kn5j.js → index-4pnsgvfk.js} +1 -1
  92. package/dist/{v2/server-8cd2j99z.js → index-5kym00ag.js} +32 -13
  93. package/dist/{index-4s3t0nd0.js → index-616rsjrv.js} +2 -2
  94. package/dist/{index-jhghdnsm.js → index-67nyj0gy.js} +485 -202
  95. package/dist/{index-6x57ar45.js → index-adk2z5d8.js} +3 -3
  96. package/dist/{index-c5pytzne.js → index-b88dwwrh.js} +1 -1
  97. package/dist/{index-rr2bb45z.js → index-c4b76d4t.js} +2 -2
  98. package/dist/{index-nj7yykkx.js → index-c7phnbvk.js} +1 -1
  99. package/dist/index-cpjk5jd2.js +82 -0
  100. package/dist/{index-edmpdxcw.js → index-d6rp4dxh.js} +5 -5
  101. package/dist/{index-dxmq29t1.js → index-dc8hy95c.js} +69 -17
  102. package/dist/{index-j75v2476.js → index-h7tgn49j.js} +12 -15
  103. package/dist/{index-ke416mdc.js → index-j76ah6d7.js} +2 -2
  104. package/dist/{index-c1p88z1y.js → index-jfh3cktr.js} +4 -4
  105. package/dist/{index-a6mc0v4d.js → index-jmycsey7.js} +3 -3
  106. package/dist/{index-24fezq97.js → index-jr5na10t.js} +4 -4
  107. package/dist/{index-s74zqahq.js → index-kc9pn495.js} +4 -4
  108. package/dist/{index-p5y3k4g7.js → index-nda0zgna.js} +2 -1
  109. package/dist/{index-jn12fvvh.js → index-neb2jaed.js} +3 -3
  110. package/dist/{index-63k48rv9.js → index-pnjwa6qa.js} +5 -5
  111. package/dist/{index-jrr131e0.js → index-rmd0069m.js} +11 -11
  112. package/dist/{index-y9f76s3f.js → index-rrv26qjz.js} +1 -1
  113. package/dist/{index-v10f1rjv.js → index-spwjbkc7.js} +1 -1
  114. package/dist/{index-k29z4aqh.js → index-t5pck3ss.js} +1 -1
  115. package/dist/{index-3esx8tkf.js → index-t7hx3qcb.js} +318 -104
  116. package/dist/{index-rpxdjkm0.js → index-v7r4td4c.js} +306 -59
  117. package/dist/{index-2vxtcb95.js → index-vkc1ca9p.js} +2 -2
  118. package/dist/{index-9zcsy3hh.js → index-x4k3f4mf.js} +17 -9
  119. package/dist/{index-bp5083x2.js → index-x9k3mqrf.js} +1 -1
  120. package/dist/{index-n37sebck.js → index-y4a3nhtk.js} +1 -1
  121. package/dist/index.js +52 -49
  122. package/dist/{logger-jm3sqqzr.js → logger-94kew5wm.js} +1 -1
  123. package/dist/{message-fts-rowid-map-17s0dfn4.js → message-fts-rowid-map-22tevnnj.js} +6 -5
  124. package/dist/{message-index-gtpqnj8w.js → message-index-5qxcz6h7.js} +16 -15
  125. package/dist/{message-index-bounded-zyc8h32y.js → message-index-bounded-n0m0t7tv.js} +16 -15
  126. package/dist/{message-time-backfill-73mmm76q.js → message-time-backfill-0myx7fz3.js} +3 -3
  127. package/dist/migration-worker.js +13 -12
  128. package/dist/{model-resolution-nx97z3x7.js → model-resolution-280gmqvd.js} +1 -1
  129. package/dist/plugin/embedding-bootstrap.d.ts +3 -1
  130. package/dist/plugin/embedding-bootstrap.d.ts.map +1 -1
  131. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  132. package/dist/plugin/rpc-handlers.d.ts +8 -0
  133. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  134. package/dist/plugin/subagent-tool-policy.d.ts +9 -0
  135. package/dist/plugin/subagent-tool-policy.d.ts.map +1 -1
  136. package/dist/{project-embedding-registry-z74mhqkf.js → project-embedding-registry-s2pqgec9.js} +13 -12
  137. package/dist/raw-ordinal-warmup-worker.js +136 -101
  138. package/dist/{read-session-chunk-jjb48bt9.js → read-session-chunk-0a8vdyqp.js} +11 -10
  139. package/dist/{read-session-raw-rsc8c7qy.js → read-session-raw-y5cszf0b.js} +4 -3
  140. package/dist/recomp-orchestrator-61vyha9j.js +62 -0
  141. package/dist/{safe-notification-target-1szv1k5k.js → safe-notification-target-mkr9yzvr.js} +2 -2
  142. package/dist/{search-archive-6vm0e2f5.js → search-archive-8q9s49p5.js} +12 -11
  143. package/dist/{search-xsqk1bj4.js → search-v1y9ejws.js} +25 -24
  144. package/dist/{send-session-notification-6ve0e8p4.js → send-session-notification-0k6qzydk.js} +7 -6
  145. package/dist/shared/logger.d.ts.map +1 -1
  146. package/dist/shared/model-resolution.d.ts +2 -0
  147. package/dist/shared/model-resolution.d.ts.map +1 -1
  148. package/dist/shared/prompt-async-transport.d.ts +3 -0
  149. package/dist/shared/prompt-async-transport.d.ts.map +1 -1
  150. package/dist/shared/rpc-types.d.ts +7 -0
  151. package/dist/shared/rpc-types.d.ts.map +1 -1
  152. package/dist/shared/sqlite.d.ts +1 -1
  153. package/dist/shared/sqlite.d.ts.map +1 -1
  154. package/dist/shared/subagent-runner.d.ts +2 -0
  155. package/dist/shared/subagent-runner.d.ts.map +1 -1
  156. package/dist/shared/worker-shutdown.d.ts +68 -0
  157. package/dist/shared/worker-shutdown.d.ts.map +1 -0
  158. package/dist/shared/worker-shutdown.fixture.d.ts +2 -0
  159. package/dist/shared/worker-shutdown.fixture.d.ts.map +1 -0
  160. package/dist/{sqlite-zf72c52d.js → sqlite-1rpvw2rj.js} +1 -1
  161. package/dist/{storage-memory-y3qmy00r.js → storage-memory-nm7v82mj.js} +2 -2
  162. package/dist/{storage-tags-r7k9tjcv.js → storage-tags-r6nk29n4.js} +5 -5
  163. package/dist/{task-config-x3qmayd2.js → task-config-t6bpyka7.js} +2 -2
  164. package/dist/tools/ctx-search/tools.d.ts.map +1 -1
  165. package/dist/{transform-postprocess-phase-jj99r7z2.js → transform-postprocess-phase-vtrgb7m6.js} +34 -31
  166. package/dist/v2/auto-search-worker.js +48 -9
  167. package/dist/v2/chunk-embedding-write-worker.js +30 -23
  168. package/dist/v2/{compaction-marker-candidates-ebx3388k.js → compaction-marker-candidates-cfab70cs.js} +3 -3
  169. package/dist/v2/compaction-marker-candidates-worker.js +2 -2
  170. package/dist/v2/compartment-chunk-embedding-nbdqx1td.js +64 -0
  171. package/dist/v2/{context-y5yamxak.js → context-cc33tv2z.js} +1189 -386
  172. package/dist/v2/{derive-budgets-2zh4gm2c.js → derive-budgets-knf763tt.js} +3 -3
  173. package/dist/v2/embedding-backfill-yxv2h5mc.js +24 -0
  174. package/dist/v2/embedding-worker-process.js +2 -2
  175. package/dist/v2/embedding-worker.js +5 -5
  176. package/dist/v2/hidden-child-record.d.ts +2 -0
  177. package/dist/v2/hidden-child-record.d.ts.map +1 -1
  178. package/dist/v2/hidden-completion.d.ts +2 -0
  179. package/dist/v2/hidden-completion.d.ts.map +1 -1
  180. package/dist/v2/hidden-model-activity.d.ts +7 -0
  181. package/dist/v2/hidden-model-activity.d.ts.map +1 -0
  182. package/dist/v2/{history-owner-42e16w0n.js → history-owner-ad0crnrn.js} +2 -2
  183. package/dist/v2/hooks/context.d.ts.map +1 -1
  184. package/dist/v2/hooks/generate.d.ts +36 -1
  185. package/dist/v2/hooks/generate.d.ts.map +1 -1
  186. package/dist/v2/hooks/lkg-system.d.ts +35 -4
  187. package/dist/v2/hooks/lkg-system.d.ts.map +1 -1
  188. package/dist/v2/hooks/payload.d.ts +16 -1
  189. package/dist/v2/hooks/payload.d.ts.map +1 -1
  190. package/dist/v2/{logger-7qt02bnb.js → logger-p34mjtja.js} +1 -1
  191. package/dist/v2/{message-fts-rowid-map-wfx67gfd.js → message-fts-rowid-map-dg12wymk.js} +6 -5
  192. package/dist/v2/{message-index-bounded-spd8r7pj.js → message-index-bounded-f4e01xk0.js} +16 -15
  193. package/dist/v2/{message-index-8vz2pq76.js → message-index-ydzrp6y6.js} +16 -15
  194. package/dist/v2/{message-time-backfill-04t0km1z.js → message-time-backfill-ddh8n9gy.js} +3 -3
  195. package/dist/v2/migration-worker.js +13 -12
  196. package/dist/v2/{model-resolution-nx97z3x7.js → model-resolution-280gmqvd.js} +1 -1
  197. package/dist/v2/{project-embedding-registry-gnkj56xp.js → project-embedding-registry-deza9ksw.js} +13 -12
  198. package/dist/v2/raw-ordinal-warmup-worker.js +136 -101
  199. package/dist/v2/{read-session-chunk-cwkxrmns.js → read-session-chunk-8cxfagky.js} +11 -10
  200. package/dist/v2/{read-session-raw-yaegtjzh.js → read-session-raw-1nrrecvx.js} +4 -3
  201. package/dist/v2/recomp-orchestrator-47m4hv5g.js +61 -0
  202. package/dist/v2/{safe-notification-target-qg7n2s77.js → safe-notification-target-khnzg57c.js} +2 -2
  203. package/dist/v2/{search-archive-wve3tq1k.js → search-archive-e80cvc09.js} +12 -11
  204. package/dist/v2/{search-hwg7jfbj.js → search-fjz746zr.js} +25 -24
  205. package/dist/v2/{send-session-notification-3pxn658x.js → send-session-notification-nwvrv34d.js} +7 -6
  206. package/dist/v2/{server-8by8qfec.js → server-0epqaxhd.js} +75 -57
  207. package/dist/v2/{server-pwv4ezb0.js → server-168pb207.js} +1 -1
  208. package/dist/v2/{server-h0410h0v.js → server-1bw1wcbp.js} +1 -1
  209. package/dist/v2/{server-beht37jy.js → server-1zx2pa5d.js} +1 -1
  210. package/dist/v2/{server-a9xqj88f.js → server-230fnbws.js} +4 -4
  211. package/dist/v2/{server-tbe1femw.js → server-29qp8nz4.js} +1 -1
  212. package/dist/v2/{server-tgnbmwah.js → server-3mz2qh5a.js} +1 -1
  213. package/dist/v2/{server-hy3d3vsx.js → server-4nw4fqhr.js} +2 -2
  214. package/dist/v2/{server-45q69hkq.js → server-4sxjs6hn.js} +5 -5
  215. package/dist/v2/{server-34kwfsr4.js → server-53eh1r8r.js} +2 -2
  216. package/dist/v2/{server-xj136kt8.js → server-55rgxfrw.js} +9 -3
  217. package/dist/v2/{server-nj659894.js → server-5arr9ecn.js} +2 -2
  218. package/dist/{index-8cd2j99z.js → v2/server-5kym00ag.js} +32 -13
  219. package/dist/v2/{server-2ar62dyx.js → server-63fqdghs.js} +106 -20
  220. package/dist/v2/{server-f2xf5gcb.js → server-6495nmn9.js} +12 -15
  221. package/dist/v2/{server-qd11g795.js → server-92g7d776.js} +2 -1
  222. package/dist/v2/{server-xq7dfjke.js → server-9x0kmta4.js} +5 -5
  223. package/dist/v2/{server-27gq4mfz.js → server-a3dwxfgd.js} +4 -4
  224. package/dist/v2/{server-6tmj0s7j.js → server-af2pght7.js} +3 -3
  225. package/dist/v2/{server-1wy7b9de.js → server-br1x0tev.js} +3 -3
  226. package/dist/v2/{server-n1prf1g6.js → server-brj8j2gk.js} +2 -2
  227. package/dist/v2/{server-6vdzn1td.js → server-c7dxxsj7.js} +308 -61
  228. package/dist/v2/server-cpjk5jd2.js +82 -0
  229. package/dist/v2/{server-g3qma5c0.js → server-dj7tz4ph.js} +2 -2
  230. package/dist/v2/{server-9hx7g5jp.js → server-ej96a39v.js} +17 -9
  231. package/dist/v2/{server-6pmqg9m4.js → server-gyy4k6mf.js} +1 -1
  232. package/dist/v2/{server-bmymkx73.js → server-hqzyq8n4.js} +11 -11
  233. package/dist/v2/{server-h1v0pyxb.js → server-j4jnp9b5.js} +468 -18
  234. package/dist/v2/{server-da07v4xp.js → server-k3t06fxr.js} +1 -1
  235. package/dist/v2/{server-gsxjv2q2.js → server-m91f9m5s.js} +69 -17
  236. package/dist/v2/{server-rmygf5pn.js → server-ne8arh8t.js} +2 -2
  237. package/dist/v2/{server-hm38q7r0.js → server-vn2nwcv6.js} +5 -5
  238. package/dist/v2/{server-46neh5fa.js → server-wyawsa88.js} +314 -127
  239. package/dist/v2/{server-zzkj2fch.js → server-xsryvyf6.js} +4 -4
  240. package/dist/v2/{server-n37sebck.js → server-y4a3nhtk.js} +1 -1
  241. package/dist/v2/{server-d04vrx0j.js → server-ygtykank.js} +2 -2
  242. package/dist/v2/server.js +6 -6
  243. package/dist/v2/{sqlite-zf72c52d.js → sqlite-1rpvw2rj.js} +1 -1
  244. package/dist/v2/{storage-memory-y3qmy00r.js → storage-memory-nm7v82mj.js} +2 -2
  245. package/dist/v2/{storage-tags-3wdb8zph.js → storage-tags-ss08kj5r.js} +5 -5
  246. package/dist/v2/store-reader.d.ts +8 -0
  247. package/dist/v2/store-reader.d.ts.map +1 -1
  248. package/dist/v2/{task-config-nvz8mapa.js → task-config-7md27rx8.js} +2 -2
  249. package/dist/v2/{wrapup-orchestrator-embdz8gj.js → wrapup-orchestrator-639whfhq.js} +32 -31
  250. package/dist/wrapup-orchestrator-mnvt2g8m.js +49 -0
  251. package/package.json +1 -1
  252. package/src/config/index.test.ts +28 -6
  253. package/src/shared/logger.test.ts +42 -1
  254. package/src/shared/logger.ts +11 -13
  255. package/src/shared/model-resolution.test.ts +67 -12
  256. package/src/shared/model-resolution.ts +43 -16
  257. package/src/shared/model-suggestion-retry.ts +1 -1
  258. package/src/shared/prompt-async-transport.ts +47 -3
  259. package/src/shared/rpc-types.ts +7 -0
  260. package/src/shared/sqlite-busy-budget-review.test.ts +6 -1
  261. package/src/shared/sqlite.ts +4 -2
  262. package/src/shared/subagent-runner.ts +2 -0
  263. package/src/shared/worker-shutdown-fence.test.ts +87 -0
  264. package/src/shared/worker-shutdown.fixture.ts +25 -0
  265. package/src/shared/worker-shutdown.test.ts +127 -0
  266. package/src/shared/worker-shutdown.ts +160 -0
  267. package/dist/embedding-backfill-fmz50tsy.js +0 -24
  268. package/dist/recomp-orchestrator-999jj4bc.js +0 -61
  269. package/dist/v2/embedding-backfill-7c7yr69y.js +0 -23
  270. package/dist/v2/recomp-orchestrator-f6m9jr7p.js +0 -60
  271. package/dist/wrapup-orchestrator-whhbjmaz.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-rpxdjkm0.js";
142
+ } from "./index-v7r4td4c.js";
137
143
  import {
138
144
  BoundedSessionMap,
139
145
  cleanSearchText,
140
146
  matchedSearchSnippet
141
- } from "./index-se4m2g6w.js";
147
+ } from "./index-48stjd56.js";
142
148
  import {
143
149
  stripSystemInjection,
144
150
  isTextPart,
@@ -234,7 +240,7 @@ import {
234
240
  extractToolCallObservation,
235
241
  ToolMutationBatch,
236
242
  createToolDropTarget
237
- } from "./index-9zcsy3hh.js";
243
+ } from "./index-x4k3f4mf.js";
238
244
  import {
239
245
  isValidLanguageCode
240
246
  } from "./index-wgypt3cs.js";
@@ -245,10 +251,10 @@ import {
245
251
  openCodeDbExists,
246
252
  withReadOnlySessionDb,
247
253
  getMessageTimesFromOpenCodeDb
248
- } from "./index-kq82mtg0.js";
254
+ } from "./index-11zf2wwc.js";
249
255
  import {
250
256
  userFacingFailureCode
251
- } from "./index-3h4dp9wb.js";
257
+ } from "./index-1pefp8ar.js";
252
258
  import {
253
259
  normalizeProtectedToolName,
254
260
  mergeProtectedTools
@@ -258,7 +264,7 @@ import {
258
264
  } from "./index-y8v6yerm.js";
259
265
  import {
260
266
  logSlowWriteTransaction
261
- } from "./index-k29z4aqh.js";
267
+ } from "./index-t5pck3ss.js";
262
268
 
263
269
  // src/features/magic-context/tagger.ts
264
270
  var TOOL_COMPOSITE_KEY_SEP = "\x00";
@@ -1243,7 +1249,8 @@ ${trimmedBody}…
1243
1249
  return wrapped;
1244
1250
  }
1245
1251
  function selectAutoSearchResults(results, threshold) {
1246
- 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));
1247
1254
  }
1248
1255
 
1249
1256
  // src/hooks/magic-context/auto-search-worker-client.ts
@@ -1336,6 +1343,13 @@ function retryUnpublishedAutoSearchNoHint(db, sessionId, messageId, startedAt) {
1336
1343
  }
1337
1344
  return true;
1338
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
+ }
1339
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)) {
1340
1354
  return executeAutoSearchWorker(db, sessionId, projectPath, query, options, entry, "search");
1341
1355
  }
@@ -1344,14 +1358,19 @@ var searchWorkers = new WeakMap;
1344
1358
  var liveSearchWorkers = new Set;
1345
1359
  var MAX_IDLE_SEARCH_WORKERS = 4;
1346
1360
  var SEARCH_WORKER_IDLE_MS = 5 * 60000;
1361
+ var DETACHED_SEARCH_LIMIT_MS = 30000;
1362
+ var AUTO_SEARCH_WORKER_CLOSE_DEADLINE_MS = 2000;
1347
1363
  var workersCreated = 0;
1348
1364
  var workersReused = 0;
1365
+ var searchesSkippedBusy = 0;
1349
1366
  async function acquireSearchWorker(db, key, entry, input, signal) {
1350
1367
  const pool = searchWorkers.get(db) ?? new Map;
1351
1368
  searchWorkers.set(db, pool);
1352
1369
  while (!signal.aborted) {
1353
1370
  let slot = pool.get(key);
1354
1371
  if (slot?.busy) {
1372
+ if (input.job === "search" && (slot.detached || slot.busySessionId === input.sessionId))
1373
+ return "busy";
1355
1374
  const current = slot;
1356
1375
  await new Promise((resolve) => {
1357
1376
  const done = () => {
@@ -1360,6 +1379,8 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
1360
1379
  };
1361
1380
  signal.addEventListener("abort", done, { once: true });
1362
1381
  current.busy?.then(done);
1382
+ if (!current.detached)
1383
+ current.detachedSignal?.then(done);
1363
1384
  if (signal.aborted)
1364
1385
  done();
1365
1386
  });
@@ -1368,14 +1389,16 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
1368
1389
  const fresh = !slot;
1369
1390
  if (!slot) {
1370
1391
  const worker = inRootAsyncContext2(() => new Worker(entry, { workerData: { ...input, persistent: true } }));
1392
+ const shutdown = createWorkerShutdown(worker, "auto-search", AUTO_SEARCH_WORKER_CLOSE_DEADLINE_MS);
1371
1393
  slot = {
1372
1394
  worker,
1373
1395
  dispose() {
1396
+ this.disposed = true;
1374
1397
  clearTimeout(this.idleTimer);
1375
1398
  if (pool.get(key) === this)
1376
1399
  pool.delete(key);
1377
1400
  liveSearchWorkers.delete(this);
1378
- worker.terminate();
1401
+ shutdown.close();
1379
1402
  worker.unref();
1380
1403
  }
1381
1404
  };
@@ -1389,9 +1412,14 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
1389
1412
  workersReused++;
1390
1413
  clearTimeout(slot.idleTimer);
1391
1414
  const current = slot;
1415
+ current.busySessionId = input.sessionId;
1416
+ current.detached = false;
1392
1417
  current.busy = new Promise((resolve) => {
1393
1418
  current.release = resolve;
1394
1419
  });
1420
+ current.detachedSignal = new Promise((resolve) => {
1421
+ current.markDetached = resolve;
1422
+ });
1395
1423
  current.worker.ref();
1396
1424
  return { slot: current, fresh };
1397
1425
  }
@@ -1400,6 +1428,9 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
1400
1428
  function queueAutoSearchBackfill(db, sessionId, projectPath, query) {
1401
1429
  if (isEmbeddingHostBusy2())
1402
1430
  return Promise.resolve();
1431
+ const snapshot = getProjectEmbeddingSnapshot2(projectPath);
1432
+ if (!snapshot?.enabled || !snapshot.features.memoryEnabled)
1433
+ return Promise.resolve();
1403
1434
  const key = `${sessionId}\x00${projectPath}`;
1404
1435
  const pending = pendingBackfills.get(db) ?? new Map;
1405
1436
  pendingBackfills.set(db, pending);
@@ -1447,6 +1478,7 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
1447
1478
  signal: deadlineSignal,
1448
1479
  readMessages: _readMessages,
1449
1480
  searchMessageHistory: _searchMessageHistory,
1481
+ stepTimings: _stepTimings,
1450
1482
  ...serializable
1451
1483
  } = options;
1452
1484
  const lifecycle = registerAutoSearchWork(sessionId);
@@ -1482,30 +1514,55 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
1482
1514
  lifecycle.done();
1483
1515
  return [];
1484
1516
  }
1517
+ if (lease === "busy") {
1518
+ lifecycle.done();
1519
+ searchesSkippedBusy++;
1520
+ throw new AutoSearchBusyError;
1521
+ }
1485
1522
  const { slot, fresh } = lease;
1486
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;
1487
1529
  return new Promise((resolve, reject) => {
1488
1530
  let settled = false;
1489
- const finish = (results, error) => {
1531
+ let released = false;
1532
+ const settle = (results, error) => {
1490
1533
  if (settled)
1491
1534
  return;
1492
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);
1493
1546
  signal?.removeEventListener("abort", abort);
1494
1547
  lifecycle.signal.removeEventListener("abort", abort);
1495
1548
  lifecycle.done();
1496
1549
  worker.off("message", onMessage);
1497
1550
  worker.off("error", onError);
1498
1551
  worker.off("exit", onExit);
1499
- if (error || signal.aborted || entry.href !== defaultAutoSearchWorkerEntry().href)
1552
+ if (dispose || !detachable)
1500
1553
  slot.dispose();
1501
- else {
1554
+ else if (!slot.disposed) {
1502
1555
  slot.idleTimer = setTimeout(() => slot.dispose(), SEARCH_WORKER_IDLE_MS);
1503
1556
  slot.idleTimer.unref?.();
1504
1557
  }
1505
- const release = slot.release;
1558
+ const free = slot.release;
1506
1559
  slot.busy = undefined;
1507
1560
  slot.release = undefined;
1508
- release?.();
1561
+ slot.busySessionId = undefined;
1562
+ slot.detached = false;
1563
+ slot.detachedSignal = undefined;
1564
+ slot.markDetached = undefined;
1565
+ free?.();
1509
1566
  const reusable = liveSearchWorkers.delete(slot);
1510
1567
  if (reusable)
1511
1568
  liveSearchWorkers.add(slot);
@@ -1513,51 +1570,82 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
1513
1570
  for (const prior of idle.slice(0, Math.max(0, idle.length - MAX_IDLE_SEARCH_WORKERS)))
1514
1571
  prior.dispose();
1515
1572
  worker.unref();
1516
- if (error)
1517
- reject(error);
1518
- else
1519
- resolve(results);
1520
1573
  };
1521
- 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
+ };
1522
1595
  signal?.addEventListener("abort", abort, { once: true });
1523
1596
  lifecycle.signal.addEventListener("abort", abort, { once: true });
1524
1597
  const onError = (error) => finish([], error);
1525
1598
  const onExit = (code) => finish([], new Error(`auto-search worker exited (${code})`));
1526
1599
  const onMessage = async (reply) => {
1527
- if (settled)
1600
+ if (released)
1528
1601
  return;
1529
- 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
+ }
1530
1612
  if (snapshot && getProjectEmbeddingSnapshot2(projectPath)?.generation !== snapshot.generation)
1531
1613
  finish([]);
1532
1614
  else
1533
1615
  finish(reply.results);
1534
1616
  return;
1535
1617
  }
1536
- if (reply.kind === "error") {
1537
- finish([], new Error(reply.error));
1538
- return;
1539
- }
1540
1618
  if (reply.kind === "messages" || reply.kind === "accepted")
1541
1619
  return;
1542
1620
  const response = { id: reply.id };
1543
- 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
+ }
1544
1639
  if (reply.kind === "query")
1545
- response.result = await (job === "backfill" ? embedTextForProject2(projectPath, reply.text, signal, "query") : boundedHintEmbedding(embedQuery, reply.text, signal)) ?? null;
1546
- else {
1547
- const passage = await embedBatchForProject2(projectPath, reply.texts, signal, reply.purpose);
1548
- const current = getProjectEmbeddingSnapshot2(projectPath);
1549
- response.passage = passage && current ? {
1550
- ...passage,
1551
- providerIdentity: current.providerIdentity,
1552
- runtimeFingerprint: current.runtimeFingerprint,
1553
- dimensions: passage.vectors.find((vector) => vector !== null)?.length ?? null
1554
- } : null;
1640
+ ownerVectorMs = performance.now() - requestedAt;
1641
+ if (signal.aborted) {
1642
+ response.result = undefined;
1643
+ response.passage = undefined;
1644
+ response.error = undefined;
1555
1645
  }
1556
- } catch (error) {
1557
- response.error = error instanceof Error ? error.message : String(error);
1558
1646
  }
1559
1647
  response.embeddingHostBusy = isEmbeddingHostBusy2();
1560
- if (!settled && !signal?.aborted) {
1648
+ if (!released) {
1561
1649
  try {
1562
1650
  worker.postMessage(response);
1563
1651
  } catch (error) {
@@ -1579,6 +1667,15 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
1579
1667
  }
1580
1668
  });
1581
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
+ }
1582
1679
  async function boundedHintEmbedding(embed, text, signal) {
1583
1680
  const controller = new AbortController;
1584
1681
  const combined = AbortSignal.any([signal, controller.signal]);
@@ -1602,6 +1699,7 @@ function defaultAutoSearchWorkerEntry() {
1602
1699
  }
1603
1700
  var MESSAGE_WORKER_ACCEPT_TIMEOUT_MS = 400;
1604
1701
  var MESSAGE_WORKER_RESULT_TIMEOUT_MS = 30000;
1702
+ var MESSAGE_SEARCH_WORKER_CLOSE_DEADLINE_MS = 2000;
1605
1703
  var messageSearchWorkerFallbacks = new Map;
1606
1704
  function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWorkerEntry(), deadlines = {}) {
1607
1705
  const fallback = (reason, detail) => {
@@ -1629,6 +1727,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
1629
1727
  return new Promise((resolve) => {
1630
1728
  let settled = false;
1631
1729
  let worker;
1730
+ let shutdown;
1632
1731
  let deadline;
1633
1732
  const finish = (outcome, reason, detail) => {
1634
1733
  if (settled)
@@ -1637,7 +1736,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
1637
1736
  clearTimeout(deadline);
1638
1737
  if (reason)
1639
1738
  fallback(reason, detail);
1640
- worker?.terminate();
1739
+ shutdown?.close();
1641
1740
  worker?.unref();
1642
1741
  resolve(outcome);
1643
1742
  };
@@ -1648,6 +1747,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
1648
1747
  };
1649
1748
  try {
1650
1749
  worker = inRootAsyncContext2(() => new Worker(entry, { workerData: input }));
1750
+ shutdown = createWorkerShutdown(worker, "message-search", MESSAGE_SEARCH_WORKER_CLOSE_DEADLINE_MS);
1651
1751
  } catch (error) {
1652
1752
  finish(null, "start-failed", error);
1653
1753
  return;
@@ -1916,7 +2016,8 @@ async function runAutoSearchHint(args) {
1916
2016
  },
1917
2017
  isEmbeddingRuntimeEnabled: () => embeddingEnabled === true,
1918
2018
  visibleMemoryIds: options.visibleMemoryIds ?? null,
1919
- sources: ["memory", "message", "git_commit"]
2019
+ sources: ["memory", "message", "git_commit"],
2020
+ chunkPoolWarmOnly: true
1920
2021
  };
1921
2022
  return searchAutoHint(db, sessionId, options.projectPath, rawPrompt, {
1922
2023
  ...searchOptions,
@@ -1927,6 +2028,11 @@ async function runAutoSearchHint(args) {
1927
2028
  } catch (error) {
1928
2029
  if (lifecycleSignal.aborted)
1929
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
+ }
1930
2036
  log2(`[auto-search] unified search failed for session ${sessionId} (no-hint frozen for this turn): ${error instanceof Error ? error.message : String(error)}`);
1931
2037
  const outcome = await writeNoHintAndReconcile("error");
1932
2038
  return outcome.ok ? { ok: false, kind: "search-failure" } : outcome;
@@ -1976,7 +2082,7 @@ ${hintText}`;
1976
2082
  if (outcome.decision.decision === "hint") {
1977
2083
  appendReminderToUserMessageById(messages, userMsgId, outcome.decision.text);
1978
2084
  }
1979
- 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)})`);
1980
2086
  return AUTO_SEARCH_OK;
1981
2087
  } finally {
1982
2088
  if (!lifecycleSignal.aborted && results !== null)
@@ -2285,6 +2391,22 @@ function resolveTodowriteAvailability(sessionId) {
2285
2391
  return resolveToolAvailability(sessionId, TODOWRITE_TOOL);
2286
2392
  }
2287
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
+
2288
2410
  // src/hooks/magic-context/cache-busting-signals.ts
2289
2411
  function canConsumeDeferredOnThisPass(args) {
2290
2412
  if (args.justAwaitedPublication)
@@ -2292,7 +2414,7 @@ function canConsumeDeferredOnThisPass(args) {
2292
2414
  return args.schedulerDecision === "execute" || args.contextPercentage >= (args.forceMaterializationPercentage ?? escalationBands(65).forceMaterializationPercentage);
2293
2415
  }
2294
2416
  function hasReclaimRide(signals) {
2295
- 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;
2296
2418
  }
2297
2419
  function prefixMutationPermitted(gate) {
2298
2420
  return !gate.signedThinkingHold || gate.firstRender || gate.idleExpiry || gate.emergency;
@@ -2305,13 +2427,233 @@ var RECLAIM_RIDE_NAMES = [
2305
2427
  "force",
2306
2428
  "explicitFlush",
2307
2429
  "publishedHistory",
2308
- "subagentExecute"
2430
+ "subagentExecute",
2431
+ "executeReclaim"
2309
2432
  ];
2310
2433
  function reclaimRideLabel(signals) {
2311
2434
  const active = RECLAIM_RIDE_NAMES.filter((name) => signals[name]);
2312
2435
  return `ride=${active.length > 0 ? active.join("+") : "none"}`;
2313
2436
  }
2314
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
+
2315
2657
  // src/hooks/magic-context/reasoning-budget-status.ts
2316
2658
  var sources = new Map;
2317
2659
  function captureOpencodeReasoningBudgetStatus(sessionId, messages, budget, prefixBound, proseRatio = 1) {
@@ -2594,6 +2936,9 @@ function latestAssistantTurnStart(messages) {
2594
2936
  function latestAssistantTurnMessages(messages) {
2595
2937
  return new Set(messages.slice(latestAssistantTurnStart(messages)));
2596
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
+ }
2597
2942
  function hasActiveAnthropicThinkingTurn(messages, provider, model) {
2598
2943
  const familyRoute = isAnthropicFamilyRoute(provider, model);
2599
2944
  for (const message of messages.slice(latestAssistantTurnStart(messages))) {
@@ -2602,7 +2947,7 @@ function hasActiveAnthropicThinkingTurn(messages, provider, model) {
2602
2947
  const parts = content(message);
2603
2948
  if (!Array.isArray(parts))
2604
2949
  continue;
2605
- 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)))
2606
2951
  return true;
2607
2952
  }
2608
2953
  return false;
@@ -2678,14 +3023,14 @@ function retainedActiveThinkingParts(args) {
2678
3023
  }
2679
3024
 
2680
3025
  // src/features/magic-context/storage-caveman-rules.ts
2681
- var NAMESPACE = "caveman";
3026
+ var NAMESPACE2 = "caveman";
2682
3027
  var CURRENT_RULES_VERSION = 2;
2683
3028
  var ORIGINAL_RULES = {
2684
3029
  currentRules: false,
2685
3030
  englishWordRules: true,
2686
3031
  legacyReasoningTags: new Set
2687
3032
  };
2688
- function parseState(lane) {
3033
+ function parseState2(lane) {
2689
3034
  if (!isRecord(lane) || lane.rules !== CURRENT_RULES_VERSION)
2690
3035
  return ORIGINAL_RULES;
2691
3036
  const tags = Array.isArray(lane.legacyReasoningTags) ? lane.legacyReasoningTags : [];
@@ -2697,7 +3042,7 @@ function parseState(lane) {
2697
3042
  }
2698
3043
  function getCavemanReplayState(db, sessionId) {
2699
3044
  try {
2700
- return parseState(readReplayEnvelope(db, sessionId)[NAMESPACE]);
3045
+ return parseState2(readReplayEnvelope(db, sessionId)[NAMESPACE2]);
2701
3046
  } catch (error) {
2702
3047
  if (error instanceof ReplayDocumentError)
2703
3048
  return ORIGINAL_RULES;
@@ -2707,11 +3052,11 @@ function getCavemanReplayState(db, sessionId) {
2707
3052
  function recordCavemanCurrentRules(db, sessionId, englishWordRules, legacyReasoningTags) {
2708
3053
  const tags = [...new Set(legacyReasoningTags)].sort((a, b) => a - b);
2709
3054
  const persisted = updateReplayDocument(db, sessionId, (doc) => {
2710
- const current = parseState(doc[NAMESPACE]);
3055
+ const current = parseState2(doc[NAMESPACE2]);
2711
3056
  if (current.currentRules && current.englishWordRules === englishWordRules)
2712
3057
  return false;
2713
3058
  doc.version = 2;
2714
- doc[NAMESPACE] = {
3059
+ doc[NAMESPACE2] = {
2715
3060
  rules: CURRENT_RULES_VERSION,
2716
3061
  legacyReasoningTags: current.currentRules ? [...current.legacyReasoningTags].sort((a, b) => a - b) : tags,
2717
3062
  ...englishWordRules ? {} : { englishWordRules: false }
@@ -2925,93 +3270,23 @@ function degradedPassError(site, error) {
2925
3270
  return new DegradedPassRefusalError(site, { cause: error });
2926
3271
  }
2927
3272
 
2928
- // src/hooks/magic-context/pending-drop-eligibility.ts
2929
- function pendingDropVeto(tagNumber, target, protectedTagIds) {
2930
- if (protectedTagIds.has(tagNumber))
2931
- return "protected";
2932
- if (target?.thinkingDropProtected)
2933
- return "active_thinking";
2934
- return null;
2935
- }
2936
- function capturePendingDropEligibility(targets, protectedTagIds) {
2937
- const eligible = new Set;
2938
- for (const [number, target] of targets) {
2939
- if (pendingDropVeto(number, target, protectedTagIds))
2940
- continue;
2941
- if (target.drop) {
2942
- if (target.canDrop?.() === true)
2943
- eligible.add(number);
2944
- } else {
2945
- const content = target.getContent?.();
2946
- if (typeof content === "string" && content.length > `[dropped §${number}§]`.length)
2947
- eligible.add(number);
2948
- }
2949
- }
2950
- return eligible;
2951
- }
2952
- function pendingDropEligibilityKey(db, sessionId, input, protectionInputs) {
2953
- const digests = input.map((message) => message.contentDigest?.() ?? null);
2954
- if (digests.some((digest) => digest === null))
2955
- return null;
2956
- const revision = db.prepare("SELECT value FROM schema_migrations_meta WHERE key = ?").get(tagRevisionKey(sessionId));
2957
- if (!revision?.value)
2958
- return null;
2959
- return JSON.stringify([
2960
- input.map((message, index) => [
2961
- message.id,
2962
- message.role,
2963
- message.synthetic,
2964
- digests[index]
2965
- ]),
2966
- revision.value,
2967
- readEpochFloorSnapshot(db, sessionId),
2968
- sessionDecisionCalibration(db, sessionId).toolsRatio,
2969
- loadProtectedTailMeta(db, sessionId),
2970
- [...getMergedReasoningStrippedIds(db, sessionId)].sort(),
2971
- [...getReasoningRemovalState(db, sessionId).messageIds].sort(),
2972
- protectionInputs
2973
- ]);
2974
- }
2975
- function createPendingDropEligibilityCache() {
2976
- const sessions = new Map;
2977
- return {
2978
- read(sessionId, key) {
2979
- const previous = sessions.get(sessionId);
2980
- if (key === null || previous?.key !== key) {
2981
- sessions.delete(sessionId);
2982
- return;
2983
- }
2984
- return previous.eligible;
2985
- },
2986
- record(sessionId, key, eligible) {
2987
- sessions.delete(sessionId);
2988
- if (key === null)
2989
- return;
2990
- const oldest = sessions.keys().next().value;
2991
- if (sessions.size >= 64 && oldest !== undefined)
2992
- sessions.delete(oldest);
2993
- sessions.set(sessionId, { key, eligible: new Set(eligible) });
2994
- }
2995
- };
2996
- }
2997
-
2998
3273
  // src/features/magic-context/storage-host-instruction-retention.ts
2999
- var NAMESPACE2 = "hostInstructionRetention";
3274
+ var NAMESPACE3 = "hostInstructionRetention";
3000
3275
  var enabled = true;
3001
3276
  function hostInstructionRetentionEnabled() {
3002
3277
  return enabled;
3003
3278
  }
3004
3279
  function isHostInstructionRetentionOn(db, sessionId) {
3005
- const lane = readReplayEnvelope(db, sessionId)[NAMESPACE2];
3280
+ const lane = readReplayEnvelope(db, sessionId)[NAMESPACE3];
3006
3281
  return typeof lane === "object" && lane !== null && lane.on === true;
3007
3282
  }
3008
3283
  function markHostInstructionRetention(db, sessionId) {
3009
3284
  return updateReplayDocument(db, sessionId, (doc) => {
3010
- const lane = doc[NAMESPACE2];
3285
+ const lane = doc[NAMESPACE3];
3011
3286
  if (typeof lane === "object" && lane !== null && lane.on === true)
3012
3287
  return false;
3013
3288
  doc.version = 2;
3014
- doc[NAMESPACE2] = { on: true };
3289
+ doc[NAMESPACE3] = { on: true };
3015
3290
  return true;
3016
3291
  });
3017
3292
  }
@@ -3301,12 +3576,16 @@ function applyPendingOperations(sessionId, db, targets, protectedTagIds, preload
3301
3576
  }
3302
3577
  } else if (target) {
3303
3578
  const replacement = buildReplacementContent(pendingOp.tagId);
3579
+ if (target.canSetContent?.(replacement) === false) {
3580
+ reject("content_unchanged");
3581
+ continue;
3582
+ }
3304
3583
  persistDrop();
3305
3584
  mutations.push(() => {
3306
3585
  const priorContent = target.getContent?.();
3307
3586
  const changed = target.setContent(replacement);
3308
- record(changed);
3309
3587
  if (changed) {
3588
+ record(true);
3310
3589
  const originalCharacters = typeof priorContent === "string" ? priorContent.length : tagById.get(pendingOp.tagId)?.byteSize ?? replacement.length;
3311
3590
  onTagReduced?.({
3312
3591
  tagNumber: pendingOp.tagId,
@@ -3877,70 +4156,6 @@ function isVisibleNoteReadPart(part) {
3877
4156
  return false;
3878
4157
  }
3879
4158
 
3880
- // src/hooks/magic-context/postprocess-read-cache.ts
3881
- var connections = new WeakMap;
3882
- function snapshot(db, sessionId) {
3883
- const transaction = db;
3884
- try {
3885
- if (transaction.inTransaction || transaction.isTransaction) {
3886
- connections.delete(db);
3887
- return { version: -1, changes: -1 };
3888
- }
3889
- } catch {
3890
- connections.delete(db);
3891
- return { version: -1, changes: -1 };
3892
- }
3893
- let connection = connections.get(db);
3894
- if (!connection) {
3895
- connection = {
3896
- stamp: db.prepare("SELECT total_changes() AS changes, data_version AS version FROM pragma_data_version"),
3897
- sessions: new BoundedSessionMap(100)
3898
- };
3899
- connections.set(db, connection);
3900
- }
3901
- const stamp = connection.stamp.get();
3902
- const previous = connection.sessions.get(sessionId);
3903
- if (previous?.version === stamp.version && previous.changes === stamp.changes) {
3904
- return previous;
3905
- }
3906
- const value = { ...stamp };
3907
- connection.sessions.set(sessionId, value);
3908
- return value;
3909
- }
3910
- function postprocessTailTags(db, sessionId) {
3911
- const state = snapshot(db, sessionId);
3912
- return state.tags ??= getTailHygieneTags2(db, sessionId);
3913
- }
3914
- function postprocessOldestTags(db, sessionId, protectedNumbers) {
3915
- const state = snapshot(db, sessionId);
3916
- const hints = state.hints;
3917
- if (hints && hints.protectedNumbers.size === protectedNumbers.size && [...protectedNumbers].every((number) => hints.protectedNumbers.has(number))) {
3918
- return hints.value;
3919
- }
3920
- const value = getOldestActiveUnprotectedToolTags2(db, sessionId, protectedNumbers);
3921
- state.hints = { protectedNumbers: new Set(protectedNumbers), value };
3922
- return value;
3923
- }
3924
- function postprocessReplaySnapshot(db, sessionId) {
3925
- const state = snapshot(db, sessionId);
3926
- const replay = state.replay ??= loadPostprocessReplaySnapshot(db, sessionId);
3927
- return {
3928
- ...replay,
3929
- staleReduceStrippedIds: new Set(replay.staleReduceStrippedIds),
3930
- processedImageStrippedIds: new Set(replay.processedImageStrippedIds),
3931
- processedImageMarkers: new Map(replay.processedImageMarkers),
3932
- strippedPlaceholderIds: new Set(replay.strippedPlaceholderIds),
3933
- hiddenSeamPlaceholderIds: new Set(replay.hiddenSeamPlaceholderIds),
3934
- mergedReasoningStrippedIds: new Set(replay.mergedReasoningStrippedIds),
3935
- trailingBlankDecisions: new Map(replay.trailingBlankDecisions),
3936
- noteNudgeAnchors: structuredClone(replay.noteNudgeAnchors),
3937
- autoSearchHintDecisions: structuredClone(replay.autoSearchHintDecisions),
3938
- todoSyntheticAnchor: structuredClone(replay.todoSyntheticAnchor),
3939
- pendingCompactionMarker: structuredClone(replay.pendingCompactionMarker),
3940
- compactionMarker: structuredClone(replay.compactionMarker)
3941
- };
3942
- }
3943
-
3944
4159
  // src/hooks/magic-context/strict-thinking-prefix.ts
3945
4160
  function servedPrefixMatches(args) {
3946
4161
  const heads = args.messages?.slice(0, 2);
@@ -4812,6 +5027,10 @@ function tagMessages(sessionId, messages, tagger, db, options = {}) {
4812
5027
  dropReasoningParts: thinkingParts,
4813
5028
  mutationParts: [{ message, part: textPart }],
4814
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
+ },
4815
5034
  setContent: (content, options) => {
4816
5035
  if (textPart.text === content)
4817
5036
  return false;
@@ -5118,6 +5337,25 @@ function proactiveStripStartIndex(args) {
5118
5337
  return divergence;
5119
5338
  return divergence ?? lastServed.messages.length;
5120
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
+ }
5121
5359
  function isPartDroppedBeforeWire(part, providerID) {
5122
5360
  if (!modelAcceptsEmptyContent(providerID) || !isRecord(part))
5123
5361
  return false;
@@ -5720,6 +5958,8 @@ async function runPostTransformPhase2(args) {
5720
5958
  if (stripOffWire)
5721
5959
  for (const id of stripped.strip?.messageIds ?? [])
5722
5960
  compactionOffFrozenThinking.add(id);
5961
+ for (const id of stripped.strip?.messageIds ?? [])
5962
+ bindingThinking.add(id);
5723
5963
  retainedThinking.clear();
5724
5964
  protectedThinkingMessages.clear();
5725
5965
  activeThinkingTurn = false;
@@ -5732,6 +5972,10 @@ async function runPostTransformPhase2(args) {
5732
5972
  if (args.forceSignedRebuildForFit && (activeThinkingPrefixHold || activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true)) {
5733
5973
  releaseThinkingForRewrite(true);
5734
5974
  }
5975
+ if (args.compactionModeTransition === true && args.thinkingBindingRecoveryEnabledForModel === true) {
5976
+ sessionLog2(args.sessionId, "compaction mode switch: stripping signed thinking");
5977
+ releaseThinkingForRewrite(false, true);
5978
+ }
5735
5979
  const foldDueDecision = m0M1EnabledForFold && args.m0M1 && !freezeM0M1 ? mustMaterialize({
5736
5980
  db: args.db,
5737
5981
  sessionId: args.sessionId,
@@ -5771,6 +6015,7 @@ async function runPostTransformPhase2(args) {
5771
6015
  };
5772
6016
  if ((foldDueDecision.value || softRefreshOpportunity || firstRenderBust && activeThinkingPrefixHold) && m0M1EnabledForFold && args.m0M1) {
5773
6017
  let committedFoldBustsServedPrefix;
6018
+ let committedFoldChangesHead;
5774
6019
  try {
5775
6020
  const previousM1 = args.sessionMeta.cachedM1Bytes?.toString("utf8");
5776
6021
  const foldResult = injectM0M1({
@@ -5800,6 +6045,12 @@ async function runPostTransformPhase2(args) {
5800
6045
  m1Text: rendered.m1Bytes.toString(),
5801
6046
  muralDataUrl: rendered.muralDataUrl
5802
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);
5803
6054
  if (bustsPrefix) {
5804
6055
  if (!conversions.isCurrent(db)) {
5805
6056
  throw new MaterializeContentionError({
@@ -5818,6 +6069,9 @@ async function runPostTransformPhase2(args) {
5818
6069
  preparedPrefix = foldResult;
5819
6070
  if (activeThinkingPrefixHold && firstRenderBust && committedFoldBustsServedPrefix) {
5820
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);
5821
6075
  }
5822
6076
  prefixPreflightFailed = foldResult.materializationContentionRetryExhausted === true;
5823
6077
  foldExecutedThisPass = foldExecutesThisPass(foldDueDecision.value || softRefreshOpportunity, foldResult.m0RematerializedThisPass);
@@ -5875,12 +6129,30 @@ async function runPostTransformPhase2(args) {
5875
6129
  const heldIdleExpiryRebuild = activeThinkingPrefixHold && args.m0M1?.hardSignals?.cacheExpired === true;
5876
6130
  const idleExpiryRebuild = (!freezeM0M1 || activeThinkingPrefixHold) && args.m0M1?.hardSignals?.cacheExpired === true;
5877
6131
  const rideSignals = {
6132
+ executeReclaim: false,
5878
6133
  subagentExecute: !args.fullFeatureMode && args.schedulerDecision === "execute",
5879
6134
  hardFold: rewritingSignedPrefix || foldBustsServedPrefixThisPass || firstRenderBust || idleExpiryRebuild,
5880
6135
  force: emergencyDropEligible && (args.contextUsage.percentage >= 95 || args.contextUsageFromEstimate !== true && getEmergencyInputSample(args.db, args.sessionId) === 0),
5881
6136
  explicitFlush: isExplicitFlush && hasPendingMaterializationOrigin(args.pendingMaterializationSessions, args.sessionId, "user_flush"),
5882
6137
  publishedHistory: !prefixPreflightFailed && (publishedM1RefreshedThisPass || !m0M1EnabledForFold && (args.pendingCompartmentInjection?.compartmentCount ?? 0) > 0 && legacyPublishedHeadChanged(args))
5883
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
+ });
5884
6156
  const publishedWorkDrainAllowed = !compactionOff && reclaimRidePermitted(rideSignals, {
5885
6157
  signedThinkingHold: activeThinkingPrefixHold,
5886
6158
  firstRender: firstRenderBust,
@@ -5888,7 +6160,7 @@ async function runPostTransformPhase2(args) {
5888
6160
  emergency: emergencyDropEligible
5889
6161
  });
5890
6162
  const shouldApplyPendingOps = publishedWorkDrainAllowed;
5891
- 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));
5892
6164
  const isCacheBustingPass = publishedWorkDrainAllowed;
5893
6165
  let unheldSignedTurnBust = false;
5894
6166
  if (isCacheBustingPass && !activeThinkingPrefixHold && activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true) {
@@ -5980,17 +6252,28 @@ async function runPostTransformPhase2(args) {
5980
6252
  throw new EmergencyFailClosedError("Magic Context could not read its saved reasoning-removal state for this session", { cause: error });
5981
6253
  }
5982
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
+ ]));
5983
6266
  if (shouldRunHeuristics) {
5984
6267
  const subagentRerun = !args.fullFeatureMode && alreadyRanThisTurn && args.schedulerDecision === "execute" && !isExplicitFlush && !forceMaterialization;
5985
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})`;
5986
6269
  sessionLog2(args.sessionId, `heuristics WILL RUN — reason=${reason}, context=${args.contextUsage.percentage.toFixed(1)}%, turn=${args.currentTurnId}`);
5987
- } else if (args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
6270
+ } else if (heuristicsLogChanged && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
5988
6271
  sessionLog2(args.sessionId, `heuristics WILL NOT RUN — reason=${args.schedulerDeferReason}`);
5989
6272
  }
5990
6273
  if (alreadyRanThisTurn && args.schedulerDecision === "execute" && !materializationRequested && args.fullFeatureMode) {
5991
6274
  sessionLog2(args.sessionId, `transform: skipping heuristics (already ran for turn ${args.currentTurnId})`);
5992
6275
  }
5993
- if (!shouldApplyPendingOps && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
6276
+ if (!shouldApplyPendingOps && pendingLogChanged && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
5994
6277
  sessionLog2(args.sessionId, `pending ops WILL NOT APPLY — reason=${args.schedulerDeferReason} pendingOps=${formatPendingOpsDepth()} context=${args.contextUsage.percentage.toFixed(1)}%`);
5995
6278
  }
5996
6279
  if (hasPendingUserOps && !shouldApplyPendingOps) {
@@ -5999,7 +6282,6 @@ async function runPostTransformPhase2(args) {
5999
6282
  let explicitMaterializedSuccessfully = false;
6000
6283
  let deferredMaterializedSuccessfully = false;
6001
6284
  let pendingOpsDidMutate = false;
6002
- const protectedToolTags = protectedToolTagNumbers(args.tags, args.protectedTools);
6003
6285
  const firstApplicationEdits = { any: false, beforeNewerThinking: false };
6004
6286
  const recordFirstApplicationWireEdit = (beforeNewerThinking) => {
6005
6287
  firstApplicationEdits.any = true;
@@ -7080,6 +7362,8 @@ async function runPostTransformPhase2(args) {
7080
7362
  });
7081
7363
  }
7082
7364
  logTransformTiming(args.sessionId, "pp.tailGuard", tTailGuard);
7365
+ if (bustedThisPass)
7366
+ clearExecuteReclaimState(args.db, args.sessionId);
7083
7367
  return {
7084
7368
  explicitMaterializedSuccessfully,
7085
7369
  deferredMaterializedSuccessfully,
@@ -7100,8 +7384,7 @@ async function runPostTransformPhase2(args) {
7100
7384
  prefixTrimStatus: deliveredPrefix?.prefixTrimStatus ?? null,
7101
7385
  thinkingBindingRecovery,
7102
7386
  proactiveThinkingStrip,
7103
- thinkingReleasedForFit,
7104
- openTurnSignedThinkingKept: args.thinkingBindingRecoveryEnabledForModel === true && activeThinkingTurn && !rewritingSignedPrefix
7387
+ thinkingReleasedForFit
7105
7388
  };
7106
7389
  }
7107
7390
  function checkM0MutationDriftAndSignal2(args) {
@@ -7116,4 +7399,4 @@ function checkM0MutationDriftAndSignal2(args) {
7116
7399
  return false;
7117
7400
  }
7118
7401
 
7119
- 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 };