@cortexkit/opencode-magic-context 0.49.16 → 0.49.17

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 (204) hide show
  1. package/dist/auto-search-worker.js +76 -63
  2. package/dist/chunk-embedding-write-worker.js +11 -11
  3. package/dist/{compaction-marker-candidates-v5c6997n.js → compaction-marker-candidates-n4krhat4.js} +2 -2
  4. package/dist/compaction-marker-candidates-worker.js +2 -2
  5. package/dist/config/schema/magic-context.d.ts +394 -394
  6. package/dist/{conflict-warning-hook-znry4j76.js → conflict-warning-hook-4pmz879v.js} +5 -5
  7. package/dist/{context-3znk23va.js → context-yhetp0kn.js} +294 -144
  8. package/dist/{embedding-backfill-q4n8dend.js → embedding-backfill-fmz50tsy.js} +11 -11
  9. package/dist/embedding-worker-process.js +1 -1
  10. package/dist/embedding-worker.js +4 -4
  11. package/dist/features/magic-context/compartment-chunk-embedding.d.ts +1 -1
  12. package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
  13. package/dist/features/magic-context/git-commits/indexer.d.ts.map +1 -1
  14. package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
  15. package/dist/features/magic-context/memory/project-identity-cache.d.ts +2 -0
  16. package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
  17. package/dist/features/magic-context/message-index-async.d.ts +1 -1
  18. package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
  19. package/dist/features/magic-context/message-index.d.ts +5 -0
  20. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  21. package/dist/features/magic-context/search.d.ts +6 -1
  22. package/dist/features/magic-context/search.d.ts.map +1 -1
  23. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  24. package/dist/features/magic-context/storage-meta-shared.d.ts +2 -2
  25. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  26. package/dist/features/magic-context/storage-session-tables.d.ts +9 -1
  27. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  28. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  29. package/dist/hooks/magic-context/auto-search-deadline.d.ts +2 -1
  30. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -1
  31. package/dist/hooks/magic-context/auto-search-hint.d.ts +3 -0
  32. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
  33. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  34. package/dist/hooks/magic-context/auto-search-worker-client.d.ts +10 -2
  35. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
  36. package/dist/hooks/magic-context/compartment-runner-historian.d.ts +2 -0
  37. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  38. package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
  39. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  40. package/dist/hooks/magic-context/lkg-recovery-fence.d.ts.map +1 -1
  41. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  42. package/dist/hooks/magic-context/system-prompt-diagnostics.d.ts +8 -0
  43. package/dist/hooks/magic-context/system-prompt-diagnostics.d.ts.map +1 -0
  44. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  45. package/dist/hooks/magic-context/tag-messages.d.ts +6 -1
  46. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  47. package/dist/hooks/magic-context/todo-view.d.ts +2 -2
  48. package/dist/hooks/magic-context/tool-drop-target.d.ts +3 -2
  49. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  50. package/dist/hooks/magic-context/transform-stage-logger.d.ts +3 -0
  51. package/dist/hooks/magic-context/transform-stage-logger.d.ts.map +1 -1
  52. package/dist/hooks/magic-context/transform.d.ts +1 -0
  53. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  54. package/dist/{index-9nkg2dzk.js → index-24fezq97.js} +3 -3
  55. package/dist/{index-a8bvhwqs.js → index-2vxtcb95.js} +32 -3
  56. package/dist/{index-f71thw8j.js → index-4s3t0nd0.js} +1 -1
  57. package/dist/{index-kn4t1haw.js → index-4yt7dtf4.js} +450 -227
  58. package/dist/{index-v9asb16b.js → index-5a1ex6x8.js} +5 -5
  59. package/dist/{index-fkx2qnvw.js → index-6x57ar45.js} +2 -2
  60. package/dist/{index-dqe8pq4x.js → index-a6mc0v4d.js} +6 -3
  61. package/dist/{index-ayym1x7f.js → index-a7c4r5re.js} +145 -736
  62. package/dist/{index-ek1yxvvz.js → index-aabzay3h.js} +165 -46
  63. package/dist/{index-hehkf6zm.js → index-b5vqckbw.js} +12 -6
  64. package/dist/{v2/server-wafzvyhg.js → index-beht37jy.js} +8 -0
  65. package/dist/{index-7b2cfmaz.js → index-bjcnntmz.js} +2 -2
  66. package/dist/{index-hqkczed7.js → index-c5pytzne.js} +22 -2
  67. package/dist/{index-p4vde22c.js → index-cwzfcbtq.js} +956 -77
  68. package/dist/{index-cj9g0j7a.js → index-fb2qxs2y.js} +7 -7
  69. package/dist/{index-nd7m2a5a.js → index-hqhm3wke.js} +25 -3
  70. package/dist/{index-5mwk1nek.js → index-jn12fvvh.js} +1 -1
  71. package/dist/{index-n6m03s3n.js → index-ke416mdc.js} +1 -1
  72. package/dist/{index-6a6dq53h.js → index-kmdj7dsq.js} +5 -5
  73. package/dist/{index-mtw9e71a.js → index-kq82mtg0.js} +2 -2
  74. package/dist/{index-n78avt2p.js → index-n37sebck.js} +1 -1
  75. package/dist/{index-v63beg1z.js → index-nkpmm9q8.js} +3 -3
  76. package/dist/{index-j6zw70pf.js → index-p7m7j0cp.js} +24 -16
  77. package/dist/{index-wk0n1cgt.js → index-qn7xstt2.js} +2 -2
  78. package/dist/{index-saews2s3.js → index-rr2bb45z.js} +1 -1
  79. package/dist/{index-7pa32z07.js → index-s734jcsr.js} +1 -1
  80. package/dist/{index-b17m64g9.js → index-s74zqahq.js} +1 -1
  81. package/dist/{index-wv9n2zcq.js → index-v8awdgvd.js} +4 -4
  82. package/dist/{index-4qfy7v57.js → index-vrzjhftj.js} +31 -20
  83. package/dist/{index-qrahzcqv.js → index-ze7mvk54.js} +10 -7
  84. package/dist/index.js +39 -39
  85. package/dist/{message-fts-rowid-map-yvx5a9jw.js → message-fts-rowid-map-17s0dfn4.js} +5 -3
  86. package/dist/{message-index-bounded-6th8djy9.js → message-index-bounded-1633vc7f.js} +17 -17
  87. package/dist/{message-index-t4pz7akd.js → message-index-dprebmtt.js} +13 -13
  88. package/dist/{message-time-backfill-8egzkd3z.js → message-time-backfill-73mmm76q.js} +1 -1
  89. package/dist/migration-worker.js +8 -8
  90. package/dist/plugin/dream-timer.d.ts +11 -0
  91. package/dist/plugin/dream-timer.d.ts.map +1 -1
  92. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  93. package/dist/{project-embedding-registry-2dea0a77.js → project-embedding-registry-z74mhqkf.js} +10 -10
  94. package/dist/raw-ordinal-warmup-worker.js +10 -10
  95. package/dist/{read-session-chunk-4pwqxm5a.js → read-session-chunk-4zp09ejb.js} +7 -7
  96. package/dist/{read-session-raw-5ar8se5v.js → read-session-raw-rsc8c7qy.js} +2 -2
  97. package/dist/{recomp-orchestrator-tjcaj5x7.js → recomp-orchestrator-z3ecszx6.js} +24 -24
  98. package/dist/{search-rb01n29x.js → search-6mee3vty.js} +20 -20
  99. package/dist/{search-archive-02jws7hw.js → search-archive-znyy44ve.js} +8 -8
  100. package/dist/{send-session-notification-2x9edkrp.js → send-session-notification-6ve0e8p4.js} +4 -4
  101. package/dist/shared/historian-cache.d.ts +8 -0
  102. package/dist/shared/historian-cache.d.ts.map +1 -0
  103. package/dist/shared/model-suggestion-retry.d.ts +2 -0
  104. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  105. package/dist/shared/rpc-discovery-cleanup.d.ts +3 -0
  106. package/dist/shared/rpc-discovery-cleanup.d.ts.map +1 -0
  107. package/dist/shared/rpc-server.d.ts +2 -0
  108. package/dist/shared/rpc-server.d.ts.map +1 -1
  109. package/dist/shared/search-text.d.ts +8 -0
  110. package/dist/shared/search-text.d.ts.map +1 -0
  111. package/dist/shared/sqlite.d.ts +4 -2
  112. package/dist/shared/sqlite.d.ts.map +1 -1
  113. package/dist/shared/storage-file-mutex.d.ts.map +1 -1
  114. package/dist/shared/subagent-runner.d.ts +2 -0
  115. package/dist/shared/subagent-runner.d.ts.map +1 -1
  116. package/dist/shared/system-directive.d.ts +2 -0
  117. package/dist/shared/system-directive.d.ts.map +1 -1
  118. package/dist/{sqlite-4pqyynrs.js → sqlite-zf72c52d.js} +1 -1
  119. package/dist/{storage-memory-j3v3hc83.js → storage-memory-y3qmy00r.js} +2 -2
  120. package/dist/{storage-tags-4z1w27xa.js → storage-tags-8qns3012.js} +8 -4
  121. package/dist/{transform-postprocess-phase-xaw5c3xp.js → transform-postprocess-phase-3ydzxa62.js} +24 -24
  122. package/dist/v2/auto-search-worker.js +76 -63
  123. package/dist/v2/chunk-embedding-write-worker.js +11 -11
  124. package/dist/v2/{compaction-marker-candidates-1vqwr3s5.js → compaction-marker-candidates-ebx3388k.js} +2 -2
  125. package/dist/v2/compaction-marker-candidates-worker.js +2 -2
  126. package/dist/v2/{context-acw1nhv8.js → context-jn3zpeqh.js} +882 -393
  127. package/dist/v2/embedding-backfill-7c7yr69y.js +23 -0
  128. package/dist/v2/embedding-worker-process.js +1 -1
  129. package/dist/v2/embedding-worker.js +4 -4
  130. package/dist/v2/fold/native-replay.d.ts +11 -2
  131. package/dist/v2/fold/native-replay.d.ts.map +1 -1
  132. package/dist/v2/fold/policy.d.ts.map +1 -1
  133. package/dist/v2/fold/restore.d.ts.map +1 -1
  134. package/dist/v2/hooks/context.d.ts.map +1 -1
  135. package/dist/v2/hooks/hidden-child.d.ts +8 -0
  136. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  137. package/dist/v2/hooks/types.d.ts +17 -0
  138. package/dist/v2/hooks/types.d.ts.map +1 -1
  139. package/dist/v2/{message-fts-rowid-map-8vf0v7cr.js → message-fts-rowid-map-wfx67gfd.js} +5 -3
  140. package/dist/v2/{message-index-bounded-dsrf49y7.js → message-index-bounded-hpejqyd8.js} +17 -17
  141. package/dist/v2/{message-index-e6qzw477.js → message-index-pxehjpzx.js} +13 -13
  142. package/dist/v2/{message-time-backfill-q5pgxf0d.js → message-time-backfill-04t0km1z.js} +1 -1
  143. package/dist/v2/migration-worker.js +8 -8
  144. package/dist/v2/{project-embedding-registry-rek75aqw.js → project-embedding-registry-gnkj56xp.js} +10 -10
  145. package/dist/v2/raw-ordinal-warmup-worker.js +10 -10
  146. package/dist/v2/{read-session-chunk-7bpygfv2.js → read-session-chunk-zdppn4bj.js} +7 -7
  147. package/dist/v2/{read-session-raw-pw2n1qgc.js → read-session-raw-yaegtjzh.js} +2 -2
  148. package/dist/v2/{recomp-orchestrator-hzpgg06e.js → recomp-orchestrator-cmqnfpp3.js} +24 -24
  149. package/dist/v2/{search-sf2vg5pk.js → search-66842dya.js} +20 -20
  150. package/dist/v2/{search-archive-fn4wy8sx.js → search-archive-gfh11vs0.js} +8 -8
  151. package/dist/v2/{send-session-notification-hmr7q0nt.js → send-session-notification-3pxn658x.js} +4 -4
  152. package/dist/v2/{server-785mb90s.js → server-1wy7b9de.js} +6 -3
  153. package/dist/v2/{server-g59aatsz.js → server-3rhpvy84.js} +956 -77
  154. package/dist/v2/{server-kqpawe1a.js → server-46neh5fa.js} +12 -6
  155. package/dist/v2/{server-rrqpvwqd.js → server-6tmj0s7j.js} +2 -2
  156. package/dist/v2/{server-kr2kc9dz.js → server-8by8qfec.js} +10 -7
  157. package/dist/v2/{server-vbe4se57.js → server-a9xqj88f.js} +1 -1
  158. package/dist/{index-wafzvyhg.js → v2/server-beht37jy.js} +8 -0
  159. package/dist/v2/{server-05xjtq6c.js → server-d04vrx0j.js} +1 -1
  160. package/dist/v2/{server-zyw55ygv.js → server-ec4ca92p.js} +5 -5
  161. package/dist/v2/{server-6fyp0v67.js → server-fw7wrk01.js} +145 -737
  162. package/dist/v2/{server-zs8d0s3b.js → server-g3qma5c0.js} +1 -1
  163. package/dist/v2/{server-00hx04yn.js → server-gpvay0xz.js} +2 -2
  164. package/dist/v2/{server-r9gjxcte.js → server-gtfhttbr.js} +7 -7
  165. package/dist/v2/{server-gha9x4qq.js → server-h1v0pyxb.js} +2 -2
  166. package/dist/v2/{server-hgg55hde.js → server-hy3d3vsx.js} +1 -1
  167. package/dist/v2/{server-1hcbw661.js → server-kh7dpa1a.js} +24 -16
  168. package/dist/v2/{server-vgpab6rd.js → server-my7k4eds.js} +4 -4
  169. package/dist/v2/{server-d8tj10db.js → server-n1prf1g6.js} +1 -1
  170. package/dist/v2/{server-n78avt2p.js → server-n37sebck.js} +1 -1
  171. package/dist/v2/{server-y5pznjt9.js → server-nj659894.js} +5 -5
  172. package/dist/v2/{server-e3ftpk7v.js → server-rmygf5pn.js} +32 -3
  173. package/dist/v2/{server-0ppsweh6.js → server-tgnbmwah.js} +22 -2
  174. package/dist/v2/{server-n5q841qn.js → server-vsw8tmm6.js} +31 -20
  175. package/dist/v2/{server-6714jebr.js → server-xj136kt8.js} +1 -1
  176. package/dist/v2/{server-0mzjjw3s.js → server-zyzawhdw.js} +25 -3
  177. package/dist/v2/{server-aavz8pm6.js → server-zzkj2fch.js} +3 -3
  178. package/dist/v2/server.js +4 -4
  179. package/dist/v2/{sqlite-4pqyynrs.js → sqlite-zf72c52d.js} +1 -1
  180. package/dist/v2/{storage-memory-j3v3hc83.js → storage-memory-y3qmy00r.js} +2 -2
  181. package/dist/v2/{storage-tags-hkwtbp3g.js → storage-tags-1h8k6ra9.js} +8 -4
  182. package/dist/v2/store-reader.d.ts +2 -0
  183. package/dist/v2/store-reader.d.ts.map +1 -1
  184. package/dist/v2/{wrapup-orchestrator-x4xj1782.js → wrapup-orchestrator-xs8redz9.js} +24 -24
  185. package/dist/wrapup-orchestrator-j7d7ry5b.js +48 -0
  186. package/package.json +1 -1
  187. package/src/config/latch-permanence-guard.test.ts +4 -0
  188. package/src/shared/historian-cache.test.ts +69 -0
  189. package/src/shared/historian-cache.ts +55 -0
  190. package/src/shared/model-suggestion-retry.ts +2 -0
  191. package/src/shared/rpc-discovery-cleanup.test.ts +57 -0
  192. package/src/shared/rpc-discovery-cleanup.ts +57 -0
  193. package/src/shared/rpc-server.ts +36 -13
  194. package/src/shared/search-text.test.ts +47 -0
  195. package/src/shared/search-text.ts +63 -0
  196. package/src/shared/sqlite.test.ts +56 -0
  197. package/src/shared/sqlite.ts +51 -2
  198. package/src/shared/storage-file-mutex-review.test.ts +22 -2
  199. package/src/shared/storage-file-mutex.ts +11 -1
  200. package/src/shared/subagent-runner.ts +2 -0
  201. package/src/shared/system-directive.ts +19 -1
  202. package/src/shared/tag-transcript.ts +12 -4
  203. package/dist/v2/embedding-backfill-jyd6492b.js +0 -23
  204. package/dist/wrapup-orchestrator-vj2tbp22.js +0 -48
