@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
@@ -92,7 +92,7 @@ import {
92
92
  getRawSessionTagKeysThrough2,
93
93
  getLegacyProtectedTailStartOrdinal2,
94
94
  readSessionChunk2
95
- } from "./index-j6zw70pf.js";
95
+ } from "./index-p7m7j0cp.js";
96
96
  import {
97
97
  getHarness2,
98
98
  harnessOwnsOpenCodeStore2
@@ -152,14 +152,14 @@ import {
152
152
  hasMeaningfulUserText2,
153
153
  estimateTokens,
154
154
  estimateFixedPromptTokens
155
- } from "./index-hqkczed7.js";
155
+ } from "./index-c5pytzne.js";
156
156
  import {
157
157
  FAIL_CLOSED_DOCTOR_COMMAND,
158
158
  getSchemaFenceRejection,
159
159
  LATEST_SUPPORTED_VERSION,
160
160
  getPersistedSchemaVersion,
161
161
  openDatabase
162
- } from "./index-cj9g0j7a.js";
162
+ } from "./index-fb2qxs2y.js";
163
163
  import {
164
164
  inRootAsyncContext2,
165
165
  Database2,
@@ -167,11 +167,11 @@ import {
167
167
  withSqliteBackgroundWriter2,
168
168
  withoutSqliteTransformPass2,
169
169
  beginSqliteWriterAsync2
170
- } from "./index-wafzvyhg.js";
170
+ } from "./index-beht37jy.js";
171
171
  import {
172
172
  shouldSkipHomeProjectMemory,
173
173
  resolveProjectIdentity
174
- } from "./index-a8bvhwqs.js";
174
+ } from "./index-2vxtcb95.js";
175
175
  import {
176
176
  isPidAlive
177
177
  } from "./index-nj7yykkx.js";
@@ -180,7 +180,7 @@ import {
180
180
  noteRawSessionSummaryRowWritten2,
181
181
  RawOrdinalsNotReady2,
182
182
  runSessionWarmupWorker
183
- } from "./index-7pa32z07.js";
183
+ } from "./index-s734jcsr.js";
184
184
  import {
185
185
  layoutLkgPrefix,
186
186
  assembleLkgPrefix,
@@ -191,7 +191,7 @@ import {
191
191
  resolveStoredPathWorkspaceIdentity,
192
192
  sourceNameForMemory,
193
193
  computeWorkspaceEpochFingerprint
194
- } from "./index-wk0n1cgt.js";
194
+ } from "./index-qn7xstt2.js";
195
195
  import {
196
196
  getTableColumnNames
197
197
  } from "./index-bp5083x2.js";
@@ -208,7 +208,7 @@ import {
208
208
  } from "./index-58e3y90n.js";
209
209
  import {
210
210
  getMeasuredToolDefinitionTokens
211
- } from "./index-n6m03s3n.js";
211
+ } from "./index-ke416mdc.js";
212
212
  import {
213
213
  invalidateAutoEmbedSession,
214
214
  drainBackgroundBatches,
@@ -217,7 +217,7 @@ import {
217
217
  getProjectChunkEmbeddingModelId2,
218
218
  getProjectEmbeddingMaxInputTokens2,
219
219
  embedItemsForProject2
220
- } from "./index-qrahzcqv.js";
220
+ } from "./index-ze7mvk54.js";
221
221
  import {
222
222
  buildCanonicalChunkTextFromFts,
223
223
  buildCompartmentSummaryFallbackText,
@@ -227,7 +227,7 @@ import {
227
227
  replaceCompartmentChunkEmbeddings,
228
228
  deleteChunkEmbedBackoffForSession,
229
229
  chunkWindowSourceKey
230
- } from "./index-hehkf6zm.js";
230
+ } from "./index-b5vqckbw.js";
231
231
  import {
232
232
  BoundedSessionMap,
233
233
  clearCompressionDepth,
@@ -238,11 +238,13 @@ import {
238
238
  ownsLkgDirtyFence,
239
239
  commitLkgWithRecoveryFence,
240
240
  clearLkgRecoveryFence,
241
+ gaDatabasePath,
242
+ V2StoreReader,
241
243
  deleteSessionScopedRows,
242
244
  toMessageIndexSource2,
243
245
  clearIndexedMessagesInTransaction2,
244
246
  indexSourcesAfterOrdinal2
245
- } from "./index-p4vde22c.js";
247
+ } from "./index-cwzfcbtq.js";
246
248
  import {
247
249
  stripWellFormedLeadingTagPrefix,
248
250
  stripTagPrefix,
@@ -255,12 +257,12 @@ import {
255
257
  foldShrunkPartTags2,
256
258
  getTagNumberByMessageId2,
257
259
  getActiveTagsBySession2
258
- } from "./index-nd7m2a5a.js";
260
+ } from "./index-hqhm3wke.js";
259
261
  import {
260
262
  openCodeDbExists,
261
263
  withReadOnlySessionDb,
262
264
  getMessageTimesFromOpenCodeDb
263
- } from "./index-mtw9e71a.js";
265
+ } from "./index-kq82mtg0.js";
264
266
  import {
265
267
  renderUserFacingFailure,
266
268
  userFacingFailureCode,
@@ -269,7 +271,7 @@ import {
269
271
  insertPrimerCandidates,
270
272
  promoteSessionFactsDurable,
271
273
  embedPromotedFacts
272
- } from "./index-wv9n2zcq.js";
274
+ } from "./index-v8awdgvd.js";
273
275
  import {
274
276
  pushNotification2
275
277
  } from "./index-x8a7jmkh.js";
