@cortexkit/opencode-magic-context 0.48.0 → 0.49.0

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 (203) hide show
  1. package/dist/auto-search-worker.js +3 -3
  2. package/dist/{conflict-warning-hook-w8cykrnf.js → conflict-warning-hook-kzx4dmk1.js} +7 -7
  3. package/dist/{context-m0cy262m.js → context-nj5f293n.js} +96 -43
  4. package/dist/{derive-budgets-sg0xsq7s.js → derive-budgets-qz5rrr08.js} +2 -2
  5. package/dist/embedding-backfill-aetxv1vt.js +21 -0
  6. package/dist/embedding-worker.js +4 -4
  7. package/dist/features/magic-context/git-commits/search-git-commits.d.ts +2 -0
  8. package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
  9. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  10. package/dist/features/magic-context/pi-content-decisions.d.ts +1 -1
  11. package/dist/features/magic-context/pi-content-decisions.d.ts.map +1 -1
  12. package/dist/features/magic-context/search-rerank.d.ts +35 -0
  13. package/dist/features/magic-context/search-rerank.d.ts.map +1 -0
  14. package/dist/features/magic-context/search.d.ts +11 -0
  15. package/dist/features/magic-context/search.d.ts.map +1 -1
  16. package/dist/features/magic-context/storage-meta-persisted.d.ts +13 -2
  17. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  18. package/dist/features/magic-context/storage-meta-session.d.ts +1 -1
  19. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  20. package/dist/features/magic-context/storage-meta.d.ts +1 -1
  21. package/dist/features/magic-context/storage-meta.d.ts.map +1 -1
  22. package/dist/features/magic-context/storage-session-tables.d.ts +2 -0
  23. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  24. package/dist/features/magic-context/storage-tag-identity-revision.d.ts +29 -9
  25. package/dist/features/magic-context/storage-tag-identity-revision.d.ts.map +1 -1
  26. package/dist/features/magic-context/storage-tags.d.ts +9 -0
  27. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  28. package/dist/features/magic-context/storage.d.ts +1 -1
  29. package/dist/features/magic-context/storage.d.ts.map +1 -1
  30. package/dist/features/magic-context/tagger.d.ts +2 -0
  31. package/dist/features/magic-context/tagger.d.ts.map +1 -1
  32. package/dist/features/magic-context/transform-decision-log.d.ts +3 -0
  33. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  34. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -1
  35. package/dist/hooks/magic-context/auto-search-replay.fixture.d.ts +24 -0
  36. package/dist/hooks/magic-context/auto-search-replay.fixture.d.ts.map +1 -0
  37. package/dist/hooks/magic-context/auto-search-runner.d.ts +1 -1
  38. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  39. package/dist/hooks/magic-context/auto-search-worker-client.d.ts +2 -0
  40. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
  41. package/dist/hooks/magic-context/command-handler.d.ts +2 -0
  42. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  43. package/dist/hooks/magic-context/emergency-fail-closed.d.ts +28 -0
  44. package/dist/hooks/magic-context/emergency-fail-closed.d.ts.map +1 -1
  45. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  46. package/dist/hooks/magic-context/historian-host-runner.d.ts +8 -0
  47. package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
  48. package/dist/hooks/magic-context/hook.d.ts +2 -1
  49. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  50. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  51. package/dist/hooks/magic-context/latest-thinking-recovery.d.ts +7 -0
  52. package/dist/hooks/magic-context/latest-thinking-recovery.d.ts.map +1 -1
  53. package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
  54. package/dist/hooks/magic-context/pass-outcome.d.ts +1 -0
  55. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
  56. package/dist/hooks/magic-context/read-session-chunk.d.ts +7 -1
  57. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  58. package/dist/hooks/magic-context/read-session-raw.d.ts +35 -0
  59. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
  60. package/dist/hooks/magic-context/rust-mode-transform.d.ts +36 -0
  61. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  62. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +8 -1
  63. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -1
  64. package/dist/hooks/magic-context/strict-thinking-prefix.d.ts +8 -0
  65. package/dist/hooks/magic-context/strict-thinking-prefix.d.ts.map +1 -0
  66. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  67. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +13 -0
  68. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  69. package/dist/hooks/magic-context/transform.d.ts +1 -0
  70. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  71. package/dist/{index-db7zwa3v.js → index-1bt88epp.js} +93 -9
  72. package/dist/{index-f0h6xwqm.js → index-1g30axtz.js} +229 -67
  73. package/dist/{index-k1xb52kd.js → index-1r0k9js3.js} +5 -5
  74. package/dist/{index-692jzy0p.js → index-2jcbj7r1.js} +122 -371
  75. package/dist/{index-bdckkfw6.js → index-2jgwttpt.js} +16 -8
  76. package/dist/{index-2y0s2hep.js → index-4mjhqadz.js} +1 -1
  77. package/dist/{index-pdecwzrd.js → index-57mrqed8.js} +1 -1
  78. package/dist/{index-ty64eqcn.js → index-9qjqq45k.js} +3 -3
  79. package/dist/{index-yq8n9qcb.js → index-9rt53q79.js} +4 -4
  80. package/dist/{index-pg50n748.js → index-b7mv1jx3.js} +4 -4
  81. package/dist/{index-mmyh6d8f.js → index-ezmszwbd.js} +6 -4
  82. package/dist/{index-fbv1dn35.js → index-gzcmtmar.js} +1 -1
  83. package/dist/{index-0an7742d.js → index-h2py7207.js} +549 -973
  84. package/dist/{index-0qhce371.js → index-h2wc01qk.js} +2 -2
  85. package/dist/{index-dhwzyd54.js → index-h5zfkjyk.js} +160 -25
  86. package/dist/{index-q2tqeqde.js → index-ha87j7a8.js} +1229 -78
  87. package/dist/{index-14cjxt20.js → index-hj2q50k0.js} +45 -8
  88. package/dist/{index-cb7emxgj.js → index-kmpvemph.js} +336 -6
  89. package/dist/{index-c43kr12f.js → index-kp5qe690.js} +7 -7
  90. package/dist/{index-bhvjj0ys.js → index-kq57tdf0.js} +2 -2
  91. package/dist/{index-7mx8v0pw.js → index-nm6a8xpd.js} +4 -4
  92. package/dist/{index-8j7gqj40.js → index-nsjyysj0.js} +6 -2
  93. package/dist/{index-k9nnwad5.js → index-nydv6g8r.js} +44 -7
  94. package/dist/{index-5zygecde.js → index-peshmj6h.js} +4 -4
  95. package/dist/{index-knh4y330.js → index-pxwp2hjk.js} +7 -2
  96. package/dist/{index-1qb0z7wa.js → index-qx53vezw.js} +1 -1
  97. package/dist/{index-q7h7csab.js → index-s4j7t92z.js} +9 -9
  98. package/dist/{index-z8e0psj8.js → index-stbr4ce6.js} +3 -3
  99. package/dist/{index-jcbd3znx.js → index-tqf7yg27.js} +1 -1
  100. package/dist/{index-72nhv486.js → index-vkbqdnkj.js} +2 -2
  101. package/dist/{index-eeezr5zz.js → index-z1tjp257.js} +1 -1
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +61 -44
  104. package/dist/{logger-d3wex3dz.js → logger-ewak5q1s.js} +1 -1
  105. package/dist/{message-index-bounded-7ezbgddp.js → message-index-bounded-h0mrd4pr.js} +13 -13
  106. package/dist/{message-time-backfill-brbd63hv.js → message-time-backfill-8x06r9kx.js} +2 -2
  107. package/dist/migration-worker.js +9 -9
  108. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -0
  109. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  110. package/dist/plugin/tool-registry.d.ts.map +1 -1
  111. package/dist/{project-embedding-registry-7qzptcw7.js → project-embedding-registry-rtt0djyb.js} +9 -9
  112. package/dist/raw-ordinal-warmup-worker.js +4 -4
  113. package/dist/{read-session-chunk-6k83m4fj.js → read-session-chunk-ty89v75e.js} +10 -8
  114. package/dist/{read-session-raw-3g9qy1xa.js → read-session-raw-8sjbc9h0.js} +5 -3
  115. package/dist/{recomp-orchestrator-d3fp1cy0.js → recomp-orchestrator-4f1yyd1q.js} +25 -25
  116. package/dist/{safe-notification-target-5ffqq32m.js → safe-notification-target-q0cyrx3x.js} +2 -2
  117. package/dist/{search-epax1ecv.js → search-pz4f4wge.js} +20 -20
  118. package/dist/{send-session-notification-erecz4y4.js → send-session-notification-38cd5dqt.js} +5 -5
  119. package/dist/shared/auto-search-lifecycle.d.ts +14 -0
  120. package/dist/shared/auto-search-lifecycle.d.ts.map +1 -1
  121. package/dist/shared/logger.d.ts.map +1 -1
  122. package/dist/shared/models-dev-temperature.d.ts +18 -0
  123. package/dist/shared/models-dev-temperature.d.ts.map +1 -0
  124. package/dist/shared/project-directory-key.d.ts +16 -0
  125. package/dist/shared/project-directory-key.d.ts.map +1 -1
  126. package/dist/shared/subagent-temperature.d.ts +46 -0
  127. package/dist/shared/subagent-temperature.d.ts.map +1 -0
  128. package/dist/{storage-tags-d3b0v2ss.js → storage-tags-k0pda32s.js} +6 -4
  129. package/dist/tools/ctx-reduce/tools.d.ts.map +1 -1
  130. package/dist/tools/ctx-search/tools.d.ts.map +1 -1
  131. package/dist/tools/ctx-search/types.d.ts +1 -0
  132. package/dist/tools/ctx-search/types.d.ts.map +1 -1
  133. package/dist/{transform-postprocess-phase-spcy2qre.js → transform-postprocess-phase-tck4g20s.js} +25 -25
  134. package/dist/v2/auto-search-worker.js +3 -3
  135. package/dist/v2/{context-sf98kstd.js → context-crbt6p1y.js} +809 -1052
  136. package/dist/v2/{derive-budgets-3vc0y84t.js → derive-budgets-fgej9j46.js} +3 -3
  137. package/dist/v2/embedding-backfill-ph1qfyn3.js +21 -0
  138. package/dist/v2/embedding-worker.js +4 -4
  139. package/dist/v2/hidden-child-native.d.ts.map +1 -1
  140. package/dist/v2/hidden-completion.d.ts +7 -0
  141. package/dist/v2/hidden-completion.d.ts.map +1 -1
  142. package/dist/v2/hooks/context.d.ts.map +1 -1
  143. package/dist/v2/hooks/dream-trigger.d.ts +4 -1
  144. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  145. package/dist/v2/hooks/generate.d.ts +9 -2
  146. package/dist/v2/hooks/generate.d.ts.map +1 -1
  147. package/dist/v2/{logger-mxd0ym09.js → logger-pj02s7sr.js} +1 -1
  148. package/dist/v2/{message-index-bounded-dy3s2k1e.js → message-index-bounded-xwqdywxg.js} +13 -13
  149. package/dist/v2/{message-time-backfill-gtx1pwk1.js → message-time-backfill-cje68egj.js} +2 -2
  150. package/dist/v2/migration-worker.js +9 -9
  151. package/dist/v2/{project-embedding-registry-1tgba5dv.js → project-embedding-registry-d6m7tyxr.js} +9 -9
  152. package/dist/v2/raw-ordinal-warmup-worker.js +4 -4
  153. package/dist/v2/{read-session-chunk-rh4khdkv.js → read-session-chunk-8p5mdryx.js} +10 -8
  154. package/dist/v2/{read-session-raw-bsbmf0vj.js → read-session-raw-j8dvp7f4.js} +5 -3
  155. package/dist/v2/{recomp-orchestrator-az61rfcg.js → recomp-orchestrator-ckfgt6wq.js} +26 -26
  156. package/dist/v2/{safe-notification-target-73ax1p5v.js → safe-notification-target-y3p1hce9.js} +2 -2
  157. package/dist/v2/{search-nzkwrc6n.js → search-ym8rehhz.js} +20 -20
  158. package/dist/v2/{send-session-notification-6km439kn.js → send-session-notification-5m0yapqx.js} +5 -5
  159. package/dist/v2/{server-x2g40a71.js → server-19zjmn02.js} +2 -2
  160. package/dist/v2/{server-sggvvzhb.js → server-1tk82krw.js} +45 -8
  161. package/dist/v2/{server-vqpf3167.js → server-2s6ayq3t.js} +2 -2
  162. package/dist/v2/{server-z2037m6z.js → server-2s9qz6n7.js} +2 -2
  163. package/dist/v2/{server-k228xhjg.js → server-3j4d00kf.js} +1 -1
  164. package/dist/v2/{server-aan4q8mx.js → server-3t0q2cqx.js} +1 -1
  165. package/dist/v2/{server-2fbhp79z.js → server-4ez8mntn.js} +16 -8
  166. package/dist/v2/{server-zxhgvsf9.js → server-676xw7at.js} +1 -1
  167. package/dist/v2/{server-52awr2mw.js → server-6byqfbqf.js} +93 -9
  168. package/dist/v2/{server-qye6ykf7.js → server-7ekna9zs.js} +2 -2
  169. package/dist/v2/{server-g5r0n3b6.js → server-7h861yms.js} +160 -25
  170. package/dist/v2/{server-v06jcv0w.js → server-8k2agx29.js} +1 -1
  171. package/dist/v2/{server-686jg6eb.js → server-c5rrgrcd.js} +44 -7
  172. package/dist/v2/{server-4k748ke6.js → server-hb6xhh9q.js} +2 -2
  173. package/dist/v2/{server-7wwc2nga.js → server-jvxzm1jy.js} +7 -7
  174. package/dist/v2/{server-1r6pmz4f.js → server-kzns2hbz.js} +1 -1
  175. package/dist/v2/{server-xdfwt6kh.js → server-pj4pjv02.js} +2 -2
  176. package/dist/v2/{server-psqc7e9n.js → server-q4ph9bwn.js} +1227 -78
  177. package/dist/v2/{server-8pyt7hev.js → server-sa8jvrfc.js} +9 -9
  178. package/dist/v2/{server-ezhze64f.js → server-ss95ky04.js} +4 -4
  179. package/dist/v2/{server-5m3dt5r1.js → server-t4k4qexw.js} +6 -2
  180. package/dist/v2/{server-e0vdaae2.js → server-v4mewb78.js} +4 -4
  181. package/dist/v2/{server-gjcr4w98.js → server-w32kmdez.js} +4 -4
  182. package/dist/v2/{server-k8x2rbxc.js → server-x4hscabv.js} +119 -365
  183. package/dist/v2/{server-yczc713m.js → server-xwz4dqh9.js} +7 -2
  184. package/dist/v2/{server-xxm59eww.js → server-ycw9qqcy.js} +4 -4
  185. package/dist/v2/{server-8tqanswc.js → server-zp53y8js.js} +331 -4
  186. package/dist/v2/server.js +4 -4
  187. package/dist/v2/{storage-tags-w4tv77sn.js → storage-tags-8vw924zn.js} +6 -4
  188. package/dist/v2/store-reader.d.ts +8 -2
  189. package/dist/v2/store-reader.d.ts.map +1 -1
  190. package/dist/v2/{wrapup-orchestrator-mz7efs7w.js → wrapup-orchestrator-a7efxaax.js} +26 -26
  191. package/dist/wrapup-orchestrator-barbc6h9.js +44 -0
  192. package/package.json +1 -1
  193. package/src/shared/auto-search-lifecycle.ts +43 -0
  194. package/src/shared/logger.test.ts +38 -0
  195. package/src/shared/logger.ts +10 -2
  196. package/src/shared/models-dev-temperature.ts +107 -0
  197. package/src/shared/project-directory-key.test.ts +59 -0
  198. package/src/shared/project-directory-key.ts +20 -0
  199. package/src/shared/subagent-temperature.test.ts +270 -0
  200. package/src/shared/subagent-temperature.ts +110 -0
  201. package/dist/embedding-backfill-9rcm1mfy.js +0 -21
  202. package/dist/v2/embedding-backfill-vn8g1nh1.js +0 -21
  203. package/dist/wrapup-orchestrator-amzta1t4.js +0 -44