@@ -14,10 +14,6 @@ import {
14
14
  getUncoveredCompartmentEndsThrough,
15
15
  providerResponseFailed,
16
16
  isSuccessfulProviderCompletion,
17
- gaDatabasePath,
18
- RAW_MESSAGE_TYPES,
19
- V2StoreReaderPool,
20
- V2StoreReader,
21
17
  getOrCreateSessionMeta,
22
18
  updateSessionMeta,
23
19
  markSessionCleanupPending,
@@ -58,7 +54,7 @@ import {
58
54
  rebaseSessionCoordinatesAsync,
59
55
  resolveOpenCodeProtectedTailBoundary,
60
56
  getActiveCompartmentRun
61
- } from "./index-ayym1x7f.js";
57
+ } from "./index-a7c4r5re.js";
62
58
  import"./index-sd3egckz.js";
63
59
  import {
64
60
  getHarness2
@@ -147,7 +143,7 @@ import {
147
143
  applyJsonSchemaParameterDescriptions,
148
144
  MagicContextRpcServer,
149
145
  subagentTemperature
150
- } from "./index-ek1yxvvz.js";
146
+ } from "./index-aabzay3h.js";
151
147
  import {
152
148
  resolveHistorianModel2
153
149
  } from "./index-8cd2j99z.js";
