@cortexkit/opencode-magic-context 0.49.19 → 0.49.21

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 (323) 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-31h86ph0.js} +3 -3
  4. package/dist/compaction-marker-candidates-worker.js +2 -2
  5. package/dist/compartment-chunk-embedding-he60aaa2.js +65 -0
  6. package/dist/config/project-security.d.ts.map +1 -1
  7. package/dist/config/schema/magic-context.d.ts +43 -9
  8. package/dist/config/schema/magic-context.d.ts.map +1 -1
  9. package/dist/{conflict-warning-hook-4pmz879v.js → conflict-warning-hook-2r32hyx6.js} +9 -8
  10. package/dist/{context-j31m2dv7.js → context-j7hp43a0.js} +576 -185
  11. package/dist/{derive-budgets-zn7yzd2d.js → derive-budgets-pqybnx09.js} +2 -2
  12. package/dist/embedding-backfill-dtke6tck.js +25 -0
  13. package/dist/embedding-worker-process.js +2 -2
  14. package/dist/embedding-worker.js +6 -6
  15. package/dist/features/magic-context/chunk-embedding-writer.d.ts.map +1 -1
  16. package/dist/features/magic-context/compartment-chunk-embedding.d.ts +44 -1
  17. package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
  18. package/dist/features/magic-context/dreamer/docs-proposals.d.ts +1 -0
  19. package/dist/features/magic-context/dreamer/docs-proposals.d.ts.map +1 -1
  20. package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts.map +1 -1
  21. package/dist/features/magic-context/dreamer/task-config.d.ts.map +1 -1
  22. package/dist/features/magic-context/dreamer/task-executor.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/memory/embedding-identity.d.ts.map +1 -1
  26. package/dist/features/magic-context/memory/embedding-local.d.ts +1 -0
  27. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  28. package/dist/features/magic-context/memory/embedding-synapse.d.ts.map +1 -1
  29. package/dist/features/magic-context/memory/embedding-worker-client.d.ts +7 -1
  30. package/dist/features/magic-context/memory/embedding-worker-client.d.ts.map +1 -1
  31. package/dist/features/magic-context/memory/local-embedding-pooling.d.ts +22 -0
  32. package/dist/features/magic-context/memory/local-embedding-pooling.d.ts.map +1 -0
  33. package/dist/features/magic-context/message-index-async.d.ts +7 -2
  34. package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
  35. package/dist/features/magic-context/message-index.d.ts +2 -0
  36. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  37. package/dist/features/magic-context/mural/compress-cues.d.ts.map +1 -1
  38. package/dist/features/magic-context/project-embedding-registry.d.ts +2 -0
  39. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  40. package/dist/features/magic-context/search-rerank.d.ts +9 -2
  41. package/dist/features/magic-context/search-rerank.d.ts.map +1 -1
  42. package/dist/features/magic-context/search.d.ts +29 -0
  43. package/dist/features/magic-context/search.d.ts.map +1 -1
  44. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  45. package/dist/features/magic-context/storage-db.d.ts +2 -0
  46. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  47. package/dist/features/magic-context/storage-meta-persisted.d.ts +2 -0
  48. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  49. package/dist/features/magic-context/subagent-token-capture.d.ts +20 -0
  50. package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -1
  51. package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
  52. package/dist/{history-owner-xp3pngv7.js → history-owner-36wp3mkb.js} +2 -2
  53. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  54. package/dist/hooks/magic-context/auto-embed-session.d.ts.map +1 -1
  55. package/dist/hooks/magic-context/auto-search-hint.d.ts +7 -1
  56. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
  57. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  58. package/dist/hooks/magic-context/auto-search-worker-client.d.ts +33 -6
  59. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
  60. package/dist/hooks/magic-context/cache-busting-signals.d.ts +6 -2
  61. package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -1
  62. package/dist/hooks/magic-context/channel2-delivery.d.ts.map +1 -1
  63. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  64. package/dist/hooks/magic-context/compartment-runner-types.d.ts +5 -0
  65. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  66. package/dist/hooks/magic-context/compartment-trigger.d.ts +1 -1
  67. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  68. package/dist/hooks/magic-context/diagnostic-log-state.d.ts +4 -0
  69. package/dist/hooks/magic-context/diagnostic-log-state.d.ts.map +1 -0
  70. package/dist/hooks/magic-context/execute-reclaim.d.ts +35 -0
  71. package/dist/hooks/magic-context/execute-reclaim.d.ts.map +1 -0
  72. package/dist/hooks/magic-context/hook-handlers.d.ts.map +1 -1
  73. package/dist/hooks/magic-context/hook.d.ts +1 -3
  74. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  75. package/dist/hooks/magic-context/latest-assistant-turn.d.ts +8 -0
  76. package/dist/hooks/magic-context/latest-assistant-turn.d.ts.map +1 -1
  77. package/dist/hooks/magic-context/lkg-recovery-fence.d.ts +5 -0
  78. package/dist/hooks/magic-context/lkg-recovery-fence.d.ts.map +1 -1
  79. package/dist/hooks/magic-context/nudge-evaluation-log.d.ts +3 -0
  80. package/dist/hooks/magic-context/nudge-evaluation-log.d.ts.map +1 -0
  81. package/dist/hooks/magic-context/pending-drop-eligibility.d.ts.map +1 -1
  82. package/dist/hooks/magic-context/protected-tail-boundary.d.ts +4 -0
  83. package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -1
  84. package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts.map +1 -1
  85. package/dist/hooks/magic-context/served-shape-repair.d.ts +19 -0
  86. package/dist/hooks/magic-context/served-shape-repair.d.ts.map +1 -0
  87. package/dist/hooks/magic-context/strip-content.d.ts +4 -2
  88. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  89. package/dist/hooks/magic-context/system-date-refresh.d.ts +5 -5
  90. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  91. package/dist/hooks/magic-context/system-prompt-sticky-date.d.ts +10 -0
  92. package/dist/hooks/magic-context/system-prompt-sticky-date.d.ts.map +1 -0
  93. package/dist/hooks/magic-context/tag-content-primitives.d.ts +1 -1
  94. package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -1
  95. package/dist/hooks/magic-context/tag-messages.d.ts +4 -1
  96. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  97. package/dist/hooks/magic-context/text-complete.d.ts +1 -1
  98. package/dist/hooks/magic-context/text-complete.d.ts.map +1 -1
  99. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  100. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +21 -6
  101. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  102. package/dist/hooks/magic-context/transform.d.ts +2 -2
  103. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  104. package/dist/{index-3esx8tkf.js → index-11gzxvf4.js} +394 -125
  105. package/dist/{index-jn12fvvh.js → index-1gtfne2c.js} +3 -3
  106. package/dist/{index-jhghdnsm.js → index-1kbznkft.js} +521 -214
  107. package/dist/{index-3h4dp9wb.js → index-3svaejkh.js} +5 -5
  108. package/dist/{index-kee4kn5j.js → index-4pnsgvfk.js} +1 -1
  109. package/dist/{index-bjcnntmz.js → index-51rdvtkz.js} +501 -20
  110. package/dist/{v2/server-8cd2j99z.js → index-5kym00ag.js} +32 -13
  111. package/dist/{index-s74zqahq.js → index-66eby7hx.js} +4 -4
  112. package/dist/{index-63k48rv9.js → index-9q1g3c5q.js} +5 -5
  113. package/dist/{index-jrr131e0.js → index-a9zvn5fe.js} +29 -15
  114. package/dist/{index-c5pytzne.js → index-b88dwwrh.js} +1 -1
  115. package/dist/{index-nj7yykkx.js → index-c7phnbvk.js} +1 -1
  116. package/dist/index-cpjk5jd2.js +82 -0
  117. package/dist/{index-c1p88z1y.js → index-ffzhwfzy.js} +4 -4
  118. package/dist/{v2/server-beht37jy.js → index-gzy5w8ya.js} +194 -5
  119. package/dist/{index-j75v2476.js → index-h7tgn49j.js} +12 -15
  120. package/dist/{index-edmpdxcw.js → index-j32jj2t8.js} +5 -5
  121. package/dist/{index-ke416mdc.js → index-j76ah6d7.js} +2 -2
  122. package/dist/{index-s734jcsr.js → index-jfem3dgz.js} +9 -3
  123. package/dist/{index-n37sebck.js → index-jjvbk92s.js} +1 -1
  124. package/dist/{index-4911rn0b.js → index-jmq8kfe7.js} +6 -6
  125. package/dist/{index-rr2bb45z.js → index-kfyb3k6n.js} +2 -2
  126. package/dist/{index-2vxtcb95.js → index-kq5w68dp.js} +2 -2
  127. package/dist/{index-kq82mtg0.js → index-ksq50rg0.js} +3 -3
  128. package/dist/{index-b5vqckbw.js → index-m32esgmj.js} +314 -127
  129. package/dist/{index-9zcsy3hh.js → index-mnhcdfxg.js} +161 -13
  130. package/dist/{index-se4m2g6w.js → index-mnnkgq0q.js} +111 -19
  131. package/dist/{index-p5y3k4g7.js → index-nda0zgna.js} +2 -1
  132. package/dist/{index-wgypt3cs.js → index-nxrsns5x.js} +2466 -1290
  133. package/dist/{index-4s3t0nd0.js → index-qgh1qwjj.js} +2 -2
  134. package/dist/{index-y9f76s3f.js → index-rrv26qjz.js} +1 -1
  135. package/dist/{index-24fezq97.js → index-rxqr723x.js} +5 -5
  136. package/dist/{index-v10f1rjv.js → index-spwjbkc7.js} +1 -1
  137. package/dist/{index-dxmq29t1.js → index-syaazvy2.js} +182 -47
  138. package/dist/{index-k29z4aqh.js → index-t5pck3ss.js} +1 -1
  139. package/dist/{index-6x57ar45.js → index-wfybj1dw.js} +4 -6
  140. package/dist/{index-cf74k5ak.js → index-whcgcfrv.js} +9 -6
  141. package/dist/{index-a6mc0v4d.js → index-x6cbrv9h.js} +3 -3
  142. package/dist/{index-bp5083x2.js → index-x9k3mqrf.js} +1 -1
  143. package/dist/{index-rpxdjkm0.js → index-y76rhsnr.js} +319 -61
  144. package/dist/{index-ze7mvk54.js → index-zy67whjr.js} +95 -59
  145. package/dist/index.js +58 -54
  146. package/dist/{logger-jm3sqqzr.js → logger-94kew5wm.js} +1 -1
  147. package/dist/{message-fts-rowid-map-17s0dfn4.js → message-fts-rowid-map-e79b7b6x.js} +6 -5
  148. package/dist/{message-index-gtpqnj8w.js → message-index-4q8ek2fc.js} +17 -16
  149. package/dist/{message-index-bounded-zyc8h32y.js → message-index-bounded-rydsg9r5.js} +17 -16
  150. package/dist/{message-time-backfill-73mmm76q.js → message-time-backfill-4qva0b4f.js} +3 -3
  151. package/dist/migration-worker.js +13 -12
  152. package/dist/{model-resolution-nx97z3x7.js → model-resolution-280gmqvd.js} +1 -1
  153. package/dist/plugin/embedding-bootstrap.d.ts +4 -1
  154. package/dist/plugin/embedding-bootstrap.d.ts.map +1 -1
  155. package/dist/plugin/hooks/create-session-hooks.d.ts +1 -0
  156. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  157. package/dist/plugin/rpc-handlers.d.ts +8 -0
  158. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  159. package/dist/plugin/subagent-tool-policy.d.ts +9 -0
  160. package/dist/plugin/subagent-tool-policy.d.ts.map +1 -1
  161. package/dist/plugin/tool-registry.d.ts.map +1 -1
  162. package/dist/{project-embedding-registry-z74mhqkf.js → project-embedding-registry-hn529988.js} +16 -13
  163. package/dist/raw-ordinal-warmup-worker.js +136 -101
  164. package/dist/{read-session-chunk-jjb48bt9.js → read-session-chunk-t039f0m5.js} +12 -11
  165. package/dist/{read-session-raw-rsc8c7qy.js → read-session-raw-aw6jgvwg.js} +4 -3
  166. package/dist/recomp-orchestrator-hbm53jj5.js +62 -0
  167. package/dist/{safe-notification-target-1szv1k5k.js → safe-notification-target-mkr9yzvr.js} +2 -2
  168. package/dist/search-archive-weh164mh.js +26 -0
  169. package/dist/search-hea079d7.js +50 -0
  170. package/dist/{send-session-notification-6ve0e8p4.js → send-session-notification-gqzkz7da.js} +7 -6
  171. package/dist/shared/logger.d.ts.map +1 -1
  172. package/dist/shared/model-resolution.d.ts +2 -0
  173. package/dist/shared/model-resolution.d.ts.map +1 -1
  174. package/dist/shared/prompt-async-transport.d.ts +3 -0
  175. package/dist/shared/prompt-async-transport.d.ts.map +1 -1
  176. package/dist/shared/rpc-types.d.ts +7 -0
  177. package/dist/shared/rpc-types.d.ts.map +1 -1
  178. package/dist/shared/sqlite.d.ts +6 -1
  179. package/dist/shared/sqlite.d.ts.map +1 -1
  180. package/dist/shared/subagent-runner.d.ts +2 -0
  181. package/dist/shared/subagent-runner.d.ts.map +1 -1
  182. package/dist/shared/tag-transcript.d.ts +2 -0
  183. package/dist/shared/tag-transcript.d.ts.map +1 -1
  184. package/dist/shared/worker-shutdown.d.ts +68 -0
  185. package/dist/shared/worker-shutdown.d.ts.map +1 -0
  186. package/dist/shared/worker-shutdown.fixture.d.ts +2 -0
  187. package/dist/shared/worker-shutdown.fixture.d.ts.map +1 -0
  188. package/dist/{sqlite-zf72c52d.js → sqlite-zdgm52sv.js} +5 -1
  189. package/dist/{storage-memory-y3qmy00r.js → storage-memory-e6a7mb0k.js} +2 -2
  190. package/dist/{storage-tags-r7k9tjcv.js → storage-tags-a77q4v77.js} +5 -5
  191. package/dist/{task-config-x3qmayd2.js → task-config-t6bpyka7.js} +2 -2
  192. package/dist/tools/ctx-search/tools.d.ts.map +1 -1
  193. package/dist/tools/ctx-search/types.d.ts +1 -0
  194. package/dist/tools/ctx-search/types.d.ts.map +1 -1
  195. package/dist/{transform-postprocess-phase-jj99r7z2.js → transform-postprocess-phase-0b04tm1p.js} +35 -32
  196. package/dist/v2/auto-search-worker.js +48 -9
  197. package/dist/v2/chunk-embedding-write-worker.js +30 -23
  198. package/dist/v2/{compaction-marker-candidates-ebx3388k.js → compaction-marker-candidates-m4vmye3w.js} +3 -3
  199. package/dist/v2/compaction-marker-candidates-worker.js +2 -2
  200. package/dist/v2/compartment-chunk-embedding-8jjmcgeg.js +64 -0
  201. package/dist/v2/{context-y5yamxak.js → context-ea3x7smm.js} +1797 -810
  202. package/dist/v2/{derive-budgets-2zh4gm2c.js → derive-budgets-knf763tt.js} +3 -3
  203. package/dist/v2/embedding-backfill-5e74ae0m.js +24 -0
  204. package/dist/v2/embedding-worker-process.js +2 -2
  205. package/dist/v2/embedding-worker.js +6 -6
  206. package/dist/v2/hidden-child-record.d.ts +2 -0
  207. package/dist/v2/hidden-child-record.d.ts.map +1 -1
  208. package/dist/v2/hidden-completion.d.ts +2 -0
  209. package/dist/v2/hidden-completion.d.ts.map +1 -1
  210. package/dist/v2/hidden-model-activity.d.ts +7 -0
  211. package/dist/v2/hidden-model-activity.d.ts.map +1 -0
  212. package/dist/v2/{history-owner-42e16w0n.js → history-owner-ad0crnrn.js} +2 -2
  213. package/dist/v2/hooks/context.d.ts.map +1 -1
  214. package/dist/v2/hooks/copied-tag-notation.d.ts +1 -1
  215. package/dist/v2/hooks/copied-tag-notation.d.ts.map +1 -1
  216. package/dist/v2/hooks/dream-timer.d.ts +2 -0
  217. package/dist/v2/hooks/dream-timer.d.ts.map +1 -1
  218. package/dist/v2/hooks/embedding-lifecycle.d.ts +7 -0
  219. package/dist/v2/hooks/embedding-lifecycle.d.ts.map +1 -0
  220. package/dist/v2/hooks/generate.d.ts +36 -1
  221. package/dist/v2/hooks/generate.d.ts.map +1 -1
  222. package/dist/v2/hooks/lkg-system.d.ts +35 -4
  223. package/dist/v2/hooks/lkg-system.d.ts.map +1 -1
  224. package/dist/v2/hooks/payload.d.ts +16 -1
  225. package/dist/v2/hooks/payload.d.ts.map +1 -1
  226. package/dist/v2/hooks/store.d.ts +2 -0
  227. package/dist/v2/hooks/store.d.ts.map +1 -1
  228. package/dist/v2/hooks/tools.d.ts +2 -1
  229. package/dist/v2/hooks/tools.d.ts.map +1 -1
  230. package/dist/v2/hooks/transform-features.d.ts +2 -2
  231. package/dist/v2/hooks/transform-features.d.ts.map +1 -1
  232. package/dist/v2/{logger-7qt02bnb.js → logger-p34mjtja.js} +1 -1
  233. package/dist/v2/{message-fts-rowid-map-wfx67gfd.js → message-fts-rowid-map-n8fdg2ja.js} +6 -5
  234. package/dist/v2/{message-index-bounded-spd8r7pj.js → message-index-bounded-8rcd7qq9.js} +17 -16
  235. package/dist/v2/{message-index-8vz2pq76.js → message-index-qz9wdp82.js} +17 -16
  236. package/dist/v2/{message-time-backfill-04t0km1z.js → message-time-backfill-zvthw6xb.js} +3 -3
  237. package/dist/v2/migration-worker.js +13 -12
  238. package/dist/v2/{model-resolution-nx97z3x7.js → model-resolution-280gmqvd.js} +1 -1
  239. package/dist/v2/{project-embedding-registry-gnkj56xp.js → project-embedding-registry-v38q4xd5.js} +16 -13
  240. package/dist/v2/raw-ordinal-warmup-worker.js +136 -101
  241. package/dist/v2/{read-session-chunk-cwkxrmns.js → read-session-chunk-wazfyxcg.js} +12 -11
  242. package/dist/v2/{read-session-raw-yaegtjzh.js → read-session-raw-b70cpwzj.js} +4 -3
  243. package/dist/v2/recomp-orchestrator-b12zaptj.js +61 -0
  244. package/dist/v2/{safe-notification-target-qg7n2s77.js → safe-notification-target-khnzg57c.js} +2 -2
  245. package/dist/v2/search-archive-x64rtz1z.js +25 -0
  246. package/dist/v2/search-hza9x72a.js +49 -0
  247. package/dist/v2/{send-session-notification-3pxn658x.js → send-session-notification-8eqe259v.js} +7 -6
  248. package/dist/v2/{server-45q69hkq.js → server-132h8twc.js} +5 -5
  249. package/dist/v2/{server-h0410h0v.js → server-1bw1wcbp.js} +1 -1
  250. package/dist/v2/{server-271qxsf5.js → server-24g8r2d0.js} +2466 -1290
  251. package/dist/v2/{server-tbe1femw.js → server-29qp8nz4.js} +1 -1
  252. package/dist/v2/{server-gsxjv2q2.js → server-33nqbqkw.js} +182 -47
  253. package/dist/v2/{server-tgnbmwah.js → server-3mz2qh5a.js} +1 -1
  254. package/dist/v2/{server-n1prf1g6.js → server-3vhxy2k5.js} +2 -2
  255. package/dist/v2/{server-xj136kt8.js → server-4kjmrjn4.js} +9 -3
  256. package/dist/v2/{server-34kwfsr4.js → server-53eh1r8r.js} +2 -2
  257. package/dist/{index-8cd2j99z.js → v2/server-5kym00ag.js} +32 -13
  258. package/dist/v2/{server-46neh5fa.js → server-62g58aaz.js} +314 -127
  259. package/dist/v2/{server-f2xf5gcb.js → server-6495nmn9.js} +12 -15
  260. package/dist/v2/{server-a9xqj88f.js → server-6v3cdzsx.js} +4 -4
  261. package/dist/v2/{server-d04vrx0j.js → server-806rzhs6.js} +2 -2
  262. package/dist/v2/{server-qd11g795.js → server-92g7d776.js} +2 -1
  263. package/dist/v2/{server-nj659894.js → server-94wk1ey3.js} +14 -3
  264. package/dist/v2/{server-6tmj0s7j.js → server-ab1g0wn9.js} +4 -6
  265. package/dist/v2/{server-8by8qfec.js → server-ad18djzs.js} +95 -59
  266. package/dist/v2/{server-hy3d3vsx.js → server-bsgd4dk1.js} +2 -2
  267. package/dist/v2/server-cpjk5jd2.js +82 -0
  268. package/dist/v2/{server-g3qma5c0.js → server-d1dzgvwd.js} +2 -2
  269. package/dist/v2/{server-hm38q7r0.js → server-d48x3m4x.js} +5 -5
  270. package/dist/v2/{server-1wy7b9de.js → server-dtp8hcjh.js} +3 -3
  271. package/dist/v2/{server-27gq4mfz.js → server-fa7vtp40.js} +9 -6
  272. package/dist/v2/{server-6pmqg9m4.js → server-gyy4k6mf.js} +1 -1
  273. package/dist/{index-beht37jy.js → v2/server-gzy5w8ya.js} +194 -5
  274. package/dist/v2/{server-bmymkx73.js → server-j8h7bsca.js} +29 -15
  275. package/dist/v2/{server-n37sebck.js → server-jjvbk92s.js} +1 -1
  276. package/dist/v2/{server-da07v4xp.js → server-k3t06fxr.js} +1 -1
  277. package/dist/v2/{server-9hx7g5jp.js → server-m4bfaevz.js} +1197 -1049
  278. package/dist/v2/{server-2ar62dyx.js → server-ppcd1qxh.js} +191 -99
  279. package/dist/v2/{server-rmygf5pn.js → server-qjvk4a9t.js} +2 -2
  280. package/dist/v2/{server-zzkj2fch.js → server-qteg2kt9.js} +5 -5
  281. package/dist/v2/{server-pwv4ezb0.js → server-rqebawx1.js} +2 -2
  282. package/dist/v2/{server-h1v0pyxb.js → server-vr4szghm.js} +501 -20
  283. package/dist/v2/{server-xq7dfjke.js → server-wwaw5npa.js} +5 -5
  284. package/dist/v2/{server-6vdzn1td.js → server-zg5y109h.js} +323 -76
  285. package/dist/v2/server.js +8 -8
  286. package/dist/v2/{sqlite-zf72c52d.js → sqlite-zdgm52sv.js} +5 -1
  287. package/dist/v2/{storage-memory-y3qmy00r.js → storage-memory-e6a7mb0k.js} +2 -2
  288. package/dist/v2/{storage-tags-3wdb8zph.js → storage-tags-q71rnr9f.js} +5 -5
  289. package/dist/v2/store-reader.d.ts +10 -0
  290. package/dist/v2/store-reader.d.ts.map +1 -1
  291. package/dist/v2/{task-config-nvz8mapa.js → task-config-7md27rx8.js} +2 -2
  292. package/dist/v2/{wrapup-orchestrator-embdz8gj.js → wrapup-orchestrator-3ssd5yy1.js} +33 -32
  293. package/dist/wrapup-orchestrator-5vpcd1zx.js +49 -0
  294. package/package.json +2 -2
  295. package/src/config/index.test.ts +72 -6
  296. package/src/config/project-security.ts +15 -0
  297. package/src/config/rerank.test.ts +60 -0
  298. package/src/config/schema/magic-context.ts +57 -0
  299. package/src/shared/logger.test.ts +42 -1
  300. package/src/shared/logger.ts +11 -13
  301. package/src/shared/model-resolution.test.ts +67 -12
  302. package/src/shared/model-resolution.ts +43 -16
  303. package/src/shared/model-suggestion-retry.ts +2 -2
  304. package/src/shared/prompt-async-transport.ts +47 -3
  305. package/src/shared/rpc-types.ts +7 -0
  306. package/src/shared/sqlite-busy-budget-review.test.ts +6 -1
  307. package/src/shared/sqlite-turn-deadline.test.ts +270 -0
  308. package/src/shared/sqlite.ts +239 -9
  309. package/src/shared/subagent-runner.ts +2 -0
  310. package/src/shared/tag-transcript.ts +9 -1
  311. package/src/shared/worker-shutdown-fence.test.ts +87 -0
  312. package/src/shared/worker-shutdown.fixture.ts +25 -0
  313. package/src/shared/worker-shutdown.test.ts +127 -0
  314. package/src/shared/worker-shutdown.ts +160 -0
  315. package/dist/embedding-backfill-fmz50tsy.js +0 -24
  316. package/dist/recomp-orchestrator-999jj4bc.js +0 -61
  317. package/dist/search-archive-6vm0e2f5.js +0 -25
  318. package/dist/search-xsqk1bj4.js +0 -49
  319. package/dist/v2/embedding-backfill-7c7yr69y.js +0 -23
  320. package/dist/v2/recomp-orchestrator-f6m9jr7p.js +0 -60
  321. package/dist/v2/search-archive-wve3tq1k.js +0 -24
  322. package/dist/v2/search-hwg7jfbj.js +0 -48
  323. package/dist/wrapup-orchestrator-whhbjmaz.js +0 -48