@@ -1,6 +1,12 @@
1
1
  import {
2
2
  getHarness2
3
3
  } from "./index-pavzsdc6.js";
4
+ import {
5
+ tagIdentityRevisionKey,
6
+ getTemporalDecisions,
7
+ freezeTemporalDecisions,
8
+ stableStringify
9
+ } from "./index-1bt88epp.js";
4
10
  import {
5
11
  protectedToolTagNumbers,
6
12
  stripWellFormedLeadingTagPrefix,
@@ -64,42 +70,36 @@ import {
64
70
  adoptNullOwnerToolTag2,
65
71
  getCandidateToolOwners2,
66
72
  pickNearestPriorOwner2
67
- } from "./index-k9nnwad5.js";
73
+ } from "./index-nydv6g8r.js";
68
74
  import {
69
75
  textMentionsRecentCommit,
70
76
  hasMeaningfulUserText2,
71
77
  estimateTokens
72
- } from "./index-1qb0z7wa.js";
78
+ } from "./index-qx53vezw.js";
73
79
  import {
74
80
  log2,
75
81
  sessionLog2
76
- } from "./index-8j7gqj40.js";
82
+ } from "./index-nsjyysj0.js";
77
83
  import {
78
84
  getTagIdentityWriteGeneration2,
79
85
  getSqliteDatabasePath2,
80
86
  assertTransformWrite2,
81
87
  isTransientSqliteError2
82
88
  } from "./index-kb9nn0a0.js";
83
- import {
84
- getTemporalDecisions,
85
- freezeTemporalDecisions,
86
- stableStringify
87
- } from "./index-db7zwa3v.js";
88
89
  import {
89
90
  isValidLanguageCode,
90
91
  resolveModelConfigValue
91
- } from "./index-bhvjj0ys.js";
92
+ } from "./index-kq57tdf0.js";
92
93
  import {
93
94
  getProjectEmbeddingSnapshot2,
94
95
  embedTextForProject2,
95
96
  embedBatchForProject2
96
- } from "./index-c43kr12f.js";
97
+ } from "./index-kp5qe690.js";
97
98
  import {
98
99
  isEmbeddingHostBusy2
99
100
  } from "./index-qt1qqasc.js";
