@cortexkit/opencode-magic-context 0.49.15 → 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 (235) hide show
  1. package/dist/auto-search-worker.js +76 -63
  2. package/dist/chunk-embedding-write-worker.js +12 -10
  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 +343 -343
  6. package/dist/config/schema/magic-context.d.ts.map +1 -1
  7. package/dist/{conflict-warning-hook-mgq17yr3.js → conflict-warning-hook-4pmz879v.js} +6 -6
  8. package/dist/{context-0m46day0.js → context-yhetp0kn.js} +297 -141
  9. package/dist/embedding-backfill-fmz50tsy.js +24 -0
  10. package/dist/embedding-worker-process.js +1 -1
  11. package/dist/embedding-worker.js +5 -5
  12. package/dist/features/magic-context/compartment-chunk-embedding.d.ts +1 -1
  13. package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
  14. package/dist/features/magic-context/git-commits/indexer.d.ts.map +1 -1
  15. package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
  16. package/dist/features/magic-context/memory/project-identity-cache.d.ts +2 -0
  17. package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
  18. package/dist/features/magic-context/message-fts-rowid-map.d.ts +2 -2
  19. package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -1
  20. package/dist/features/magic-context/message-fts-session-filter.d.ts +2 -0
  21. package/dist/features/magic-context/message-fts-session-filter.d.ts.map +1 -1
  22. package/dist/features/magic-context/message-index-async.d.ts +1 -1
  23. package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
  24. package/dist/features/magic-context/message-index.d.ts +5 -0
  25. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  26. package/dist/features/magic-context/message-time-backfill.d.ts +2 -2
  27. package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -1
  28. package/dist/features/magic-context/search.d.ts +6 -1
  29. package/dist/features/magic-context/search.d.ts.map +1 -1
  30. package/dist/features/magic-context/storage-db.d.ts +2 -1
  31. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  32. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  33. package/dist/features/magic-context/storage-meta-shared.d.ts +2 -2
  34. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  35. package/dist/features/magic-context/storage-session-tables.d.ts +9 -1
  36. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  37. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  38. package/dist/hooks/magic-context/auto-search-deadline.d.ts +2 -1
  39. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -1
  40. package/dist/hooks/magic-context/auto-search-hint.d.ts +3 -0
  41. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
  42. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  43. package/dist/hooks/magic-context/auto-search-worker-client.d.ts +10 -2
  44. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
  45. package/dist/hooks/magic-context/compartment-runner-historian.d.ts +4 -2
  46. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  47. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  48. package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -1
  49. package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
  50. package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
  51. package/dist/hooks/magic-context/historian-prompt-fit.d.ts +2 -1
  52. package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -1
  53. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  54. package/dist/hooks/magic-context/lkg-recovery-fence.d.ts.map +1 -1
  55. package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts +26 -0
  56. package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts.map +1 -1
  57. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  58. package/dist/hooks/magic-context/recomp-orchestrator.d.ts +3 -3
  59. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
  60. package/dist/hooks/magic-context/system-prompt-diagnostics.d.ts +8 -0
  61. package/dist/hooks/magic-context/system-prompt-diagnostics.d.ts.map +1 -0
  62. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  63. package/dist/hooks/magic-context/tag-messages.d.ts +6 -1
  64. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  65. package/dist/hooks/magic-context/todo-view.d.ts +2 -2
  66. package/dist/hooks/magic-context/tool-drop-target.d.ts +3 -2
  67. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  68. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  69. package/dist/hooks/magic-context/transform-stage-logger.d.ts +3 -0
  70. package/dist/hooks/magic-context/transform-stage-logger.d.ts.map +1 -1
  71. package/dist/hooks/magic-context/transform.d.ts +1 -0
  72. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  73. package/dist/{index-3kdm78zp.js → index-24fezq97.js} +4 -4
  74. package/dist/{index-a8bvhwqs.js → index-2vxtcb95.js} +32 -3
  75. package/dist/{index-f71thw8j.js → index-4s3t0nd0.js} +1 -1
  76. package/dist/{index-ts1hjk1h.js → index-4yt7dtf4.js} +453 -227
  77. package/dist/{index-mc1cqza6.js → index-5a1ex6x8.js} +5 -5
  78. package/dist/{index-fkx2qnvw.js → index-6x57ar45.js} +2 -2
  79. package/dist/{index-dyvbsvga.js → index-a6mc0v4d.js} +25 -11
  80. package/dist/{index-snp5wbge.js → index-a7c4r5re.js} +160 -749
  81. package/dist/{index-42vcjcwe.js → index-aabzay3h.js} +180 -103
  82. package/dist/{index-3kx0kg0f.js → index-b5vqckbw.js} +14 -8
  83. package/dist/{v2/server-wafzvyhg.js → index-beht37jy.js} +8 -0
  84. package/dist/{index-e20m7284.js → index-bjcnntmz.js} +3 -3
  85. package/dist/{index-hqkczed7.js → index-c5pytzne.js} +22 -2
  86. package/dist/{index-thvnpfsv.js → index-cwzfcbtq.js} +967 -88
  87. package/dist/{index-yxycg7fs.js → index-fb2qxs2y.js} +26 -18
  88. package/dist/{index-mht7bq0z.js → index-hqhm3wke.js} +32 -8
  89. package/dist/{index-e4dsjj1p.js → index-jn12fvvh.js} +1 -1
  90. package/dist/index-kaqs6h31.js +58 -0
  91. package/dist/{index-n6m03s3n.js → index-ke416mdc.js} +1 -1
  92. package/dist/index-kmdj7dsq.js +96 -0
  93. package/dist/{index-1d289pq2.js → index-kq82mtg0.js} +2 -2
  94. package/dist/{index-n78avt2p.js → index-n37sebck.js} +1 -1
  95. package/dist/{index-1vc7jrkg.js → index-nkpmm9q8.js} +3 -3
  96. package/dist/{index-944w16m0.js → index-p7m7j0cp.js} +25 -17
  97. package/dist/{index-wk0n1cgt.js → index-qn7xstt2.js} +2 -2
  98. package/dist/{index-saews2s3.js → index-rr2bb45z.js} +1 -1
  99. package/dist/{index-mmfa86mt.js → index-s734jcsr.js} +169 -149
  100. package/dist/{index-dgs16axy.js → index-s74zqahq.js} +1 -1
  101. package/dist/{index-bxdg2nbt.js → index-v8awdgvd.js} +4 -4
  102. package/dist/{index-xn6q9pg6.js → index-vrzjhftj.js} +36 -76
  103. package/dist/{index-1sarmj9z.js → index-wgypt3cs.js} +6 -6
  104. package/dist/{index-y1qysm3q.js → index-ze7mvk54.js} +11 -8
  105. package/dist/index.js +47 -45
  106. package/dist/message-fts-rowid-map-17s0dfn4.js +25 -0
  107. package/dist/{message-index-bounded-vtgpq6b4.js → message-index-bounded-1633vc7f.js} +17 -17
  108. package/dist/{message-index-a6gztaqx.js → message-index-dprebmtt.js} +15 -15
  109. package/dist/{message-time-backfill-qjge9044.js → message-time-backfill-73mmm76q.js} +5 -5
  110. package/dist/migration-worker.js +9 -7
  111. package/dist/plugin/dream-timer.d.ts +11 -0
  112. package/dist/plugin/dream-timer.d.ts.map +1 -1
  113. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  114. package/dist/{project-embedding-registry-x45bv3qr.js → project-embedding-registry-z74mhqkf.js} +12 -10
  115. package/dist/raw-ordinal-warmup-worker.js +40 -10
  116. package/dist/{read-session-chunk-3ae3nfdn.js → read-session-chunk-4zp09ejb.js} +9 -9
  117. package/dist/{read-session-raw-m56hc7v2.js → read-session-raw-rsc8c7qy.js} +2 -2
  118. package/dist/{recomp-orchestrator-nwzcfhx4.js → recomp-orchestrator-z3ecszx6.js} +26 -26
  119. package/dist/{search-deajrd90.js → search-6mee3vty.js} +23 -22
  120. package/dist/search-archive-znyy44ve.js +25 -0
  121. package/dist/{send-session-notification-24r4esbh.js → send-session-notification-6ve0e8p4.js} +5 -5
  122. package/dist/shared/historian-cache.d.ts +8 -0
  123. package/dist/shared/historian-cache.d.ts.map +1 -0
  124. package/dist/shared/model-suggestion-retry.d.ts +4 -0
  125. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  126. package/dist/shared/resolve-fallbacks.d.ts +3 -3
  127. package/dist/shared/rpc-discovery-cleanup.d.ts +3 -0
  128. package/dist/shared/rpc-discovery-cleanup.d.ts.map +1 -0
  129. package/dist/shared/rpc-server.d.ts +2 -0
  130. package/dist/shared/rpc-server.d.ts.map +1 -1
  131. package/dist/shared/search-text.d.ts +8 -0
  132. package/dist/shared/search-text.d.ts.map +1 -0
  133. package/dist/shared/sqlite.d.ts +4 -2
  134. package/dist/shared/sqlite.d.ts.map +1 -1
  135. package/dist/shared/storage-file-mutex.d.ts.map +1 -1
  136. package/dist/shared/subagent-runner.d.ts +2 -0
  137. package/dist/shared/subagent-runner.d.ts.map +1 -1
  138. package/dist/shared/system-directive.d.ts +2 -0
  139. package/dist/shared/system-directive.d.ts.map +1 -1
  140. package/dist/{sqlite-4pqyynrs.js → sqlite-zf72c52d.js} +1 -1
  141. package/dist/{storage-memory-j3v3hc83.js → storage-memory-y3qmy00r.js} +2 -2
  142. package/dist/{storage-tags-s5bg1ahx.js → storage-tags-8qns3012.js} +8 -4
  143. package/dist/tools/ctx-expand/search-archive.d.ts +5 -1
  144. package/dist/tools/ctx-expand/search-archive.d.ts.map +1 -1
  145. package/dist/{transform-postprocess-phase-ne3z1zmt.js → transform-postprocess-phase-3ydzxa62.js} +26 -26
  146. package/dist/v2/auto-search-worker.js +76 -63
  147. package/dist/v2/chunk-embedding-write-worker.js +12 -10
  148. package/dist/v2/{compaction-marker-candidates-1vqwr3s5.js → compaction-marker-candidates-ebx3388k.js} +2 -2
  149. package/dist/v2/compaction-marker-candidates-worker.js +2 -2
  150. package/dist/v2/{context-4qczzck7.js → context-jn3zpeqh.js} +909 -454
  151. package/dist/v2/embedding-backfill-7c7yr69y.js +23 -0
  152. package/dist/v2/embedding-worker-process.js +1 -1
  153. package/dist/v2/embedding-worker.js +5 -5
  154. package/dist/v2/fold/native-replay.d.ts +11 -2
  155. package/dist/v2/fold/native-replay.d.ts.map +1 -1
  156. package/dist/v2/fold/policy.d.ts.map +1 -1
  157. package/dist/v2/fold/restore.d.ts.map +1 -1
  158. package/dist/v2/hooks/context.d.ts.map +1 -1
  159. package/dist/v2/hooks/hidden-child.d.ts +8 -0
  160. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  161. package/dist/v2/hooks/types.d.ts +17 -0
  162. package/dist/v2/hooks/types.d.ts.map +1 -1
  163. package/dist/v2/message-fts-rowid-map-wfx67gfd.js +24 -0
  164. package/dist/v2/{message-index-bounded-rxxznd34.js → message-index-bounded-hpejqyd8.js} +17 -17
  165. package/dist/v2/{message-index-f947qtbz.js → message-index-pxehjpzx.js} +15 -15
  166. package/dist/v2/{message-time-backfill-bsteyc4d.js → message-time-backfill-04t0km1z.js} +5 -5
  167. package/dist/v2/migration-worker.js +9 -7
  168. package/dist/v2/{project-embedding-registry-0msp56p8.js → project-embedding-registry-gnkj56xp.js} +12 -10
  169. package/dist/v2/raw-ordinal-warmup-worker.js +40 -10
  170. package/dist/v2/{read-session-chunk-rq9nx1nn.js → read-session-chunk-zdppn4bj.js} +9 -9
  171. package/dist/v2/{read-session-raw-b3tf6ra1.js → read-session-raw-yaegtjzh.js} +2 -2
  172. package/dist/v2/{recomp-orchestrator-5zhxtwha.js → recomp-orchestrator-cmqnfpp3.js} +26 -26
  173. package/dist/v2/{search-n8wqxb1j.js → search-66842dya.js} +23 -22
  174. package/dist/v2/search-archive-gfh11vs0.js +24 -0
  175. package/dist/v2/{send-session-notification-8ghn9tnv.js → send-session-notification-3pxn658x.js} +5 -5
  176. package/dist/v2/{server-yrvqaswb.js → server-1wy7b9de.js} +25 -11
  177. package/dist/v2/{server-th4y11y7.js → server-271qxsf5.js} +6 -6
  178. package/dist/v2/{server-e298hswg.js → server-3rhpvy84.js} +967 -88
  179. package/dist/v2/{server-qhfvvfxj.js → server-46neh5fa.js} +14 -8
  180. package/dist/v2/{server-rrqpvwqd.js → server-6tmj0s7j.js} +2 -2
  181. package/dist/v2/{server-hek6z3w6.js → server-8by8qfec.js} +11 -8
  182. package/dist/v2/{server-vbe4se57.js → server-a9xqj88f.js} +1 -1
  183. package/dist/{index-wafzvyhg.js → v2/server-beht37jy.js} +8 -0
  184. package/dist/v2/{server-05xjtq6c.js → server-d04vrx0j.js} +1 -1
  185. package/dist/v2/server-ec4ca92p.js +96 -0
  186. package/dist/v2/{server-dd0tz6cn.js → server-fw7wrk01.js} +160 -750
  187. package/dist/v2/{server-zs8d0s3b.js → server-g3qma5c0.js} +1 -1
  188. package/dist/v2/{server-k2bzedxk.js → server-gpvay0xz.js} +2 -2
  189. package/dist/v2/{server-kmbarfmn.js → server-gtfhttbr.js} +26 -18
  190. package/dist/v2/{server-g10mdym6.js → server-h1v0pyxb.js} +3 -3
  191. package/dist/v2/{server-4gn3z5an.js → server-hy3d3vsx.js} +1 -1
  192. package/dist/v2/server-kaqs6h31.js +58 -0
  193. package/dist/v2/{server-ehyava47.js → server-kh7dpa1a.js} +25 -17
  194. package/dist/v2/{server-6cdy4rc0.js → server-my7k4eds.js} +4 -4
  195. package/dist/v2/{server-d8tj10db.js → server-n1prf1g6.js} +1 -1
  196. package/dist/v2/{server-n78avt2p.js → server-n37sebck.js} +1 -1
  197. package/dist/v2/{server-zc3e54vy.js → server-nj659894.js} +6 -6
  198. package/dist/v2/{server-gvkm8xaj.js → server-rmygf5pn.js} +32 -3
  199. package/dist/v2/{server-0ppsweh6.js → server-tgnbmwah.js} +22 -2
  200. package/dist/v2/{server-cfbr1s2x.js → server-vsw8tmm6.js} +36 -76
  201. package/dist/v2/{server-prg55b7k.js → server-xj136kt8.js} +23 -3
  202. package/dist/v2/{server-atbc19ab.js → server-zyzawhdw.js} +32 -8
  203. package/dist/v2/{server-ef89gdsx.js → server-zzkj2fch.js} +4 -4
  204. package/dist/v2/server.js +5 -5
  205. package/dist/v2/{sqlite-4pqyynrs.js → sqlite-zf72c52d.js} +1 -1
  206. package/dist/v2/{storage-memory-j3v3hc83.js → storage-memory-y3qmy00r.js} +2 -2
  207. package/dist/v2/{storage-tags-hcc2adpf.js → storage-tags-1h8k6ra9.js} +8 -4
  208. package/dist/v2/store-reader.d.ts +2 -0
  209. package/dist/v2/store-reader.d.ts.map +1 -1
  210. package/dist/v2/{wrapup-orchestrator-65pwye0d.js → wrapup-orchestrator-xs8redz9.js} +26 -26
  211. package/dist/wrapup-orchestrator-j7d7ry5b.js +48 -0
  212. package/package.json +1 -1
  213. package/src/config/latch-permanence-guard.test.ts +4 -0
  214. package/src/config/schema/magic-context.ts +14 -6
  215. package/src/shared/historian-cache.test.ts +69 -0
  216. package/src/shared/historian-cache.ts +55 -0
  217. package/src/shared/model-resolution.test.ts +22 -0
  218. package/src/shared/model-suggestion-retry.ts +11 -3
  219. package/src/shared/resolve-fallbacks.test.ts +2 -3
  220. package/src/shared/resolve-fallbacks.ts +3 -3
  221. package/src/shared/rpc-discovery-cleanup.test.ts +57 -0
  222. package/src/shared/rpc-discovery-cleanup.ts +57 -0
  223. package/src/shared/rpc-server.ts +36 -13
  224. package/src/shared/search-text.test.ts +47 -0
  225. package/src/shared/search-text.ts +63 -0
  226. package/src/shared/sqlite.test.ts +56 -0
  227. package/src/shared/sqlite.ts +51 -2
  228. package/src/shared/storage-file-mutex-review.test.ts +22 -2
  229. package/src/shared/storage-file-mutex.ts +11 -1
  230. package/src/shared/subagent-runner.ts +2 -0
  231. package/src/shared/system-directive.ts +19 -1
  232. package/src/shared/tag-transcript.ts +12 -4
  233. package/dist/embedding-backfill-5e1t5wha.js +0 -22
  234. package/dist/v2/embedding-backfill-jmaf8zrr.js +0 -21
  235. package/dist/wrapup-orchestrator-28xzsj5q.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-snp5wbge.js";