@@ -280,16 +282,16 @@ import {
280
282
  getMemoriesByProject2,
281
283
  getMemoriesByProjects2,
282
284
  getMaxMemoryIdForProjects2
283
- } from "./index-n78avt2p.js";
285
+ } from "./index-n37sebck.js";
284
286
  import {
285
287
  isMarkerCandidateBasisCurrent2,
286
288
  invalidateMarkerCandidateBasis2,
287
289
  readMarkerCandidateBasis2,
288
290
  prepareMarkerCandidateBasis2
289
- } from "./index-f71thw8j.js";
291
+ } from "./index-4s3t0nd0.js";
290
292
  import {
291
293
  sendStatusNotification2
292
- } from "./index-b17m64g9.js";
294
+ } from "./index-s74zqahq.js";
293
295
  import {
294
296
  isCompactionEnabled,
295
297
  migrateLegacyAgentEnabledInMemory
@@ -297,9 +299,6 @@ import {
297
299
  import {
298
300
  piModelRefToCanonical
299
301
  } from "./index-avwt563y.js";
300
- import {
301
- sameProjectDirectory
302
- } from "./index-knvkbfvh.js";
303
302
  import {
304
303
  getErrorMessage,
305
304
  describeError
@@ -4912,10 +4911,10 @@ function readProjectDocsCanonical(projectDirectory) {
4912
4911
  return { renderedBlock, canonicalHash };
4913
4912
  }
4914
4913
  // src/hooks/magic-context/lkg-slot.ts
4915
- import { createHash as createHash6 } from "node:crypto";
4914
+ import { createHash as createHash5 } from "node:crypto";
4916
4915
 
4917
4916
  // src/hooks/magic-context/lkg-measured-request.ts
4918
- import { createHash as createHash4 } from "node:crypto";
4917
+ import { createHash as createHash3 } from "node:crypto";
4919
4918
 
4920
4919
  // src/shared/provider-response-completion.ts
4921
4920
  function providerResponseFailed(input) {
@@ -4983,691 +4982,6 @@ function cancelAutoSearchWork(sessionId) {
4983
4982
  }
4984
4983
  }
4985
4984
 
4986
- // src/v2/store-reader.ts
4987
- import { createHash as createHash3 } from "node:crypto";
4988
- import { statSync as statSync5 } from "node:fs";
4989
- import { hostname } from "node:os";
4990
- import { resolve as resolve2 } from "node:path";
4991
- function gaDatabasePath(dataHome, channel = "latest", env = process.env) {
4992
- return resolveOpenCodeDbPath("v2", { dataHome, channel, env }).path;
4993
- }
4994
- var RAW_MESSAGE_TYPES = [
4995
- "user",
4996
- "synthetic",
4997
- "assistant",
4998
- "skill",
4999
- "shell",
5000
- "system"
5001
- ];
5002
- var RAW_MESSAGE_TYPE_PARAMETERS = RAW_MESSAGE_TYPES.map(() => "?").join(", ");
5003
- var V2_MESSAGE_PAGE_SQL = `WITH bounds AS (
5004
- SELECT
5005
- CASE WHEN ? = 0 THEN -1 ELSE COALESCE((
5006
- SELECT seq FROM session_message
5007
- WHERE session_id = ? AND type IN (${RAW_MESSAGE_TYPE_PARAMETERS})
5008
- ORDER BY seq ASC LIMIT 1 OFFSET ?
5009
- ), (SELECT MAX(seq) FROM session_message WHERE session_id = ?), -1) END AS after_seq,
5010
- COALESCE((
5011
- SELECT seq FROM session_message
5012
- WHERE session_id = ? AND type IN (${RAW_MESSAGE_TYPE_PARAMETERS})
5013
- ORDER BY seq ASC LIMIT 1 OFFSET ?
5014
- ), ?) AS watermark_seq
5015
- )
5016
- SELECT id, session_id, type, seq, time_created, data FROM session_message, bounds
5017
- WHERE session_id = ?
5018
- AND type IN (${RAW_MESSAGE_TYPE_PARAMETERS})
5019
- AND seq > bounds.after_seq
5020
- AND seq <= bounds.watermark_seq
5021
- ORDER BY seq ASC LIMIT ?`;
5022
- var V2_STORE_READER_DEBUG_COUNTER_KEY = "magic-context.v2.store-reader-debug";
5023
- var debugSymbol = Symbol.for(V2_STORE_READER_DEBUG_COUNTER_KEY);
5024
- var debugGlobal = globalThis;
5025
- var QUERY_STATEMENTS = {
5026
- messagePage: V2_MESSAGE_PAGE_SQL,
5027
- messageCount: "SELECT COUNT(*) AS count FROM session_message WHERE session_id = ? AND type IN (?)",
5028
- storedMessageCount: "SELECT COUNT(*) AS count FROM session_message WHERE session_id = ?",
5029
- messageById: "SELECT id, session_id, type, seq, time_created, data FROM session_message WHERE session_id = ? AND id = ? AND type IN (?) LIMIT 1",
5030
- messageExistsById: "SELECT 1 FROM session_message WHERE id = ? AND session_id = ? AND type IN (?) LIMIT 1",
5031
- messageOrdinalById: `WITH target AS (
5032
- SELECT seq FROM session_message WHERE session_id = ? AND id = ? AND type IN (?) LIMIT 1
5033
- )
5034
- SELECT (SELECT COUNT(*) FROM session_message WHERE session_id = ? AND type IN (?) AND seq <= target.seq) AS ordinal FROM target`,
5035
- messageIdOrdinals: "SELECT id FROM session_message WHERE session_id = ? AND type IN (?) ORDER BY seq ASC LIMIT ? OFFSET ?",
5036
- messageOrdinalPage: "SELECT id, type, seq, json_valid(data) AS valid FROM session_message WHERE session_id = ? AND seq > ? ORDER BY seq ASC, id ASC LIMIT ?",
5037
- rawRowsThrough: "SELECT id, session_id, type, seq, time_created, data FROM session_message WHERE session_id = ? AND type IN (?) AND seq <= ? ORDER BY seq DESC LIMIT ?"
5038
- };
5039
- function debugCounters() {
5040
- const counters = debugGlobal[debugSymbol] ??= {
5041
- decodedRows: 0,
5042
- operations: {},
5043
- openReaders: 0,
5044
- maxOpenReaders: 0,
5045
- readersOpened: 0,
5046
- readersClosed: 0
5047
- };
5048
- counters.openReaders ??= 0;
5049
- counters.maxOpenReaders ??= 0;
5050
- counters.readersOpened ??= 0;
5051
- counters.readersClosed ??= 0;
5052
- return counters;
5053
- }
5054
- function returnedRowCount(value) {
5055
- if (Array.isArray(value))
5056
- return value.length;
5057
- if (value === null || value === undefined || value === false)
5058
- return 0;
5059
- return 1;
5060
- }
5061
- function trackDecodeOperation(name, operation) {
5062
- const counters = debugCounters();
5063
- const before = counters.decodedRows;
5064
- const started = performance.now();
5065
- let value;
5066
- try {
5067
- value = operation();
5068
- return value;
5069
- } finally {
5070
- const decodedRows = counters.decodedRows - before;
5071
- const current = counters.operations[name] ?? {
5072
- calls: 0,
5073
- decodedRows: 0,
5074
- maxDecodedRows: 0
5075
- };
5076
- current.calls += 1;
5077
- current.decodedRows += decodedRows;
5078
- current.maxDecodedRows = Math.max(current.maxDecodedRows, decodedRows);
5079
- counters.operations[name] = current;
5080
- const statement = QUERY_STATEMENTS[name];
5081
- if (counters.captureQueries && statement) {
5082
- (counters.queries ??= []).push({
5083
- operation: name,
5084
- statement,
5085
- rows: returnedRowCount(value),
5086
- elapsedMs: performance.now() - started
5087
- });
5088
- }
5089
- }
5090
- }
5091
- function decode(row) {
5092
- debugCounters().decodedRows += 1;
5093
- const data = JSON.parse(row.data);
5094
- if (!data || typeof data !== "object" || Array.isArray(data)) {
5095
- throw new Error(`Invalid session_message data at seq ${row.seq}`);
5096
- }
5097
- if (row.type === "idle" && !["succeeded", "failed", "interrupted"].includes(String(data.outcome))) {
5098
- throw new Error(`Invalid idle outcome at seq ${row.seq}`);
5099
- }
5100
- return { ...row, data };
5101
- }
5102
- function connect(path, identity = "") {
5103
- const stat = statSync5(path);
5104
- const acquiredIdentity = identity || `${stat.dev}:${stat.ino}:${stat.birthtimeMs}`;
5105
- const db = new Database2(path, { readonly: true, fileMustExist: true });
5106
- try {
5107
- assertOpenCodeStoreGeneration(db, "v2", path);
5108
- } catch (error) {
5109
- db.close();
5110
- throw error;
5111
- }
5112
- const counters = debugCounters();
5113
- counters.openReaders += 1;
5114
- counters.readersOpened += 1;
5115
- counters.maxOpenReaders = Math.max(counters.maxOpenReaders, counters.openReaders);
5116
- return { db, statements: new Map, identity: acquiredIdentity, leases: 0, retired: false };
5117
- }
5118
- function closeConnection(connection) {
5119
- connection.statements.clear();
5120
- try {
5121
- connection.db.close();
5122
- } finally {
5123
- const counters = debugCounters();
5124
- counters.openReaders = Math.max(0, counters.openReaders - 1);
5125
- counters.readersClosed += 1;
5126
- }
5127
- }
5128
-
5129
- class V2StoreReaderPool {
5130
- capacity;
5131
- connections = new Map;
5132
- closed = false;
5133
- closing = false;
5134
- holds = 0;
5135
- idleWaiters = new Set;
5136
- constructor(capacity = 4) {
5137
- this.capacity = capacity;
5138
- if (!Number.isSafeInteger(capacity) || capacity < 1)
5139
- throw new Error("Invalid reader capacity");
5140
- }
5141
- open(path) {
5142
- return new V2StoreReader(path, this);
5143
- }
5144
- acquire(path) {
5145
- if (this.closed)
5146
- throw new Error("Store reader pool is closed");
5147
- const key = resolve2(path);
5148
- const stat = statSync5(key);
5149
- const identity = `${stat.dev}:${stat.ino}:${stat.birthtimeMs}`;
5150
- let connection = this.connections.get(key);
5151
- if (connection && connection.identity !== identity) {
5152
- this.connections.delete(key);
5153
- this.retire(connection);
5154
- connection = undefined;
5155
- }
5156
- if (!connection)
5157
- connection = connect(key, identity);
5158
- connection.leases++;
5159
- this.connections.delete(key);
5160
- this.connections.set(key, connection);
5161
- while (this.connections.size > this.capacity) {
5162
- const oldest = this.connections.entries().next().value;
5163
- if (!oldest)
5164
- break;
5165
- this.connections.delete(oldest[0]);
5166
- this.retire(oldest[1]);
5167
- }
5168
- return connection;
5169
- }
5170
- release(connection) {
5171
- connection.leases--;
5172
- if (connection.retired && connection.leases === 0)
5173
- closeConnection(connection);
5174
- }
5175
- retire(connection) {
5176
- connection.retired = true;
5177
- if (connection.leases === 0)
5178
- closeConnection(connection);
5179
- }
5180
- hold() {
5181
- if (this.closed || this.closing)
5182
- throw new Error("Store reader pool is closed");
5183
- this.holds++;
5184
- let released = false;
5185
- return () => {
5186
- if (released)
5187
- return;
5188
- released = true;
5189
- this.holds--;
5190
- if (this.holds === 0 && this.closing)
5191
- this.finishClose();
5192
- };
5193
- }
5194
- isClosed() {
5195
- return this.closed;
5196
- }
5197
- holdCount() {
5198
- return this.holds;
5199
- }
5200
- close() {
5201
- if (this.closed || this.closing)
5202
- return;
5203
- this.closing = true;
5204
- if (this.holds === 0)
5205
- this.finishClose();
5206
- }
5207
- async closeWhenIdle(timeoutMs) {
5208
- this.close();
5209
- if (this.closed)
5210
- return true;
5211
- let timer;
5212
- let waiter;
5213
- try {
5214
- await new Promise((resolve) => {
5215
- waiter = resolve;
5216
- this.idleWaiters.add(resolve);
5217
- timer = setTimeout(resolve, Math.max(0, timeoutMs));
5218
- });
5219
- } finally {
5220
- if (timer)
5221
- clearTimeout(timer);
5222
- if (waiter)
5223
- this.idleWaiters.delete(waiter);
5224
- }
5225
- return this.closed;
5226
- }
5227
- finishClose() {
5228
- if (this.closed)
5229
- return;
5230
- this.closed = true;
5231
- for (const connection of this.connections.values())
5232
- this.retire(connection);
5233
- this.connections.clear();
5234
- for (const resolve of this.idleWaiters)
5235
- resolve();
5236
- this.idleWaiters.clear();
5237
- }
5238
- }
5239
-
5240
- class V2StoreReader {
5241
- path;
5242
- pool;
5243
- db;
5244
- connection;
5245
- closed = false;
5246
- constructor(path, pool) {
5247
- this.path = path;
5248
- this.pool = pool;
5249
- this.connection = pool ? pool.acquire(path) : connect(path);
5250
- this.db = this.connection.db;
5251
- }
5252
- hostIdentity() {
5253
- return createHash3("sha256").update(JSON.stringify([hostname(), resolve2(this.path), this.connection.identity])).digest("hex");
5254
- }
5255
- prepare(sql) {
5256
- if (this.closed)
5257
- throw new Error("Store reader is closed");
5258
- const statements = this.connection.statements;
5259
- let statement = statements.get(sql);
5260
- if (!statement) {
5261
- statement = this.db.prepare(sql);
5262
- if (statements.size >= 128)
5263
- statements.clear();
5264
- statements.set(sql, statement);
5265
- }
5266
- return statement;
5267
- }
5268
- close() {
5269
- if (this.closed)
5270
- return;
5271
- this.closed = true;
5272
- if (this.pool)
5273
- this.pool.release(this.connection);
5274
- else
5275
- closeConnection(this.connection);
5276
- }
5277
- page(sessionID, options = {}) {
5278
- return trackDecodeOperation("page", () => {
5279
- const limit = options.limit ?? 100;
5280
- if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1e4)
5281
- throw new Error("Invalid page limit");
5282
- const after = options.after ?? -1;
5283
- if (!Number.isSafeInteger(after))
5284
- throw new Error("Invalid seq cursor");
5285
- if (options.through !== undefined && !Number.isSafeInteger(options.through))
5286
- throw new Error("Invalid seq upper bound");
5287
- const predicates = ["session_id = ?", "seq > ?"];
5288
- const parameters = [sessionID, after];
5289
- if (options.through !== undefined) {
5290
- predicates.push("seq <= ?");
5291
- parameters.push(options.through);
5292
- }
5293
- if (options.type) {
5294
- predicates.push("type = ?");
5295
- parameters.push(options.type);
5296
- }
5297
- const rows = this.prepare(`SELECT id, session_id, type, seq, time_created, data FROM session_message
5298
- WHERE ${predicates.join(" AND ")}
5299
- ORDER BY seq ASC LIMIT ?`).all(...parameters, limit).map(decode);
5300
- return { rows, cursor: rows.at(-1)?.seq };
5301
- });
5302
- }
5303
- messagePage(sessionID, afterOrdinal, limit, finalWatermark, after) {
5304
- return trackDecodeOperation("messagePage", () => {
5305
- if (!Number.isSafeInteger(afterOrdinal) || afterOrdinal < 0)
5306
- throw new Error("Invalid raw-message ordinal cursor");
5307
- if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1e4)
5308
- throw new Error("Invalid page limit");
5309
- if (!Number.isSafeInteger(finalWatermark) || finalWatermark < 0)
5310
- throw new Error("Invalid raw-message watermark");
5311
- const pageSize = Math.min(limit, finalWatermark - afterOrdinal);
5312
- if (pageSize <= 0)
5313
- return [];
5314
- if (after) {
5315
- const anchor = this.prepare("SELECT seq FROM session_message WHERE session_id = ? AND id = ?").get(sessionID, after.id);
5316
- if (anchor) {
5317
- return this.prepare(`SELECT id, session_id, type, seq, time_created, data
5318
- FROM session_message WHERE session_id = ? AND seq > ?
5319
- AND type IN (${RAW_MESSAGE_TYPE_PARAMETERS}) ORDER BY seq ASC LIMIT ?`).all(sessionID, anchor.seq, ...RAW_MESSAGE_TYPES, pageSize).map(decode);
5320
- }
5321
- }
5322
- const maximumSeq = Number.MAX_SAFE_INTEGER;
5323
- const rows = this.prepare(V2_MESSAGE_PAGE_SQL).all(afterOrdinal, sessionID, ...RAW_MESSAGE_TYPES, Math.max(0, afterOrdinal - 1), sessionID, sessionID, ...RAW_MESSAGE_TYPES, finalWatermark - 1, maximumSeq, sessionID, ...RAW_MESSAGE_TYPES, pageSize);
5324
- return rows.map(decode);
5325
- });
5326
- }
5327
- messageCount(sessionID) {
5328
- return trackDecodeOperation("messageCount", () => {
5329
- const rawTypes = RAW_MESSAGE_TYPES.map(() => "?").join(", ");
5330
- const row = this.prepare(`SELECT COUNT(*) AS count FROM session_message
5331
- WHERE session_id = ? AND type IN (${rawTypes})`).get(sessionID, ...RAW_MESSAGE_TYPES);
5332
- return typeof row?.count === "number" ? row.count : 0;
5333
- });
5334
- }
5335
- sessionDirectoryPage(afterSessionID, limit) {
5336
- const rows = this.prepare(`SELECT id, COALESCE(directory, '') AS directory FROM session_v2
5337
- WHERE id > ? ORDER BY id ASC LIMIT ?`).all(afterSessionID ?? "", limit);
5338
- return rows.map((row) => ({ sessionId: row.id, directory: row.directory }));
5339
- }
5340
- latestMessageTime(sessionID) {
5341
- const row = this.prepare("SELECT MAX(time_created) AS time FROM session_message WHERE session_id = ?").get(sessionID);
5342
- return row?.time ?? undefined;
5343
- }
5344
- isSubagent(sessionID) {
5345
- const row = this.prepare("SELECT parent_id FROM session_v2 WHERE id = ?").get(sessionID);
5346
- if (!row)
5347
- return null;
5348
- return typeof row.parent_id === "string" && row.parent_id.length > 0;
5349
- }
5350
- latestRootSessionInDirectory(directory) {
5351
- const columns = new Set(this.prepare("PRAGMA table_info(session_v2)").all().map((column) => column.name));
5352
- const archived = columns.has("time_archived") ? " AND time_archived IS NULL" : "";
5353
- const order = columns.has("time_updated") ? "time_updated DESC, id DESC" : "id DESC";
5354
- const page = this.prepare(`SELECT id, COALESCE(directory, '') AS directory FROM session_v2
5355
- WHERE parent_id IS NULL${archived}
5356
- AND COALESCE(json_extract(metadata, '$.magic_context'), '') <> 'hidden-run'
5357
- ORDER BY ${order} LIMIT ? OFFSET ?`);
5358
- const pageSize = 500;
5359
- for (let offset = 0;; offset += pageSize) {
5360
- const rows = page.all(pageSize, offset);
5361
- const match = rows.find((row) => sameProjectDirectory(row.directory, directory));
5362
- if (match)
5363
- return match.id;
5364
- if (rows.length < pageSize)
5365
- return;
5366
- }
5367
- }
5368
- rootSessionActivity(sessionIDs) {
5369
- const roots = new Map;
5370
- for (let offset = 0;offset < sessionIDs.length; offset += 500) {
5371
- const chunk = sessionIDs.slice(offset, offset + 500);
5372
- const rows = this.prepare(`SELECT id, (
5373
- SELECT MAX(time_created) FROM session_message
5374
- WHERE session_id = session_v2.id AND type = 'user'
5375
- ) AS time FROM session_v2
5376
- WHERE parent_id IS NULL
5377
- AND COALESCE(json_extract(metadata, '$.magic_context'), '') <> 'hidden-run'
5378
- AND id IN (${chunk.map(() => "?").join(",")})`).all(...chunk);
5379
- for (const row of rows)
5380
- if (row.time !== null)
5381
- roots.set(row.id, row.time);
5382
- }
5383
- return roots;
5384
- }
5385
- oldestUserMessageTimesSince(sessionIDs, sinceMs) {
5386
- const result = new Map;
5387
- for (let offset = 0;offset < sessionIDs.length; offset += 500) {
5388
- const chunk = sessionIDs.slice(offset, offset + 500);
5389
- const rows = this.prepare(`SELECT session_id, MIN(time_created) AS time FROM session_message
5390
- WHERE type = 'user' AND time_created > ? AND session_id IN (${chunk.map(() => "?").join(",")})
5391
- GROUP BY session_id`).all(sinceMs, ...chunk);
5392
- for (const row of rows)
5393
- result.set(row.session_id, row.time);
5394
- }
5395
- return result;
5396
- }
5397
- retrospectiveUserPage(sessionID, options) {
5398
- const { boundaryMs, before, limit, maxChars, truncationMarker } = options;
5399
- if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1e4)
5400
- throw new Error("Invalid page limit");
5401
- if (!Number.isSafeInteger(maxChars) || maxChars <= truncationMarker.length)
5402
- throw new Error("Invalid text limit");
5403
- const direction = before ? "DESC" : "ASC";
5404
- const head = Math.floor((maxChars - truncationMarker.length) / 2);
5405
- const tail = maxChars - truncationMarker.length - head;
5406
- return this.prepare(`WITH users AS (
5407
- SELECT session_id, seq, time_created, data FROM session_message
5408
- WHERE session_id = ? AND type = 'user' AND time_created ${before ? "<=" : ">"}
5409
- ?
5410
- ORDER BY time_created ${direction}, seq ${direction} LIMIT ?
5411
- ), texts AS (
5412
- SELECT session_id, seq, time_created, CASE
5413
- WHEN json_extract(data, '$.synthetic') = 1 OR json_extract(data, '$.ignored') = 1 THEN ''
5414
- WHEN json_type(data, '$.text') = 'text' THEN json_extract(data, '$.text')
5415
- ELSE COALESCE((SELECT group_concat(json_extract(value, '$.text'), char(10))
5416
- FROM json_each(users.data, '$.content')
5417
- WHERE json_extract(value, '$.type') IN ('text', 'input_text')
5418
- AND COALESCE(json_extract(value, '$.synthetic'), 0) <> 1
5419
- AND COALESCE(json_extract(value, '$.ignored'), 0) <> 1), '') END AS text
5420
- FROM users WHERE json_valid(data)
5421
- ) SELECT seq, time_created, CASE WHEN length(text) > ?
5422
- THEN substr(text, 1, ?) || ? || substr(text, -?) ELSE text END AS text,
5423
- EXISTS (
5424
- SELECT 1 FROM session_message assistant_reply
5425
- WHERE assistant_reply.session_id = texts.session_id
5426
- AND assistant_reply.type = 'assistant'
5427
- AND assistant_reply.seq < texts.seq
5428
- AND EXISTS (
5429
- SELECT 1 FROM session_message prior_user
5430
- WHERE prior_user.session_id = texts.session_id
5431
- AND prior_user.type = 'user'
5432
- AND prior_user.seq < assistant_reply.seq
5433
- )
5434
- ) AS follows_assistant_reply
5435
- FROM texts ORDER BY time_created ${direction}, seq ${direction}`).all(sessionID, boundaryMs, limit, maxChars, head, truncationMarker, tail);
5436
- }
5437
- storedRowsAfter(sessionID, after) {
5438
- const row = this.prepare("SELECT COUNT(*) AS count FROM session_message WHERE session_id = ? AND seq > ?").get(sessionID, after);
5439
- return row.count;
5440
- }
5441
- storedMessageCount(sessionID) {
5442
- return trackDecodeOperation("storedMessageCount", () => {
5443
- const row = this.prepare("SELECT COUNT(*) AS count FROM session_message WHERE session_id = ?").get(sessionID);
5444
- return typeof row?.count === "number" ? row.count : 0;
5445
- });
5446
- }
5447
- messageById(sessionID, id) {
5448
- return trackDecodeOperation("messageById", () => {
5449
- const rawTypes = RAW_MESSAGE_TYPES.map(() => "?").join(", ");
5450
- const row = this.prepare(`SELECT id, session_id, type, seq, time_created, data FROM session_message
5451
- WHERE session_id = ? AND id = ? AND type IN (${rawTypes}) LIMIT 1`).get(sessionID, id, ...RAW_MESSAGE_TYPES);
5452
- return row ? decode(row) : null;
5453
- });
5454
- }
5455
- messageTimes(sessionID, ids) {
5456
- const times = new Map;
5457
- for (let offset = 0;offset < ids.length; offset += 500) {
5458
- const batch = ids.slice(offset, offset + 500);
5459
- const rows = this.prepare(`SELECT id, COALESCE(time_created, json_extract(data, '$.time.created')) AS created,
5460
- json_extract(data, '$.time.completed') AS completed
5461
- FROM session_message WHERE session_id = ? AND id IN (${batch.map(() => "?").join(",")})`).all(sessionID, ...batch);
5462
- for (const row of rows)
5463
- times.set(row.id, {
5464
- created: typeof row.created === "number" ? row.created : undefined,
5465
- completed: typeof row.completed === "number" ? row.completed : undefined
5466
- });
5467
- }
5468
- return times;
5469
- }
5470
- messageExistsById(sessionID, id) {
5471
- return trackDecodeOperation("messageExistsById", () => {
5472
- const rawTypes = RAW_MESSAGE_TYPES.map(() => "?").join(", ");
5473
- const row = this.prepare(`SELECT 1 FROM session_message
5474
- WHERE id = ? AND session_id = ? AND type IN (${rawTypes}) LIMIT 1`).get(id, sessionID, ...RAW_MESSAGE_TYPES);
5475
- return row != null;
5476
- });
5477
- }
5478
- messageOrdinalById(sessionID, id) {
5479
- return trackDecodeOperation("messageOrdinalById", () => {
5480
- const rawTypes = RAW_MESSAGE_TYPES.map(() => "?").join(", ");
5481
- const row = this.prepare(`WITH target AS (
5482
- SELECT seq FROM session_message
5483
- WHERE session_id = ? AND id = ? AND type IN (${rawTypes})
5484
- LIMIT 1
5485
- )
5486
- SELECT (
5487
- SELECT COUNT(*) FROM session_message
5488
- WHERE session_id = ?
5489
- AND type IN (${rawTypes})
5490
- AND seq <= target.seq
5491
- ) AS ordinal
5492
- FROM target`).get(sessionID, id, ...RAW_MESSAGE_TYPES, sessionID, ...RAW_MESSAGE_TYPES);
5493
- return typeof row?.ordinal === "number" ? row.ordinal : null;
5494
- });
5495
- }
5496
- messageIdOrdinals(sessionID, fromOrdinal, toOrdinal) {
5497
- return trackDecodeOperation("messageIdOrdinals", () => {
5498
- if (!Number.isSafeInteger(fromOrdinal) || fromOrdinal < 1)
5499
- throw new Error("Invalid raw-message range start");
5500
- if (!Number.isSafeInteger(toOrdinal) || toOrdinal < fromOrdinal)
5501
- throw new Error("Invalid raw-message range end");
5502
- const rawTypes = RAW_MESSAGE_TYPES.map(() => "?").join(", ");
5503
- const rows = this.prepare(`SELECT id FROM session_message
5504
- WHERE session_id = ? AND type IN (${rawTypes})
5505
- ORDER BY seq ASC LIMIT ? OFFSET ?`).all(sessionID, ...RAW_MESSAGE_TYPES, toOrdinal - fromOrdinal + 1, fromOrdinal - 1);
5506
- return new Map(rows.map((row, index) => [row.id, fromOrdinal + index]));
5507
- });
5508
- }
5509
- messageOrdinalPage(sessionID, after, limit) {
5510
- return trackDecodeOperation("messageOrdinalPage", () => {
5511
- if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1e4)
5512
- throw new Error("Invalid page limit");
5513
- const rows = after ? this.prepare(`SELECT id, type, seq, json_valid(data) AS valid
5514
- FROM session_message
5515
- WHERE session_id = ? AND (seq > ? OR (seq = ? AND id > ?))
5516
- ORDER BY seq ASC, id ASC LIMIT ?`).all(sessionID, after.timeCreated, after.timeCreated, after.id, limit) : this.prepare(`SELECT id, type, seq, json_valid(data) AS valid
5517
- FROM session_message
5518
- WHERE session_id = ?
5519
- ORDER BY seq ASC, id ASC LIMIT ?`).all(sessionID, limit);
5520
- const rawTypes = new Set(RAW_MESSAGE_TYPES);
5521
- return rows.map((row) => ({
5522
- id: row.id,
5523
- timeCreated: row.seq,
5524
- contributesOrdinal: rawTypes.has(row.type),
5525
- hasValidInfo: row.valid === 1
5526
- }));
5527
- });
5528
- }
5529
- range(sessionID, after, through) {
5530
- return trackDecodeOperation("range", () => through <= after ? [] : this.all(sessionID, after, undefined, through));
5531
- }
5532
- spanRowStamps(sessionID, after, through) {
5533
- if (!Number.isSafeInteger(after) || !Number.isSafeInteger(through))
5534
- throw new Error("Invalid seq span");
5535
- const rows = this.prepare(`SELECT seq, id, time_updated AS updated, length(CAST(data AS BLOB)) AS bytes
5536
- FROM session_message WHERE session_id = ? AND seq > ? AND seq <= ?
5537
- ORDER BY seq ASC`).all(sessionID, after, through);
5538
- const stamps = new Map;
5539
- for (const row of rows)
5540
- stamps.set(row.seq, `${row.id}\x00${row.updated ?? ""}\x00${row.bytes ?? ""}`);
5541
- return stamps;
5542
- }
5543
- rawRowsThrough(sessionID, throughSeq, limit) {
5544
- return trackDecodeOperation("rawRowsThrough", () => {
5545
- if (!Number.isSafeInteger(throughSeq))
5546
- throw new Error("Invalid seq upper bound");
5547
- if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1e4)
5548
- throw new Error("Invalid page limit");
5549
- const rawTypes = RAW_MESSAGE_TYPES.map(() => "?").join(", ");
5550
- return this.prepare(`SELECT id, session_id, type, seq, time_created, data FROM session_message
5551
- WHERE session_id = ? AND type IN (${rawTypes}) AND seq <= ?
5552
- ORDER BY seq DESC LIMIT ?`).all(sessionID, ...RAW_MESSAGE_TYPES, throughSeq, limit).map(decode);
5553
- });
5554
- }
5555
- sequenceForId(sessionID, id) {
5556
- if (!id)
5557
- return;
5558
- const row = this.prepare("SELECT seq FROM session_message WHERE session_id = ? AND id = ? LIMIT 1").get(sessionID, id);
5559
- return typeof row?.seq === "number" ? row.seq : undefined;
5560
- }
5561
- syntheticMessageIDs(sessionID) {
5562
- const rows = this.prepare("SELECT id FROM session_message WHERE session_id = ? AND type = 'synthetic'").all(sessionID);
5563
- return new Set(rows.map((row) => row.id));
5564
- }
5565
- forkOrigin(sessionID) {
5566
- const columns = new Set(this.prepare("PRAGMA table_info(session_v2)").all().map((column) => column.name));
5567
- if (!columns.has("fork_session_id") || !columns.has("fork_boundary"))
5568
- return null;
5569
- const row = this.prepare("SELECT fork_session_id, fork_boundary FROM session_v2 WHERE id = ?").get(sessionID);
5570
- if (!row?.fork_session_id || !row.fork_boundary)
5571
- return null;
5572
- try {
5573
- const boundary = JSON.parse(row.fork_boundary);
5574
- if (boundary.type !== "before" && boundary.type !== "through" || typeof boundary.messageID !== "string" || boundary.messageID.length === 0)
5575
- return null;
5576
- return {
5577
- parentSessionID: row.fork_session_id,
5578
- boundary: { type: boundary.type, messageID: boundary.messageID }
5579
- };
5580
- } catch {
5581
- return null;
5582
- }
5583
- }
5584
- sessionExists(sessionID) {
5585
- return this.prepare("SELECT 1 FROM session_v2 WHERE id = ?").get(sessionID) != null;
5586
- }
5587
- rowStampsThrough(sessionID, throughSeq) {
5588
- return this.prepare(`SELECT id, type, seq, time_created FROM session_message
5589
- WHERE session_id = ? AND seq <= ? ORDER BY seq ASC`).all(sessionID, throughSeq);
5590
- }
5591
- latestSequenceForIds(sessionID, ids) {
5592
- let latest = -1;
5593
- for (let offset = 0;offset < ids.length; offset += 500) {
5594
- const chunk = ids.slice(offset, offset + 500);
5595
- const row = this.prepare(`SELECT MAX(seq) AS seq FROM session_message
5596
- WHERE session_id = ? AND id IN (${chunk.map(() => "?").join(", ")})`).get(sessionID, ...chunk);
5597
- if (typeof row?.seq === "number")
5598
- latest = Math.max(latest, row.seq);
5599
- }
5600
- return latest;
5601
- }
5602
- compactionByStatus(sessionID, status) {
5603
- const row = this.prepare(`SELECT id, session_id, type, seq, time_created, data FROM session_message
5604
- WHERE session_id = ? AND type = 'compaction'
5605
- AND json_extract(data, '$.status') = ?
5606
- ORDER BY seq DESC LIMIT 1`).get(sessionID, status);
5607
- return row ? decode(row) : undefined;
5608
- }
5609
- latestCompaction(sessionID) {
5610
- return trackDecodeOperation("latestCompaction", () => this.compactionByStatus(sessionID, "completed"));
5611
- }
5612
- latestRunningCompaction(sessionID) {
5613
- return trackDecodeOperation("latestRunningCompaction", () => this.compactionByStatus(sessionID, "running"));
5614
- }
5615
- idleRows(sessionID, after = -1) {
5616
- return trackDecodeOperation("idleRows", () => this.all(sessionID, after, "idle"));
5617
- }
5618
- earliestSequence(sessionID) {
5619
- const row = this.prepare("SELECT MIN(seq) AS seq FROM session_message WHERE session_id = ?").get(sessionID);
5620
- return typeof row?.seq === "number" ? row.seq : undefined;
5621
- }
5622
- latestSequence(sessionID) {
5623
- const row = this.prepare("SELECT MAX(seq) AS seq FROM session_message WHERE session_id = ?").get(sessionID);
5624
- return typeof row?.seq === "number" ? row.seq : -1;
5625
- }
5626
- assistantSince(sessionID, afterSeq) {
5627
- return trackDecodeOperation("assistantSince", () => {
5628
- const rows = this.prepare(`SELECT id, session_id, type, seq, time_created, data FROM session_message
5629
- WHERE session_id = ? AND type = 'assistant' AND seq > ?
5630
- ORDER BY seq ASC`).all(sessionID, afterSeq);
5631
- return rows.map((row) => decode(row));
5632
- });
5633
- }
5634
- latestAssistant(sessionID) {
5635
- return trackDecodeOperation("latestAssistant", () => {
5636
- const row = this.prepare(`SELECT id, session_id, type, seq, time_created, data FROM session_message
5637
- WHERE session_id = ? AND type = 'assistant'
5638
- ORDER BY seq DESC LIMIT 1`).get(sessionID);
5639
- return row ? decode(row) : undefined;
5640
- });
5641
- }
5642
- latestIdle(sessionID) {
5643
- return trackDecodeOperation("latestIdle", () => {
5644
- const row = this.prepare(`SELECT id, session_id, type, seq, time_created, data FROM session_message
5645
- WHERE session_id = ? AND type = 'idle'
5646
- ORDER BY seq DESC LIMIT 1`).get(sessionID);
5647
- return row ? decode(row) : undefined;
5648
- });
5649
- }
5650
- window(sessionID) {
5651
- return trackDecodeOperation("window", () => this.db.transaction(() => {
5652
- const cut = this.latestCompaction(sessionID);
5653
- return this.all(sessionID, cut ? cut.seq - 1 : -1);
5654
- }).deferred());
5655
- }
5656
- history(sessionID) {
5657
- return trackDecodeOperation("history", () => this.all(sessionID, -1));
5658
- }
5659
- all(sessionID, after, type, through) {
5660
- const rows = [];
5661
- for (;; ) {
5662
- const page = this.page(sessionID, { after, through, type });
5663
- rows.push(...page.rows);
5664
- if (page.rows.length < 100 || page.cursor === undefined)
5665
- return rows;
5666
- after = page.cursor;
5667
- }
5668
- }
5669
- }
5670
-
5671
4985
  // src/features/magic-context/resolve-subagent-fallback.ts