@@ -162,12 +158,12 @@ import {
162
158
  openDatabaseAsync,
163
159
  isDatabasePersisted,
164
160
  getDatabasePersistenceError
165
- } from "./index-cj9g0j7a.js";
161
+ } from "./index-fb2qxs2y.js";
166
162
  import {
167
163
  setHomeProjectPermission,
168
164
  resolveProjectIdentityForSession,
169
165
  scheduleAfterBootQuiet
170
- } from "./index-a8bvhwqs.js";
166
+ } from "./index-2vxtcb95.js";
171
167
  import {
172
168
  needsBlockedRead,
173
169
  markHostUnservedRow,
@@ -178,6 +174,7 @@ import {
178
174
  assertExecutableToolInput,
179
175
  getProtectionWindowForSession,
180
176
  clearCachedM0M1,
177
+ clearCachedM0,
181
178
  getChannel2NudgeState,
182
179
  claimChannel2NudgeState,
183
180
  casChannel2NudgeClaim,
@@ -199,36 +196,40 @@ import {
199
196
  cleanUserText2,
200
197
  readRawSessionMessageIdOrdinalsForRange2,
201
198
  readRawSessionMessageOrdinalById2
202
- } from "./index-j6zw70pf.js";
199
+ } from "./index-p7m7j0cp.js";
203
200
  import {
204
201
  invalidateAutoEmbedSession,
205
202
  clearEmbedSessionState
206
- } from "./index-qrahzcqv.js";
203
+ } from "./index-ze7mvk54.js";
207
204
  import {
208
205
  hasMeaningfulUserText2,
209
206
  preloadTokenizer,
210
207
  estimateTokens
211
- } from "./index-hqkczed7.js";
212
- import"./index-fkx2qnvw.js";
208
+ } from "./index-c5pytzne.js";
209
+ import"./index-6x57ar45.js";
213
210
  import {
214
211
  inRootAsyncContext2,
215
212
  withSqliteTransformPass2,
216
213
  withoutSqliteTransformPass2,
217
214
  isTransientSqliteError2,
218
215
  withAsyncPrivilegedWriter2
219
- } from "./index-wafzvyhg.js";
216
+ } from "./index-beht37jy.js";
220
217
  import"./index-v0p37hm2.js";
221
- import"./index-7pa32z07.js";
222
- import"./index-dqe8pq4x.js";
218
+ import"./index-s734jcsr.js";
219
+ import"./index-a6mc0v4d.js";
223
220
  import {
224
221
  deleteChunkEmbedBackoffForSession
225
- } from "./index-hehkf6zm.js";
222
+ } from "./index-b5vqckbw.js";
226
223
  import"./index-nj7yykkx.js";