57
+ } from "./index-a7c4r5re.js";
62
58
  import"./index-sd3egckz.js";
63
59
  import {
64
60
  getHarness2
@@ -81,7 +77,7 @@ import {
81
77
  resolveKnownHistorianContextLimit2,
82
78
  resolveHistorianContextLimit2
83
79
  } from "./index-v10f1rjv.js";
84
- import"./index-1sarmj9z.js";
80
+ import"./index-wgypt3cs.js";
85
81
  import {
86
82
  CANONICAL_DREAM_TASKS,
87
83
  DREAM_TASK_CAPABILITIES,
@@ -147,7 +143,7 @@ import {
147
143
  applyJsonSchemaParameterDescriptions,
148
144
  MagicContextRpcServer,
149
145
  subagentTemperature
150
- } from "./index-42vcjcwe.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-yxycg7fs.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,34 +196,40 @@ import {
199
196
  cleanUserText2,
200
197
  readRawSessionMessageIdOrdinalsForRange2,
201
198
  readRawSessionMessageOrdinalById2
202
- } from "./index-944w16m0.js";
199
+ } from "./index-p7m7j0cp.js";
203
200
  import {
204
201
  invalidateAutoEmbedSession,
205
202
  clearEmbedSessionState
206
- } from "./index-y1qysm3q.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";
220
- import"./index-dyvbsvga.js";
216
+ } from "./index-beht37jy.js";
217
+ import"./index-v0p37hm2.js";
218
+ import"./index-s734jcsr.js";
219
+ import"./index-a6mc0v4d.js";
221
220
  import {
222
221
  deleteChunkEmbedBackoffForSession
223
- } from "./index-3kx0kg0f.js";
222
+ } from "./index-b5vqckbw.js";
224
223
  import"./index-nj7yykkx.js";