@@ -7,9 +7,10 @@ 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
+ stripPersistedAssistantText,
13
14
  byteSize,
14
15
  stripTagPrefix,
15
16
  prependTag,
@@ -73,31 +74,37 @@ import {
73
74
  adoptNullOwnerToolTag2,
74
75
  getCandidateToolOwners2,
75
76
  pickNearestPriorOwner2
76
- } from "./index-cf74k5ak.js";
77
+ } from "./index-whcgcfrv.js";
77
78
  import {
78
79
  textMentionsRecentCommit,
79
80
  hasMeaningfulUserText2,
80
81
  estimateTokens
81
- } from "./index-c5pytzne.js";
82
+ } from "./index-b88dwwrh.js";
83
+ import {
84
+ getMagicContextStorageDir
85
+ } from "./index-g2q4htwp.js";
82
86
  import {
83
87
  log2,
84
88
  sessionLog2
85
- } from "./index-j75v2476.js";
89
+ } from "./index-h7tgn49j.js";
86
90
  import {
87
91
  inRootAsyncContext2,
88
92
  getTagIdentityWriteGeneration2,
89
93
  getSqliteDatabasePath2,
90
94
  assertTransformWrite2,
91
95
  isTransientSqliteError2
92
- } from "./index-beht37jy.js";
96
+ } from "./index-gzy5w8ya.js";
93
97
  import {
94
98
  getProjectEmbeddingSnapshot2,
95
99
  embedTextForProject2,
96
100
  embedBatchForProject2
97
- } from "./index-ze7mvk54.js";
101
+ } from "./index-zy67whjr.js";
102
+ import {
103
+ createWorkerShutdown
104
+ } from "./index-cpjk5jd2.js";
98
105
  import {
99
106
  runSessionWarmupWorker
100
- } from "./index-s734jcsr.js";
107
+ } from "./index-jfem3dgz.js";
101
108
  import {
102
109
  getMaxM0MutationId,
103
110
  getLastCompartmentEndMessage,
@@ -133,12 +140,12 @@ import {
133
140
  peekNoteNudgeText,
134
141
  markNoteNudgeDelivered,
135
142
  getActiveCompartmentRun
136
- } from "./index-rpxdjkm0.js";
143
+ } from "./index-y76rhsnr.js";
137
144
  import {
138
145
  BoundedSessionMap,
139
146
  cleanSearchText,
140
147
  matchedSearchSnippet
141
- } from "./index-se4m2g6w.js";
148
+ } from "./index-mnnkgq0q.js";
142
149
  import {
143
150
  stripSystemInjection,
144
151
  isTextPart,
@@ -208,12 +215,14 @@ import {
208
215
  replaySentinelByMessageIds,
209
216
  isInActiveAnthropicTurn,
210
217
  hasAnthropicReasoning,
218
+ prepareServedShapeRepair,
211
219
  stripSystemInjectedMessages,
212
220
  stripDroppedPlaceholderMessages,
213
221
  replayClearedReasoning,
214
222
  replayStrippedInlineThinking,
215
223
  clearOldReasoning,
216
224
  stripClearedReasoning,
225
+ captureInlineThinkingRepairs,
217
226
  stripInlineThinking,
218
227
  findReasoningBearingAssistantIds,
219
228
  findLatestAssistantReasoningMutationExemptMessage,
@@ -234,10 +243,10 @@ import {
234
243
  extractToolCallObservation,
235
244
  ToolMutationBatch,
236
245
  createToolDropTarget
237
- } from "./index-9zcsy3hh.js";
246
+ } from "./index-mnhcdfxg.js";
238
247
  import {
239
248
  isValidLanguageCode
240
- } from "./index-wgypt3cs.js";
249
+ } from "./index-nxrsns5x.js";
241
250
  import {
242
251
  isEmbeddingHostBusy2
243
252
  } from "./index-qt1qqasc.js";