100
101
  import {
101
102
  BoundedSessionMap,
102
- renderUserFacingFailure,
103
103
  getMaxM0MutationId,
104
104
  escalationBands,
105
105
  MERGED_REASONING_PARTS_PREFIX,
@@ -120,7 +120,7 @@ import {
120
120
  getAutoSearchHintDecisions,
121
121
  appendAutoSearchHintDecision,
122
122
  pruneNoteNudgeAnchors,
123
- pruneAutoSearchHintDecisions,
123
+ flushAutoSearchHintDecisionRetirement,
124
124
  getPersistedTodoPermissionDenied,
125
125
  setPersistedTodoPermissionDenied,
126
126
  getPersistedTodoSyntheticAnchor,
@@ -146,6 +146,9 @@ import {
146
146
  setPendingCompactionMarkerState,
147
147
  replacePendingCompactionMarkerStateIf,
148
148
  clearPendingCompactionMarkerStateIf,
149
+ rememberUnpublishedAutoSearchNoHint,
150
+ getUnpublishedAutoSearchNoHint,
151
+ forgetUnpublishedAutoSearchNoHint,
149
152
  registerAutoSearchWork,
150
153
  cancelAutoSearchWork,
151
154
  updateSessionMeta,
@@ -170,15 +173,15 @@ import {
170
173
  peekNoteNudgeText,
171
174
  markNoteNudgeDelivered,
172
175
  getActiveCompartmentRun
173
- } from "./index-692jzy0p.js";
176
+ } from "./index-2jcbj7r1.js";
174
177
  import {
175
178
  runSessionWarmupWorker
176
- } from "./index-dhwzyd54.js";
179
+ } from "./index-h5zfkjyk.js";
177
180
  import {
178
181
  openCodeDbExists,
179
182
  withReadOnlySessionDb,
180
183
  getMessageTimesFromOpenCodeDb
181
- } from "./index-ty64eqcn.js";
184
+ } from "./index-9qjqq45k.js";
182
185
  import {
183
186
  stripSystemInjection,
184
187
  isTextPart,
@@ -203,7 +206,10 @@ import {
203
206
  extractToolCallObservation,
204
207
  ToolMutationBatch,
205
208
  createToolDropTarget
206
- } from "./index-bdckkfw6.js";
209
+ } from "./index-2jgwttpt.js";
210
+ import {
211
+ renderUserFacingFailure
212
+ } from "./index-kmpvemph.js";
207
213
  import {
208
214
  getErrorMessage
209
215
  } from "./index-y8v6yerm.js";
@@ -213,7 +219,7 @@ import {
213
219
  } from "./index-d9vfe7xq.js";
214
220
  import {
215
221
  logSlowWriteTransaction
216
- } from "./index-2y0s2hep.js";
222
+ } from "./index-4mjhqadz.js";
217
223
 
218
224
  // src/features/magic-context/tagger.ts
219
225
  var TOOL_COMPOSITE_KEY_SEP = "\x00";
@@ -221,7 +227,9 @@ function makeToolCompositeKey(ownerMsgId, callId) {
221
227
  return `${ownerMsgId}${TOOL_COMPOSITE_KEY_SEP}${callId}`;
222
228
  }
223
229
  var GET_COUNTER_SQL = `SELECT counter FROM session_meta WHERE session_id = ?`;
224
- var GET_TAGS_VERSION_SQL = `SELECT tags_version FROM session_meta WHERE session_id = ?`;
230
+ var GET_TAGS_VERSION_SQL = `SELECT
231
+ (SELECT tags_version FROM session_meta WHERE session_id = ?) AS tags_version,
232
+ (SELECT value FROM schema_migrations_meta WHERE key = ?) AS identity_revision`;
225
233
  var GET_ASSIGNMENTS_SQL = "SELECT message_id, tag_number, type, tool_owner_message_id, byte_size, token_count, input_byte_size, input_token_count FROM tags WHERE session_id = ? ORDER BY tag_number ASC";
226
234
  var GET_ASSIGNMENTS_SCOPED_SQL = "SELECT message_id, tag_number, type, tool_owner_message_id, byte_size, token_count, input_byte_size, input_token_count FROM tags WHERE session_id = ? AND tag_number >= ? ORDER BY tag_number ASC";
227
235
  var probeTagsVersionStatements = new WeakMap;