225
224
  import {
226
225
  BoundedSessionMap,
227
226
  advanceSessionActivity,
228
- backfillSessionActivity
229
- } from "./index-thvnpfsv.js";
227
+ backfillSessionActivity,
228
+ gaDatabasePath,
229
+ RAW_MESSAGE_TYPES,
230
+ V2StoreReaderPool,
231
+ V2StoreReader
232
+ } from "./index-cwzfcbtq.js";
230
233
  import"./index-bp5083x2.js";
231
234
  import"./index-1zx87sdm.js";
232
235
  import {
@@ -235,22 +238,20 @@ import {
235
238
  isDroppedToolOutput,
236
239
  evaluateChannel2,
237
240
  buildChannel2Reminder
238
- } from "./index-mht7bq0z.js";
239
- import"./index-v0p37hm2.js";
240
- import"./index-mmfa86mt.js";
241
+ } from "./index-hqhm3wke.js";
241
242
  import"./index-58e3y90n.js";
242
- import"./index-1d289pq2.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-bxdg2nbt.js";
254
+ } from "./index-v8awdgvd.js";
254
255
  import {
255
256
  createTagger,
256
257
  cavemanWordRulesForLanguage,
@@ -259,27 +260,29 @@ import {
259
260
  EmergencyFailClosedError,
260
261
  DegradedPassRefusalError,
261
262
  isSyntheticHeadMessage2
262
- } from "./index-ts1hjk1h.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-e20m7284.js";
268
- import"./index-3kdm78zp.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-dgs16axy.js";
276
- import"./index-xn6q9pg6.js";
277
- import"./index-1vc7jrkg.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";
284
+ import"./index-kaqs6h31.js";
285
+ import"./index-kmdj7dsq.js";
283
286
  import {
284
287
  isDreamerRunnable,
285
288
  isSmartNoteSurfaceAvailable,
@@ -293,6 +296,9 @@ import {
293
296
  } from "./index-y8v6yerm.js";
294
297
  import"./index-k29z4aqh.js";
295
298
 
299
+ // src/v2/hooks/context.ts
300
+ import { setTimeout as delay } from "node:timers/promises";
301
+
296
302
  // src/hooks/magic-context/history-boundary-repair.ts
297
303
  function readBaseline(db, sessionId) {
298
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);
@@ -1629,24 +1635,31 @@ ${data.output?.output ?? ""}`
1629
1635
  const sameModel = sameProvider && previousModel?.id === model.id;
1630
1636
  const reuse = sameModel && data.error === undefined;
1631
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);
1632
1639
  const content = [];
1633
1640
  const results = [];
1634
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
+ };
1635
1648
  if (part.type === "text") {
1636
1649
  if (part.text !== "")
1637
1650
  content.push({
1638
1651
  type: "text",
1639
1652
  text: part.text,
1640
- providerMetadata: reuse ? metadata(part.state) : undefined
1653
+ providerMetadata: reuse ? metadata(native) : undefined
1641
1654
  });
1642
1655
  continue;
1643
1656
  }
1644
1657
  if (part.type === "reasoning") {
1645
- if (part.text !== "" || reuse && part.state !== undefined)
1658
+ if (part.text !== "" || reuse && !reasoningInterrupted && native !== undefined)
1646
1659
  content.push({
1647
- type: reuse || data.error === undefined ? "reasoning" : "text",
1660
+ type: data.error === undefined && !reasoningInterrupted ? "reasoning" : "text",
1648
1661
  text: part.text,
1649
- providerMetadata: reuse ? metadata(part.state) : undefined
1662
+ providerMetadata: reuse && !reasoningInterrupted ? metadata(native) : undefined
1650
1663
  });
1651
1664
  continue;
1652
1665
  }
@@ -1665,7 +1678,7 @@ ${data.output?.output ?? ""}`
1665
1678
  name: part.name,
1666
1679
  input,
1667
1680
  providerExecuted: part.executed,
1668
- providerMetadata: toolReuse ? metadata(part.providerState) : undefined
1681
+ providerMetadata: toolReuse ? metadata(native) : undefined
1669
1682
  });