@@ -245,10 +254,10 @@ import {
245
254
  openCodeDbExists,
246
255
  withReadOnlySessionDb,
247
256
  getMessageTimesFromOpenCodeDb
248
- } from "./index-kq82mtg0.js";
257
+ } from "./index-ksq50rg0.js";
249
258
  import {
250
259
  userFacingFailureCode
251
- } from "./index-3h4dp9wb.js";
260
+ } from "./index-3svaejkh.js";
252
261
  import {
253
262
  normalizeProtectedToolName,
254
263
  mergeProtectedTools
@@ -258,7 +267,7 @@ import {
258
267
  } from "./index-y8v6yerm.js";
259
268
  import {
260
269
  logSlowWriteTransaction
261
- } from "./index-k29z4aqh.js";
270
+ } from "./index-t5pck3ss.js";
262
271
 
263
272
  // src/features/magic-context/tagger.ts
264
273
  var TOOL_COMPOSITE_KEY_SEP = "\x00";
@@ -1243,7 +1252,8 @@ ${trimmedBody}…
1243
1252
  return wrapped;
1244
1253
  }
1245
1254
  function selectAutoSearchResults(results, threshold) {
1246
- return results.filter((result) => (result.relevanceScore ?? result.score) >= threshold);
1255
+ const relevance = (result) => result.relevanceScore ?? result.score;
1256
+ return results.filter((result) => relevance(result) >= threshold).sort((left, right) => relevance(right) - relevance(left));
1247
1257
  }
1248
1258
 
1249
1259
  // src/hooks/magic-context/auto-search-worker-client.ts
@@ -1336,22 +1346,42 @@ function retryUnpublishedAutoSearchNoHint(db, sessionId, messageId, startedAt) {
1336
1346
  }
1337
1347
  return true;
1338
1348
  }
1349
+
1350
+ class AutoSearchBusyError extends Error {
1351
+ constructor() {
1352
+ super("an earlier auto-search of this session is still running");
1353
+ this.name = "AutoSearchBusyError";
1354
+ }
1355
+ }
1339
1356
  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
- return executeAutoSearchWorker(db, sessionId, projectPath, query, options, entry, "search");
1357
+ const {
1358
+ rerankConfig: _rerankConfig,
1359
+ rerankClient: _rerankClient,
1360
+ rerankConnectionFile: _rerankConnectionFile,
1361
+ onRerankSkipped: _onRerankSkipped,
1362
+ captureRerankLanes: _captureRerankLanes,
1363
+ ...hintOptions
1364
+ } = options;
1365
+ return executeAutoSearchWorker(db, sessionId, projectPath, query, { ...hintOptions, explicitSearch: false, rerank: false }, entry, "search");
1341
1366
  }
1342
1367
  var pendingBackfills = new WeakMap;
1343
1368
  var searchWorkers = new WeakMap;
1344
1369
  var liveSearchWorkers = new Set;
1345
1370
  var MAX_IDLE_SEARCH_WORKERS = 4;
1346
1371
  var SEARCH_WORKER_IDLE_MS = 5 * 60000;
1372
+ var DETACHED_SEARCH_LIMIT_MS = 30000;
1373
+ var AUTO_SEARCH_WORKER_CLOSE_DEADLINE_MS = 2000;
1347
1374
  var workersCreated = 0;
1348
1375
  var workersReused = 0;