227
224
  import {
228
225
  BoundedSessionMap,
229
226
  advanceSessionActivity,
230
- backfillSessionActivity
231
- } from "./index-p4vde22c.js";
227
+ backfillSessionActivity,
228
+ gaDatabasePath,
229
+ RAW_MESSAGE_TYPES,
230
+ V2StoreReaderPool,
231
+ V2StoreReader
232
+ } from "./index-cwzfcbtq.js";
232
233
  import"./index-bp5083x2.js";
233
234
  import"./index-1zx87sdm.js";
234
235
  import {
@@ -237,20 +238,20 @@ import {
237
238
  isDroppedToolOutput,
238
239
  evaluateChannel2,
239
240
  buildChannel2Reminder
240
- } from "./index-nd7m2a5a.js";
241
+ } from "./index-hqhm3wke.js";
241
242
  import"./index-58e3y90n.js";
242
- import"./index-mtw9e71a.js";
243
+ import"./index-kq82mtg0.js";
243
244
  import {
244
245
  getCurrentToolSetHash,
245
246
  recordToolDefinition
246
- } from "./index-n6m03s3n.js";
247
+ } from "./index-ke416mdc.js";
247
248
  import"./index-fr0wbhdn.js";
248
- import"./index-wk0n1cgt.js";
249
+ import"./index-qn7xstt2.js";
249
250
  import"./index-fb3zxn06.js";
250
251
  import {
251
252
  renderUserFacingFailure,
252
253
  userFacingFailureCode
253
- } from "./index-wv9n2zcq.js";
254
+ } from "./index-v8awdgvd.js";
254
255
  import {
255
256
  createTagger,
256
257
  cavemanWordRulesForLanguage,
@@ -259,29 +260,29 @@ import {
259
260
  EmergencyFailClosedError,
260
261
  DegradedPassRefusalError,
261
262
  isSyntheticHeadMessage2
262
- } from "./index-kn4t1haw.js";
263
- import"./index-f71thw8j.js";
263
+ } from "./index-4yt7dtf4.js";
264
+ import"./index-4s3t0nd0.js";
264
265
  import"./index-qt1qqasc.js";
265
- import"./index-saews2s3.js";
266
+ import"./index-rr2bb45z.js";
266
267
  import"./index-4dhv7mqz.js";
267
- import"./index-7b2cfmaz.js";
268
- import"./index-9nkg2dzk.js";
269
- import"./index-n78avt2p.js";
268
+ import"./index-bjcnntmz.js";
269
+ import"./index-24fezq97.js";
270
+ import"./index-n37sebck.js";
270
271
  import {
271
272
  pushNotification2,
272
273
  isTuiConnected2
273
274
  } from "./index-x8a7jmkh.js";
274
275
  import"./index-y9f76s3f.js";
275
- import"./index-b17m64g9.js";
276
- import"./index-4qfy7v57.js";
277
- import"./index-v63beg1z.js";
276
+ import"./index-s74zqahq.js";
277
+ import"./index-vrzjhftj.js";
278
+ import"./index-nkpmm9q8.js";
278
279
  import"./index-gp3kcpc4.js";
279
280
  import {
280
281
  detectConflicts
281
282
  } from "./index-kee4kn5j.js";
282
283
  import"./index-fmsr7v69.js";
283
284
  import"./index-kaqs6h31.js";
284
- import"./index-6a6dq53h.js";
285
+ import"./index-kmdj7dsq.js";
285
286
  import {
286
287
  isDreamerRunnable,
287
288
  isSmartNoteSurfaceAvailable,
@@ -295,6 +296,9 @@ import {
295
296
  } from "./index-y8v6yerm.js";
296
297
  import"./index-k29z4aqh.js";
297
298
 
299
+ // src/v2/hooks/context.ts
300
+ import { setTimeout as delay } from "node:timers/promises";
301
+
298
302
  // src/hooks/magic-context/history-boundary-repair.ts
299
303
  function readBaseline(db, sessionId) {
300
304
  const row = db.prepare("SELECT cached_m0_bytes IS NOT NULL AS hasM0, cached_m0_last_baseline_end_message_id AS boundary FROM session_meta WHERE session_id = ?").get(sessionId);
@@ -1631,24 +1635,31 @@ ${data.output?.output ?? ""}`
1631
1635
  const sameModel = sameProvider && previousModel?.id === model.id;
1632
1636
  const reuse = sameModel && data.error === undefined;
1633
1637
  const metadata = (state) => state === undefined ? undefined : { [model.providerID]: state };
1638
+ const reasoningInterrupted = data.content?.some((part) => part.type === "reasoning" && part.time !== undefined && part.time.completed === undefined);
1634
1639
  const content = [];
1635
1640
  const results = [];
1636
1641
  for (const part of data.content ?? []) {
1642
+ let native = "native" in part ? part.native : part.type === "tool" ? part.providerState : part.state;
1643
+ if (part.type === "tool" && part.providerResultState !== null && typeof part.providerResultState === "object" && !Array.isArray(part.providerResultState))
1644
+ native = {
1645
+ ...native !== null && typeof native === "object" && !Array.isArray(native) ? native : {},
1646
+ ...part.providerResultState
1647
+ };
1637
1648
  if (part.type === "text") {
1638
1649
  if (part.text !== "")
1639
1650
  content.push({
1640
1651
  type: "text",
1641
1652
  text: part.text,
1642
- providerMetadata: reuse ? metadata(part.state) : undefined
1653
+ providerMetadata: reuse ? metadata(native) : undefined
1643
1654
  });
1644
1655
  continue;
1645
1656
  }
1646
1657
  if (part.type === "reasoning") {
1647
- if (part.text !== "" || reuse && part.state !== undefined)
1658
+ if (part.text !== "" || reuse && !reasoningInterrupted && native !== undefined)
1648
1659
  content.push({
1649
- type: reuse || data.error === undefined ? "reasoning" : "text",
1660
+ type: data.error === undefined && !reasoningInterrupted ? "reasoning" : "text",
1650
1661
  text: part.text,
1651
- providerMetadata: reuse ? metadata(part.state) : undefined
1662
+ providerMetadata: reuse && !reasoningInterrupted ? metadata(native) : undefined
1652
1663
  });
1653
1664
  continue;
1654
1665
  }
@@ -1667,7 +1678,7 @@ ${data.output?.output ?? ""}`
1667
1678
  name: part.name,
1668
1679
  input,
1669
1680
  providerExecuted: part.executed,
1670
- providerMetadata: toolReuse ? metadata(part.providerState) : undefined
1681
+ providerMetadata: toolReuse ? metadata(native) : undefined
1671
1682
  });
1672
1683
  if (!completed)
1673
1684
  continue;