1670
1683
  if (!completed)
1671
1684
  continue;
@@ -1676,7 +1689,7 @@ ${data.output?.output ?? ""}`
1676
1689
  id: part.id,
1677
1690
  name: part.name,
1678
1691
  providerExecuted: part.executed,
1679
- providerMetadata: toolReuse ? metadata(part.providerResultState ?? part.providerState) : sameProvider ? metadata(part.providerResultState) : undefined,
1692
+ providerMetadata: (part.executed === true ? sameProvider : reuse) ? metadata(native) : undefined,
1680
1693
  result: state.status === "error" ? { error: state.error, content: toolContent } : single?.type === "text" ? { type: "text", value: single.text } : { type: "content", value: toolContent },
1681
1694
  ...state.status === "error" ? { resultType: "error" } : {}
1682
1695
  };
@@ -1704,13 +1717,50 @@ function copyNativeInput(messages) {
1704
1717
  return copies;
1705
1718
  }
1706
1719
  function isLocalCheckpoint(row) {
1707
- 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
+ }
1708
1734
  }
1709
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
+ }
1710
1759
 
1711
1760
  class NativeFoldReplay {
1712
1761
  storage;
1713
1762
  openReader;
1763
+ admissions;
1714
1764
  changed = new Set;
1715
1765
  dirty = new Set;
1716
1766
  unavailable = new Set;
@@ -1718,9 +1768,11 @@ class NativeFoldReplay {
1718
1768
  metadataThrough = new Map;
1719
1769
  loaded = new Map;
1720
1770
  sources = new Map;
1721
- constructor(storage, openReader) {
1771
+ staleHeads = new Set;
1772
+ constructor(storage, openReader, admissions) {
1722
1773
  this.storage = storage;
1723
1774
  this.openReader = openReader;
1775
+ this.admissions = admissions;
1724
1776
  storage.onEvict((sessionID) => this.clear(sessionID));
1725
1777
  }
1726
1778
  account(sessionID) {
@@ -1759,6 +1811,51 @@ class NativeFoldReplay {
1759
1811
  async baseline(sessionID) {
1760
1812
  return this.tail(sessionID)?.baseline;
1761
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
+ }
1762
1859
  rendered(row, model) {
1763
1860
  return restoreRow(row, model, hostUsesMediaAssets() ? {
1764
1861
  asset: hostMediaAsset,
@@ -1836,6 +1933,7 @@ class NativeFoldReplay {
1836
1933
  this.loaded.set(draft.sessionID, through);
1837
1934
  this.unavailable.delete(draft.sessionID);
1838
1935
  this.changed.delete(draft.sessionID);
1936
+ this.staleHeads.delete(draft.sessionID);
1839
1937
  } finally {
1840
1938
  reader.close();
1841
1939
  }
@@ -1862,7 +1960,8 @@ class NativeFoldReplay {
1862
1960
  async supplyHeld(args) {
1863
1961
  const { draft, reader, summary } = args;
1864
1962
  const tail = this.tail(draft.sessionID);
1865
- const id = reader.latestRunningCompaction(draft.sessionID)?.id;
1963
+ const running = reader.latestRunningCompaction(draft.sessionID);
1964
+ const id = running?.id;
1866
1965
  if (!id || !tail || tail.model !== `${draft.model.providerID}/${draft.model.id}`)
1867
1966
  return false;
1868
1967
  const through = reader.latestSequence(draft.sessionID);
@@ -1886,6 +1985,21 @@ class NativeFoldReplay {
1886
1985
  summary
1887
1986
  };
1888
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
+ }
1889
2003
  return true;
1890
2004
  }
1891
2005
  async restore(sessionID, cut, model, options = {}) {
@@ -1970,6 +2084,9 @@ class NativeFoldReplay {
1970
2084
  sourceChanged(sessionID) {
1971
2085
  return this.changed.has(sessionID);
1972
2086
  }
2087
+ needsHeadRebuild(sessionID) {
2088
+ return this.staleHeads.has(sessionID);
2089
+ }
1973
2090
  clear(sessionID) {
1974
2091
  this.sources.delete(sessionID);
1975
2092
  this.metadata.delete(sessionID);
@@ -1978,8 +2095,11 @@ class NativeFoldReplay {
1978
2095
  this.unavailable.delete(sessionID);
1979
2096
  this.dirty.delete(sessionID);
1980
2097
  this.changed.delete(sessionID);
2098
+ this.staleHeads.delete(sessionID);
1981
2099
  }
1982
2100
  async forget(sessionID) {
2101
+ if (this.admissions)
2102
+ await forgetNativeFoldProvenance(this.admissions, sessionID);
1983
2103
  await this.storage.forget(sessionID);
1984
2104
  }
1985
2105
  }
@@ -1994,11 +2114,7 @@ class HostFoldPolicy {
1994
2114
  this.deps = deps;
1995
2115
  }
1996
2116
  owned(sessionID, cut, id) {
1997
- const row = this.deps.storage.admission(sessionID, id);
1998
- if (!isLocalCheckpoint(cut) || cut.id !== id || !row?.payload || row.digest !== foldDigest(row.payload))
1999
- return false;
2000
- const snapshot = JSON.parse(row.payload);
2001
- 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);
2002
2118
  }
2003
2119
  async idle(sessionID) {
2004
2120
  const { storage, session, threshold } = this.deps;
@@ -4675,7 +4791,7 @@ async function registerContext(context) {
4675
4791
  }
4676
4792
  const folds = new FoldOwner(context.storage);
4677
4793
  const nativeFoldMemory = !compactionOff && process.env.MC_OC2_INVISIBLE_FOLD === "1" ? nativeFoldCache(() => storage.require()) : undefined;
4678
- const nativeFoldReplay = nativeFoldMemory ? new NativeFoldReplay(nativeFoldMemory, () => openStoreReader()) : undefined;
4794
+ const nativeFoldReplay = nativeFoldMemory ? new NativeFoldReplay(nativeFoldMemory, () => openStoreReader(), context.storage) : undefined;
4679
4795
  setOutputReserveConfig(config.output_reserve);
4680
4796
  const queriedModels = new Set;
4681
4797
  const rawLimits = new Map;
@@ -4727,6 +4843,7 @@ async function registerContext(context) {
4727
4843
  memorySyncRequestedSessions: rustMemorySyncRequestedSessions
4728
4844
  }) : undefined;
4729
4845
  const hiddenChildHook = new HiddenChildHook;
4846
+ await context.session.hook("http.request", (draft) => hiddenChildHook.cacheRequest(draft));
4730
4847
  const tools = db && isDatabasePersisted(db) ? await registerTools(context, db, config, moduleToolBackends?.backends, (id) => hiddenChildHook.owns(id)) : undefined;
4731
4848
  const usage = new Map;
4732
4849
  const generateReplay = new V2GenerateReplay;
@@ -5103,83 +5220,114 @@ async function registerContext(context) {
5103
5220
  }) : undefined;
5104
5221
  const usageController = new AbortController;
5105
5222
  const usageDone = (async () => {
5106
- try {
5107
- for await (const value of context.event.subscribe({ signal: usageController.signal })) {
5108
- if (usageController.signal.aborted)
5109
- break;
5110
- const event = value;
5111
- if (!event.data?.sessionID)
5112
- continue;
5113
- const sessionID = event.data.sessionID;
5114
- if (event.type?.startsWith("session.revert.") || event.type === "session.message.content.updated") {
5115
- nativeFoldReplay?.onEvent(event);
5116
- restoredRows.forget(sessionID);
5117
- }
5118
- if (event.type === "session.error" || event.type === "session.execution.failed") {
5119
- const error = hiddenTerminalError(event);
5120
- if (error !== undefined)
5121
- hiddenSessionErrors.set(sessionID, error);
5122
- 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;
5123
5300
  const model = liveModels.get(sessionID);
5124
- try {
5125
- armLatestThinkingRecoveryFromError({
5126
- db,
5127
- sessionId: sessionID,
5128
- error,
5129
- providerID: model?.providerID,
5130
- modelID: model?.modelID
5301
+ if (model) {
5302
+ await recordUsage({
5303
+ sessionID,
5304
+ model: { providerID: model.providerID, id: model.modelID }
5131
5305
  });
5132
- } catch (armError) {
5133
- log2("[magic-context] v2 latest-thinking recovery arm failed", armError);
5306
+ if (!compactionOff && typeof await nativeFoldReplay?.baseline(sessionID) === "string")
5307
+ hostFolds?.idle(sessionID);
5134
5308
  }
5309
+ } catch (error) {
5310
+ log2(`[magic-context] v2 event handler failed (type=${event.type ?? "unknown"}, session=${event.data?.sessionID ?? "none"})`, error);
5135
5311
  }
5136
- continue;
5137
- }
5138
- if (event.type === "session.deleted") {
5139
- clearLkgMeasuredRequest(sessionID);
5140
- deletedSessions.add(sessionID);
5141
- transform?.clearSessionLogState(sessionID);
5142
- if (db) {
5143
- markSessionCleanupPending(db, sessionID);
5144
- clearSession(db, sessionID);
5145
- }
5146
- rawProviders.get(sessionID)?.();
5147
- rawProviders.delete(sessionID);
5148
- usage.delete(sessionID);
5149
- hiddenSessionErrors.delete(sessionID);
5150
- storageNoticeBySession.delete(sessionID);
5151
- liveModels.delete(sessionID);
5152
- variants.delete(sessionID);
5153
- agents.delete(sessionID);
5154
- channel1.delete(sessionID);
5155
- commitSeenLastPass.delete(sessionID);
5156
- clearEmbedSessionState(sessionID);
5157
- historyRefreshSessions.delete(sessionID);
5158
- clearPendingMaterialization(pendingMaterializationSessions, sessionID);
5159
- lastHeuristicsTurnId.delete(sessionID);
5160
- restoredRows.forget(sessionID);
5161
- await nativeFoldReplay?.forget(sessionID);
5162
- generateReplay.forget(sessionID);
5163
- systemPromptRefreshSessions.delete(sessionID);
5164
- systemPrompt?.clearSession(sessionID);
5165
- tagger.cleanup(sessionID);
5166
- continue;
5167
- }
5168
- if (event.type !== "session.execution.succeeded")
5169
- continue;
5170
- const model = liveModels.get(sessionID);
5171
- if (model) {
5172
- await recordUsage({
5173
- sessionID,
5174
- model: { providerID: model.providerID, id: model.modelID }
5175
- });
5176
- if (!compactionOff && typeof await nativeFoldReplay?.baseline(sessionID) === "string")
5177
- hostFolds?.idle(sessionID);
5178
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;
5179
5330
  }
5180
- } catch (error) {
5181
- if (!usageController.signal.aborted)
5182
- log2("[magic-context] v2 usage subscription failed", error);
5183
5331
  }
5184
5332
  })();
5185
5333
  const materialize = (draft) => {
@@ -5452,6 +5600,7 @@ async function registerContext(context) {
5452
5600
  compactionOff,
5453
5601
  storeGeneration: "v2",
5454
5602
  normalizeRestoredAssistantText: stripCopiedTagNotation,
5603
+ refreshSourceContents: (sessionID) => nativeFoldReplay?.needsHeadRebuild(sessionID) ?? false,
5455
5604
  hostCleanupCompactionMarkers: () => ({
5456
5605
  verified: true,
5457
5606
  removedLineages: 0,
@@ -5540,12 +5689,13 @@ async function registerContext(context) {
5540
5689
  historyRefreshSessions.add(draft.sessionID);
5541
5690
  requestPendingMaterialization(pendingMaterializationSessions, draft.sessionID, "boundary_repair");
5542
5691
  }
5543
- 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);
5544
5694
  postFold = cut !== undefined;
5545
- if (cut && !incoming)
5695
+ if (localCut && !incoming)
5546
5696
  throw new Error("The host checkpoint disappeared from the context draft");
5547
5697
  let nativeRestored;
5548
- if (cut && nativeFoldReplay && isLocalCheckpoint(cut)) {
5698
+ if (cut && nativeFoldReplay && await nativeFoldReplay.admits(draft.sessionID, cut, reader)) {
5549
5699
  try {
5550
5700
  nativeRestored = await nativeFoldReplay.restore(draft.sessionID, cut, `${draft.model.providerID}/${draft.model.id}`, { bounded: !rustModeModuleClient });
5551
5701
  } catch (error) {
@@ -5554,7 +5704,11 @@ async function registerContext(context) {
5554
5704
  nativeRestored = await nativeFoldReplay.restoreRead(draft.sessionID, cut, draft.model);
5555
5705
  }
5556
5706
  }
5557
- 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);
5558
5712
  historyRefreshSessions.add(draft.sessionID);
5559
5713
  requestPendingMaterialization(pendingMaterializationSessions, draft.sessionID, "host_history_change");
5560
5714
  }
@@ -5565,25 +5719,27 @@ async function registerContext(context) {
5565
5719
  return !id || !present.has(id);
5566
5720
  });
5567
5721
  draft.messages.splice(0, draft.messages.length, ...hidden, ...draft.messages.filter((message) => message !== incoming));
5568
- } else if (cut && incoming) {
5569
- const identity = await folds.observe({
5570
- sessionID: draft.sessionID,
5571
- cutSeq: cut.seq,
5572
- summary: cut.data.summary ?? "",
5573
- rendered: incoming,
5574
- onHard: (reason) => {
5575
- sessionLog2(draft.sessionID, `HARD reason=${reason}`);
5576
- materialize(draft);
5577
- requestPendingMaterialization(pendingMaterializationSessions, draft.sessionID, "host_compaction");
5578
- }
5579
- });
5580
- checkpoint = structuredClone(identity.rendered ?? incoming);
5581
- 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
+ }
5582
5738
  const moduleBoundaryID = rustModeModuleClient ? getPersistedCompactionMarkerState(db, draft.sessionID)?.boundaryMessageId ?? null : null;
5583
5739
  const moduleBoundarySeq = moduleBoundaryID ? reader.sequenceForId(draft.sessionID, moduleBoundaryID) : undefined;
5584
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);
5585
5741
  const servedBoundary = boundaryID ? servedBoundaryRow(reader, draft.sessionID, boundaryID) : null;
5586
- 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;
5587
5743
  if (moduleBoundarySeq !== undefined)
5588
5744
  sessionLog2(draft.sessionID, `v2 restore: from the module boundary ${moduleBoundaryID} to the host checkpoint`);
5589
5745
  const present = new Set(draft.messages.map((message) => message.id));
@@ -5834,13 +5990,13 @@ ${baseline}
5834
5990
  }, 0));
5835
5991
  return {
5836
5992
  async dispose() {
5993
+ usageController.abort();
5837
5994
  await hiddenCompletionExecutor?.dispose();
5995
+ await usageDone;
5838
5996
  rpcStopped = true;
5839
5997
  rpcServer.stop();
5840
5998
  transform?.disposeRust();
5841
5999
  tools?.dispose();
5842
- usageController.abort();
5843
- await usageDone;
5844
6000
  deletedSessions.clear();
5845
6001
  await dreamTrigger?.dispose();
5846
6002
  await maintenanceTimer?.dispose();