1376
+ var searchesSkippedBusy = 0;
1349
1377
  async function acquireSearchWorker(db, key, entry, input, signal) {
1350
1378
  const pool = searchWorkers.get(db) ?? new Map;
1351
1379
  searchWorkers.set(db, pool);
1352
1380
  while (!signal.aborted) {
1353
1381
  let slot = pool.get(key);
1354
1382
  if (slot?.busy) {
1383
+ if (input.job === "search" && (slot.detached || slot.busySessionId === input.sessionId))
1384
+ return "busy";
1355
1385
  const current = slot;
1356
1386
  await new Promise((resolve) => {
1357
1387
  const done = () => {
@@ -1360,6 +1390,8 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
1360
1390
  };
1361
1391
  signal.addEventListener("abort", done, { once: true });
1362
1392
  current.busy?.then(done);
1393
+ if (!current.detached)
1394
+ current.detachedSignal?.then(done);
1363
1395
  if (signal.aborted)
1364
1396
  done();
1365
1397
  });
@@ -1368,14 +1400,16 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
1368
1400
  const fresh = !slot;
1369
1401
  if (!slot) {
1370
1402
  const worker = inRootAsyncContext2(() => new Worker(entry, { workerData: { ...input, persistent: true } }));
1403
+ const shutdown = createWorkerShutdown(worker, "auto-search", AUTO_SEARCH_WORKER_CLOSE_DEADLINE_MS);
1371
1404
  slot = {
1372
1405
  worker,
1373
1406
  dispose() {
1407
+ this.disposed = true;
1374
1408
  clearTimeout(this.idleTimer);
1375
1409
  if (pool.get(key) === this)
1376
1410
  pool.delete(key);
1377
1411
  liveSearchWorkers.delete(this);
1378
- worker.terminate();
1412
+ shutdown.close();
1379
1413
  worker.unref();
1380
1414
  }
1381
1415
  };
@@ -1389,9 +1423,14 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
1389
1423
  workersReused++;
1390
1424
  clearTimeout(slot.idleTimer);
1391
1425
  const current = slot;
1426
+ current.busySessionId = input.sessionId;
1427
+ current.detached = false;
1392
1428
  current.busy = new Promise((resolve) => {
1393
1429
  current.release = resolve;
1394
1430
  });
1431
+ current.detachedSignal = new Promise((resolve) => {
1432
+ current.markDetached = resolve;
1433
+ });
1395
1434
  current.worker.ref();
1396
1435
  return { slot: current, fresh };
1397
1436
  }
@@ -1400,6 +1439,9 @@ async function acquireSearchWorker(db, key, entry, input, signal) {
1400
1439
  function queueAutoSearchBackfill(db, sessionId, projectPath, query) {
1401
1440
  if (isEmbeddingHostBusy2())
1402
1441
  return Promise.resolve();
1442
+ const snapshot = getProjectEmbeddingSnapshot2(projectPath);
1443
+ if (!snapshot?.enabled || !snapshot.features.memoryEnabled)
1444
+ return Promise.resolve();
1403
1445
  const key = `${sessionId}\x00${projectPath}`;
1404
1446
  const pending = pendingBackfills.get(db) ?? new Map;
1405
1447
  pendingBackfills.set(db, pending);
@@ -1447,6 +1489,7 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
1447
1489
  signal: deadlineSignal,
1448
1490
  readMessages: _readMessages,
1449
1491
  searchMessageHistory: _searchMessageHistory,
1492
+ stepTimings: _stepTimings,
1450
1493
  ...serializable
1451
1494
  } = options;
1452
1495
  const lifecycle = registerAutoSearchWork(sessionId);
@@ -1482,30 +1525,55 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
1482
1525
  lifecycle.done();
1483
1526
  return [];
1484
1527
  }
1528
+ if (lease === "busy") {
1529
+ lifecycle.done();
1530
+ searchesSkippedBusy++;
1531
+ throw new AutoSearchBusyError;
1532
+ }
1485
1533
  const { slot, fresh } = lease;
1486
1534
  const worker = slot.worker;
1535
+ const detachable = job === "search" && entry.href === defaultAutoSearchWorkerEntry().href;
1536
+ const startedAt = performance.now();
1537
+ let detachedAt;
1538
+ let ownerVectorMs;
1539
+ let abandonTimer;
1487
1540
  return new Promise((resolve, reject) => {
1488
1541
  let settled = false;
1489
- const finish = (results, error) => {
1542
+ let released = false;
1543
+ const settle = (results, error) => {
1490
1544
  if (settled)
1491
1545
  return;
1492
1546
  settled = true;
1547
+ if (error)
1548
+ reject(error);
1549
+ else
1550
+ resolve(results);
1551
+ };
1552
+ const release = (dispose) => {
1553
+ if (released)
1554
+ return;
1555
+ released = true;
1556
+ clearTimeout(abandonTimer);
1493
1557
  signal?.removeEventListener("abort", abort);
1494
1558
  lifecycle.signal.removeEventListener("abort", abort);
1495
1559
  lifecycle.done();
1496
1560
  worker.off("message", onMessage);
1497
1561
  worker.off("error", onError);
1498
1562
  worker.off("exit", onExit);
1499
- if (error || signal.aborted || entry.href !== defaultAutoSearchWorkerEntry().href)
1563
+ if (dispose || !detachable)
1500
1564
  slot.dispose();
1501
- else {
1565
+ else if (!slot.disposed) {
1502
1566
  slot.idleTimer = setTimeout(() => slot.dispose(), SEARCH_WORKER_IDLE_MS);
1503
1567
  slot.idleTimer.unref?.();
1504
1568
  }
1505
- const release = slot.release;
1569
+ const free = slot.release;
1506
1570
  slot.busy = undefined;
1507
1571
  slot.release = undefined;
1508
- release?.();
1572
+ slot.busySessionId = undefined;
1573
+ slot.detached = false;
1574
+ slot.detachedSignal = undefined;
1575
+ slot.markDetached = undefined;
1576
+ free?.();
1509
1577
  const reusable = liveSearchWorkers.delete(slot);
1510
1578
  if (reusable)
1511
1579
  liveSearchWorkers.add(slot);
@@ -1513,51 +1581,82 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
1513
1581
  for (const prior of idle.slice(0, Math.max(0, idle.length - MAX_IDLE_SEARCH_WORKERS)))
1514
1582
  prior.dispose();
1515
1583
  worker.unref();
1516
- if (error)
1517
- reject(error);
1518
- else
1519
- resolve(results);
1520
1584
  };
1521
- const abort = () => finish([]);
1585
+ const finish = (results, error) => {
1586
+ settle(results, error);
1587
+ release(Boolean(error) || signal.aborted);
1588
+ };
1589
+ const abort = () => {
1590
+ if (lifecycle.signal.aborted || !detachable) {
1591
+ finish([]);
1592
+ return;
1593
+ }
1594
+ if (settled)
1595
+ return;
1596
+ detachedAt = performance.now();
1597
+ slot.detached = true;
1598
+ slot.markDetached?.();
1599
+ settle([]);
1600
+ abandonTimer = setTimeout(() => {
1601
+ log2(`[auto-search] session ${sessionId}: search still running ${DETACHED_SEARCH_LIMIT_MS} ms after its deadline; disposing its worker (owner vector wait ${formatMs(ownerVectorMs)})`);
1602
+ release(true);
1603
+ }, DETACHED_SEARCH_LIMIT_MS);
1604
+ abandonTimer.unref?.();
1605
+ };
1522
1606
  signal?.addEventListener("abort", abort, { once: true });
1523
1607
  lifecycle.signal.addEventListener("abort", abort, { once: true });
1524
1608
  const onError = (error) => finish([], error);
1525
1609
  const onExit = (code) => finish([], new Error(`auto-search worker exited (${code})`));
1526
1610
  const onMessage = async (reply) => {
1527
- if (settled)
1611
+ if (released)
1528
1612
  return;
1529
- if (reply.kind === "result") {
1613
+ if (reply.kind === "result" || reply.kind === "error") {
1614
+ if (detachedAt !== undefined) {
1615
+ logLateSearch(sessionId, performance.now() - detachedAt, detachedAt - startedAt, ownerVectorMs, reply.kind === "result" ? reply.timings : undefined, reply.kind === "error");
1616
+ release(reply.kind === "error");
1617
+ return;
1618
+ }
1619
+ if (reply.kind === "error") {
1620
+ finish([], new Error(reply.error));
1621
+ return;
1622
+ }
1530
1623
  if (snapshot && getProjectEmbeddingSnapshot2(projectPath)?.generation !== snapshot.generation)
1531
1624
  finish([]);
1532
1625
  else
1533
1626
  finish(reply.results);
1534
1627
  return;
1535
1628
  }
1536
- if (reply.kind === "error") {
1537
- finish([], new Error(reply.error));
1538
- return;
1539
- }
1540
1629
  if (reply.kind === "messages" || reply.kind === "accepted")
1541
1630
  return;
1542
1631
  const response = { id: reply.id };
1543
- try {
1632
+ if (!signal.aborted) {
1633
+ const requestedAt = performance.now();
1634
+ try {
1635
+ if (reply.kind === "query")
1636
+ response.result = await (job === "backfill" ? embedTextForProject2(projectPath, reply.text, signal, "query") : boundedHintEmbedding(embedQuery, reply.text, signal)) ?? null;
1637
+ else {
1638
+ const passage = await embedBatchForProject2(projectPath, reply.texts, signal, reply.purpose);
1639
+ const current = getProjectEmbeddingSnapshot2(projectPath);
1640
+ response.passage = passage && current ? {
1641
+ ...passage,
1642
+ providerIdentity: current.providerIdentity,
1643
+ runtimeFingerprint: current.runtimeFingerprint,
1644
+ dimensions: passage.vectors.find((vector) => vector !== null)?.length ?? null
1645
+ } : null;
1646
+ }
1647
+ } catch (error) {
1648
+ response.error = error instanceof Error ? error.message : String(error);
1649
+ }
1544
1650
  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;
1651
+ ownerVectorMs = performance.now() - requestedAt;
1652
+ if (signal.aborted) {
1653
+ response.result = undefined;
1654
+ response.passage = undefined;
1655
+ response.error = undefined;
1555
1656
  }
1556
- } catch (error) {
1557
- response.error = error instanceof Error ? error.message : String(error);
1558
1657
  }
1559
1658
  response.embeddingHostBusy = isEmbeddingHostBusy2();
1560
- if (!settled && !signal?.aborted) {
1659
+ if (!released) {
1561
1660
  try {
1562
1661
  worker.postMessage(response);
1563
1662
  } catch (error) {
@@ -1579,6 +1678,15 @@ async function executeAutoSearchWorker(db, sessionId, projectPath, query, option
1579
1678
  }
1580
1679
  });
1581
1680
  }
1681
+ function formatMs(value) {
1682
+ return value === undefined ? "n/a" : `${Math.round(value)} ms`;
1683
+ }
1684
+ function logLateSearch(sessionId, lateMs, waitedMs, ownerVectorMs, timings, failed) {
1685
+ const steps = timings?.steps;
1686
+ const warm = timings?.lastPoolWarm;
1687
+ 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";
1688
+ 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}`);
1689
+ }
1582
1690
  async function boundedHintEmbedding(embed, text, signal) {
1583
1691
  const controller = new AbortController;
1584
1692
  const combined = AbortSignal.any([signal, controller.signal]);
@@ -1602,6 +1710,7 @@ function defaultAutoSearchWorkerEntry() {
1602
1710
  }
1603
1711
  var MESSAGE_WORKER_ACCEPT_TIMEOUT_MS = 400;
1604
1712
  var MESSAGE_WORKER_RESULT_TIMEOUT_MS = 30000;
1713
+ var MESSAGE_SEARCH_WORKER_CLOSE_DEADLINE_MS = 2000;
1605
1714
  var messageSearchWorkerFallbacks = new Map;
1606
1715
  function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWorkerEntry(), deadlines = {}) {
1607
1716
  const fallback = (reason, detail) => {
@@ -1629,6 +1738,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
1629
1738
  return new Promise((resolve) => {
1630
1739
  let settled = false;
1631
1740
  let worker;
1741
+ let shutdown;
1632
1742
  let deadline;
1633
1743
  const finish = (outcome, reason, detail) => {
1634
1744
  if (settled)
@@ -1637,7 +1747,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
1637
1747
  clearTimeout(deadline);
1638
1748
  if (reason)
1639
1749
  fallback(reason, detail);
1640
- worker?.terminate();
1750
+ shutdown?.close();
1641
1751
  worker?.unref();
1642
1752
  resolve(outcome);
1643
1753
  };
@@ -1648,6 +1758,7 @@ function searchMessageHistoryOffThread(db, request, entry = defaultAutoSearchWor
1648
1758
  };
1649
1759
  try {
1650
1760
  worker = inRootAsyncContext2(() => new Worker(entry, { workerData: input }));
1761
+ shutdown = createWorkerShutdown(worker, "message-search", MESSAGE_SEARCH_WORKER_CLOSE_DEADLINE_MS);
1651
1762
  } catch (error) {
1652
1763
  finish(null, "start-failed", error);
1653
1764
  return;
@@ -1916,7 +2027,8 @@ async function runAutoSearchHint(args) {
1916
2027
  },
1917
2028
  isEmbeddingRuntimeEnabled: () => embeddingEnabled === true,
1918
2029
  visibleMemoryIds: options.visibleMemoryIds ?? null,
1919
- sources: ["memory", "message", "git_commit"]
2030
+ sources: ["memory", "message", "git_commit"],
2031
+ chunkPoolWarmOnly: true
1920
2032
  };
1921
2033
  return searchAutoHint(db, sessionId, options.projectPath, rawPrompt, {
1922
2034
  ...searchOptions,
@@ -1927,6 +2039,11 @@ async function runAutoSearchHint(args) {
1927
2039
  } catch (error) {
1928
2040
  if (lifecycleSignal.aborted)
1929
2041
  return AUTO_SEARCH_OK;
2042
+ if (error instanceof AutoSearchBusyError) {
2043
+ sessionLog2(sessionId, "auto-search: an earlier search of this session is still running, skipping hint for this turn");
2044
+ persistAutoSearchSkip(db, sessionId, userMsgId);
2045
+ return { ok: false, kind: "timeout" };
2046
+ }
1930
2047
  log2(`[auto-search] unified search failed for session ${sessionId} (no-hint frozen for this turn): ${error instanceof Error ? error.message : String(error)}`);
1931
2048
  const outcome = await writeNoHintAndReconcile("error");
1932
2049
  return outcome.ok ? { ok: false, kind: "search-failure" } : outcome;
@@ -1976,7 +2093,7 @@ ${hintText}`;
1976
2093
  if (outcome.decision.decision === "hint") {
1977
2094
  appendReminderToUserMessageById(messages, userMsgId, outcome.decision.text);
1978
2095
  }
1979
- sessionLog2(sessionId, `auto-search: attached hint to ${userMsgId} (${results.length} fragments, top score ${results[0].score.toFixed(3)})`);
2096
+ sessionLog2(sessionId, `auto-search: attached hint to ${userMsgId} (${results.length} fragments, top relevance ${(results[0].relevanceScore ?? results[0].score).toFixed(3)})`);
1980
2097
  return AUTO_SEARCH_OK;
1981
2098
  } finally {
1982
2099
  if (!lifecycleSignal.aborted && results !== null)
@@ -2285,6 +2402,22 @@ function resolveTodowriteAvailability(sessionId) {
2285
2402
  return resolveToolAvailability(sessionId, TODOWRITE_TOOL);
2286
2403
  }
2287
2404
 
2405
+ // src/hooks/magic-context/diagnostic-log-state.ts
2406
+ var states = new BoundedSessionMap(1000);
2407
+ var scope = (sessionId) => `${getMagicContextStorageDir()}\x00${getHarness2()}\x00${sessionId}`;
2408
+ function diagnosticStateChanged(sessionId, category, state) {
2409
+ const key = scope(sessionId);
2410
+ const previous = states.get(key) ?? new Map;
2411
+ if (previous.get(category) === state)
2412
+ return false;
2413
+ previous.set(category, state);
2414
+ states.set(key, previous);
2415
+ return true;
2416
+ }
2417
+ function clearDiagnosticLogState(sessionId) {
2418
+ states.delete(scope(sessionId));
2419
+ }
2420
+
2288
2421
  // src/hooks/magic-context/cache-busting-signals.ts
2289
2422
  function canConsumeDeferredOnThisPass(args) {
2290
2423
  if (args.justAwaitedPublication)
@@ -2292,7 +2425,7 @@ function canConsumeDeferredOnThisPass(args) {
2292
2425
  return args.schedulerDecision === "execute" || args.contextPercentage >= (args.forceMaterializationPercentage ?? escalationBands(65).forceMaterializationPercentage);
2293
2426
  }
2294
2427
  function hasReclaimRide(signals) {
2295
- return signals.hardFold || signals.force || signals.explicitFlush || signals.publishedHistory || signals.subagentExecute === true;
2428
+ return signals.hardFold || signals.force || signals.explicitFlush || signals.publishedHistory || signals.subagentExecute === true || signals.executeReclaim === true || signals.servedShapeRepair === true;
2296
2429
  }
2297
2430
  function prefixMutationPermitted(gate) {
2298
2431
  return !gate.signedThinkingHold || gate.firstRender || gate.idleExpiry || gate.emergency;
@@ -2305,13 +2438,234 @@ var RECLAIM_RIDE_NAMES = [
2305
2438
  "force",
2306
2439
  "explicitFlush",
2307
2440
  "publishedHistory",
2308
- "subagentExecute"
2441
+ "subagentExecute",
2442
+ "executeReclaim",
2443
+ "servedShapeRepair"
2309
2444
  ];
2310
2445
  function reclaimRideLabel(signals) {
2311
2446
  const active = RECLAIM_RIDE_NAMES.filter((name) => signals[name]);
2312
2447
  return `ride=${active.length > 0 ? active.join("+") : "none"}`;
2313
2448
  }
2314
2449
 
2450
+ // src/hooks/magic-context/pending-drop-eligibility.ts
2451
+ function pendingDropVeto(tagNumber, target, protectedTagIds) {
2452
+ if (protectedTagIds.has(tagNumber))
2453
+ return "protected";
2454
+ if (target?.thinkingDropProtected)
2455
+ return "active_thinking";
2456
+ return null;
2457
+ }
2458
+ function capturePendingDropEligibility(targets, protectedTagIds) {
2459
+ const eligible = new Set;
2460
+ for (const [number, target] of targets) {
2461
+ if (pendingDropVeto(number, target, protectedTagIds))
2462
+ continue;
2463
+ if (target.drop) {
2464
+ if (target.canDrop?.() === true)
2465
+ eligible.add(number);
2466
+ } else {
2467
+ const content = target.getContent?.();
2468
+ const replacement = `[dropped §${number}§]`;
2469
+ if (typeof content === "string" && content.length > replacement.length && target.canSetContent?.(replacement) !== false)
2470
+ eligible.add(number);
2471
+ }
2472
+ }
2473
+ return eligible;
2474
+ }
2475
+ function pendingDropEligibilityKey(db, sessionId, input, protectionInputs) {
2476
+ const digests = input.map((message) => message.contentDigest?.() ?? null);
2477
+ if (digests.some((digest) => digest === null))
2478
+ return null;
2479
+ const revision = db.prepare("SELECT value FROM schema_migrations_meta WHERE key = ?").get(tagRevisionKey(sessionId));
2480
+ if (!revision?.value)
2481
+ return null;
2482
+ return JSON.stringify([
2483
+ input.map((message, index) => [
2484
+ message.id,
2485
+ message.role,
2486
+ message.synthetic,
2487
+ digests[index]
2488
+ ]),
2489
+ revision.value,
2490
+ readEpochFloorSnapshot(db, sessionId),
2491
+ sessionDecisionCalibration(db, sessionId).toolsRatio,
2492
+ loadProtectedTailMeta(db, sessionId),
2493
+ [...getMergedReasoningStrippedIds(db, sessionId)].sort(),
2494
+ [...getReasoningRemovalState(db, sessionId).messageIds].sort(),
2495
+ protectionInputs
2496
+ ]);
2497
+ }
2498
+ function createPendingDropEligibilityCache() {
2499
+ const sessions = new Map;
2500
+ return {
2501
+ read(sessionId, key) {
2502
+ const previous = sessions.get(sessionId);
2503
+ if (key === null || previous?.key !== key) {
2504
+ sessions.delete(sessionId);
2505
+ return;
2506
+ }
2507
+ return previous.eligible;
2508
+ },
2509
+ record(sessionId, key, eligible) {
2510
+ sessions.delete(sessionId);
2511
+ if (key === null)
2512
+ return;
2513
+ const oldest = sessions.keys().next().value;
2514
+ if (sessions.size >= 64 && oldest !== undefined)
2515
+ sessions.delete(oldest);
2516
+ sessions.set(sessionId, { key, eligible: new Set(eligible) });
2517
+ }
2518
+ };
2519
+ }
2520
+
2521
+ // src/hooks/magic-context/postprocess-read-cache.ts
2522
+ var connections = new WeakMap;
2523
+ function snapshot(db, sessionId) {
2524
+ const transaction = db;
2525
+ try {
2526
+ if (transaction.inTransaction || transaction.isTransaction) {
2527
+ connections.delete(db);
2528
+ return { version: -1, changes: -1 };
2529
+ }
2530
+ } catch {
2531
+ connections.delete(db);
2532
+ return { version: -1, changes: -1 };
2533
+ }
2534
+ let connection = connections.get(db);
2535
+ if (!connection) {
2536
+ connection = {
2537
+ stamp: db.prepare("SELECT total_changes() AS changes, data_version AS version FROM pragma_data_version"),
2538
+ sessions: new BoundedSessionMap(100)
2539
+ };
2540
+ connections.set(db, connection);
2541
+ }
2542
+ const stamp = connection.stamp.get();
2543
+ const previous = connection.sessions.get(sessionId);
2544
+ if (previous?.version === stamp.version && previous.changes === stamp.changes) {
2545
+ return previous;
2546
+ }
2547
+ const value = { ...stamp };
2548
+ connection.sessions.set(sessionId, value);
2549
+ return value;
2550
+ }
2551
+ function postprocessTailTags(db, sessionId) {
2552
+ const state = snapshot(db, sessionId);
2553
+ return state.tags ??= getTailHygieneTags2(db, sessionId);
2554
+ }
2555
+ function postprocessOldestTags(db, sessionId, protectedNumbers) {
2556
+ const state = snapshot(db, sessionId);
2557
+ const hints = state.hints;
2558
+ if (hints && hints.protectedNumbers.size === protectedNumbers.size && [...protectedNumbers].every((number) => hints.protectedNumbers.has(number))) {
2559
+ return hints.value;
2560
+ }
2561
+ const value = getOldestActiveUnprotectedToolTags2(db, sessionId, protectedNumbers);
2562
+ state.hints = { protectedNumbers: new Set(protectedNumbers), value };
2563
+ return value;
2564
+ }
2565
+ function postprocessReplaySnapshot(db, sessionId) {
2566
+ const state = snapshot(db, sessionId);
2567
+ const replay = state.replay ??= loadPostprocessReplaySnapshot(db, sessionId);
2568
+ return {
2569
+ ...replay,
2570
+ staleReduceStrippedIds: new Set(replay.staleReduceStrippedIds),
2571
+ processedImageStrippedIds: new Set(replay.processedImageStrippedIds),
2572
+ processedImageMarkers: new Map(replay.processedImageMarkers),
2573
+ strippedPlaceholderIds: new Set(replay.strippedPlaceholderIds),
2574
+ hiddenSeamPlaceholderIds: new Set(replay.hiddenSeamPlaceholderIds),
2575
+ mergedReasoningStrippedIds: new Set(replay.mergedReasoningStrippedIds),
2576
+ trailingBlankDecisions: new Map(replay.trailingBlankDecisions),
2577
+ noteNudgeAnchors: structuredClone(replay.noteNudgeAnchors),
2578
+ autoSearchHintDecisions: structuredClone(replay.autoSearchHintDecisions),
2579
+ todoSyntheticAnchor: structuredClone(replay.todoSyntheticAnchor),
2580
+ pendingCompactionMarker: structuredClone(replay.pendingCompactionMarker),
2581
+ compactionMarker: structuredClone(replay.compactionMarker)
2582
+ };
2583
+ }
2584
+
2585
+ // src/hooks/magic-context/execute-reclaim.ts
2586
+ var NAMESPACE = "executeReclaim";
2587
+ var failedWrites = new WeakMap;
2588
+ function readExecuteReclaimState(db, sessionId) {
2589
+ return parseState(postprocessReplaySnapshot(db, sessionId).executeReclaim);
2590
+ }
2591
+ function parseState(lane) {
2592
+ const value = lane;
2593
+ return {
2594
+ heldPasses: typeof value?.heldPasses === "number" ? Math.max(0, value.heldPasses) : 0,
2595
+ floorOrdinal: typeof value?.floorOrdinal === "number" ? value.floorOrdinal : null,
2596
+ floorPromptId: typeof value?.floorPromptId === "string" ? value.floorPromptId : null
2597
+ };
2598
+ }
2599
+ function writeExecuteReclaimState(db, sessionId, patch) {
2600
+ if (failedWrites.get(db)?.has(sessionId))
2601
+ return false;
2602
+ try {
2603
+ const current = readExecuteReclaimState(db, sessionId);
2604
+ if (JSON.stringify(current) === JSON.stringify({ ...current, ...patch }))
2605
+ return true;
2606
+ if (!updateReplayDocument(db, sessionId, (doc) => {
2607
+ const previous = parseState(doc[NAMESPACE]);
2608
+ const state = { ...previous, ...patch };
2609
+ if (JSON.stringify(previous) === JSON.stringify(state))
2610
+ return false;
2611
+ doc.version = 2;
2612
+ doc[NAMESPACE] = state;
2613
+ return true;
2614
+ }))
2615
+ throw new Error("Could not persist execute reclaim state");
2616
+ return true;
2617
+ } catch (error) {
2618
+ let failed = failedWrites.get(db);
2619
+ if (!failed)
2620
+ failedWrites.set(db, failed = new Set);
2621
+ failed.add(sessionId);
2622
+ sessionLog2(sessionId, `execute reclaim state persistence failed; retaining existing policy: ${String(error)}`);
2623
+ return false;
2624
+ }
2625
+ }
2626
+ function clearExecuteReclaimState(db, sessionId) {
2627
+ writeExecuteReclaimState(db, sessionId, {
2628
+ heldPasses: 0,
2629
+ floorOrdinal: null,
2630
+ floorPromptId: null
2631
+ });
2632
+ }
2633
+ function maintainExecuteFloorMark(db, sessionId, promptId, belowExecute) {
2634
+ failedWrites.get(db)?.delete(sessionId);
2635
+ const state = readExecuteReclaimState(db, sessionId);
2636
+ if (state.floorOrdinal !== null && (belowExecute || promptId !== null && promptId !== state.floorPromptId)) {
2637
+ writeExecuteReclaimState(db, sessionId, { floorOrdinal: null, floorPromptId: null });
2638
+ }
2639
+ }
2640
+ function estimateExecuteReclaimTokens(args) {
2641
+ const eligible = capturePendingDropEligibility(args.targets, args.protectedTagIds);
2642
+ const queued = new Set(args.pendingOps.filter((op) => op.operation === "drop").map((op) => op.tagId));
2643
+ const candidates = args.tags.filter((tag) => tag.status === "active" && queued.has(tag.tagNumber) && eligible.has(tag.tagNumber));
2644
+ const preparationTargets = new Map;
2645
+ for (const tag of candidates) {
2646
+ const target = args.targets.get(tag.tagNumber);
2647
+ if (target?.prepareDrop)
2648
+ preparationTargets.set(tag.tagNumber, target);
2649
+ }
2650
+ const prepared = preparationTargets.size === 0 ? new Set : args.probePreparation?.(preparationTargets) ?? new Set([...preparationTargets].filter(([, target]) => target.prepareDrop?.() !== false).map(([number]) => number));
2651
+ const seed = sessionDecisionCalibration(args.db, args.sessionId);
2652
+ return candidates.reduce((total, tag) => {
2653
+ if (preparationTargets.has(tag.tagNumber) && !prepared.has(tag.tagNumber))
2654
+ return total;
2655
+ const ratio = tag.type === "tool" ? seed.toolsRatio : seed.proseRatio;
2656
+ return total + Math.max(0, (tag.tokenCount ?? Math.ceil(tag.byteSize / 4)) * ratio);
2657
+ }, 0);
2658
+ }
2659
+ function originateExecuteReclaim(args) {
2660
+ if (failedWrites.get(args.db)?.has(args.sessionId))
2661
+ return false;
2662
+ const state = readExecuteReclaimState(args.db, args.sessionId);
2663
+ const heldPasses = args.primaryExecute && args.reclaimableTokens > 0 && !args.alreadyBusting ? state.heldPasses + 1 : 0;
2664
+ if (!writeExecuteReclaimState(args.db, args.sessionId, { heldPasses }))
2665
+ return false;
2666
+ return args.primaryExecute && !args.alreadyBusting && !args.summaryCanCome && args.reclaimableTokens > 0 && (args.usableWindow > 0 && args.reclaimableTokens >= args.usableWindow * 0.02 || heldPasses >= 3);
2667
+ }
2668
+
2315
2669
  // src/hooks/magic-context/reasoning-budget-status.ts
2316
2670
  var sources = new Map;
2317
2671
  function captureOpencodeReasoningBudgetStatus(sessionId, messages, budget, prefixBound, proseRatio = 1) {
@@ -2594,6 +2948,9 @@ function latestAssistantTurnStart(messages) {
2594
2948
  function latestAssistantTurnMessages(messages) {
2595
2949
  return new Set(messages.slice(latestAssistantTurnStart(messages)));
2596
2950
  }
2951
+ function isAnthropicThinkingPart(part, familyRoute) {
2952
+ return isRecord(part) && THINKING_TYPES.has(String(part.type ?? part.kind)) && (familyRoute || isRecord(part.metadata) && isRecord(part.metadata.anthropic));
2953
+ }
2597
2954
  function hasActiveAnthropicThinkingTurn(messages, provider, model) {
2598
2955
  const familyRoute = isAnthropicFamilyRoute(provider, model);
2599
2956
  for (const message of messages.slice(latestAssistantTurnStart(messages))) {
@@ -2602,7 +2959,7 @@ function hasActiveAnthropicThinkingTurn(messages, provider, model) {
2602
2959
  const parts = content(message);
2603
2960
  if (!Array.isArray(parts))
2604
2961
  continue;
2605
- if (parts.some((part) => isRecord(part) && THINKING_TYPES.has(String(part.type ?? part.kind)) && (familyRoute || isRecord(part.metadata) && isRecord(part.metadata.anthropic))))
2962
+ if (parts.some((part) => isAnthropicThinkingPart(part, familyRoute)))
2606
2963
  return true;
2607
2964
  }
2608
2965
  return false;
@@ -2678,14 +3035,14 @@ function retainedActiveThinkingParts(args) {
2678
3035
  }
2679
3036
 
2680
3037
  // src/features/magic-context/storage-caveman-rules.ts
2681
- var NAMESPACE = "caveman";
3038
+ var NAMESPACE2 = "caveman";
2682
3039
  var CURRENT_RULES_VERSION = 2;
2683
3040
  var ORIGINAL_RULES = {
2684
3041
  currentRules: false,
2685
3042
  englishWordRules: true,
2686
3043
  legacyReasoningTags: new Set
2687
3044
  };
2688
- function parseState(lane) {
3045
+ function parseState2(lane) {
2689
3046
  if (!isRecord(lane) || lane.rules !== CURRENT_RULES_VERSION)
2690
3047
  return ORIGINAL_RULES;
2691
3048
  const tags = Array.isArray(lane.legacyReasoningTags) ? lane.legacyReasoningTags : [];
@@ -2697,7 +3054,7 @@ function parseState(lane) {
2697
3054
  }
2698
3055
  function getCavemanReplayState(db, sessionId) {
2699
3056
  try {
2700
- return parseState(readReplayEnvelope(db, sessionId)[NAMESPACE]);
3057
+ return parseState2(readReplayEnvelope(db, sessionId)[NAMESPACE2]);
2701
3058
  } catch (error) {
2702
3059
  if (error instanceof ReplayDocumentError)
2703
3060
  return ORIGINAL_RULES;
@@ -2707,11 +3064,11 @@ function getCavemanReplayState(db, sessionId) {
2707
3064
  function recordCavemanCurrentRules(db, sessionId, englishWordRules, legacyReasoningTags) {
2708
3065
  const tags = [...new Set(legacyReasoningTags)].sort((a, b) => a - b);
2709
3066
  const persisted = updateReplayDocument(db, sessionId, (doc) => {
2710
- const current = parseState(doc[NAMESPACE]);
3067
+ const current = parseState2(doc[NAMESPACE2]);
2711
3068
  if (current.currentRules && current.englishWordRules === englishWordRules)
2712
3069
  return false;
2713
3070
  doc.version = 2;
2714
- doc[NAMESPACE] = {
3071
+ doc[NAMESPACE2] = {
2715
3072
  rules: CURRENT_RULES_VERSION,
2716
3073
  legacyReasoningTags: current.currentRules ? [...current.legacyReasoningTags].sort((a, b) => a - b) : tags,
2717
3074
  ...englishWordRules ? {} : { englishWordRules: false }
@@ -2925,93 +3282,23 @@ function degradedPassError(site, error) {
2925
3282
  return new DegradedPassRefusalError(site, { cause: error });
2926
3283
  }
2927
3284
 
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
3285
  // src/features/magic-context/storage-host-instruction-retention.ts
2999
- var NAMESPACE2 = "hostInstructionRetention";
3286
+ var NAMESPACE3 = "hostInstructionRetention";
3000
3287
  var enabled = true;
3001
3288
  function hostInstructionRetentionEnabled() {
3002
3289
  return enabled;
3003
3290
  }
3004
3291
  function isHostInstructionRetentionOn(db, sessionId) {
3005
- const lane = readReplayEnvelope(db, sessionId)[NAMESPACE2];
3292
+ const lane = readReplayEnvelope(db, sessionId)[NAMESPACE3];
3006
3293
  return typeof lane === "object" && lane !== null && lane.on === true;
3007
3294
  }
3008
3295
  function markHostInstructionRetention(db, sessionId) {
3009
3296
  return updateReplayDocument(db, sessionId, (doc) => {
3010
- const lane = doc[NAMESPACE2];
3297
+ const lane = doc[NAMESPACE3];
3011
3298
  if (typeof lane === "object" && lane !== null && lane.on === true)
3012
3299
  return false;
3013
3300
  doc.version = 2;
3014
- doc[NAMESPACE2] = { on: true };
3301
+ doc[NAMESPACE3] = { on: true };
3015
3302
  return true;
3016
3303
  });
3017
3304
  }
@@ -3301,12 +3588,16 @@ function applyPendingOperations(sessionId, db, targets, protectedTagIds, preload
3301
3588
  }
3302
3589
  } else if (target) {
3303
3590
  const replacement = buildReplacementContent(pendingOp.tagId);
3591
+ if (target.canSetContent?.(replacement) === false) {
3592
+ reject("content_unchanged");
3593
+ continue;
3594
+ }
3304
3595
  persistDrop();
3305
3596
  mutations.push(() => {
3306
3597
  const priorContent = target.getContent?.();
3307
3598
  const changed = target.setContent(replacement);
3308
- record(changed);
3309
3599
  if (changed) {
3600
+ record(true);
3310
3601
  const originalCharacters = typeof priorContent === "string" ? priorContent.length : tagById.get(pendingOp.tagId)?.byteSize ?? replacement.length;
3311
3602
  onTagReduced?.({
3312
3603
  tagNumber: pendingOp.tagId,
@@ -3877,70 +4168,6 @@ function isVisibleNoteReadPart(part) {
3877
4168
  return false;
3878
4169
  }
3879
4170
 
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
4171
  // src/hooks/magic-context/strict-thinking-prefix.ts
3945
4172
  function servedPrefixMatches(args) {
3946
4173
  const heads = args.messages?.slice(0, 2);
@@ -4731,7 +4958,7 @@ function tagMessages(sessionId, messages, tagger, db, options = {}) {
4731
4958
  const textPart = part;
4732
4959
  const thinkingParts = messageThinkingParts;
4733
4960
  const contentId = `${messageId}:p${partIndex}`;
4734
- const whitespaceOnlyAssistant = message.info.role === "assistant" && stripTagPrefix(textPart.text).trim().length === 0;
4961
+ const whitespaceOnlyAssistant = message.info.role === "assistant" && (stripTagPrefix(textPart.text).trim().length === 0 || textPart.text.includes("§") && stripPersistedAssistantText(textPart.text).length === 0);
4735
4962
  let existingTagId;
4736
4963
  if (whitespaceOnlyAssistant) {
4737
4964
  const persistedWhitespaceTag = getTagNumberByMessageId2(db, sessionId, contentId);
@@ -4783,7 +5010,7 @@ function tagMessages(sessionId, messages, tagger, db, options = {}) {
4783
5010
  accAssignTag += performance.now() - _tAssignText;
4784
5011
  const persistedSource = sourceContents.get(tagId);
4785
5012
  if (persistedSource !== undefined && !options.refreshSourceContents) {
4786
- textPart.text = options.normalizeRestoredAssistantText && message.info.role === "assistant" ? options.normalizeRestoredAssistantText(persistedSource) : persistedSource;
5013
+ textPart.text = options.normalizeRestoredAssistantText && message.info.role === "assistant" ? options.normalizeRestoredAssistantText(persistedSource, message.info.providerID) : persistedSource;
4787
5014
  } else {
4788
5015
  const sourceContent = stripTagPrefix(textPart.text);
4789
5016
  if (sourceContent.trim().length > 0 || options.refreshSourceContents) {
@@ -4812,6 +5039,10 @@ function tagMessages(sessionId, messages, tagger, db, options = {}) {
4812
5039
  dropReasoningParts: thinkingParts,
4813
5040
  mutationParts: [{ message, part: textPart }],
4814
5041
  textPrefix: skipPrefixInjection ? "" : prependTag(tagId, ""),
5042
+ canSetContent: (content) => {
5043
+ const partialEnd = messageId ? getPartialEnds().get(messageId) : undefined;
5044
+ return textPart.text !== content && (partialEnd === undefined || partIndex <= partialEnd);
5045
+ },
4815
5046
  setContent: (content, options) => {
4816
5047
  if (textPart.text === content)
4817
5048
  return false;
@@ -5118,6 +5349,25 @@ function proactiveStripStartIndex(args) {
5118
5349
  return divergence;
5119
5350
  return divergence ?? lastServed.messages.length;
5120
5351
  }
5352
+ function servesThinkingBlock2(messages, providerID, modelID) {
5353
+ const familyRoute = isAnthropicFamilyRoute(providerID, modelID);
5354
+ for (const message of messages) {
5355
+ if (message.info.role !== "assistant")
5356
+ continue;
5357
+ for (const part of message.parts) {
5358
+ if (!isAnthropicThinkingPart(part, familyRoute) || part.ignored === true)
5359
+ continue;
5360
+ if (part.type === "redacted_thinking")
5361
+ return true;
5362
+ if (typeof part.text === "string" && part.text !== "")
5363
+ return true;
5364
+ const records = isRecord(part.metadata) ? Object.values(part.metadata) : [];
5365
+ if (records.some((record) => isRecord(record) && record.redactedData !== undefined))
5366
+ return true;
5367
+ }
5368
+ }
5369
+ return false;
5370
+ }
5121
5371
  function isPartDroppedBeforeWire(part, providerID) {
5122
5372
  if (!modelAcceptsEmptyContent(providerID) || !isRecord(part))
5123
5373
  return false;
@@ -5647,6 +5897,9 @@ async function runPostTransformPhase2(args) {
5647
5897
  }
5648
5898
  };
5649
5899
  const trailingBlankSourceDecisions = args.trailingBlankSourceDecisions ?? snapshotTrailingBlankSourceDecisions(args.messages);
5900
+ if (!modelAcceptsEmptyContent(args.resolvedProviderID) && !compactionOff)
5901
+ captureInlineThinkingRepairs(args.messages, args.messageTagNumbers, args.sessionMeta?.clearedReasoningThroughTag ?? 0);
5902
+ const servedShapeRepair = prepareServedShapeRepair(args.db, args.sessionId, args.messages, args.readLastServedMessages, compactionOff ? undefined : postprocessReplaySnapshot(args.db, args.sessionId));
5650
5903
  let trailingBlankNewestAssistant;
5651
5904
  for (let index = args.messages.length - 1;index >= 0; index -= 1) {
5652
5905
  const message = args.messages[index];
@@ -5676,8 +5929,8 @@ async function runPostTransformPhase2(args) {
5676
5929
  }
5677
5930
  const activeCompartmentRun = args.canRunCompartments ? getActiveCompartmentRun(args.sessionId) : undefined;
5678
5931
  const compartmentRunning = args.canRunCompartments && !args.awaitedCompartmentRun && activeCompartmentRun !== undefined;
5679
- let deferredMaterialize = args.canConsumeDeferredLate && deferredMaterializationWasPending;
5680
- let materializationRequested = isExplicitFlush || deferredMaterialize;
5932
+ let deferredMaterialize = (args.canConsumeDeferredLate || servedShapeRepair.needsRebuild) && deferredMaterializationWasPending;
5933
+ let materializationRequested = isExplicitFlush || deferredMaterialize || servedShapeRepair.needsRebuild;
5681
5934
  const m0M1EnabledForFold = args.m0M1 !== undefined && (!!args.m0M1.projectPath || !!args.m0M1.projectDirectory) && (args.fullFeatureMode || compactionOff);
5682
5935
  const frozenThinking = new Set(args.activeThinkingTurn || compactionOff ? getMergedReasoningStrippedIds(args.db, args.sessionId) : []);
5683
5936
  const compactionOffFrozenThinking = compactionOff ? compactionOffFrozenThinkingIds(frozenThinking) : new Set;
@@ -5720,6 +5973,8 @@ async function runPostTransformPhase2(args) {
5720
5973
  if (stripOffWire)
5721
5974
  for (const id of stripped.strip?.messageIds ?? [])
5722
5975
  compactionOffFrozenThinking.add(id);
5976
+ for (const id of stripped.strip?.messageIds ?? [])
5977
+ bindingThinking.add(id);
5723
5978
  retainedThinking.clear();
5724
5979
  protectedThinkingMessages.clear();
5725
5980
  activeThinkingTurn = false;
@@ -5729,9 +5984,15 @@ async function runPostTransformPhase2(args) {
5729
5984
  rewritingSignedPrefix = true;
5730
5985
  thinkingReleasedForFit ||= forFit;
5731
5986
  };
5987
+ if (servedShapeRepair.needsRebuild && activeThinkingTurn)
5988
+ releaseThinkingForRewrite(false, true);
5732
5989
  if (args.forceSignedRebuildForFit && (activeThinkingPrefixHold || activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true)) {
5733
5990
  releaseThinkingForRewrite(true);
5734
5991
  }
5992
+ if (args.compactionModeTransition === true && args.thinkingBindingRecoveryEnabledForModel === true) {
5993
+ sessionLog2(args.sessionId, "compaction mode switch: stripping signed thinking");
5994
+ releaseThinkingForRewrite(false, true);
5995
+ }
5735
5996
  const foldDueDecision = m0M1EnabledForFold && args.m0M1 && !freezeM0M1 ? mustMaterialize({
5736
5997
  db: args.db,
5737
5998
  sessionId: args.sessionId,
@@ -5756,7 +6017,7 @@ async function runPostTransformPhase2(args) {
5756
6017
  let foldBustsServedPrefixThisPass = false;
5757
6018
  let publishedM1RefreshedThisPass = false;
5758
6019
  let prefixPreflightFailed = false;
5759
- const softRefreshOpportunity = !freezeM0M1 && (args.schedulerDecision === "execute" || deferredMaterialize);
6020
+ const softRefreshOpportunity = !freezeM0M1 && (args.schedulerDecision === "execute" || deferredMaterialize || servedShapeRepair.needsRebuild);
5760
6021
  let m0RematerializedThisPass = false;
5761
6022
  const m0CoverageBeforeFold = args.sessionMeta.cachedM0Bytes === null ? -1 : args.sessionMeta.cachedM0MaxCompartmentSeq;
5762
6023
  let m0MaterializeReason = null;
@@ -5771,6 +6032,7 @@ async function runPostTransformPhase2(args) {
5771
6032
  };
5772
6033
  if ((foldDueDecision.value || softRefreshOpportunity || firstRenderBust && activeThinkingPrefixHold) && m0M1EnabledForFold && args.m0M1) {
5773
6034
  let committedFoldBustsServedPrefix;
6035
+ let committedFoldChangesHead;
5774
6036
  try {
5775
6037
  const previousM1 = args.sessionMeta.cachedM1Bytes?.toString("utf8");
5776
6038
  const foldResult = injectM0M1({
@@ -5800,6 +6062,12 @@ async function runPostTransformPhase2(args) {
5800
6062
  m1Text: rendered.m1Bytes.toString(),
5801
6063
  muralDataUrl: rendered.muralDataUrl
5802
6064
  }) : foldBustsServedPrefix(foldDueDecision.reason, servedPrefixBeforeFold, rendered);
6065
+ committedFoldChangesHead = firstRenderBust ? !servedPrefixMatches({
6066
+ messages: servedBeforeFirstRender,
6067
+ m0Text: rendered.m0Bytes.toString(),
6068
+ m1Text: rendered.m1Bytes.toString(),
6069
+ muralDataUrl: rendered.muralDataUrl
6070
+ }) : foldChangesServedPrefix(servedPrefixBeforeFold, rendered);
5803
6071
  if (bustsPrefix) {
5804
6072
  if (!conversions.isCurrent(db)) {
5805
6073
  throw new MaterializeContentionError({
@@ -5818,6 +6086,9 @@ async function runPostTransformPhase2(args) {
5818
6086
  preparedPrefix = foldResult;
5819
6087
  if (activeThinkingPrefixHold && firstRenderBust && committedFoldBustsServedPrefix) {
5820
6088
  releaseThinkingForRewrite(false, true);
6089
+ } else if (compactionOff && !activeThinkingPrefixHold && args.thinkingBindingRecoveryEnabledForModel === true && committedFoldChangesHead) {
6090
+ sessionLog2(args.sessionId, "compaction-off fold changed the head: stripping signed thinking");
6091
+ releaseThinkingForRewrite(false, true);
5821
6092
  }
5822
6093
  prefixPreflightFailed = foldResult.materializationContentionRetryExhausted === true;
5823
6094
  foldExecutedThisPass = foldExecutesThisPass(foldDueDecision.value || softRefreshOpportunity, foldResult.m0RematerializedThisPass);
@@ -5875,21 +6146,43 @@ async function runPostTransformPhase2(args) {
5875
6146
  const heldIdleExpiryRebuild = activeThinkingPrefixHold && args.m0M1?.hardSignals?.cacheExpired === true;
5876
6147
  const idleExpiryRebuild = (!freezeM0M1 || activeThinkingPrefixHold) && args.m0M1?.hardSignals?.cacheExpired === true;
5877
6148
  const rideSignals = {
6149
+ servedShapeRepair: servedShapeRepair.needsRebuild,
6150
+ executeReclaim: false,
5878
6151
  subagentExecute: !args.fullFeatureMode && args.schedulerDecision === "execute",
5879
6152
  hardFold: rewritingSignedPrefix || foldBustsServedPrefixThisPass || firstRenderBust || idleExpiryRebuild,
5880
6153
  force: emergencyDropEligible && (args.contextUsage.percentage >= 95 || args.contextUsageFromEstimate !== true && getEmergencyInputSample(args.db, args.sessionId) === 0),
5881
6154
  explicitFlush: isExplicitFlush && hasPendingMaterializationOrigin(args.pendingMaterializationSessions, args.sessionId, "user_flush"),
5882
6155
  publishedHistory: !prefixPreflightFailed && (publishedM1RefreshedThisPass || !m0M1EnabledForFold && (args.pendingCompartmentInjection?.compartmentCount ?? 0) > 0 && legacyPublishedHeadChanged(args))
5883
6156
  };
5884
- const publishedWorkDrainAllowed = !compactionOff && reclaimRidePermitted(rideSignals, {
6157
+ const protectedToolTags = protectedToolTagNumbers(args.tags, args.protectedTools);
6158
+ rideSignals.executeReclaim = !compactionOff && originateExecuteReclaim({
6159
+ db: args.db,
6160
+ sessionId: args.sessionId,
6161
+ primaryExecute: args.fullFeatureMode && args.schedulerDecision === "execute" && args.contextUsage.percentage < args.forceMaterializationPercentage,
6162
+ alreadyBusting: Object.values(rideSignals).some(Boolean) || args.historyRebuiltThisPass,
6163
+ 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,
6164
+ reclaimableTokens: estimateExecuteReclaimTokens({
6165
+ db: args.db,
6166
+ sessionId: args.sessionId,
6167
+ pendingOps,
6168
+ tags: args.tags,
6169
+ targets: newTargets,
6170
+ protectedTagIds: new Set([...args.protectedTagIds, ...protectedToolTags])
6171
+ }),
6172
+ usableWindow: args.usableWindow
6173
+ });
6174
+ const publishedWorkDrainAllowed = (!compactionOff || servedShapeRepair.needsRebuild) && reclaimRidePermitted(rideSignals, {
5885
6175
  signedThinkingHold: activeThinkingPrefixHold,
5886
6176
  firstRender: firstRenderBust,
5887
6177
  idleExpiry: idleExpiryRebuild,
5888
6178
  emergency: emergencyDropEligible
5889
6179
  });
5890
- const shouldApplyPendingOps = publishedWorkDrainAllowed;
5891
- const shouldRunHeuristics = publishedWorkDrainAllowed && (rideSignals.publishedHistory || materializationRequested || forceMaterialization || foldBustsServedPrefixThisPass || firstRenderBust || heldIdleExpiryRebuild || emergencyDropEligible || args.schedulerDecision === "execute" && (!alreadyRanThisTurn || !args.fullFeatureMode));
6180
+ const shouldApplyPendingOps = !compactionOff && publishedWorkDrainAllowed;
6181
+ const shouldRunHeuristics = !compactionOff && publishedWorkDrainAllowed && (rideSignals.publishedHistory || rideSignals.executeReclaim || rideSignals.servedShapeRepair || materializationRequested || forceMaterialization || foldBustsServedPrefixThisPass || firstRenderBust || heldIdleExpiryRebuild || emergencyDropEligible || args.schedulerDecision === "execute" && (!alreadyRanThisTurn || !args.fullFeatureMode));
5892
6182
  const isCacheBustingPass = publishedWorkDrainAllowed;
6183
+ if (servedShapeRepair.needsRebuild && !isCacheBustingPass)
6184
+ throw new Error("Served-shape repair requires a rebuilding pass");
6185
+ servedShapeRepair.apply(isCacheBustingPass);
5893
6186
  let unheldSignedTurnBust = false;
5894
6187
  if (isCacheBustingPass && !activeThinkingPrefixHold && activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true) {
5895
6188
  if (foldBustsServedPrefixThisPass || firstRenderBust || publishedM1RefreshedThisPass)
@@ -5980,17 +6273,28 @@ async function runPostTransformPhase2(args) {
5980
6273
  throw new EmergencyFailClosedError("Magic Context could not read its saved reasoning-removal state for this session", { cause: error });
5981
6274
  }
5982
6275
  }
6276
+ const heuristicsLogChanged = diagnosticStateChanged(args.sessionId, "heuristics", JSON.stringify([
6277
+ args.currentTurnId,
6278
+ shouldRunHeuristics,
6279
+ shouldRunHeuristics ? null : args.schedulerDeferReason
6280
+ ]));
6281
+ const pendingLogChanged = diagnosticStateChanged(args.sessionId, "pending-ops", JSON.stringify([
6282
+ args.currentTurnId,
6283
+ shouldApplyPendingOps,
6284
+ shouldApplyPendingOps ? null : args.schedulerDeferReason,
6285
+ shouldApplyPendingOps ? null : (getPendingOpsCount(args.db, args.sessionId) ?? 0) > 0
6286
+ ]));
5983
6287
  if (shouldRunHeuristics) {
5984
6288
  const subagentRerun = !args.fullFeatureMode && alreadyRanThisTurn && args.schedulerDecision === "execute" && !isExplicitFlush && !forceMaterialization;
5985
6289
  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
6290
  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) {
6291
+ } else if (heuristicsLogChanged && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
5988
6292
  sessionLog2(args.sessionId, `heuristics WILL NOT RUN — reason=${args.schedulerDeferReason}`);
5989
6293
  }
5990
6294
  if (alreadyRanThisTurn && args.schedulerDecision === "execute" && !materializationRequested && args.fullFeatureMode) {
5991
6295
  sessionLog2(args.sessionId, `transform: skipping heuristics (already ran for turn ${args.currentTurnId})`);
5992
6296
  }
5993
- if (!shouldApplyPendingOps && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
6297
+ if (!shouldApplyPendingOps && pendingLogChanged && args.schedulerDeferReason !== undefined && args.schedulerDeferReason !== null) {
5994
6298
  sessionLog2(args.sessionId, `pending ops WILL NOT APPLY — reason=${args.schedulerDeferReason} pendingOps=${formatPendingOpsDepth()} context=${args.contextUsage.percentage.toFixed(1)}%`);
5995
6299
  }
5996
6300
  if (hasPendingUserOps && !shouldApplyPendingOps) {
@@ -5999,7 +6303,6 @@ async function runPostTransformPhase2(args) {
5999
6303
  let explicitMaterializedSuccessfully = false;
6000
6304
  let deferredMaterializedSuccessfully = false;
6001
6305
  let pendingOpsDidMutate = false;
6002
- const protectedToolTags = protectedToolTagNumbers(args.tags, args.protectedTools);
6003
6306
  const firstApplicationEdits = { any: false, beforeNewerThinking: false };
6004
6307
  const recordFirstApplicationWireEdit = (beforeNewerThinking) => {
6005
6308
  firstApplicationEdits.any = true;
@@ -6007,6 +6310,8 @@ async function runPostTransformPhase2(args) {
6007
6310
  };
6008
6311
  if (temporalFirstApplication)
6009
6312
  recordFirstApplicationWireEdit(true);
6313
+ if (servedShapeRepair.needsRebuild)
6314
+ recordFirstApplicationWireEdit(true);
6010
6315
  const firstApplicationLocations = new Map;
6011
6316
  const recordFirstApplicationAt = (message, partIndex) => {
6012
6317
  recordFirstApplicationWireEdit(false);
@@ -6149,11 +6454,12 @@ async function runPostTransformPhase2(args) {
6149
6454
  if (routineCleanupApplied && canUseEmptySentinels) {
6150
6455
  stripClearedReasoning(args.messages);
6151
6456
  }
6152
- const strippedInline = routineCleanupApplied && ageLaneAllowed ? stripInlineThinking(args.messages, args.messageTagNumbers, budgetCutoff) : 0;
6457
+ const strippedInline = routineCleanupApplied && ageLaneAllowed ? stripInlineThinking(args.messages, args.messageTagNumbers, budgetCutoff, !canUseEmptySentinels) : 0;
6153
6458
  const persistedInlineWatermark = args.sessionMeta?.clearedReasoningThroughTag ?? 0;
6154
6459
  if (routineCleanupApplied && persistedInlineWatermark > 0 && !compactionOff) {
6155
- replayStrippedInlineThinking(args.messages, args.messageTagNumbers, persistedInlineWatermark);
6460
+ replayStrippedInlineThinking(args.messages, args.messageTagNumbers, persistedInlineWatermark, !canUseEmptySentinels);
6156
6461
  }
6462
+ servedShapeRepair.apply(isCacheBustingPass);
6157
6463
  let removedReasoningMessages = 0;
6158
6464
  if (routineCleanupApplied && !prefixBoundModel && reasoningRemovalSelectable && reasoningRemovalReadable) {
6159
6465
  const newIds = selectReasoningRemovals({
@@ -6480,7 +6786,7 @@ async function runPostTransformPhase2(args) {
6480
6786
  }
6481
6787
  }
6482
6788
  if (isCacheBustingPass) {
6483
- const droppedResult = stripDroppedPlaceholderMessages(args.messages, args.resolvedProviderID, recordFirstApplicationAt);
6789
+ const droppedResult = stripDroppedPlaceholderMessages(args.messages.filter((message) => !servedShapeRepair.messageIDs.has(message.info.id ?? "")), args.resolvedProviderID, recordFirstApplicationAt);
6484
6790
  const protectedTailStart = Math.max(0, args.messages.length - SYSTEM_INJECTION_ACTIONABLE_TAIL_MESSAGES);
6485
6791
  const systemInjectedResult = stripSystemInjectedMessages(args.messages, protectedTailStart, args.resolvedProviderID, recordFirstApplicationAt);
6486
6792
  const hiddenMessages = args.hiddenMessagesAtCompactionSeam ?? [];
@@ -7080,6 +7386,8 @@ async function runPostTransformPhase2(args) {
7080
7386
  });
7081
7387
  }
7082
7388
  logTransformTiming(args.sessionId, "pp.tailGuard", tTailGuard);
7389
+ if (bustedThisPass)
7390
+ clearExecuteReclaimState(args.db, args.sessionId);
7083
7391
  return {
7084
7392
  explicitMaterializedSuccessfully,
7085
7393
  deferredMaterializedSuccessfully,
@@ -7100,8 +7408,7 @@ async function runPostTransformPhase2(args) {
7100
7408
  prefixTrimStatus: deliveredPrefix?.prefixTrimStatus ?? null,
7101
7409
  thinkingBindingRecovery,
7102
7410
  proactiveThinkingStrip,
7103
- thinkingReleasedForFit,
7104
- openTurnSignedThinkingKept: args.thinkingBindingRecoveryEnabledForModel === true && activeThinkingTurn && !rewritingSignedPrefix
7411
+ thinkingReleasedForFit
7105
7412
  };
7106
7413
  }
7107
7414
  function checkM0MutationDriftAndSignal2(args) {
@@ -7116,4 +7423,4 @@ function checkM0MutationDriftAndSignal2(args) {
7116
7423
  return false;
7117
7424
  }
7118
7425
 
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 };
7426
+ 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 };