@@ -1678,7 +1689,7 @@ ${data.output?.output ?? ""}`
1678
1689
  id: part.id,
1679
1690
  name: part.name,
1680
1691
  providerExecuted: part.executed,
1681
- providerMetadata: toolReuse ? metadata(part.providerResultState ?? part.providerState) : sameProvider ? metadata(part.providerResultState) : undefined,
1692
+ providerMetadata: (part.executed === true ? sameProvider : reuse) ? metadata(native) : undefined,
1682
1693
  result: state.status === "error" ? { error: state.error, content: toolContent } : single?.type === "text" ? { type: "text", value: single.text } : { type: "content", value: toolContent },
1683
1694
  ...state.status === "error" ? { resultType: "error" } : {}
1684
1695
  };
@@ -1706,13 +1717,50 @@ function copyNativeInput(messages) {
1706
1717
  return copies;
1707
1718
  }
1708
1719
  function isLocalCheckpoint(row) {
1709
- return row.type === "compaction" && row.data.status === "completed" && row.data.providerContext === undefined;
1720
+ return row.type === "compaction" && row.data.status === "completed" && row.data.providerContext === undefined && row.data.native?.messages === undefined;
1721
+ }
1722
+ function isAdmittedLocalCheckpoint(storage, sessionID, cut) {
1723
+ if (!isLocalCheckpoint(cut) || cut.session_id !== sessionID)
1724
+ return false;
1725
+ const admission = storage.admission(sessionID, cut.id);
1726
+ if (!admission?.payload || admission.digest !== foldDigest(admission.payload))
1727
+ return false;
1728
+ try {
1729
+ const snapshot = JSON.parse(admission.payload);
1730
+ return snapshot.source === storage.sourceID && snapshot.sessionID === sessionID && snapshot.admissionID === cut.id && snapshot.summary === cut.data.summary;
1731
+ } catch {
1732
+ return false;
1733
+ }
1710
1734
  }
1711
1735
  var conversational = (row) => RAW_MESSAGE_TYPES.includes(row.type) || row.type === "location-switched";
1736
+ var historyDigest = (reader, sessionID, through) => foldDigest(JSON.stringify(reader.range(sessionID, -1, through).filter(conversational)));
1737
+ var admissionKey = (sessionID) => `native-fold/v2/${encodeURIComponent(sessionID)}`;
1738
+ async function forgetNativeFoldProvenance(storage, sessionID, legacyOnly = false) {
1739
+ const remove = async (key) => {
1740
+ if (storage.remove)
1741
+ await storage.remove(key);
1742
+ else
1743
+ await storage.set(key, null);
1744
+ };
1745
+ if (!legacyOnly)
1746
+ await remove(admissionKey(sessionID));
1747
+ if (!storage.scan)
1748
+ return;
1749
+ let after;
1750
+ do {
1751
+ const page = await storage.scan({ prefix: "native-fold/v1/", after, limit: 100 });
1752
+ for (const { key } of page.entries) {
1753
+ if (key.slice("native-fold/v1/".length).split("/").slice(1).join("/") === sessionID)
1754
+ await remove(key);
1755
+ }
1756
+ after = page.next;
1757
+ } while (after);
1758
+ }
1712
1759
 
1713
1760
  class NativeFoldReplay {
1714
1761
  storage;
1715
1762
  openReader;
1763
+ admissions;
1716
1764
  changed = new Set;
1717
1765
  dirty = new Set;
1718
1766
  unavailable = new Set;
@@ -1720,9 +1768,11 @@ class NativeFoldReplay {
1720
1768
  metadataThrough = new Map;
1721
1769
  loaded = new Map;
1722
1770
  sources = new Map;
1723
- constructor(storage, openReader) {
1771
+ staleHeads = new Set;
1772
+ constructor(storage, openReader, admissions) {
1724
1773
  this.storage = storage;
1725
1774
  this.openReader = openReader;
1775
+ this.admissions = admissions;
1726
1776
  storage.onEvict((sessionID) => this.clear(sessionID));
1727
1777
  }
1728
1778
  account(sessionID) {
@@ -1761,6 +1811,51 @@ class NativeFoldReplay {
1761
1811
  async baseline(sessionID) {
1762
1812
  return this.tail(sessionID)?.baseline;
1763
1813
  }
1814
+ admissionKey(sessionID) {
1815
+ return admissionKey(sessionID);
1816
+ }
1817
+ async removeAdmission(key) {
1818
+ if (this.admissions?.remove)
1819
+ await this.admissions.remove(key);
1820
+ else
1821
+ await this.admissions?.set(key, null);
1822
+ }
1823
+ async removeLegacyAdmissions(sessionID) {
1824
+ if (this.admissions)
1825
+ await forgetNativeFoldProvenance(this.admissions, sessionID, true);
1826
+ }
1827
+ async admits(sessionID, cut, reader) {
1828
+ if (!isLocalCheckpoint(cut) || cut.session_id !== sessionID)
1829
+ return false;
1830
+ if (isAdmittedLocalCheckpoint(this.storage, sessionID, cut))
1831
+ return true;
1832
+ if (!this.admissions)
1833
+ return false;
1834
+ try {
1835
+ const source = reader.hostIdentity();
1836
+ const saved = await this.admissions.get(this.admissionKey(sessionID));
1837
+ if (!saved?.payload || saved.digest !== foldDigest(saved.payload))
1838
+ return false;
1839
+ const snapshot = JSON.parse(saved.payload);
1840
+ if (snapshot.sourceDigest !== foldDigest(source) || snapshot.sessionID !== sessionID || snapshot.admissionID !== cut.id || snapshot.summaryDigest !== foldDigest(cut.data.summary ?? ""))
1841
+ return false;
1842
+ if (snapshot.historyDigest !== historyDigest(reader, sessionID, cut.seq - 1)) {
1843
+ this.staleHeads.add(sessionID);
1844
+ this.invalidate(sessionID);
1845
+ await this.removeAdmission(this.admissionKey(sessionID));
1846
+ return false;
1847
+ }
1848
+ await this.storage.supply(sessionID, cut.id, JSON.stringify({
1849
+ source: this.storage.sourceID,
1850
+ sessionID,
1851
+ admissionID: cut.id,
1852
+ summary: cut.data.summary
1853
+ }));
1854
+ return true;
1855
+ } catch {
1856
+ return false;
1857
+ }
1858
+ }
1764
1859
  rendered(row, model) {
1765
1860
  return restoreRow(row, model, hostUsesMediaAssets() ? {
1766
1861
  asset: hostMediaAsset,
@@ -1838,6 +1933,7 @@ class NativeFoldReplay {
1838
1933
  this.loaded.set(draft.sessionID, through);
1839
1934
  this.unavailable.delete(draft.sessionID);
1840
1935
  this.changed.delete(draft.sessionID);
1936
+ this.staleHeads.delete(draft.sessionID);
1841
1937
  } finally {
1842
1938
  reader.close();
1843
1939
  }
@@ -1864,7 +1960,8 @@ class NativeFoldReplay {
1864
1960
  async supplyHeld(args) {
1865
1961
  const { draft, reader, summary } = args;
1866
1962
  const tail = this.tail(draft.sessionID);
1867
- const id = reader.latestRunningCompaction(draft.sessionID)?.id;
1963
+ const running = reader.latestRunningCompaction(draft.sessionID);
1964
+ const id = running?.id;
1868
1965
  if (!id || !tail || tail.model !== `${draft.model.providerID}/${draft.model.id}`)
1869
1966
  return false;
1870
1967
  const through = reader.latestSequence(draft.sessionID);
@@ -1888,6 +1985,21 @@ class NativeFoldReplay {
1888
1985
  summary
1889
1986
  };
1890
1987
  await this.storage.supply(draft.sessionID, id, JSON.stringify(snapshot));
1988
+ if (this.admissions) {
1989
+ const provenance = {
1990
+ sourceDigest: foldDigest(reader.hostIdentity()),
1991
+ sessionID: draft.sessionID,
1992
+ admissionID: id,
1993
+ summaryDigest: foldDigest(summary),
1994
+ historyDigest: historyDigest(reader, draft.sessionID, (running?.seq ?? through) - 1)
1995
+ };
1996
+ const payload = JSON.stringify(provenance);
1997
+ await this.admissions.set(this.admissionKey(draft.sessionID), {
1998
+ payload,
1999
+ digest: foldDigest(payload)
2000
+ });
2001
+ await this.removeLegacyAdmissions(draft.sessionID);
2002
+ }
1891
2003
  return true;
1892
2004
  }
1893
2005
  async restore(sessionID, cut, model, options = {}) {
@@ -1972,6 +2084,9 @@ class NativeFoldReplay {
1972
2084
  sourceChanged(sessionID) {
1973
2085
  return this.changed.has(sessionID);
1974
2086
  }
2087
+ needsHeadRebuild(sessionID) {
2088
+ return this.staleHeads.has(sessionID);
2089
+ }
1975
2090
  clear(sessionID) {
1976
2091
  this.sources.delete(sessionID);
1977
2092
  this.metadata.delete(sessionID);
@@ -1980,8 +2095,11 @@ class NativeFoldReplay {
1980
2095
  this.unavailable.delete(sessionID);
1981
2096
  this.dirty.delete(sessionID);
1982
2097
  this.changed.delete(sessionID);
2098
+ this.staleHeads.delete(sessionID);
1983
2099
  }
1984
2100
  async forget(sessionID) {
2101
+ if (this.admissions)
2102
+ await forgetNativeFoldProvenance(this.admissions, sessionID);
1985
2103
  await this.storage.forget(sessionID);
1986
2104
  }
1987
2105
  }
@@ -1996,11 +2114,7 @@ class HostFoldPolicy {
1996
2114
  this.deps = deps;
1997
2115
  }
1998
2116
  owned(sessionID, cut, id) {
1999
- const row = this.deps.storage.admission(sessionID, id);
2000
- if (!isLocalCheckpoint(cut) || cut.id !== id || !row?.payload || row.digest !== foldDigest(row.payload))
2001
- return false;
2002
- const snapshot = JSON.parse(row.payload);
2003
- return snapshot.summary === cut.data.summary && snapshot.source === this.deps.storage.sourceID && snapshot.sessionID === sessionID && snapshot.admissionID === id;
2117
+ return cut.id === id && isAdmittedLocalCheckpoint(this.deps.storage, sessionID, cut);
2004
2118
  }
2005
2119
  async idle(sessionID) {
2006
2120
  const { storage, session, threshold } = this.deps;
@@ -4677,7 +4791,7 @@ async function registerContext(context) {
4677
4791
  }
4678
4792
  const folds = new FoldOwner(context.storage);
4679
4793
  const nativeFoldMemory = !compactionOff && process.env.MC_OC2_INVISIBLE_FOLD === "1" ? nativeFoldCache(() => storage.require()) : undefined;
4680
- const nativeFoldReplay = nativeFoldMemory ? new NativeFoldReplay(nativeFoldMemory, () => openStoreReader()) : undefined;
4794
+ const nativeFoldReplay = nativeFoldMemory ? new NativeFoldReplay(nativeFoldMemory, () => openStoreReader(), context.storage) : undefined;
4681
4795
  setOutputReserveConfig(config.output_reserve);
4682
4796
  const queriedModels = new Set;
4683
4797
  const rawLimits = new Map;
@@ -4729,6 +4843,7 @@ async function registerContext(context) {
4729
4843
  memorySyncRequestedSessions: rustMemorySyncRequestedSessions
4730
4844
  }) : undefined;
4731
4845
  const hiddenChildHook = new HiddenChildHook;
4846
+ await context.session.hook("http.request", (draft) => hiddenChildHook.cacheRequest(draft));
4732
4847
  const tools = db && isDatabasePersisted(db) ? await registerTools(context, db, config, moduleToolBackends?.backends, (id) => hiddenChildHook.owns(id)) : undefined;
4733
4848
  const usage = new Map;
4734
4849
  const generateReplay = new V2GenerateReplay;
@@ -5105,87 +5220,114 @@ async function registerContext(context) {
5105
5220
  }) : undefined;
5106
5221
  const usageController = new AbortController;
5107
5222
  const usageDone = (async () => {
5108
- try {
5109
- for await (const value of context.event.subscribe({ signal: usageController.signal })) {
5110
- if (usageController.signal.aborted)
5111
- break;
5112
- const event = value;
5113
- if (event.type === "provider.updated" || event.type === "model.updated") {
5114
- queriedModels.clear();
5115
- continue;
5116
- }
5117
- if (!event.data?.sessionID)
5118
- continue;
5119
- const sessionID = event.data.sessionID;
5120
- if (event.type?.startsWith("session.revert.") || event.type === "session.message.content.updated") {
5121
- nativeFoldReplay?.onEvent(event);
5122
- restoredRows.forget(sessionID);
5123
- }
5124
- if (event.type === "session.error" || event.type === "session.execution.failed") {
5125
- const error = hiddenTerminalError(event);
5126
- if (error !== undefined)
5127
- hiddenSessionErrors.set(sessionID, error);
5128
- if (error !== undefined && db && !compactionOff) {
5223
+ let retry = 0;
5224
+ while (!usageController.signal.aborted) {
5225
+ const subscribedAt = Date.now();
5226
+ try {
5227
+ for await (const value of context.event.subscribe({
5228
+ signal: usageController.signal
5229
+ })) {
5230
+ if (usageController.signal.aborted)
5231
+ break;
5232
+ const event = value;
5233
+ try {
5234
+ if (event.type === "provider.updated" || event.type === "model.updated") {
5235
+ queriedModels.clear();
5236
+ continue;
5237
+ }
5238
+ if (!event.data?.sessionID)
5239
+ continue;
5240
+ const sessionID = event.data.sessionID;
5241
+ if (event.type?.startsWith("session.revert.") || event.type === "session.message.content.updated") {
5242
+ nativeFoldReplay?.onEvent(event);
5243
+ restoredRows.forget(sessionID);
5244
+ }
5245
+ if (event.type === "session.error" || event.type === "session.execution.failed") {
5246
+ const error = hiddenTerminalError(event);
5247
+ if (error !== undefined)
5248
+ hiddenSessionErrors.set(sessionID, error);
5249
+ if (error !== undefined && db && !compactionOff) {
5250
+ const model = liveModels.get(sessionID);
5251
+ try {
5252
+ armLatestThinkingRecoveryFromError({
5253
+ db,
5254
+ sessionId: sessionID,
5255
+ error,
5256
+ providerID: model?.providerID,
5257
+ modelID: model?.modelID
5258
+ });
5259
+ } catch (armError) {
5260
+ log2("[magic-context] v2 latest-thinking recovery arm failed", armError);
5261
+ }
5262
+ }
5263
+ continue;
5264
+ }
5265
+ if (event.type === "session.deleted") {
5266
+ clearLkgMeasuredRequest(sessionID);
5267
+ deletedSessions.add(sessionID);
5268
+ transform?.clearSessionLogState(sessionID);
5269
+ if (db) {
5270
+ markSessionCleanupPending(db, sessionID);
5271
+ clearSession(db, sessionID);
5272
+ }
5273
+ rawProviders.get(sessionID)?.();
5274
+ rawProviders.delete(sessionID);
5275
+ usage.delete(sessionID);
5276
+ hiddenSessionErrors.delete(sessionID);
5277
+ storageNoticeBySession.delete(sessionID);
5278
+ liveModels.delete(sessionID);
5279
+ variants.delete(sessionID);
5280
+ agents.delete(sessionID);
5281
+ channel1.delete(sessionID);
5282
+ commitSeenLastPass.delete(sessionID);
5283
+ clearEmbedSessionState(sessionID);
5284
+ historyRefreshSessions.delete(sessionID);
5285
+ clearPendingMaterialization(pendingMaterializationSessions, sessionID);
5286
+ lastHeuristicsTurnId.delete(sessionID);
5287
+ restoredRows.forget(sessionID);
5288
+ if (nativeFoldReplay)
5289
+ await nativeFoldReplay.forget(sessionID);
5290
+ else
5291
+ await forgetNativeFoldProvenance(context.storage, sessionID);
5292
+ generateReplay.forget(sessionID);
5293
+ systemPromptRefreshSessions.delete(sessionID);
5294
+ systemPrompt?.clearSession(sessionID);
5295
+ tagger.cleanup(sessionID);
5296
+ continue;
5297
+ }
5298
+ if (event.type !== "session.execution.succeeded")
5299
+ continue;
5129
5300
  const model = liveModels.get(sessionID);
5130
- try {
5131
- armLatestThinkingRecoveryFromError({
5132
- db,
5133
- sessionId: sessionID,
5134
- error,
5135
- providerID: model?.providerID,
5136
- modelID: model?.modelID
5301
+ if (model) {
5302
+ await recordUsage({
5303
+ sessionID,
5304
+ model: { providerID: model.providerID, id: model.modelID }
5137
5305
  });
5138
- } catch (armError) {
5139
- log2("[magic-context] v2 latest-thinking recovery arm failed", armError);
5306
+ if (!compactionOff && typeof await nativeFoldReplay?.baseline(sessionID) === "string")
5307
+ hostFolds?.idle(sessionID);
5140
5308
  }
5309
+ } catch (error) {
5310
+ log2(`[magic-context] v2 event handler failed (type=${event.type ?? "unknown"}, session=${event.data?.sessionID ?? "none"})`, error);
5141
5311
  }
5142
- continue;
5143
- }
5144
- if (event.type === "session.deleted") {
5145
- clearLkgMeasuredRequest(sessionID);
5146
- deletedSessions.add(sessionID);
5147
- transform?.clearSessionLogState(sessionID);
5148
- if (db) {
5149
- markSessionCleanupPending(db, sessionID);
5150
- clearSession(db, sessionID);
5151
- }
5152
- rawProviders.get(sessionID)?.();
5153
- rawProviders.delete(sessionID);
5154
- usage.delete(sessionID);
5155
- hiddenSessionErrors.delete(sessionID);
5156
- storageNoticeBySession.delete(sessionID);
5157
- liveModels.delete(sessionID);
5158
- variants.delete(sessionID);
5159
- agents.delete(sessionID);
5160
- channel1.delete(sessionID);
5161
- commitSeenLastPass.delete(sessionID);
5162
- clearEmbedSessionState(sessionID);
5163
- historyRefreshSessions.delete(sessionID);
5164
- clearPendingMaterialization(pendingMaterializationSessions, sessionID);
5165
- lastHeuristicsTurnId.delete(sessionID);
5166
- restoredRows.forget(sessionID);
5167
- await nativeFoldReplay?.forget(sessionID);
5168
- generateReplay.forget(sessionID);
5169
- systemPromptRefreshSessions.delete(sessionID);
5170
- systemPrompt?.clearSession(sessionID);
5171
- tagger.cleanup(sessionID);
5172
- continue;
5173
- }
5174
- if (event.type !== "session.execution.succeeded")
5175
- continue;
5176
- const model = liveModels.get(sessionID);
5177
- if (model) {
5178
- await recordUsage({
5179
- sessionID,
5180
- model: { providerID: model.providerID, id: model.modelID }
5181
- });
5182
- if (!compactionOff && typeof await nativeFoldReplay?.baseline(sessionID) === "string")
5183
- hostFolds?.idle(sessionID);
5184
5312
  }
5313
+ } catch (error) {
5314
+ if (!usageController.signal.aborted)
5315
+ log2("[magic-context] v2 usage subscription failed", error);
5316
+ }
5317
+ if (usageController.signal.aborted)
5318
+ break;
5319
+ if (Date.now() - subscribedAt >= 30000)
5320
+ retry = 0;
5321
+ const ceiling = Math.min(30000, 250 * 2 ** retry);
5322
+ retry = Math.min(retry + 1, 7);
5323
+ try {
5324
+ await delay(ceiling * (0.5 + Math.random() * 0.5), undefined, {
5325
+ signal: usageController.signal
5326
+ });
5327
+ } catch (error) {
5328
+ if (!usageController.signal.aborted)
5329
+ throw error;
5185
5330
  }
5186
- } catch (error) {
5187
- if (!usageController.signal.aborted)
5188
- log2("[magic-context] v2 usage subscription failed", error);
5189
5331
  }
5190
5332
  })();
5191
5333
  const materialize = (draft) => {
@@ -5458,6 +5600,7 @@ async function registerContext(context) {
5458
5600
  compactionOff,
5459
5601
  storeGeneration: "v2",
5460
5602
  normalizeRestoredAssistantText: stripCopiedTagNotation,
5603
+ refreshSourceContents: (sessionID) => nativeFoldReplay?.needsHeadRebuild(sessionID) ?? false,
5461
5604
  hostCleanupCompactionMarkers: () => ({
5462
5605
  verified: true,
5463
5606
  removedLineages: 0,
@@ -5546,12 +5689,13 @@ async function registerContext(context) {
5546
5689
  historyRefreshSessions.add(draft.sessionID);
5547
5690
  requestPendingMaterialization(pendingMaterializationSessions, draft.sessionID, "boundary_repair");
5548
5691
  }
5549
- const incoming = cut && draft.messages.find((message) => message.id === cut.id);
5692
+ const localCut = cut && isLocalCheckpoint(cut) ? cut : undefined;
5693
+ const incoming = localCut && draft.messages.find((message) => message.id === localCut.id);
5550
5694
  postFold = cut !== undefined;
5551
- if (cut && !incoming)
5695
+ if (localCut && !incoming)
5552
5696
  throw new Error("The host checkpoint disappeared from the context draft");
5553
5697
  let nativeRestored;
5554
- if (cut && nativeFoldReplay && isLocalCheckpoint(cut)) {
5698
+ if (cut && nativeFoldReplay && await nativeFoldReplay.admits(draft.sessionID, cut, reader)) {
5555
5699
  try {
5556
5700
  nativeRestored = await nativeFoldReplay.restore(draft.sessionID, cut, `${draft.model.providerID}/${draft.model.id}`, { bounded: !rustModeModuleClient });
5557
5701
  } catch (error) {
@@ -5560,7 +5704,11 @@ async function registerContext(context) {
5560
5704
  nativeRestored = await nativeFoldReplay.restoreRead(draft.sessionID, cut, draft.model);
5561
5705
  }
5562
5706
  }
5563
- if (nativeRestored && nativeFoldReplay?.sourceChanged(draft.sessionID)) {
5707
+ if (cut && nativeFoldReplay?.sourceChanged(draft.sessionID)) {
5708
+ if (db && !rustModeModuleClient && nativeFoldReplay.needsHeadRebuild(draft.sessionID))
5709
+ clearCachedM0(db, draft.sessionID);
5710
+ if (nativeFoldReplay.needsHeadRebuild(draft.sessionID))
5711
+ restoredRows.forget(draft.sessionID);
5564
5712
  historyRefreshSessions.add(draft.sessionID);
5565
5713
  requestPendingMaterialization(pendingMaterializationSessions, draft.sessionID, "host_history_change");
5566
5714
  }
@@ -5571,25 +5719,27 @@ async function registerContext(context) {
5571
5719
  return !id || !present.has(id);
5572
5720
  });
5573
5721
  draft.messages.splice(0, draft.messages.length, ...hidden, ...draft.messages.filter((message) => message !== incoming));
5574
- } else if (cut && incoming) {
5575
- const identity = await folds.observe({
5576
- sessionID: draft.sessionID,
5577
- cutSeq: cut.seq,
5578
- summary: cut.data.summary ?? "",
5579
- rendered: incoming,
5580
- onHard: (reason) => {
5581
- sessionLog2(draft.sessionID, `HARD reason=${reason}`);
5582
- materialize(draft);
5583
- requestPendingMaterialization(pendingMaterializationSessions, draft.sessionID, "host_compaction");
5584
- }
5585
- });
5586
- checkpoint = structuredClone(identity.rendered ?? incoming);
5587
- submitted = identity.rendered ? identity.renderedSummary ?? identity.submitted : cut.data.summary ?? "";
5722
+ } else if (localCut && cut && incoming) {
5723
+ if (!nativeFoldReplay) {
5724
+ const identity = await folds.observe({
5725
+ sessionID: draft.sessionID,
5726
+ cutSeq: cut.seq,
5727
+ summary: cut.data.summary ?? "",
5728
+ rendered: incoming,
5729
+ onHard: (reason) => {
5730
+ sessionLog2(draft.sessionID, `HARD reason=${reason}`);
5731
+ materialize(draft);
5732
+ requestPendingMaterialization(pendingMaterializationSessions, draft.sessionID, "host_compaction");
5733
+ }
5734
+ });
5735
+ checkpoint = structuredClone(identity.rendered ?? incoming);
5736
+ submitted = identity.rendered ? identity.renderedSummary ?? identity.submitted : cut.data.summary ?? "";
5737
+ }
5588
5738
  const moduleBoundaryID = rustModeModuleClient ? getPersistedCompactionMarkerState(db, draft.sessionID)?.boundaryMessageId ?? null : null;
5589
5739
  const moduleBoundarySeq = moduleBoundaryID ? reader.sequenceForId(draft.sessionID, moduleBoundaryID) : undefined;
5590
5740
  const boundaryID = db.prepare("SELECT cached_m0_last_baseline_end_message_id AS id FROM session_meta WHERE session_id = ?").get(draft.sessionID)?.id ?? (boundaryRepair?.kind === "repaired" || boundaryRepair?.kind === "baseline-reset" ? boundaryRepair.anchorEndMessageId : null);
5591
5741
  const servedBoundary = boundaryID ? servedBoundaryRow(reader, draft.sessionID, boundaryID) : null;
5592
- const boundary = (moduleBoundarySeq !== undefined ? moduleBoundarySeq - 1 : undefined) ?? servedBoundary?.seq ?? reader.sequenceForId(draft.sessionID, boundaryID) ?? (reader.earliestSequence(draft.sessionID) ?? 0) - 1;
5742
+ const boundary = (nativeFoldReplay?.sourceChanged(draft.sessionID) && !rustModeModuleClient ? (reader.earliestSequence(draft.sessionID) ?? 0) - 1 : undefined) ?? (moduleBoundarySeq !== undefined ? moduleBoundarySeq - 1 : undefined) ?? servedBoundary?.seq ?? reader.sequenceForId(draft.sessionID, boundaryID) ?? (reader.earliestSequence(draft.sessionID) ?? 0) - 1;
5593
5743
  if (moduleBoundarySeq !== undefined)
5594
5744
  sessionLog2(draft.sessionID, `v2 restore: from the module boundary ${moduleBoundaryID} to the host checkpoint`);
5595
5745
  const present = new Set(draft.messages.map((message) => message.id));
@@ -5840,13 +5990,13 @@ ${baseline}
5840
5990
  }, 0));
5841
5991
  return {
5842
5992
  async dispose() {
5993
+ usageController.abort();
5843
5994
  await hiddenCompletionExecutor?.dispose();
5995
+ await usageDone;
5844
5996
  rpcStopped = true;
5845
5997
  rpcServer.stop();
5846
5998
  transform?.disposeRust();
5847
5999
  tools?.dispose();
5848
- usageController.abort();
5849
- await usageDone;
5850
6000
  deletedSessions.clear();
5851
6001
  await dreamTrigger?.dispose();
5852
6002
  await maintenanceTimer?.dispose();