5672
4986
  function resolveIsSubagentFromOpenCodeDb(sessionId) {
5673
4987
  try {
@@ -5744,17 +5058,48 @@ function findSessionMeta(db, sessionId) {
5744
5058
  const result = db.prepare(`SELECT ${getSessionMetaSelectColumns(db)} FROM session_meta WHERE session_id = ?`).get(sessionId);
5745
5059
  return isSessionMetaRow(result) ? toSessionMeta(result) : undefined;
5746
5060
  }
5061
+ var parentReadRetries = new WeakMap;
5062
+ var PARENT_READ_ATTEMPTS = 5;
5063
+ var PARENT_READ_COOLDOWN_MS = 30000;
5747
5064
  function getOrCreateSessionMeta(db, sessionId) {
5748
5065
  const existing = findSessionMeta(db, sessionId);
5749
- if (existing)
5750
- return existing;
5751
- const defaults = getDefaultSessionMeta(sessionId);
5752
5066
  const harness = getHarness2();
5067
+ if (existing) {
5068
+ if (harness !== "opencode2")
5069
+ return existing;
5070
+ const row = db.prepare("SELECT is_subagent FROM session_meta WHERE session_id = ?").get(sessionId);
5071
+ if (row.is_subagent !== null)
5072
+ return existing;
5073
+ }
5074
+ const defaults = existing ?? getDefaultSessionMeta(sessionId);
5075
+ let retries = parentReadRetries.get(db);
5076
+ if (harness === "opencode2") {
5077
+ if (!retries) {
5078
+ retries = new BoundedSessionMap(1000);
5079
+ parentReadRetries.set(db, retries);
5080
+ }
5081
+ const retry = retries.get(sessionId);
5082
+ if (retry && retry.attempts >= PARENT_READ_ATTEMPTS && Date.now() - retry.at < PARENT_READ_COOLDOWN_MS)
5083
+ return defaults;
5084
+ }
5753
5085
  const fallbackSubagent = harness === "opencode" ? resolveIsSubagentFromOpenCodeDb(sessionId) : harness === "opencode2" ? resolveIsSubagentFromOpenCode2Db(sessionId) : null;
5754
5086
  if (fallbackSubagent === true) {
5755
5087
  defaults.isSubagent = true;
5756
5088
  }
5757
- ensureSessionMetaRow(db, sessionId, harness === "opencode2" && fallbackSubagent === true);
5089
+ if (harness === "opencode2") {
5090
+ if (fallbackSubagent === null) {
5091
+ const previous = retries?.get(sessionId);
5092
+ const attempts = previous && Date.now() - previous.at < PARENT_READ_COOLDOWN_MS ? previous.attempts + 1 : 1;
5093
+ retries?.set(sessionId, { attempts, at: Date.now() });
5094
+ ensureSessionMetaRow(db, sessionId, null);
5095
+ return defaults;
5096
+ }
5097
+ retries?.delete(sessionId);
5098
+ ensureSessionMetaRow(db, sessionId, fallbackSubagent);
5099
+ db.prepare("UPDATE session_meta SET is_subagent = ? WHERE session_id = ? AND is_subagent IS NULL").run(fallbackSubagent ? 1 : 0, sessionId);
5100
+ return defaults;
5101
+ }
5102
+ ensureSessionMetaRow(db, sessionId);
5758
5103
  if (harness === "opencode" && fallbackSubagent === true) {
5759
5104
  db.prepare("UPDATE session_meta SET is_subagent = 1 WHERE session_id = ?").run(sessionId);
5760
5105
  }
@@ -5863,14 +5208,18 @@ function clearSession(db, sessionId, rustModuleCleanupAcknowledged = false, perm
5863
5208
  cancelAutoSearchWork(sessionId);
5864
5209
  let transactionStartedAt = 0;
5865
5210
  let clearedMarker = null;
5211
+ let eligibleSessions = 0;
5866
5212
  withoutSqliteTransformPass2(() => withSqliteBackgroundWriter2(() => db.transaction(() => {
5867
5213
  transactionStartedAt = performance.now();
5868
5214
  clearedMarker = getPendingPiCompactionMarkerState(db, sessionId);
5869
- deleteSessionScopedRows(db, [sessionId], undefined, {
5215
+ eligibleSessions = deleteSessionScopedRows(db, [sessionId], undefined, {
5870
5216
  rustModuleCleanupAcknowledged,
5871
- preserveTagRevisionTombstones: !permanentlyDeleted
5217
+ preserveTagRevisionTombstones: !permanentlyDeleted,
5218
+ deferRecoveryFenceCleanup: true
5872
5219
  });
5873
5220
  }).immediate()));
5221
+ if (eligibleSessions > 0)
5222
+ clearLkgRecoveryFence(sessionId);
5874
5223
  if (clearedMarker)
5875
5224
  logPiCompactionMarkerClear(sessionId, clearedMarker, "session-reset");
5876
5225
  clearUnpublishedAutoSearchNoHints(sessionId);
@@ -6033,7 +5382,7 @@ function lkgProviderInputTotal(tokens) {
6033
5382
  return counts.every((count) => Number.isSafeInteger(count) && count >= 0) ? counts.reduce((sum, count) => sum + count, 0) : Number.NaN;
6034
5383
  }
6035
5384
  function identity(slot) {
6036
- return createHash4("sha256").update(JSON.stringify([
5385
+ return createHash3("sha256").update(JSON.stringify([
6037
5386
  slot.capturedAt,
6038
5387
  slot.captureSequence,
6039
5388
  slot.rowVersion,
@@ -6129,7 +5478,7 @@ function clearCapturedLkgMeasurement(sessionId) {
6129
5478
  }
6130
5479
 
6131
5480
  // src/hooks/magic-context/lkg-persist.ts
6132
- import { createHash as createHash5 } from "node:crypto";
5481
+ import { createHash as createHash4 } from "node:crypto";
6133
5482
  function parseStringArray(value) {
6134
5483
  if (typeof value !== "string")
6135
5484
  return null;
@@ -6243,7 +5592,7 @@ function rememberFingerprint(db, sessionId, fingerprint) {
6243
5592
  saved.set(sessionId, fingerprint);
6244
5593
  }
6245
5594
  function slotFingerprint(slot) {
6246
- return createHash5("sha256").update(JSON.stringify([
5595
+ return createHash4("sha256").update(JSON.stringify([
6247
5596
  slot.jsonPrefix,
6248
5597
  slot.inputIdSeq,
6249
5598
  slot.inputContentDigests,
@@ -7357,7 +6706,7 @@ var DIGEST_CHUNK_BYTES = 64 * 1024;
7357
6706
  var digestChunk;
7358
6707
  function lkgContentDigestFromFields(fields) {
7359
6708
  lkgDigestsComputed += 1;
7360
- const hash = createHash6("sha256");
6709
+ const hash = createHash5("sha256");
7361
6710
  digestChunk ??= Buffer.allocUnsafe(DIGEST_CHUNK_BYTES);
7362
6711
  const chunk = digestChunk;
7363
6712
  let offset = 0;
@@ -7420,7 +6769,7 @@ function legacyLkgDigestFromFields(fields) {
7420
6769
  const value = typeof field === "symbol" ? field.description ?? "" : String(field);
7421
6770
  key += `${typeof field}:${value.length}:${value}\x00`;
7422
6771
  }
7423
- return createHash6("sha256").update(key).digest("base64url");
6772
+ return createHash5("sha256").update(key).digest("base64url");
7424
6773
  }
7425
6774
  function legacyLkgContentDigest(message) {
7426
6775
  const fields = flattenContentFields(withoutEmptyUserDiffSummary(message));
@@ -8888,7 +8237,7 @@ class HiddenCompletionRefusal extends Error {
8888
8237
  }
8889
8238
  // src/features/magic-context/dreamer/provider-output-failure.ts
8890
8239
  import { AsyncLocalStorage } from "node:async_hooks";
8891
- import { createHash as createHash7 } from "node:crypto";
8240
+ import { createHash as createHash6 } from "node:crypto";
8892
8241
  var MAX_NEAR_ZERO_OUTPUT_TOKENS = 32;
8893
8242
 
8894
8243
  class DreamerProviderOutputFailureError extends Error {
@@ -8985,12 +8334,45 @@ function providerOutputFailureFromInvalidManifest(messages, responseText, now =
8985
8334
  const resetAt = quotaResetAt(responseText, now);
8986
8335
  if (resetAt === undefined && completion.outputTokens > MAX_NEAR_ZERO_OUTPUT_TOKENS)
8987
8336
  return null;
8988
- const fingerprint = createHash7("sha256").update(normalized).digest("hex").slice(0, 16);
8337
+ const fingerprint = createHash6("sha256").update(normalized).digest("hex").slice(0, 16);
8989
8338
  return new DreamerProviderOutputFailureError(fingerprint, completion.outputTokens, completion.reasoningTokens, responseText, resetAt);
8990
8339
  }
8991
8340
 
8992
8341
  // src/v2/hooks/hidden-child.ts
8993
- import { createHash as createHash8 } from "node:crypto";
8342
+ import { createHash as createHash7 } from "node:crypto";
8343
+
8344
+ // src/shared/historian-cache.ts
8345
+ function withoutHistorianTailCache(body) {
8346
+ const value = JSON.parse(body);
8347
+ if (!value || typeof value.model !== "string" || typeof value.max_tokens !== "number" || !Array.isArray(value.system) || value.system.length === 0 || !value.system.every((part) => part?.type === "text" && typeof part.text === "string") || !value.system.some((part) => part.cache_control) || !Array.isArray(value.messages) || value.cache_control !== undefined)
8348
+ return body;
8349
+ const root = parseTree(body);
8350
+ const property = (node, key) => node?.children?.find((child) => child.children?.[0]?.value === key)?.children?.[1];
8351
+ const removals = [];
8352
+ for (const message of property(root, "messages")?.children ?? []) {
8353
+ for (const block of property(message, "content")?.children ?? []) {
8354
+ if (block.type !== "object")
8355
+ continue;
8356
+ const fields = block.children ?? [];
8357
+ fields.forEach((field, index) => {
8358
+ if (field.children?.[0]?.value !== "cache_control")
8359
+ return;
8360
+ const next = fields[index + 1];
8361
+ const previous = fields[index - 1];
8362
+ removals.push(next ? [field.offset, next.offset] : [
8363
+ previous ? previous.offset + previous.length : field.offset,
8364
+ field.offset + field.length
8365
+ ]);
8366
+ });
8367
+ }
8368
+ }
8369
+ for (const [start, end] of removals.sort((a, b) => b[0] - a[0])) {
8370
+ body = body.slice(0, start) + body.slice(end);
8371
+ }
8372
+ return body;
8373
+ }
8374
+
8375
+ // src/v2/hooks/hidden-child.ts
8994
8376
  var HIDDEN_HISTORIAN_AGENT = "historian";
8995
8377
  var HIDDEN_DREAMER_AGENT = "dreamer-classifier";
8996
8378
  var HIDDEN_CURATE_AGENT = DREAMER_AGENT;
@@ -9154,7 +8536,7 @@ function markerCandidates(text) {
9154
8536
  function textDigest(text) {
9155
8537
  return {
9156
8538
  length: text.length,
9157
- sha256: createHash8("sha256").update(text).digest("hex").slice(0, 16)
8539
+ sha256: createHash7("sha256").update(text).digest("hex").slice(0, 16)
9158
8540
  };
9159
8541
  }
9160
8542
  function firstDifference(a, b) {
@@ -9177,6 +8559,7 @@ class HiddenChildHook {
9177
8559
  childIDs = new Map;
9178
8560
  attempts = new Map;
9179
8561
  active = new Map;
8562
+ cacheWarnings = new Set;
9180
8563
  constructor(note = log2) {
9181
8564
  this.note = note;
9182
8565
  }
@@ -9202,6 +8585,30 @@ class HiddenChildHook {
9202
8585
  owns(sessionID) {
9203
8586
  return this.childIDs.has(sessionID);
9204
8587
  }
8588
+ async cacheRequest(draft) {
8589
+ const attempt = this.active.get(draft.sessionID);
8590
+ if (!this.owns(draft.sessionID) || !attempt || attempt.identity.kind !== "historian" || draft.kind !== "primary" || attempt.request.cacheTail !== "skip")
8591
+ return;
8592
+ if ((attempt.wireRequests ?? 0) > 0)
8593
+ return;
8594
+ attempt.wireRequests = 1;
8595
+ try {
8596
+ const original = await draft.request.clone().text();
8597
+ const body = withoutHistorianTailCache(original);
8598
+ if (body === original)
8599
+ return;
8600
+ const headers = new Headers(draft.request.headers);
8601
+ headers.delete("content-length");
8602
+ draft.request = new Request(draft.request, { body, headers });
8603
+ } catch (error) {
8604
+ if (!this.cacheWarnings.has(draft.sessionID)) {
8605
+ this.cacheWarnings.add(draft.sessionID);
8606
+ try {
8607
+ this.note(`Historian cache optimization skipped for ${draft.sessionID}: ${String(error)}`);
8608
+ } catch {}
8609
+ }
8610
+ }
8611
+ }
9205
8612
  compactionSummary(sessionID, agent) {
9206
8613
  if (!this.owns(sessionID)) {
9207
8614
  if (isChildOfDisposedInstance(sessionID)) {
@@ -10300,9 +9707,9 @@ async function promptAsyncAndWaitForIdle(client, request, options = {}) {
10300
9707
  }
10301
9708
  }
10302
9709
  // src/shared/prompt-surface-runtime.ts
10303
- import { createHash as createHash9 } from "node:crypto";
10304
- import { existsSync as existsSync5, readFileSync as readFileSync6, statSync as statSync6 } from "node:fs";
10305
- import { dirname as dirname4, isAbsolute as isAbsolute3, resolve as resolve3 } from "node:path";
9710
+ import { createHash as createHash8 } from "node:crypto";
9711
+ import { existsSync as existsSync5, readFileSync as readFileSync6, statSync as statSync5 } from "node:fs";
9712
+ import { dirname as dirname4, isAbsolute as isAbsolute3, resolve as resolve2 } from "node:path";
10306
9713
 
10307
9714
  // src/tools/light-descriptions.ts
10308
9715
  var CTX_REDUCE_LIGHT_DESCRIPTION = `Stamp an item as no longer needed for the work ahead. Not a delete: stamping QUEUES it, the item stays readable until Magic Context clears stamped items in one sweep, newest tags are protected, and a cleared item goes to the archive (recent: a [dropped §N§] placeholder; older: removed) recoverable via ctx_expand(tag=N). The question is "does this need to stay on my desk for what comes next?" — a file you keep editing stays, the grep that found it goes. Stamp used reads/searches/outputs, acted-on build/test output, redundant dumps, extracted pasted payloads; keep user messages, your own text, unresolved errors, raw evidence, exact wording that may matter. Look at each tag; never blanket-stamp "1-50". Grammar: "3-5", "1,2,9", "1-5,8,12-15".`;
@@ -10333,12 +9740,12 @@ function promptSurfaceHashMaterial(systemContent, preset = "full") {
10333
9740
  \x00magic-context-prompt-surface:${preset}`;
10334
9741
  }
10335
9742
  function systemPromptFingerprint(systemContent, preset = "full") {
10336
- return createHash9("md5").update(promptSurfaceHashMaterial(systemContent, preset)).digest("hex");
9743
+ return createHash8("md5").update(promptSurfaceHashMaterial(systemContent, preset)).digest("hex");
10337
9744
  }
10338
9745
  var PROMPT_SURFACE_TOOL_ID_SET = new Set(ACTIVE_TOOL_IDS);
10339
9746
  function resolveUserConfigDirectory(options) {
10340
9747
  if (options.userConfigDirectory)
10341
- return resolve3(options.userConfigDirectory);
9748
+ return resolve2(options.userConfigDirectory);
10342
9749
  const sharedBase = cortexKitUserConfigBasePath();
10343
9750
  const shared = detectConfigFile(sharedBase);
10344
9751
  if (shared.format !== "none")
@@ -10365,10 +9772,10 @@ function createPromptSurfaceRuntime(options) {
10365
9772
  const readGuidanceOverride = (configuredPath) => {
10366
9773
  if (!configuredPath)
10367
9774
  return;
10368
- const path = isAbsolute3(configuredPath) ? configuredPath : resolve3(userConfigDirectory, configuredPath);
9775
+ const path = isAbsolute3(configuredPath) ? configuredPath : resolve2(userConfigDirectory, configuredPath);
10369
9776
  let content;
10370
9777
  try {
10371
- if (!statSync6(path).isFile()) {
9778
+ if (!statSync5(path).isFile()) {
10372
9779
  warnOnce(`guidance-not-file:${path}`, `prompt_surface.guidance_override_path (${path}) is not a file; using built-in guidance.`);
10373
9780
  return;
10374
9781
  }
@@ -11019,7 +10426,7 @@ function compareMemorySelectionPriority(left, right) {
11019
10426
  }
11020
10427
 
11021
10428
  // src/features/magic-context/mural/render-trigger.ts
11022
- import { createHash as createHash10 } from "node:crypto";
10429
+ import { createHash as createHash9 } from "node:crypto";
11023
10430
 
11024
10431
  // src/features/magic-context/mural/mural-selection.ts
11025
10432
  var DEFAULT_MURAL_MEMORY_BUDGET = 8000;
@@ -11723,7 +11130,7 @@ function ensureMuralRendered(db, projectIdentity, budgetTokens = DEFAULT_MURAL_M
11723
11130
  return { ...cached.result };
11724
11131
  }
11725
11132
  const plan = planMuralRender(entries);
11726
- const textHash = createHash10("sha256").update(plan.layout.text).digest("hex");
11133
+ const textHash = createHash9("sha256").update(plan.layout.text).digest("hex");
11727
11134
  if (existing && existing.contentHash === textHash && existing.width === plan.width && existing.height === plan.height) {
11728
11135
  return rememberRender(db, projectIdentity, key, existing.image, {
11729
11136
  hasMural: true,
@@ -11912,14 +11319,14 @@ function parseUserMemoryRow(row) {
11912
11319
  }
11913
11320
 
11914
11321
  // src/features/magic-context/compaction-marker.ts
11915
- import { createHash as createHash11 } from "node:crypto";
11916
- import { existsSync as existsSync6, statSync as statSync7 } from "node:fs";
11322
+ import { createHash as createHash10 } from "node:crypto";
11323
+ import { existsSync as existsSync6, statSync as statSync6 } from "node:fs";
11917
11324
  var BASE62_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
11918
11325
  var ID_PREFIX_HEX_LENGTH = 12;
11919
11326
  var ID_SUFFIX_LENGTH = 14;
11920
11327
  var ID_PREFIX_MASK = (1n << BigInt(ID_PREFIX_HEX_LENGTH * 4)) - 1n;
11921
11328
  function deterministicBase62(seed, length) {
11922
- let value = BigInt(`0x${createHash11("sha256").update(seed).digest("hex")}`);
11329
+ let value = BigInt(`0x${createHash10("sha256").update(seed).digest("hex")}`);
11923
11330
  const chars = Array(length);
11924
11331
  for (let index = length - 1;index >= 0; index -= 1) {
11925
11332
  chars[index] = BASE62_CHARS[Number(value % 62n)];
@@ -11985,7 +11392,7 @@ function runMarkerWriteTransaction(db, site, operation) {
11985
11392
  function markerWalPages(db) {
11986
11393
  try {
11987
11394
  const row = db.prepare("PRAGMA page_size").get();
11988
- const bytes = statSync7(`${getOpenCodeDbPath()}-wal`).size;
11395
+ const bytes = statSync6(`${getOpenCodeDbPath()}-wal`).size;
11989
11396
  return Math.max(0, Math.floor((bytes - 32) / (row.page_size + 24)));
11990
11397
  } catch {
11991
11398
  return null;
@@ -17932,6 +17339,7 @@ async function runHistorianPrompt(args) {
17932
17339
  let handle = null;
17933
17340
  let completion;
17934
17341
  const executor = resolveHiddenCompletionExecutor(args.hiddenCompletionExecutor, client, db, sessionDirectory, "historian");
17342
+ const cacheTail = args.cacheTail ?? (executor.capabilities.harness === "opencode2" ? "skip" : undefined);
17935
17343
  let promptSettled = false;
17936
17344
  let hadUnsettledPrompt = false;
17937
17345
  const startedAt = Date.now();
@@ -18013,6 +17421,7 @@ async function runHistorianPrompt(args) {
18013
17421
  try {
18014
17422
  await promptSyncWithModelSuggestionRetry(client, {
18015
17423
  path: { id: agentSessionId },
17424
+ ...cacheTail !== undefined ? { cacheTail: retryIndex > 0 ? "write" : cacheTail } : {},
18016
17425
  query: { directory: sessionDirectory },
18017
17426
  body: {
18018
17427
  agent: agentId,
@@ -21931,4 +21340,4 @@ async function executeContextRecomp(deps, options = {}) {
21931
21340
  return (await executeContextRecompWithResult(deps, options)).message;
21932
21341
  }
21933
21342
 
21934
- export { denyTaskRoutingToCallerAgents, buildHiddenAgentRegistrations, buildZenReadAgentRegistrations, buildHiddenAgentConfig, getMagicContextBuiltinCommands, formatConfigParseStatusLine, claimConfigParseFailuresOnce, cortexKitUserConfigBasePath, cortexKitProjectConfigBasePath, resolveLegacyConfigSources, migrateMagicContextConfigLocations, getProtectedTokensTierOverrides, loadPluginConfigDetailed, historianRunConfig, dreamerRunConfig, pluginConfigReader, currentPluginConfigReader, withLiveDreamerOutputCap, createDreamerOutputCapSampler, COMPARTMENT_AGENT_SYSTEM_PROMPT, HISTORIAN_EDITOR_SYSTEM_PROMPT, COMPARTMENT_STRUCTURAL_SYSTEM_PROMPT, clampProducerAtomChars, producerInputTokenLimit, historianProducerReserve, producerPromptFailureReason, DREAMER_AGENT, DREAMER_RETROSPECTIVE_AGENT, DREAMER_PRIMER_INVESTIGATOR_AGENT, DREAMER_MEMORY_MAPPER_AGENT, DREAMER_CLASSIFIER_AGENT, DREAMER_DOCS_AGENT, DREAMER_REVIEWER_AGENT, COMPARTMENT_LEASE_RENEWAL_MS, acquireCompartmentLease, renewCompartmentLease, releaseCompartmentLeaseBestEffort, isCompartmentLeaseHeld, queueM0Mutation, getMaxM0MutationId, getCompartments, getLastCompartmentEndMessage, getLastCompartmentEndMessageId, getUncoveredCompartmentEndsThrough, providerResponseFailed, isSuccessfulProviderCompletion, rememberUnpublishedAutoSearchNoHint, getUnpublishedAutoSearchNoHint, forgetUnpublishedAutoSearchNoHint, registerAutoSearchWork, cancelAutoSearchWork, gaDatabasePath, RAW_MESSAGE_TYPES, V2StoreReaderPool, V2StoreReader, getOrCreateSessionMeta, updateSessionMeta, advanceToolReclaimWatermark, markSessionCleanupPending, retryPendingSessionCleanups, retryPendingRustSessionCleanupsForProject, clearSession, requestPendingMaterialization, pendingMaterializationOrigin, hasPendingMaterializationOrigin, clearPendingMaterialization, recordSystemPromptForRequest, recordHeldHeadForRequest, bindSystemPromptResponse, isHeldHeadForRequest, deferDeliveredSystemRefresh, retirePendingSystemPromptDelivery, lkgProviderInputTotal, beginV2LkgRequest, claimLkgRequestIdentity, currentLkgRequestIdentity, noteCapturedLkgRequest, noteLkgProviderResponse, measuredLkgPrefix, clearLkgMeasuredRequest, saveLkgSlotToDb, clearPersistedLkgSlotStrict, loadPersistedLkgSlot, drainStaleLkgSlots, createDbLkgPersistence, resolveLkgModelKeys, createLkgEntryProjector, captureLkgSlot, validateAnthropicReasoningRuns, validateLkgSeam, replayLkg, coldStartRawServedIndex, coldStartUncapturedReplay, noteUncertifiedNormalLkg, hasProcessLocalLkgProof, lkgDirtyRevision, rememberLkgDirtyRevision, noteLkgRecoveryPrefix, readLkgRecoveryPrefix, noteLkgHealthyPrefix, lkgRecoveryReplayUnproven, lkgRecoveryEntryUnproven, registerLkgPersistence, beginLkgPass, visitMessageContentFields, contentSnapshotValue, messageContentFields, signatureForFields, exactReusablePrefix, incrementalLkgContentDigests, lkgSlotRejection, captureSlot, getInMemorySlot, getSlot, forgetInMemorySlot, dropSlot, noteEntry, getLkgSlotHeapStats, TOOL_SWEEP_SCOPED_MARKER, useScopedToolSweep, createPreAdoptionToolSweepResolver, copySessionStateForClone, queueMemoryMutation, getMaxMemoryMutationIdForProjects, GLOBAL_USER_PROFILE_PROJECT_PATH, getProjectState, bumpProjectUserProfileVersion, saveSourceContent, replaceSourceContent, getSourceContents, createChildSessionWithFence, HiddenCompletionRefusal, DreamerProviderOutputFailureError, withDreamerModelCooldown, providerOutputFailureFromInvalidManifest, HIDDEN_HISTORIAN_AGENT, HIDDEN_DREAMER_AGENT, HIDDEN_CURATE_AGENT, hiddenAgentFor, hiddenToolLoop, HIDDEN_RUN_DISPOSED_REASON, noteChildOfDisposedInstance, hiddenChildPermissions, registerHiddenChildAgents, hiddenToolCallRefusal, HiddenAgentStepLimit, HiddenChildHook, extractLatestAssistantText, hasLengthCappedOutput, parseProviderModel, modelBodyField, toModelEntry, isPromptTimeoutError, getPromptFailureDetail, raceWithSignal, promptSyncWithValidatedOutputRetry, normalizeSDKResponse, failedInvocationStatus, sumTokensFromChildMessages, recordChildInvocation, recordPromptSessionError, createPromptAsyncTransport, CTX_NOTE_LIGHT_DESCRIPTION, ACTIVE_TOOL_IDS, systemPromptFingerprint, createPromptSurfaceRuntime, createPromptSurfaceGuidanceEpochCache, setKeepSubagents, teardownChildSession, getCompartmentEvents, runTokenLog, formatRunTokenLog, buildMagicContextSection, getMuralIdentity, getMural, modelKeyAcceptsImages, resolveMuralWire, USER_MEMORY_CANDIDATE_TTL_MS, insertUserMemoryCandidates, getUserMemoryCandidates, deleteUserMemoryCandidates, pruneExpiredUserMemoryCandidates, insertUserMemory, getActiveUserMemories, updateUserMemoryContent, dismissUserMemory, getOpenCodeDbPath, compareOpenCodeMessagesByCanonicalOrder, prepareCompactionMarkerCandidates, removeMcOwnedCompactionMarkers, MARKER_SUMMARY_TEXT, markerUpdateDefinitelyDidNotCut, applyDeferredCompactionMarker, removeCompactionMarkerForSession, checkCompactionMarkerConsistency, extractM0Block, formatDate, TEMPORAL_MARKER_REPLAY_PATTERN, collectTemporalCandidates, injectTemporalMarkers, clearInjectionCache, getVisibleMemoryIds, selectHiddenMessagesAtCompactionSeam, prepareCompartmentInjection, renderCompartmentInjection, MaterializeContentionError, mustMaterialize, trimMemoriesToBudgetV2, renderMemoryBlockV2, materializeM0, hydrateCachedM0Mural, resetPrefixTrimFallbackState, findHostCompactionWindow, capturePrefixTrimSourceOrder, prepareCachedM0M1Replay, hasCompleteCachedM0M1, injectM0M1, resolveHiddenCompletionExecutor, createV1HiddenCompletionExecutor, readCoordinateGeneration, readCoordinateRebaseNotice, formatCoordinateRebaseNotice, rebaseSessionCoordinatesAsync, EMPTY_READ_REPLY, noteTouchedAt, renderGlance, renderNotesById, formatWriteReply, observeNoteNudgeServe, onNoteTrigger, peekNoteNudgeText, markNoteNudgeDelivered, clearNoteNudgeTriggerAndCooldown, resetNoteNudgeCooldownOnly, clearNoteNudgeTriggerOnly, describeBoundaryDiagnostics, RECOVERY_NO_HEAD_LIMIT, deriveProtectedTailTokenTarget, selectPerRunCap, resolveOpenCodeProtectedTailBoundary, resolveWrapupProtectedTailBoundary, getRawHistoryEligibility, hasRunnableCompartmentWindow, recordHighPressureNoEligibleHead, noteTransformPassForExactOrdinalReads, runCompartmentAgent, snapRangeToCompartments, getActiveCompartmentRun, markActiveCompartmentRunPublished, registerActiveCompartmentRun, startCompartmentAgent, executeContextRecomp };
21343
+ export { denyTaskRoutingToCallerAgents, buildHiddenAgentRegistrations, buildZenReadAgentRegistrations, buildHiddenAgentConfig, getMagicContextBuiltinCommands, formatConfigParseStatusLine, claimConfigParseFailuresOnce, cortexKitUserConfigBasePath, cortexKitProjectConfigBasePath, resolveLegacyConfigSources, migrateMagicContextConfigLocations, getProtectedTokensTierOverrides, loadPluginConfigDetailed, historianRunConfig, dreamerRunConfig, pluginConfigReader, currentPluginConfigReader, withLiveDreamerOutputCap, createDreamerOutputCapSampler, COMPARTMENT_AGENT_SYSTEM_PROMPT, HISTORIAN_EDITOR_SYSTEM_PROMPT, COMPARTMENT_STRUCTURAL_SYSTEM_PROMPT, clampProducerAtomChars, producerInputTokenLimit, historianProducerReserve, producerPromptFailureReason, DREAMER_AGENT, DREAMER_RETROSPECTIVE_AGENT, DREAMER_PRIMER_INVESTIGATOR_AGENT, DREAMER_MEMORY_MAPPER_AGENT, DREAMER_CLASSIFIER_AGENT, DREAMER_DOCS_AGENT, DREAMER_REVIEWER_AGENT, COMPARTMENT_LEASE_RENEWAL_MS, acquireCompartmentLease, renewCompartmentLease, releaseCompartmentLeaseBestEffort, isCompartmentLeaseHeld, queueM0Mutation, getMaxM0MutationId, getCompartments, getLastCompartmentEndMessage, getLastCompartmentEndMessageId, getUncoveredCompartmentEndsThrough, providerResponseFailed, isSuccessfulProviderCompletion, rememberUnpublishedAutoSearchNoHint, getUnpublishedAutoSearchNoHint, forgetUnpublishedAutoSearchNoHint, registerAutoSearchWork, cancelAutoSearchWork, getOrCreateSessionMeta, updateSessionMeta, advanceToolReclaimWatermark, markSessionCleanupPending, retryPendingSessionCleanups, retryPendingRustSessionCleanupsForProject, clearSession, requestPendingMaterialization, pendingMaterializationOrigin, hasPendingMaterializationOrigin, clearPendingMaterialization, recordSystemPromptForRequest, recordHeldHeadForRequest, bindSystemPromptResponse, isHeldHeadForRequest, deferDeliveredSystemRefresh, retirePendingSystemPromptDelivery, lkgProviderInputTotal, beginV2LkgRequest, claimLkgRequestIdentity, currentLkgRequestIdentity, noteCapturedLkgRequest, noteLkgProviderResponse, measuredLkgPrefix, clearLkgMeasuredRequest, saveLkgSlotToDb, clearPersistedLkgSlotStrict, loadPersistedLkgSlot, drainStaleLkgSlots, createDbLkgPersistence, resolveLkgModelKeys, createLkgEntryProjector, captureLkgSlot, validateAnthropicReasoningRuns, validateLkgSeam, replayLkg, coldStartRawServedIndex, coldStartUncapturedReplay, noteUncertifiedNormalLkg, hasProcessLocalLkgProof, lkgDirtyRevision, rememberLkgDirtyRevision, noteLkgRecoveryPrefix, readLkgRecoveryPrefix, noteLkgHealthyPrefix, lkgRecoveryReplayUnproven, lkgRecoveryEntryUnproven, registerLkgPersistence, beginLkgPass, visitMessageContentFields, contentSnapshotValue, messageContentFields, signatureForFields, exactReusablePrefix, incrementalLkgContentDigests, lkgSlotRejection, captureSlot, getInMemorySlot, getSlot, forgetInMemorySlot, dropSlot, noteEntry, getLkgSlotHeapStats, TOOL_SWEEP_SCOPED_MARKER, useScopedToolSweep, createPreAdoptionToolSweepResolver, copySessionStateForClone, queueMemoryMutation, getMaxMemoryMutationIdForProjects, GLOBAL_USER_PROFILE_PROJECT_PATH, getProjectState, bumpProjectUserProfileVersion, saveSourceContent, replaceSourceContent, getSourceContents, createChildSessionWithFence, HiddenCompletionRefusal, DreamerProviderOutputFailureError, withDreamerModelCooldown, providerOutputFailureFromInvalidManifest, HIDDEN_HISTORIAN_AGENT, HIDDEN_DREAMER_AGENT, HIDDEN_CURATE_AGENT, hiddenAgentFor, hiddenToolLoop, HIDDEN_RUN_DISPOSED_REASON, noteChildOfDisposedInstance, hiddenChildPermissions, registerHiddenChildAgents, hiddenToolCallRefusal, HiddenAgentStepLimit, HiddenChildHook, extractLatestAssistantText, hasLengthCappedOutput, parseProviderModel, modelBodyField, toModelEntry, isPromptTimeoutError, getPromptFailureDetail, raceWithSignal, promptSyncWithValidatedOutputRetry, normalizeSDKResponse, failedInvocationStatus, sumTokensFromChildMessages, recordChildInvocation, recordPromptSessionError, createPromptAsyncTransport, CTX_NOTE_LIGHT_DESCRIPTION, ACTIVE_TOOL_IDS, systemPromptFingerprint, createPromptSurfaceRuntime, createPromptSurfaceGuidanceEpochCache, setKeepSubagents, teardownChildSession, getCompartmentEvents, runTokenLog, formatRunTokenLog, buildMagicContextSection, getMuralIdentity, getMural, modelKeyAcceptsImages, resolveMuralWire, USER_MEMORY_CANDIDATE_TTL_MS, insertUserMemoryCandidates, getUserMemoryCandidates, deleteUserMemoryCandidates, pruneExpiredUserMemoryCandidates, insertUserMemory, getActiveUserMemories, updateUserMemoryContent, dismissUserMemory, getOpenCodeDbPath, compareOpenCodeMessagesByCanonicalOrder, prepareCompactionMarkerCandidates, removeMcOwnedCompactionMarkers, MARKER_SUMMARY_TEXT, markerUpdateDefinitelyDidNotCut, applyDeferredCompactionMarker, removeCompactionMarkerForSession, checkCompactionMarkerConsistency, extractM0Block, formatDate, TEMPORAL_MARKER_REPLAY_PATTERN, collectTemporalCandidates, injectTemporalMarkers, clearInjectionCache, getVisibleMemoryIds, selectHiddenMessagesAtCompactionSeam, prepareCompartmentInjection, renderCompartmentInjection, MaterializeContentionError, mustMaterialize, trimMemoriesToBudgetV2, renderMemoryBlockV2, materializeM0, hydrateCachedM0Mural, resetPrefixTrimFallbackState, findHostCompactionWindow, capturePrefixTrimSourceOrder, prepareCachedM0M1Replay, hasCompleteCachedM0M1, injectM0M1, resolveHiddenCompletionExecutor, createV1HiddenCompletionExecutor, readCoordinateGeneration, readCoordinateRebaseNotice, formatCoordinateRebaseNotice, rebaseSessionCoordinatesAsync, EMPTY_READ_REPLY, noteTouchedAt, renderGlance, renderNotesById, formatWriteReply, observeNoteNudgeServe, onNoteTrigger, peekNoteNudgeText, markNoteNudgeDelivered, clearNoteNudgeTriggerAndCooldown, resetNoteNudgeCooldownOnly, clearNoteNudgeTriggerOnly, describeBoundaryDiagnostics, RECOVERY_NO_HEAD_LIMIT, deriveProtectedTailTokenTarget, selectPerRunCap, resolveOpenCodeProtectedTailBoundary, resolveWrapupProtectedTailBoundary, getRawHistoryEligibility, hasRunnableCompartmentWindow, recordHighPressureNoEligibleHead, noteTransformPassForExactOrdinalReads, runCompartmentAgent, snapRangeToCompartments, getActiveCompartmentRun, markActiveCompartmentRunPublished, registerActiveCompartmentRun, startCompartmentAgent, executeContextRecomp };