@@ -342,10 +350,16 @@ function createTagger() {
342
350
  const memCounter = heapHolder.counters.get(sessionId) ?? 0;
343
351
  const dbMax = getMaxTagNumberBySession2(db, sessionId);
344
352
  const next = Math.max(memCounter, dbMax) + 1;
353
+ const loaded = heapHolder.loadSignatures.get(sessionId);
354
+ let ownedInitialIdentity;
345
355
  try {
346
356
  db.transaction(() => {
357
+ const admitted = loaded?.db === db && loaded.identityRevision === null ? probeSignature(sessionId, db) : null;
358
+ const initializesOwnedEpoch = admitted !== null && loaded !== undefined && admitted.identityRevision === null && admitted.tagsVersion === loaded.tagsVersion;
347
359
  getUpsertCounterStatement(db).run(sessionId, next, getHarness2());
348
360
  insertTag2(db, sessionId, messageId, type, byteSize, next, reasoningByteSize, toolName, inputByteSize, toolOwnerMessageId, entryFingerprint, tokenCounts);
361
+ if (initializesOwnedEpoch)
362
+ ownedInitialIdentity = probeSignature(sessionId, db).identityRevision;
349
363
  }).immediate();
350
364
  } catch (error) {
351
365
  if (!isUniqueConstraintError(error)) {
@@ -366,6 +380,8 @@ function createTagger() {
366
380
  const signature = heapHolder.loadSignatures.get(sessionId);
367
381
  if (signature?.db === db) {
368
382
  signature.tagsVersion += 1;
383
+ if (signature === loaded && ownedInitialIdentity !== undefined)
384
+ signature.identityRevision = ownedInitialIdentity;
369
385
  }
370
386
  if (type === "tool") {
371
387
  getSessionToolAccounting(sessionId).set(next, {
@@ -468,15 +484,16 @@ function createTagger() {
468
484
  return heapHolder.counters.get(sessionId) ?? 0;
469
485
  }
470
486
  function probeSignature(sessionId, db) {
471
- const row = getProbeTagsVersionStatement(db).get(sessionId);
487
+ const row = getProbeTagsVersionStatement(db).get(sessionId, tagIdentityRevisionKey(sessionId));
472
488
  return {
473
- tagsVersion: row?.tags_version ?? 0
489
+ tagsVersion: row?.tags_version ?? 0,
490
+ identityRevision: row?.identity_revision ?? null
474
491
  };
475
492
  }
476
493
  function initFromDb(sessionId, db, floor = 0) {
477
494
  const probe = probeSignature(sessionId, db);
478
495
  const cached = heapHolder.loadSignatures.get(sessionId);
479
- if (cached !== undefined && cached.db === db && cached.tagsVersion === probe.tagsVersion && cached.floor === floor) {
496
+ if (cached !== undefined && cached.db === db && cached.tagsVersion === probe.tagsVersion && cached.identityRevision === probe.identityRevision && cached.floor === floor) {
480
497
  return;
481
498
  }
482
499
  const row = db.prepare(GET_COUNTER_SQL).get(sessionId);
@@ -509,6 +526,7 @@ function createTagger() {
509
526
  heapHolder.loadSignatures.set(sessionId, {
510
527
  db,
511
528
  tagsVersion: probe.tagsVersion,
529
+ identityRevision: probe.identityRevision,
512
530
  floor
513
531
  });
514
532
  }
@@ -516,6 +534,10 @@ function createTagger() {
516
534
  const signature = heapHolder.loadSignatures.get(sessionId);
517
535
  return signature?.db === db ? signature.tagsVersion : undefined;
518
536
  }
537
+ function getLoadedTagIdentityRevision(sessionId, db) {
538
+ const signature = heapHolder.loadSignatures.get(sessionId);
539
+ return signature?.db === db ? signature.identityRevision : undefined;
540
+ }
519
541
  function cleanup(sessionId) {
520
542
  heapHolder.counters.delete(sessionId);
521
543
  heapHolder.assignments.delete(sessionId);
@@ -558,6 +580,7 @@ function createTagger() {
558
580
  getCounter,
559
581
  initFromDb,
560
582
  getLoadedTagsVersion,
583
+ getLoadedTagIdentityRevision,
561
584
  cleanup,
562
585
  getHeapStats
563
586
  };
@@ -606,6 +629,8 @@ function persistAutoSearchSkip(db, sessionId, messageId, reason = "timeout") {
606
629
  ok = outcome.ok && outcome.decision.decision === "no-hint";
607
630
  } catch {}
608
631
  assertTransformWrite2();
632
+ if (!ok)
633
+ rememberUnpublishedAutoSearchNoHint(sessionId, messageId, reason);
609
634
  const persistence = Promise.resolve(ok);
610
635
  messages.set(messageId, persistence);
611
636
  return persistence;
@@ -1237,7 +1262,36 @@ function queueAutoSearchRegistration(db, projectPath, register) {
1237
1262
  function persistAutoSearchDecision(db, sessionId, decision, startedAt) {
1238
1263
  if (performance.now() - startedAt >= AUTO_SEARCH_TIMEOUT_MS)
1239
1264
  return null;
1240
- return appendAutoSearchHintDecision(db, sessionId, decision);
1265
+ let outcome;
1266
+ try {
1267
+ outcome = appendAutoSearchHintDecision(db, sessionId, decision);
1268
+ } catch (error) {
1269
+ assertTransformWrite2();
1270
+ rememberUnpublishedAutoSearchNoHint(sessionId, decision.messageId, decision.decision === "no-hint" ? decision.reason : "error");
1271
+ if (!isTransientSqliteError2(error))
1272
+ throw error;
1273
+ log2(`[auto-search] decision save hit a busy store for session ${sessionId}; serving without a hint and retrying the save on a later pass: ${error instanceof Error ? error.message : String(error)}`);
1274
+ return { ok: false, kind: "storage-busy" };
1275
+ }
1276
+ if (!outcome.ok) {
1277
+ assertTransformWrite2();
1278
+ rememberUnpublishedAutoSearchNoHint(sessionId, decision.messageId, decision.decision === "no-hint" ? decision.reason : "error");
1279
+ } else if (outcome.decision.decision === "no-hint") {
1280
+ forgetUnpublishedAutoSearchNoHint(sessionId, decision.messageId);
1281
+ }
1282
+ return outcome;
1283
+ }
1284
+ function retryUnpublishedAutoSearchNoHint(db, sessionId, messageId, startedAt) {
1285
+ const reason = getUnpublishedAutoSearchNoHint(sessionId, messageId);
1286
+ if (reason === undefined)
1287
+ return false;
1288
+ try {
1289
+ persistAutoSearchDecision(db, sessionId, { messageId, decision: "no-hint", reason }, startedAt);
1290
+ } catch (error) {
1291
+ assertTransformWrite2();
1292
+ log2(`[auto-search] frozen omission save still failed for session ${sessionId}: ${error instanceof Error ? error.message : String(error)}`);
1293
+ }
1294
+ return true;
1241
1295
  }
1242
1296
  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)) {
1243
1297
  return executeAutoSearchWorker(db, sessionId, projectPath, query, options, entry, "search");
@@ -1625,6 +1679,9 @@ async function runAutoSearchHint(args) {
1625
1679
  return coalesceAutoSearchTurn(db, sessionId, userMsgId, async (lifecycleSignal) => {
1626
1680
  if (lifecycleSignal.aborted)
1627
1681
  return AUTO_SEARCH_OK;
1682
+ if (retryUnpublishedAutoSearchNoHint(db, sessionId, userMsgId, startedAt)) {
1683
+ return AUTO_SEARCH_OK;
1684
+ }
1628
1685
  if (wasAutoSearchSkipped(db, sessionId, userMsgId))
1629
1686
  return AUTO_SEARCH_OK;
1630
1687
  const existing = getAutoSearchHintDecisions(db, sessionId);
@@ -1655,7 +1712,10 @@ async function runAutoSearchHint(args) {
1655
1712
  return { ok: false, kind: "timeout" };
1656
1713
  }
1657
1714
  if (!outcome.ok)
1658
- return { ok: false, kind: "cas-exhaustion" };
1715
+ return {
1716
+ ok: false,
1717
+ kind: outcome.kind === "storage-busy" ? "storage-busy" : "cas-exhaustion"
1718
+ };
1659
1719
  if (outcome.kind === "already-present" && outcome.decision.decision === "hint") {
1660
1720
  appendReminderToUserMessageById(messages, userMsgId, outcome.decision.text);
1661
1721
  }
@@ -1699,8 +1759,11 @@ async function runAutoSearchHint(args) {
1699
1759
  });
1700
1760
  }, startedAt);
1701
1761
  } catch (error) {
1702
- log2(`[auto-search] unified search failed for session ${sessionId} (will retry next pass): ${error instanceof Error ? error.message : String(error)}`);
1703
- return { ok: false, kind: "search-failure" };
1762
+ if (lifecycleSignal.aborted)
1763
+ return AUTO_SEARCH_OK;
1764
+ log2(`[auto-search] unified search failed for session ${sessionId} (no-hint frozen for this turn): ${error instanceof Error ? error.message : String(error)}`);
1765
+ const outcome = await writeNoHintAndReconcile("error");
1766
+ return outcome.ok ? { ok: false, kind: "search-failure" } : outcome;
1704
1767
  }
1705
1768
  if (lifecycleSignal.aborted)
1706
1769
  return AUTO_SEARCH_OK;
@@ -1735,6 +1798,8 @@ ${hintText}`;
1735
1798
  return { ok: false, kind: "timeout" };
1736
1799
  }
1737
1800
  if (!outcome.ok) {
1801
+ if (outcome.kind === "storage-busy")
1802
+ return { ok: false, kind: "storage-busy" };
1738
1803
  sessionLog2(sessionId, `auto-search: CAS exhausted for ${userMsgId}; skipping wire append`);
1739
1804
  return { ok: false, kind: "cas-exhaustion" };
1740
1805
  }
@@ -1748,6 +1813,8 @@ ${hintText}`;
1748
1813
  queueAutoSearchBackfill(db, sessionId, options.projectPath, rawPrompt);
1749
1814
  }
1750
1815
  }, () => {
1816
+ if (getUnpublishedAutoSearchNoHint(sessionId, userMsgId) !== undefined)
1817
+ return;
1751
1818
  if (wasAutoSearchSkipped(db, sessionId, userMsgId))
1752
1819
  return;
1753
1820
  const decision = getAutoSearchHintDecisions(db, sessionId).find((entry) => entry.messageId === userMsgId);
@@ -3001,11 +3068,15 @@ function opencodeReasoningBudgetStatus(messages, budget, prefixBound, proseRatio
3001
3068
 
3002
3069
  // src/hooks/magic-context/emergency-fail-closed.ts
3003
3070
  var ENGINE_RECONNECTING_USER_MESSAGE = "Magic Context's engine is reconnecting. Send your message again in a few seconds.";
3071
+ var ENGINE_BUSY_USER_MESSAGE = "Magic Context is still applying the previous context update for this session. Send your message again in a moment.";
3004
3072
  var PROTECTED_TOOL_RESULTS_OVER_LIMIT = "The tool results kept by protected_tools are larger than this model's context window, so this turn was not sent. Lower the protected_tools counts.";
3005
3073
  var PROTECTED_TOOL_RESULTS_OVER_LIMIT_CODE = "protected_tool_results_over_limit";
3074
+ var SIGNED_TURN_OVER_LIMIT = "This turn's context is larger than the model's context window even after all of its thinking and reclaimable tool output were removed, so it was not sent. Send a new message or start a new session to continue.";
3075
+ var SIGNED_TURN_OVER_LIMIT_CODE = "signed_turn_over_limit";
3076
+ var SIGNED_THINKING_RESET_FENCE_FAILED = "Magic Context could not record a thinking reset for this session, so this turn was not sent. Send your message again.";
3006
3077
  function contextRefusalError(message) {
3007
3078
  return new EmergencyFailClosedError(message, {
3008
- code: message === PROTECTED_TOOL_RESULTS_OVER_LIMIT ? PROTECTED_TOOL_RESULTS_OVER_LIMIT_CODE : undefined
3079
+ code: message === PROTECTED_TOOL_RESULTS_OVER_LIMIT ? PROTECTED_TOOL_RESULTS_OVER_LIMIT_CODE : message === SIGNED_TURN_OVER_LIMIT ? SIGNED_TURN_OVER_LIMIT_CODE : undefined
3009
3080
  });
3010
3081
  }
3011
3082
  function protectedToolRefusal(error) {
@@ -3015,6 +3086,8 @@ function protectedToolRefusal(error) {
3015
3086
  const current = error;
3016
3087
  if (current.code === PROTECTED_TOOL_RESULTS_OVER_LIMIT_CODE)
3017
3088
  return contextRefusalError(PROTECTED_TOOL_RESULTS_OVER_LIMIT);
3089
+ if (current.code === SIGNED_TURN_OVER_LIMIT_CODE)
3090
+ return contextRefusalError(SIGNED_TURN_OVER_LIMIT);
3018
3091
  error = current.cause;
3019
3092
  }
3020
3093
  return;
@@ -3024,6 +3097,11 @@ function outgoingContextRefusal(estimate, limit, protectedToolTokens = 0) {
3024
3097
  return;
3025
3098
  return PROTECTED_TOOL_RESULTS_OVER_LIMIT;
3026
3099
  }
3100
+ function signedTurnContextRefusal(estimate, limit) {
3101
+ if (estimate?.refusalGrade !== true || typeof estimate.refusalTokens !== "number" || !Number.isFinite(estimate.refusalTokens) || !limit || !Number.isFinite(limit) || limit <= 0 || estimate.refusalTokens <= limit)
3102
+ return;
3103
+ return SIGNED_TURN_OVER_LIMIT;
3104
+ }
3027
3105
 
3028
3106
  class EmergencyFailClosedError extends Error {
3029
3107
  code;
@@ -4343,6 +4421,39 @@ function postprocessReplaySnapshot(db, sessionId) {
4343
4421
  };
4344
4422
  }
4345
4423
 
4424
+ // src/hooks/magic-context/strict-thinking-prefix.ts
4425
+ function servedPrefixMatches(args) {
4426
+ const heads = args.messages?.slice(0, 2);
4427
+ if (!heads || heads.length !== 2 || args.m0Text == null || args.m1Text == null)
4428
+ return false;
4429
+ const text = (message) => {
4430
+ if (!isRecord(message))
4431
+ return;
4432
+ if (typeof message.content === "string")
4433
+ return message.content;
4434
+ const parts = Array.isArray(message.parts) ? message.parts : message.content;
4435
+ if (!Array.isArray(parts))
4436
+ return;
4437
+ return parts.filter(isRecord).filter((part) => part.type === "text").map((part) => String(part.text ?? "")).join("");
4438
+ };
4439
+ if (text(heads[0]) !== args.m0Text || text(heads[1]) !== args.m1Text)
4440
+ return false;
4441
+ const head = heads[0];
4442
+ if (!isRecord(head))
4443
+ return false;
4444
+ const parts = Array.isArray(head.parts) ? head.parts : head.content;
4445
+ if (!Array.isArray(parts))
4446
+ return !args.muralDataUrl;
4447
+ const images = parts.filter(isRecord).filter((part) => part.type === "image" || part.type === "file");
4448
+ if (!args.muralDataUrl)
4449
+ return images.length === 0;
4450
+ if (images.length !== 1)
4451
+ return false;
4452
+ const image = images[0];
4453
+ const url = typeof image.url === "string" ? image.url : typeof image.data === "string" && typeof image.mimeType === "string" ? `data:${image.mimeType};base64,${image.data}` : undefined;
4454
+ return url === args.muralDataUrl;
4455
+ }
4456
+
4346
4457
  // src/hooks/magic-context/supersession-reclaim.ts
4347
4458
  var SUPERSESSION_RECENT_MESSAGE_WINDOW = 20;
4348
4459
  function recentSupersessionOwnerMessageIds(db, sessionId) {
@@ -4655,6 +4766,7 @@ function getCachedInertWhitespaceAssistantTags(db, sessionId, tagger, messages)
4655
4766
  const messageIds = messages.flatMap((message) => typeof message.info.id === "string" ? [message.info.id] : []);
4656
4767
  const ownersKey = JSON.stringify(messageIds);
4657
4768
  const tagsVersion = tagger.getLoadedTagsVersion?.(sessionId, db);
4769
+ const identityRevision = tagger.getLoadedTagIdentityRevision?.(sessionId, db);
4658
4770
  if (tagsVersion === undefined)
4659
4771
  return getInertWhitespaceAssistantTags2(db, sessionId, messageIds);
4660
4772
  let bySession = inertWhitespaceCache.get(db);
@@ -4663,10 +4775,10 @@ function getCachedInertWhitespaceAssistantTags(db, sessionId, tagger, messages)
4663
4775
  inertWhitespaceCache.set(db, bySession);
4664
4776
  }
4665
4777
  const cached = bySession.get(sessionId);
4666
- if (cached?.tagsVersion === tagsVersion && cached.ownersKey === ownersKey)
4778
+ if (cached?.tagsVersion === tagsVersion && cached.identityRevision === identityRevision && cached.ownersKey === ownersKey)
4667
4779
  return cached.tags;
4668
4780
  const tags = getInertWhitespaceAssistantTags2(db, sessionId, messageIds);
4669
- bySession.set(sessionId, { tagsVersion, ownersKey, tags });
4781
+ bySession.set(sessionId, { tagsVersion, identityRevision, ownersKey, tags });
4670
4782
  return tags;
4671
4783
  }
4672
4784
  function makeToolOwnerCacheKey(sessionId, callId) {
@@ -5509,6 +5621,8 @@ function applyRustModeThinkingStrips(args, hostEditBeforeNewestThinking) {
5509
5621
  const recoveryMessageIds = new Set;
5510
5622
  let thinkingBindingRecovery = null;
5511
5623
  let proactiveThinkingStrip = null;
5624
+ const signedThinkingReset = args.cacheBustingPass === true && args.moduleSignedThinkingReset === true;
5625
+ const stripProtection = signedThinkingReset ? undefined : args.protectedThinkingMessages;
5512
5626
  {
5513
5627
  try {
5514
5628
  for (const id of getMergedReasoningStrippedIds(args.db, args.sessionId)) {
@@ -5535,26 +5649,31 @@ function applyRustModeThinkingStrips(args, hostEditBeforeNewestThinking) {
5535
5649
  } catch (error) {
5536
5650
  sessionLog2(args.sessionId, "rust thinking binding recovery failed:", error);
5537
5651
  }
5538
- stripReasoningFromAssistantIds(args.messages, args.resolvedProviderID, recoveryMessageIds, args.protectedThinkingMessages);
5539
- const moduleBustStrips = !args.activeThinkingTurn && args.cacheBustingPass === true && (args.moduleReasoningTrimOnly !== true || hostEditBeforeNewestThinking);
5540
- const stripFrom = args.thinkingBindingRecoveryEnabledForModel === true ? proactiveStripStartIndex({ ...args, cacheBustingPass: moduleBustStrips }) : null;
5652
+ stripReasoningFromAssistantIds(args.messages, args.resolvedProviderID, recoveryMessageIds, stripProtection);
5653
+ const moduleBustStrips = signedThinkingReset || !args.activeThinkingTurn && args.cacheBustingPass === true && (args.moduleReasoningTrimOnly !== true || hostEditBeforeNewestThinking);
5654
+ const stripFrom = args.thinkingBindingRecoveryEnabledForModel === true || signedThinkingReset ? proactiveStripStartIndex({ ...args, cacheBustingPass: moduleBustStrips }) : null;
5541
5655
  if (stripFrom !== null) {
5656
+ const stripped = args.messages.slice(stripFrom);
5542
5657
  const outcome = freezeReasoningOnBustingPass2({
5543
5658
  db: args.db,
5544
5659
  sessionId: args.sessionId,
5545
- messages: args.messages.slice(stripFrom),
5546
- protectedMessages: args.protectedThinkingMessages,
5660
+ messages: stripped,
5661
+ protectedMessages: stripProtection,
5547
5662
  alreadyFrozen: recoveryMessageIds
5548
5663
  });
5549
5664
  if (outcome.strip) {
5550
5665
  proactiveThinkingStrip = outcome.strip;
5551
5666
  for (const id of outcome.strip.messageIds)
5552
5667
  recoveryMessageIds.add(id);
5553
- stripReasoningFromAssistantIds(args.messages, args.resolvedProviderID, new Set(outcome.strip.messageIds), args.protectedThinkingMessages);
5668
+ }
5669
+ const removed = signedThinkingReset ? new Set(findReasoningBearingAssistantIds(stripped)) : new Set(outcome.strip?.messageIds ?? []);
5670
+ if (removed.size > 0) {
5671
+ stripReasoningFromAssistantIds(args.messages, args.resolvedProviderID, removed, stripProtection);
5554
5672
  }
5555
5673
  }
5556
5674
  }
5557
- args.restoreLatestTurnOriginals?.();
5675
+ if (!signedThinkingReset)
5676
+ args.restoreLatestTurnOriginals?.();
5558
5677
  return { thinkingBindingRecovery, proactiveThinkingStrip };
5559
5678
  }
5560
5679
  function runRustModePostprocess2(args) {
@@ -5597,7 +5716,7 @@ function runRustModePostprocess2(args) {
5597
5716
  appendReminderToUserMessageById(args.messages, anchor.messageId, anchor.text);
5598
5717
  }
5599
5718
  for (const decision of getAutoSearchHintDecisions(args.db, args.sessionId)) {
5600
- if (decision.decision === "hint") {
5719
+ if (decision.decision === "hint" && getUnpublishedAutoSearchNoHint(args.sessionId, decision.messageId) === undefined) {
5601
5720
  appendReminderToUserMessageById(args.messages, decision.messageId, decision.text);
5602
5721
  }
5603
5722
  }
@@ -5860,7 +5979,7 @@ async function runPostTransformPhase2(args) {
5860
5979
  const reasoningMutationExemptMessage = findLatestAssistantReasoningMutationExemptMessage(args.messages);
5861
5980
  const pendingMaterializationAtPassStart = args.pendingMaterializationSessions.has(args.sessionId);
5862
5981
  const deferredMaterializationAtPassStart = args.deferredMaterializationSessions.has(args.sessionId);
5863
- const isExplicitFlush = pendingMaterializationAtPassStart;
5982
+ let isExplicitFlush = pendingMaterializationAtPassStart;
5864
5983
  const deferredMaterializationWasPending = deferredMaterializationAtPassStart;
5865
5984
  const alreadyRanThisTurn = args.currentTurnId !== null && args.lastHeuristicsTurnId.get(args.sessionId) === args.currentTurnId;
5866
5985
  const forceMaterialization = args.fullFeatureMode && !compactionOff && args.contextUsage.percentage >= args.forceMaterializationPercentage;
@@ -5877,8 +5996,8 @@ async function runPostTransformPhase2(args) {
5877
5996
  }
5878
5997
  const activeCompartmentRun = args.canRunCompartments ? getActiveCompartmentRun(args.sessionId) : undefined;
5879
5998
  const compartmentRunning = args.canRunCompartments && !args.awaitedCompartmentRun && activeCompartmentRun !== undefined;
5880
- const deferredMaterialize = args.canConsumeDeferredLate && deferredMaterializationWasPending;
5881
- const materializationRequested = isExplicitFlush || deferredMaterialize;
5999
+ let deferredMaterialize = args.canConsumeDeferredLate && deferredMaterializationWasPending;
6000
+ let materializationRequested = isExplicitFlush || deferredMaterialize;
5882
6001
  const m0M1EnabledForFold = args.m0M1 !== undefined && (!!args.m0M1.projectPath || !!args.m0M1.projectDirectory) && (args.fullFeatureMode || compactionOff);
5883
6002
  const frozenThinking = new Set(args.activeThinkingTurn ? getMergedReasoningStrippedIds(args.db, args.sessionId) : []);
5884
6003
  const bindingThinking = new Set([...frozenThinking].filter((id) => id.startsWith(THINKING_BINDING_RECOVERY_FROZEN_PREFIX)).map((id) => id.slice(THINKING_BINDING_RECOVERY_FROZEN_PREFIX.length)));
@@ -5890,9 +6009,9 @@ async function runPostTransformPhase2(args) {
5890
6009
  bindingIds: bindingThinking,
5891
6010
  removedIds: getReasoningRemovalState(args.db, args.sessionId).messageIds
5892
6011
  }) : new Set;
5893
- const activeThinkingTurn = retainedThinking.size > 0;
6012
+ let activeThinkingTurn = retainedThinking.size > 0;
5894
6013
  const protectedThinkingMessages = new Set(args.messages.filter((message) => message.parts.some((part) => retainedThinking.has(part))));
5895
- const newTargets = protectNewTagMutations(args.messages, args.targets, retainedThinking, args.thinkingBindingRecoveryEnabledForModel === true);
6014
+ let newTargets = protectNewTagMutations(args.messages, args.targets, retainedThinking, args.thinkingBindingRecoveryEnabledForModel === true);
5896
6015
  let maxReasoningTag = 0;
5897
6016
  for (const tag of args.messageTagNumbers.values())
5898
6017
  maxReasoningTag = Math.max(maxReasoningTag, tag);
@@ -5902,7 +6021,28 @@ async function runPostTransformPhase2(args) {
5902
6021
  if (tag && tag > 0)
5903
6022
  safeReasoningCutoff = Math.min(safeReasoningCutoff, tag - 1);
5904
6023
  }
5905
- const freezeM0M1 = args.freezeM0M1 === true || activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true;
6024
+ let activeThinkingPrefixHold = args.activeThinkingPrefixHold === true || activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true;
6025
+ let freezeM0M1 = args.freezeM0M1 === true || activeThinkingPrefixHold;
6026
+ let rewritingSignedPrefix = false;
6027
+ let thinkingReleasedForFit = false;
6028
+ const releaseThinkingForRewrite = (forFit = false) => {
6029
+ const stripped = freezeReasoningOnBustingPass2({
6030
+ db: args.db,
6031
+ sessionId: args.sessionId,
6032
+ messages: args.messages,
6033
+ alreadyFrozen: bindingThinking
6034
+ });
6035
+ if (stripped.persistenceFailed)
6036
+ throw new Error("Cannot persist signed thinking omission before prefix rewrite");
6037
+ retainedThinking.clear();
6038
+ protectedThinkingMessages.clear();
6039
+ activeThinkingTurn = false;
6040
+ activeThinkingPrefixHold = false;
6041
+ freezeM0M1 = args.directoryPrefixHold === true;
6042
+ newTargets = args.targets;
6043
+ rewritingSignedPrefix = true;
6044
+ thinkingReleasedForFit ||= forFit;
6045
+ };
5906
6046
  const foldDueDecision = m0M1EnabledForFold && args.m0M1 && !freezeM0M1 ? mustMaterialize({
5907
6047
  db: args.db,
5908
6048
  sessionId: args.sessionId,
@@ -5922,6 +6062,7 @@ async function runPostTransformPhase2(args) {
5922
6062
  const cachedPrefixBeforePreflight = shouldCaptureCachedPrefix ? prepareCachedM0M1Replay(args.db, args.sessionId) : undefined;
5923
6063
  const completeCachedPrefixAvailable = args.sessionMeta.cachedM0Bytes != null && args.sessionMeta.cachedM1Bytes != null || cachedPrefixBeforePreflight !== undefined || m0M1EnabledForFold && !shouldCaptureCachedPrefix && hasCompleteCachedM0M1(args.db, args.sessionId);
5924
6064
  const firstRenderBust = m0M1EnabledForFold && !completeCachedPrefixAvailable;
6065
+ const servedBeforeFirstRender = firstRenderBust ? args.readLastServedMessages?.() : null;
5925
6066
  let foldExecutedThisPass = false;
5926
6067
  let foldBustsServedPrefixThisPass = false;
5927
6068
  let publishedM1RefreshedThisPass = false;
@@ -5939,7 +6080,7 @@ async function runPostTransformPhase2(args) {
5939
6080
  m1Bytes: args.sessionMeta.cachedM1Bytes ?? null,
5940
6081
  muralDataUrl: args.sessionMeta.cachedM0MuralDataUrl ?? null
5941
6082
  };
5942
- if ((foldDueDecision.value || softRefreshOpportunity) && m0M1EnabledForFold && args.m0M1) {
6083
+ if ((foldDueDecision.value || softRefreshOpportunity || firstRenderBust && activeThinkingPrefixHold) && m0M1EnabledForFold && args.m0M1) {
5943
6084
  let committedFoldBustsServedPrefix;
5944
6085
  try {
5945
6086
  const previousM1 = args.sessionMeta.cachedM1Bytes?.toString("utf8");
@@ -5964,7 +6105,12 @@ async function runPostTransformPhase2(args) {
5964
6105
  onFoldPrepare: () => {
5965
6106
  const conversions = prepareLegacyToolSkeletonConversions(args.db, args.sessionId, args.targets);
5966
6107
  return (db, rendered) => {
5967
- const bustsPrefix = foldBustsServedPrefix(foldDueDecision.reason, servedPrefixBeforeFold, rendered);
6108
+ const bustsPrefix = activeThinkingPrefixHold ? !servedPrefixMatches({
6109
+ messages: servedBeforeFirstRender,
6110
+ m0Text: rendered.m0Bytes.toString(),
6111
+ m1Text: rendered.m1Bytes.toString(),
6112
+ muralDataUrl: rendered.muralDataUrl
6113
+ }) : foldBustsServedPrefix(foldDueDecision.reason, servedPrefixBeforeFold, rendered);
5968
6114
  if (bustsPrefix) {
5969
6115
  if (!conversions.isCurrent(db)) {
5970
6116
  throw new MaterializeContentionError({
@@ -5981,6 +6127,9 @@ async function runPostTransformPhase2(args) {
5981
6127
  }
5982
6128
  });
5983
6129
  preparedPrefix = foldResult;
6130
+ if (activeThinkingPrefixHold && firstRenderBust && committedFoldBustsServedPrefix) {
6131
+ releaseThinkingForRewrite();
6132
+ }
5984
6133
  prefixPreflightFailed = foldResult.materializationContentionRetryExhausted === true;
5985
6134
  foldExecutedThisPass = foldExecutesThisPass(foldDueDecision.value || softRefreshOpportunity, foldResult.m0RematerializedThisPass);
5986
6135
  foldBustsServedPrefixThisPass = foldExecutedThisPass && (committedFoldBustsServedPrefix ?? true);
@@ -6016,6 +6165,15 @@ async function runPostTransformPhase2(args) {
6016
6165
  }
6017
6166
  logTransformTiming(args.sessionId, "pp.prefixPreflight", tPostprocessSetup, `foldExecuted=${foldExecutedThisPass} m1Refreshed=${publishedM1RefreshedThisPass}`);
6018
6167
  const tPassDecisions = performance.now();
6168
+ const frontToolCandidates = args.tags.filter((tag) => tag.type === "tool" && tag.status === "active" && args.targets.get(tag.tagNumber)?.canDrop?.());
6169
+ if (activeThinkingPrefixHold && (args.forceSignedRebuildForFit || args.contextUsage.percentage >= 95 && frontToolCandidates.length > 0 && frontToolCandidates.every((tag) => newTargets.get(tag.tagNumber)?.thinkingRewriteProtected === true))) {
6170
+ releaseThinkingForRewrite(true);
6171
+ }
6172
+ if (activeThinkingPrefixHold) {
6173
+ isExplicitFlush = false;
6174
+ deferredMaterialize = false;
6175
+ materializationRequested = false;
6176
+ }
6019
6177
  const shouldReadPendingOps = !compactionOff && (materializationRequested || publishedM1RefreshedThisPass || args.schedulerDecision === "execute" || forceMaterialization || foldExecutedThisPass || firstRenderBust || compartmentRunning);
6020
6178
  const pendingOps = shouldReadPendingOps ? getPendingOps(args.db, args.sessionId) : [];
6021
6179
  const hasPendingUserOps = pendingOps.length > 0;
@@ -6025,7 +6183,8 @@ async function runPostTransformPhase2(args) {
6025
6183
  const depth = getPendingOpsCount(args.db, args.sessionId);
6026
6184
  return depth === null ? "not loaded (deferred pass)" : String(depth);
6027
6185
  };
6028
- const idleExpiryRebuild = !freezeM0M1 && args.m0M1?.hardSignals?.cacheExpired === true;
6186
+ const heldIdleExpiryRebuild = activeThinkingPrefixHold && args.m0M1?.hardSignals?.cacheExpired === true;
6187
+ const idleExpiryRebuild = (!freezeM0M1 || activeThinkingPrefixHold) && args.m0M1?.hardSignals?.cacheExpired === true;
6029
6188
  const rideSignals = {
6030
6189
  subagentExecute: !args.fullFeatureMode && args.schedulerDecision === "execute",
6031
6190
  hardFold: foldBustsServedPrefixThisPass || firstRenderBust || idleExpiryRebuild,
@@ -6033,15 +6192,16 @@ async function runPostTransformPhase2(args) {
6033
6192
  explicitFlush: isExplicitFlush || deferredMaterialize && !prefixPreflightFailed,
6034
6193
  publishedHistory: publishedM1RefreshedThisPass || !m0M1EnabledForFold && (args.pendingCompartmentInjection?.compartmentCount ?? 0) > 0 && (args.historyRebuiltThisPass || args.rebuiltHistoryFromInitialPrepare || args.canConsumeDeferredLate && args.deferredHistoryWasPendingAtPassStart)
6035
6194
  };
6036
- const publishedWorkDrainAllowed = !compactionOff && hasReclaimRide(rideSignals);
6195
+ const publishedWorkDrainAllowed = !compactionOff && (!activeThinkingPrefixHold || firstRenderBust || idleExpiryRebuild || emergencyDropEligible) && hasReclaimRide(rideSignals);
6037
6196
  const shouldApplyPendingOps = publishedWorkDrainAllowed;
6038
- const shouldRunHeuristics = !compactionOff && hasReclaimRide(rideSignals) && (rideSignals.publishedHistory || materializationRequested || forceMaterialization || foldBustsServedPrefixThisPass || firstRenderBust || emergencyDropEligible || args.schedulerDecision === "execute" && (!alreadyRanThisTurn || !args.fullFeatureMode));
6197
+ const shouldRunHeuristics = publishedWorkDrainAllowed && (rideSignals.publishedHistory || materializationRequested || forceMaterialization || foldBustsServedPrefixThisPass || firstRenderBust || heldIdleExpiryRebuild || emergencyDropEligible || args.schedulerDecision === "execute" && (!alreadyRanThisTurn || !args.fullFeatureMode));
6039
6198
  const isCacheBustingPass = publishedWorkDrainAllowed;
6199
+ const canEditWholePrefix = isCacheBustingPass && !activeThinkingPrefixHold;
6040
6200
  const previousTemporalDecisions = args.temporalCandidates && !compactionOff ? new Map([
6041
6201
  ...args.temporalObservedDecisions ?? [],
6042
6202
  ...getTemporalDecisions(args.db, args.sessionId, args.temporalReplayIds ?? args.temporalCandidates.keys())
6043
6203
  ]) : undefined;
6044
- const temporalDecisions = args.temporalCandidates && !compactionOff ? isCacheBustingPass ? new Map([
6204
+ const temporalDecisions = args.temporalCandidates && !compactionOff ? canEditWholePrefix ? new Map([
6045
6205
  ...previousTemporalDecisions ?? [],
6046
6206
  ...freezeTemporalDecisions(args.db, args.sessionId, args.temporalCandidates)
6047
6207
  ]) : previousTemporalDecisions : undefined;
@@ -6199,7 +6359,7 @@ async function runPostTransformPhase2(args) {
6199
6359
  wordRules: args.cavemanTextCompression.wordRules
6200
6360
  } : undefined;
6201
6361
  const heuristicTags = shouldApplyPendingOps ? getActiveTagsBySession2(args.db, args.sessionId) : args.tags;
6202
- const emergencyRewriteAlreadyPriced = pendingOpsDidMutate || foldBustsServedPrefixThisPass || args.historyRebuiltThisPass || args.compartmentInjectionRebuiltFromDb || args.rebuiltHistoryFromInitialPrepare;
6362
+ const emergencyRewriteAlreadyPriced = pendingOpsDidMutate || foldBustsServedPrefixThisPass || firstRenderBust || heldIdleExpiryRebuild || args.historyRebuiltThisPass || args.compartmentInjectionRebuiltFromDb || args.rebuiltHistoryFromInitialPrepare;
6203
6363
  if (emergencyDropEligible && emergencyRewriteAlreadyPriced && getEmergencyInputSample(args.db, args.sessionId) > 0) {
6204
6364
  clearEmergencyDropSample(args.db, args.sessionId);
6205
6365
  }
@@ -6260,7 +6420,7 @@ async function runPostTransformPhase2(args) {
6260
6420
  }
6261
6421
  }
6262
6422
  const reasoningEstimates = tryGetReasoningTokenEstimatesByMessage2(args.db, args.sessionId, sessionDecisionCalibration(args.db, args.sessionId).proseRatio);
6263
- const budgetCutoff = routineCleanupApplied && reasoningEstimates ? Math.min(safeReasoningCutoff, opencodeReasoningBudgetCutoff({
6423
+ const budgetCutoff = routineCleanupApplied && !activeThinkingPrefixHold && reasoningEstimates ? Math.min(safeReasoningCutoff, opencodeReasoningBudgetCutoff({
6264
6424
  messages: args.messages,
6265
6425
  messageTagNumbers: args.messageTagNumbers,
6266
6426
  budget: args.keepReasoningTokens ?? DEFAULT_KEEP_REASONING_TOKENS,
@@ -6282,7 +6442,7 @@ async function runPostTransformPhase2(args) {
6282
6442
  replayStrippedInlineThinking(args.messages, args.messageTagNumbers, persistedInlineWatermark);
6283
6443
  }
6284
6444
  let removedReasoningMessages = 0;
6285
- if (routineCleanupApplied && reasoningRemovalSelectable && reasoningRemovalReadable) {
6445
+ if (routineCleanupApplied && !prefixBoundModel && reasoningRemovalSelectable && reasoningRemovalReadable) {
6286
6446
  const newIds = selectReasoningRemovals({
6287
6447
  messages: args.messages,
6288
6448
  messageTagNumbers: args.messageTagNumbers,
@@ -6399,7 +6559,7 @@ async function runPostTransformPhase2(args) {
6399
6559
  logTransformTiming(args.sessionId, "toolReclaim.select", tReclaimSelect, `targets=${autoReclaimTargetCount}`);
6400
6560
  if (syntheticPendingOps.length > 0) {
6401
6561
  const tReclaimApply = performance.now();
6402
- autoReclaimDidMutate = applyPendingOperations(args.sessionId, args.db, args.targets, args.protectedTagIds, undefined, [], syntheticPendingOps, editMarkerTagIds, (reduction) => droppedTokenReductions.push(reduction));
6562
+ autoReclaimDidMutate = applyPendingOperations(args.sessionId, args.db, newTargets, args.protectedTagIds, undefined, [], syntheticPendingOps, editMarkerTagIds, (reduction) => droppedTokenReductions.push(reduction));
6403
6563
  logTransformTiming(args.sessionId, "toolReclaim.apply", tReclaimApply);
6404
6564
  if (autoReclaimDidMutate) {
6405
6565
  droppedCount += syntheticPendingOps.length;
@@ -6452,7 +6612,7 @@ async function runPostTransformPhase2(args) {
6452
6612
  const t8 = performance.now();
6453
6613
  const frozenStaleReduceIds = replaySnapshot.staleReduceStrippedIds;
6454
6614
  const staleReduceResult = dropStaleReduceCalls(args.messages, frozenStaleReduceIds, {
6455
- detect: isCacheBustingPass,
6615
+ detect: canEditWholePrefix,
6456
6616
  protectedCount: args.protectedCount,
6457
6617
  protectedCallIds: new Set(args.tags.filter((tag) => protectedToolTags.has(tag.tagNumber)).map((tag) => tag.messageId)),
6458
6618
  onFirstApplication: recordFirstApplicationAt
@@ -6471,7 +6631,7 @@ async function runPostTransformPhase2(args) {
6471
6631
  const tImg = performance.now();
6472
6632
  const frozenImageIds = replaySnapshot.processedImageStrippedIds;
6473
6633
  const imageResult = stripProcessedImages(args.messages, frozenImageIds, {
6474
- detect: isCacheBustingPass && args.watermark > 0,
6634
+ detect: canEditWholePrefix && args.watermark > 0,
6475
6635
  watermark: args.watermark,
6476
6636
  messageTagNumbers: args.messageTagNumbers,
6477
6637
  onFirstApplication: recordFirstApplicationAt
@@ -6715,7 +6875,7 @@ async function runPostTransformPhase2(args) {
6715
6875
  messages: args.messages,
6716
6876
  fullFeatureMode: args.fullFeatureMode,
6717
6877
  compactionOff,
6718
- isCacheBustingPass,
6878
+ isCacheBustingPass: canEditWholePrefix,
6719
6879
  sessionMeta: args.sessionMeta,
6720
6880
  todowriteAvailability: args.todowriteAvailability,
6721
6881
  client: args.client,
@@ -6782,7 +6942,7 @@ async function runPostTransformPhase2(args) {
6782
6942
  autoSearchHintAppendedThisPass = autoSearchCompletedThisPass && countAutoSearchHints(args.db, args.sessionId) !== autoSearchHintsBefore;
6783
6943
  logTransformTiming(args.sessionId, "pp.autoSearchHint", tAutoSearch);
6784
6944
  }
6785
- if (args.fullFeatureMode && isCacheBustingPass) {
6945
+ if (args.fullFeatureMode && canEditWholePrefix) {
6786
6946
  const visibleIds = new Set;
6787
6947
  for (const message of args.messages) {
6788
6948
  if (typeof message.info?.id === "string") {
@@ -6790,15 +6950,15 @@ async function runPostTransformPhase2(args) {
6790
6950
  }
6791
6951
  }
6792
6952
  const prunedAnchors = pruneNoteNudgeAnchors(args.db, args.sessionId, visibleIds);
6793
- const prunedDecisions = pruneAutoSearchHintDecisions(args.db, args.sessionId, visibleIds);
6794
- if (prunedAnchors > 0 || prunedDecisions > 0) {
6795
- sessionLog2(args.sessionId, `sticky-injection GC: pruned ${prunedAnchors} note-nudge anchor(s), ${prunedDecisions} auto-search decision(s)`);
6953
+ flushAutoSearchHintDecisionRetirement(args.db, args.sessionId, visibleIds);
6954
+ if (prunedAnchors > 0) {
6955
+ sessionLog2(args.sessionId, `sticky-injection GC: pruned ${prunedAnchors} note-nudge anchor(s)`);
6796
6956
  }
6797
6957
  }
6798
6958
  const materializeReason = m0MaterializeReason ?? (explicitMaterializedSuccessfully ? "explicit_flush" : null);
6799
6959
  const materialized = m0RematerializedThisPass || explicitMaterializedSuccessfully || deferredMaterializedSuccessfully;
6800
6960
  let bustedThisPass = firstApplicationEdits.any || firstRenderBust || pendingOpsDidMutate || heuristicOrReasoningDidMutate || autoReclaimDidMutateThisPass || convertedToolSkeletonsDidMutate || m0RematerializedThisPass || m0M1InjectedThisPass && historyWasConsumedThisPass || historyWasConsumedThisPass;
6801
- const proactiveThinkingStripPermitted = isCacheBustingPass;
6961
+ const proactiveThinkingStripPermitted = isCacheBustingPass && !activeThinkingPrefixHold;
6802
6962
  const tFrozenDecisions = performance.now();
6803
6963
  if (reasoningMutationTargetUnknown) {
6804
6964
  const reasoningCandidates = args.reasoningByMessage.size > 0 ? args.reasoningByMessage.keys() : args.messages;
@@ -6849,7 +7009,7 @@ async function runPostTransformPhase2(args) {
6849
7009
  sessionLog2(args.sessionId, "thinking binding recovery: persistence failed; leaving the bound blocks intact");
6850
7010
  }
6851
7011
  }
6852
- if (canUseEmptySentinels && isCacheBustingPass) {
7012
+ if (canUseEmptySentinels && canEditWholePrefix) {
6853
7013
  const candidates = findMergedReasoningStripDecisions(args.messages, args.resolvedProviderID, mergedReasoningStrippedIds, {
6854
7014
  mutationExemptMessage: reasoningMutationExemptMessage,
6855
7015
  protectedMessages: protectedThinkingMessages
@@ -6895,7 +7055,7 @@ async function runPostTransformPhase2(args) {
6895
7055
  recordFirstApplicationAt(message, partIndex);
6896
7056
  }
6897
7057
  };
6898
- if (isCacheBustingPass && trailingBlankDecisions.size > 0) {
7058
+ if (canEditWholePrefix && trailingBlankDecisions.size > 0) {
6899
7059
  const visibleMessageIds = new Set(args.messages.flatMap((message) => typeof message.info.id === "string" ? [message.info.id] : []));
6900
7060
  const poisonedKeepIds = [];
6901
7061
  for (const [id, decision] of trailingBlankDecisions) {
@@ -7000,7 +7160,7 @@ async function runPostTransformPhase2(args) {
7000
7160
  }
7001
7161
  }
7002
7162
  }
7003
- const prefixEditBesidesReasoningTrim = firstRenderBust || materializationRequested || explicitMaterializedSuccessfully || deferredMaterializedSuccessfully || foldBustsServedPrefixThisPass || publishedM1RefreshedThisPass || m0RematerializedThisPass || m0M1InjectedThisPass && historyWasConsumedThisPass || historyWasConsumedThisPass || pendingOpsDidMutate || heuristicOrReasoningEditBesidesTrim || emergency || autoReclaimDidMutateThisPass || convertedToolSkeletonsDidMutate || deferredClearedMarkerRetires || noteNudgeAppendedThisPass || todoAnchorMovedThisPass || autoSearchHintAppendedThisPass || dropModeSwitchesThisPass || firstApplicationEdits.beforeNewerThinking;
7163
+ const prefixEditBesidesReasoningTrim = firstRenderBust || heldIdleExpiryRebuild || materializationRequested || explicitMaterializedSuccessfully || deferredMaterializedSuccessfully || foldBustsServedPrefixThisPass || publishedM1RefreshedThisPass || m0RematerializedThisPass || m0M1InjectedThisPass && historyWasConsumedThisPass || historyWasConsumedThisPass || pendingOpsDidMutate || heuristicOrReasoningEditBesidesTrim || emergency || autoReclaimDidMutateThisPass || convertedToolSkeletonsDidMutate || deferredClearedMarkerRetires || noteNudgeAppendedThisPass || todoAnchorMovedThisPass || autoSearchHintAppendedThisPass || dropModeSwitchesThisPass || firstApplicationEdits.beforeNewerThinking;
7004
7164
  let proactiveThinkingStrip = null;
7005
7165
  if (!compactionOff && args.thinkingBindingRecoveryEnabledForModel === true && proactiveThinkingStripPermitted && prefixEditBesidesReasoningTrim) {
7006
7166
  const outcome = freezeReasoningOnBustingPass2({
@@ -7047,8 +7207,9 @@ async function runPostTransformPhase2(args) {
7047
7207
  const removedReasoningParts = reasoningRemovalEnabled ? removeReasoningParts(args.messages, removedReasoningIds, args.resolvedProviderID) : 0;
7048
7208
  const reasoningStatusRatio = sessionDecisionCalibration(args.db, args.sessionId).proseRatio;
7049
7209
  captureOpencodeReasoningBudgetStatus(args.sessionId, args.messages, args.keepReasoningTokens ?? DEFAULT_KEEP_REASONING_TOKENS, prefixBoundModel, reasoningStatusRatio);
7050
- args.restoreLatestTurnOriginals?.();
7051
- if (args.restoreLatestTurnOriginals) {
7210
+ if (!rewritingSignedPrefix)
7211
+ args.restoreLatestTurnOriginals?.();
7212
+ if (!rewritingSignedPrefix && args.restoreLatestTurnOriginals) {
7052
7213
  refreshReasoningRemovalUnion();
7053
7214
  if (replayCommittedVisibleDrops()) {
7054
7215
  finalizeMessageRepresentation2(args.messages, args.resolvedProviderID, finalizeOptions);
@@ -7172,7 +7333,8 @@ async function runPostTransformPhase2(args) {
7172
7333
  bustedThisPass,
7173
7334
  prefixTrimStatus: deliveredPrefix?.prefixTrimStatus ?? null,
7174
7335
  thinkingBindingRecovery,
7175
- proactiveThinkingStrip
7336
+ proactiveThinkingStrip,
7337
+ thinkingReleasedForFit
7176
7338
  };
7177
7339
  }
7178
7340
  function checkM0MutationDriftAndSignal2(args) {
@@ -7187,4 +7349,4 @@ function checkM0MutationDriftAndSignal2(args) {
7187
7349
  return false;
7188
7350
  }
7189
7351
 
7190
- export { createTagger, cavemanWordRulesForLanguage, searchMessageHistoryOffThread, findSessionId, findLastUserMessageId, clearAutoSearchForSession, setCtxReduceRegisteredGlobally, resolveCtxReduceAvailabilityFromMessages, resolveCtxReduceAvailability, primeCtxReduceSpawnPermission, ctxReduceSpawnPermissionReadNeeded, spawnAgentFromMessages, spawnAgentFromOpenCodeDb, todowritePermissionDenied, cachedToolPermissionDenied, clearToolPermissionDenied, resolveTodowriteAvailabilityFromMessages, resolveTodowriteAvailability, canConsumeDeferredOnThisPass, hasReclaimRide, reclaimRideLabel, replayClearedReasoning, replayStrippedInlineThinking, stripClearedReasoning, snapshotTrailingBlankSourceDecisions, projectOpencodeReasoningBudgetCutoff, resolveKeepReasoningTokens, reasoningBudgetCutoff, captureOpencodeReasoningBudgetStatus, reasoningBudgetStatusLine, ENGINE_RECONNECTING_USER_MESSAGE, contextRefusalError, protectedToolRefusal, outgoingContextRefusal, EmergencyFailClosedError, latestAssistantTurnStart, latestAssistantTurnMessages, hasActiveAnthropicThinkingTurn, replayCavemanCompression, DegradedPassRefusalError, degradedPassError, applyFlushedStatuses, prewarmTagOwners, waitForTagOwners, stripStructuralNoise, 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 };
7352
+ export { createTagger, cavemanWordRulesForLanguage, searchMessageHistoryOffThread, findSessionId, findLastUserMessageId, clearAutoSearchForSession, setCtxReduceRegisteredGlobally, resolveCtxReduceAvailabilityFromMessages, resolveCtxReduceAvailability, primeCtxReduceSpawnPermission, ctxReduceSpawnPermissionReadNeeded, spawnAgentFromMessages, spawnAgentFromOpenCodeDb, todowritePermissionDenied, cachedToolPermissionDenied, clearToolPermissionDenied, resolveTodowriteAvailabilityFromMessages, resolveTodowriteAvailability, canConsumeDeferredOnThisPass, hasReclaimRide, reclaimRideLabel, replayClearedReasoning, replayStrippedInlineThinking, stripClearedReasoning, findReasoningBearingAssistantIds, snapshotTrailingBlankSourceDecisions, projectOpencodeReasoningBudgetCutoff, resolveKeepReasoningTokens, reasoningBudgetCutoff, 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, 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 };