@cortexkit/opencode-magic-context 0.48.0 → 0.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/dist/auto-search-worker.js +3 -3
  2. package/dist/{conflict-warning-hook-w8cykrnf.js → conflict-warning-hook-kzx4dmk1.js} +7 -7
  3. package/dist/{context-m0cy262m.js → context-nj5f293n.js} +96 -43
  4. package/dist/{derive-budgets-sg0xsq7s.js → derive-budgets-qz5rrr08.js} +2 -2
  5. package/dist/embedding-backfill-aetxv1vt.js +21 -0
  6. package/dist/embedding-worker.js +4 -4
  7. package/dist/features/magic-context/git-commits/search-git-commits.d.ts +2 -0
  8. package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
  9. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  10. package/dist/features/magic-context/pi-content-decisions.d.ts +1 -1
  11. package/dist/features/magic-context/pi-content-decisions.d.ts.map +1 -1
  12. package/dist/features/magic-context/search-rerank.d.ts +35 -0
  13. package/dist/features/magic-context/search-rerank.d.ts.map +1 -0
  14. package/dist/features/magic-context/search.d.ts +11 -0
  15. package/dist/features/magic-context/search.d.ts.map +1 -1
  16. package/dist/features/magic-context/storage-meta-persisted.d.ts +13 -2
  17. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  18. package/dist/features/magic-context/storage-meta-session.d.ts +1 -1
  19. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  20. package/dist/features/magic-context/storage-meta.d.ts +1 -1
  21. package/dist/features/magic-context/storage-meta.d.ts.map +1 -1
  22. package/dist/features/magic-context/storage-session-tables.d.ts +2 -0
  23. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  24. package/dist/features/magic-context/storage-tag-identity-revision.d.ts +29 -9
  25. package/dist/features/magic-context/storage-tag-identity-revision.d.ts.map +1 -1
  26. package/dist/features/magic-context/storage-tags.d.ts +9 -0
  27. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  28. package/dist/features/magic-context/storage.d.ts +1 -1
  29. package/dist/features/magic-context/storage.d.ts.map +1 -1
  30. package/dist/features/magic-context/tagger.d.ts +2 -0
  31. package/dist/features/magic-context/tagger.d.ts.map +1 -1
  32. package/dist/features/magic-context/transform-decision-log.d.ts +3 -0
  33. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  34. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -1
  35. package/dist/hooks/magic-context/auto-search-replay.fixture.d.ts +24 -0
  36. package/dist/hooks/magic-context/auto-search-replay.fixture.d.ts.map +1 -0
  37. package/dist/hooks/magic-context/auto-search-runner.d.ts +1 -1
  38. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  39. package/dist/hooks/magic-context/auto-search-worker-client.d.ts +2 -0
  40. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
  41. package/dist/hooks/magic-context/command-handler.d.ts +2 -0
  42. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  43. package/dist/hooks/magic-context/emergency-fail-closed.d.ts +28 -0
  44. package/dist/hooks/magic-context/emergency-fail-closed.d.ts.map +1 -1
  45. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  46. package/dist/hooks/magic-context/historian-host-runner.d.ts +8 -0
  47. package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
  48. package/dist/hooks/magic-context/hook.d.ts +2 -1
  49. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  50. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  51. package/dist/hooks/magic-context/latest-thinking-recovery.d.ts +7 -0
  52. package/dist/hooks/magic-context/latest-thinking-recovery.d.ts.map +1 -1
  53. package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
  54. package/dist/hooks/magic-context/pass-outcome.d.ts +1 -0
  55. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
  56. package/dist/hooks/magic-context/read-session-chunk.d.ts +7 -1
  57. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  58. package/dist/hooks/magic-context/read-session-raw.d.ts +35 -0
  59. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
  60. package/dist/hooks/magic-context/rust-mode-transform.d.ts +36 -0
  61. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  62. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +8 -1
  63. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -1
  64. package/dist/hooks/magic-context/strict-thinking-prefix.d.ts +8 -0
  65. package/dist/hooks/magic-context/strict-thinking-prefix.d.ts.map +1 -0
  66. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  67. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +13 -0
  68. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  69. package/dist/hooks/magic-context/transform.d.ts +1 -0
  70. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  71. package/dist/{index-db7zwa3v.js → index-1bt88epp.js} +93 -9
  72. package/dist/{index-f0h6xwqm.js → index-1g30axtz.js} +229 -67
  73. package/dist/{index-k1xb52kd.js → index-1r0k9js3.js} +5 -5
  74. package/dist/{index-692jzy0p.js → index-2jcbj7r1.js} +122 -371
  75. package/dist/{index-bdckkfw6.js → index-2jgwttpt.js} +16 -8
  76. package/dist/{index-2y0s2hep.js → index-4mjhqadz.js} +1 -1
  77. package/dist/{index-pdecwzrd.js → index-57mrqed8.js} +1 -1
  78. package/dist/{index-ty64eqcn.js → index-9qjqq45k.js} +3 -3
  79. package/dist/{index-yq8n9qcb.js → index-9rt53q79.js} +4 -4
  80. package/dist/{index-pg50n748.js → index-b7mv1jx3.js} +4 -4
  81. package/dist/{index-mmyh6d8f.js → index-ezmszwbd.js} +6 -4
  82. package/dist/{index-fbv1dn35.js → index-gzcmtmar.js} +1 -1
  83. package/dist/{index-0an7742d.js → index-h2py7207.js} +549 -973
  84. package/dist/{index-0qhce371.js → index-h2wc01qk.js} +2 -2
  85. package/dist/{index-dhwzyd54.js → index-h5zfkjyk.js} +160 -25
  86. package/dist/{index-q2tqeqde.js → index-ha87j7a8.js} +1229 -78
  87. package/dist/{index-14cjxt20.js → index-hj2q50k0.js} +45 -8
  88. package/dist/{index-cb7emxgj.js → index-kmpvemph.js} +336 -6
  89. package/dist/{index-c43kr12f.js → index-kp5qe690.js} +7 -7
  90. package/dist/{index-bhvjj0ys.js → index-kq57tdf0.js} +2 -2
  91. package/dist/{index-7mx8v0pw.js → index-nm6a8xpd.js} +4 -4
  92. package/dist/{index-8j7gqj40.js → index-nsjyysj0.js} +6 -2
  93. package/dist/{index-k9nnwad5.js → index-nydv6g8r.js} +44 -7
  94. package/dist/{index-5zygecde.js → index-peshmj6h.js} +4 -4
  95. package/dist/{index-knh4y330.js → index-pxwp2hjk.js} +7 -2
  96. package/dist/{index-1qb0z7wa.js → index-qx53vezw.js} +1 -1
  97. package/dist/{index-q7h7csab.js → index-s4j7t92z.js} +9 -9
  98. package/dist/{index-z8e0psj8.js → index-stbr4ce6.js} +3 -3
  99. package/dist/{index-jcbd3znx.js → index-tqf7yg27.js} +1 -1
  100. package/dist/{index-72nhv486.js → index-vkbqdnkj.js} +2 -2
  101. package/dist/{index-eeezr5zz.js → index-z1tjp257.js} +1 -1
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +61 -44
  104. package/dist/{logger-d3wex3dz.js → logger-ewak5q1s.js} +1 -1
  105. package/dist/{message-index-bounded-7ezbgddp.js → message-index-bounded-h0mrd4pr.js} +13 -13
  106. package/dist/{message-time-backfill-brbd63hv.js → message-time-backfill-8x06r9kx.js} +2 -2
  107. package/dist/migration-worker.js +9 -9
  108. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -0
  109. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  110. package/dist/plugin/tool-registry.d.ts.map +1 -1
  111. package/dist/{project-embedding-registry-7qzptcw7.js → project-embedding-registry-rtt0djyb.js} +9 -9
  112. package/dist/raw-ordinal-warmup-worker.js +4 -4
  113. package/dist/{read-session-chunk-6k83m4fj.js → read-session-chunk-ty89v75e.js} +10 -8
  114. package/dist/{read-session-raw-3g9qy1xa.js → read-session-raw-8sjbc9h0.js} +5 -3
  115. package/dist/{recomp-orchestrator-d3fp1cy0.js → recomp-orchestrator-4f1yyd1q.js} +25 -25
  116. package/dist/{safe-notification-target-5ffqq32m.js → safe-notification-target-q0cyrx3x.js} +2 -2
  117. package/dist/{search-epax1ecv.js → search-pz4f4wge.js} +20 -20
  118. package/dist/{send-session-notification-erecz4y4.js → send-session-notification-38cd5dqt.js} +5 -5
  119. package/dist/shared/auto-search-lifecycle.d.ts +14 -0
  120. package/dist/shared/auto-search-lifecycle.d.ts.map +1 -1
  121. package/dist/shared/logger.d.ts.map +1 -1
  122. package/dist/shared/models-dev-temperature.d.ts +18 -0
  123. package/dist/shared/models-dev-temperature.d.ts.map +1 -0
  124. package/dist/shared/project-directory-key.d.ts +16 -0
  125. package/dist/shared/project-directory-key.d.ts.map +1 -1
  126. package/dist/shared/subagent-temperature.d.ts +46 -0
  127. package/dist/shared/subagent-temperature.d.ts.map +1 -0
  128. package/dist/{storage-tags-d3b0v2ss.js → storage-tags-k0pda32s.js} +6 -4
  129. package/dist/tools/ctx-reduce/tools.d.ts.map +1 -1
  130. package/dist/tools/ctx-search/tools.d.ts.map +1 -1
  131. package/dist/tools/ctx-search/types.d.ts +1 -0
  132. package/dist/tools/ctx-search/types.d.ts.map +1 -1
  133. package/dist/{transform-postprocess-phase-spcy2qre.js → transform-postprocess-phase-tck4g20s.js} +25 -25
  134. package/dist/v2/auto-search-worker.js +3 -3
  135. package/dist/v2/{context-sf98kstd.js → context-crbt6p1y.js} +809 -1052
  136. package/dist/v2/{derive-budgets-3vc0y84t.js → derive-budgets-fgej9j46.js} +3 -3
  137. package/dist/v2/embedding-backfill-ph1qfyn3.js +21 -0
  138. package/dist/v2/embedding-worker.js +4 -4
  139. package/dist/v2/hidden-child-native.d.ts.map +1 -1
  140. package/dist/v2/hidden-completion.d.ts +7 -0
  141. package/dist/v2/hidden-completion.d.ts.map +1 -1
  142. package/dist/v2/hooks/context.d.ts.map +1 -1
  143. package/dist/v2/hooks/dream-trigger.d.ts +4 -1
  144. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  145. package/dist/v2/hooks/generate.d.ts +9 -2
  146. package/dist/v2/hooks/generate.d.ts.map +1 -1
  147. package/dist/v2/{logger-mxd0ym09.js → logger-pj02s7sr.js} +1 -1
  148. package/dist/v2/{message-index-bounded-dy3s2k1e.js → message-index-bounded-xwqdywxg.js} +13 -13
  149. package/dist/v2/{message-time-backfill-gtx1pwk1.js → message-time-backfill-cje68egj.js} +2 -2
  150. package/dist/v2/migration-worker.js +9 -9
  151. package/dist/v2/{project-embedding-registry-1tgba5dv.js → project-embedding-registry-d6m7tyxr.js} +9 -9
  152. package/dist/v2/raw-ordinal-warmup-worker.js +4 -4
  153. package/dist/v2/{read-session-chunk-rh4khdkv.js → read-session-chunk-8p5mdryx.js} +10 -8
  154. package/dist/v2/{read-session-raw-bsbmf0vj.js → read-session-raw-j8dvp7f4.js} +5 -3
  155. package/dist/v2/{recomp-orchestrator-az61rfcg.js → recomp-orchestrator-ckfgt6wq.js} +26 -26
  156. package/dist/v2/{safe-notification-target-73ax1p5v.js → safe-notification-target-y3p1hce9.js} +2 -2
  157. package/dist/v2/{search-nzkwrc6n.js → search-ym8rehhz.js} +20 -20
  158. package/dist/v2/{send-session-notification-6km439kn.js → send-session-notification-5m0yapqx.js} +5 -5
  159. package/dist/v2/{server-x2g40a71.js → server-19zjmn02.js} +2 -2
  160. package/dist/v2/{server-sggvvzhb.js → server-1tk82krw.js} +45 -8
  161. package/dist/v2/{server-vqpf3167.js → server-2s6ayq3t.js} +2 -2
  162. package/dist/v2/{server-z2037m6z.js → server-2s9qz6n7.js} +2 -2
  163. package/dist/v2/{server-k228xhjg.js → server-3j4d00kf.js} +1 -1
  164. package/dist/v2/{server-aan4q8mx.js → server-3t0q2cqx.js} +1 -1
  165. package/dist/v2/{server-2fbhp79z.js → server-4ez8mntn.js} +16 -8
  166. package/dist/v2/{server-zxhgvsf9.js → server-676xw7at.js} +1 -1
  167. package/dist/v2/{server-52awr2mw.js → server-6byqfbqf.js} +93 -9
  168. package/dist/v2/{server-qye6ykf7.js → server-7ekna9zs.js} +2 -2
  169. package/dist/v2/{server-g5r0n3b6.js → server-7h861yms.js} +160 -25
  170. package/dist/v2/{server-v06jcv0w.js → server-8k2agx29.js} +1 -1
  171. package/dist/v2/{server-686jg6eb.js → server-c5rrgrcd.js} +44 -7
  172. package/dist/v2/{server-4k748ke6.js → server-hb6xhh9q.js} +2 -2
  173. package/dist/v2/{server-7wwc2nga.js → server-jvxzm1jy.js} +7 -7
  174. package/dist/v2/{server-1r6pmz4f.js → server-kzns2hbz.js} +1 -1
  175. package/dist/v2/{server-xdfwt6kh.js → server-pj4pjv02.js} +2 -2
  176. package/dist/v2/{server-psqc7e9n.js → server-q4ph9bwn.js} +1227 -78
  177. package/dist/v2/{server-8pyt7hev.js → server-sa8jvrfc.js} +9 -9
  178. package/dist/v2/{server-ezhze64f.js → server-ss95ky04.js} +4 -4
  179. package/dist/v2/{server-5m3dt5r1.js → server-t4k4qexw.js} +6 -2
  180. package/dist/v2/{server-e0vdaae2.js → server-v4mewb78.js} +4 -4
  181. package/dist/v2/{server-gjcr4w98.js → server-w32kmdez.js} +4 -4
  182. package/dist/v2/{server-k8x2rbxc.js → server-x4hscabv.js} +119 -365
  183. package/dist/v2/{server-yczc713m.js → server-xwz4dqh9.js} +7 -2
  184. package/dist/v2/{server-xxm59eww.js → server-ycw9qqcy.js} +4 -4
  185. package/dist/v2/{server-8tqanswc.js → server-zp53y8js.js} +331 -4
  186. package/dist/v2/server.js +4 -4
  187. package/dist/v2/{storage-tags-w4tv77sn.js → storage-tags-8vw924zn.js} +6 -4
  188. package/dist/v2/store-reader.d.ts +8 -2
  189. package/dist/v2/store-reader.d.ts.map +1 -1
  190. package/dist/v2/{wrapup-orchestrator-mz7efs7w.js → wrapup-orchestrator-a7efxaax.js} +26 -26
  191. package/dist/wrapup-orchestrator-barbc6h9.js +44 -0
  192. package/package.json +1 -1
  193. package/src/shared/auto-search-lifecycle.ts +43 -0
  194. package/src/shared/logger.test.ts +38 -0
  195. package/src/shared/logger.ts +10 -2
  196. package/src/shared/models-dev-temperature.ts +107 -0
  197. package/src/shared/project-directory-key.test.ts +59 -0
  198. package/src/shared/project-directory-key.ts +20 -0
  199. package/src/shared/subagent-temperature.test.ts +270 -0
  200. package/src/shared/subagent-temperature.ts +110 -0
  201. package/dist/embedding-backfill-9rcm1mfy.js +0 -21
  202. package/dist/v2/embedding-backfill-vn8g1nh1.js +0 -21
  203. package/dist/wrapup-orchestrator-amzta1t4.js +0 -44
@@ -5,32 +5,37 @@ import {
5
5
  removeSystemReminders,
6
6
  hasMeaningfulUserText2,
7
7
  extractTexts2
8
- } from "./server-1r6pmz4f.js";
8
+ } from "./server-kzns2hbz.js";
9
9
  import {
10
10
  withSqliteBackgroundWriter2,
11
11
  withoutSqliteTransformPass2
12
12
  } from "./server-kb9nn0a0.js";
13
13
  import {
14
+ TAG_TOMBSTONE_OWNER_PREFIX,
15
+ tagTombstoneOwnerRange,
16
+ tagTombstoneOwnerKey,
17
+ tagRevisionKey,
18
+ tagIdentityRevisionKey,
14
19
  deleteTagIdentityRevisions
15
- } from "./server-52awr2mw.js";
20
+ } from "./server-6byqfbqf.js";
16
21
  import {
17
22
  cleanUserText2
18
- } from "./server-2fbhp79z.js";
23
+ } from "./server-4ez8mntn.js";
19
24
  import {
20
25
  recordMessageFtsRowid,
21
26
  recordIndexedMessageTime,
22
27
  messageFtsOrdinalRangeIsMapped,
23
28
  deleteUnmappedMessageFtsRows
24
- } from "./server-k228xhjg.js";
29
+ } from "./server-3j4d00kf.js";
25
30
  import {
26
31
  deleteChunkEmbedBackoffForSession
27
- } from "./server-ezhze64f.js";
32
+ } from "./server-ss95ky04.js";
28
33
  import {
29
34
  closeQuietly
30
35
  } from "./server-8ajstryz.js";
31
36
  import {
32
37
  logSlowWriteTransaction
33
- } from "./server-aan4q8mx.js";
38
+ } from "./server-3t0q2cqx.js";
34
39
 
35
40
  // src/features/magic-context/compression-depth-storage.ts
36
41
  var incrementDepthStatements = new WeakMap;
@@ -168,6 +173,17 @@ function deleteSessionScopedRows(db, sessionIds, harness, options = {}) {
168
173
  if (deletableSessionIds.length === 0)
169
174
  return 0;
170
175
  const placeholders = deletableSessionIds.map(() => "?").join(", ");
176
+ const harnessTables = SESSION_SCOPED_TABLES.filter((definition) => definition.harnessScoped);
177
+ if (options.preserveTagRevisionTombstones) {
178
+ const owners = db.prepare(harnessTables.map((definition) => `SELECT session_id, harness FROM ${definition.table} WHERE session_id IN (${placeholders})${definition.extraPredicate ? ` AND ${definition.extraPredicate}` : ""}`).join(" UNION ")).all(...harnessTables.flatMap(() => deletableSessionIds));
179
+ const record = db.prepare("INSERT OR IGNORE INTO schema_migrations_meta (key, value) VALUES (?, ?)");
180
+ for (const owner of owners)
181
+ record.run(tagTombstoneOwnerKey(owner.session_id, owner.harness), owner.harness);
182
+ const fallback = db.prepare(`INSERT INTO schema_migrations_meta (key, value)
183
+ SELECT ?, ? WHERE NOT EXISTS (SELECT 1 FROM schema_migrations_meta WHERE key >= ? AND key < ?)`);
184
+ for (const id of deletableSessionIds)
185
+ fallback.run(tagTombstoneOwnerKey(id, getHarness2()), getHarness2(), ...tagTombstoneOwnerRange(id));
186
+ }
171
187
  for (const sessionId of deletableSessionIds)
172
188
  deleteChunkEmbedBackoffForSession(db, sessionId);
173
189
  for (const definition of SESSION_SCOPED_TABLES) {
@@ -194,6 +210,20 @@ function deleteSessionScopedRows(db, sessionIds, harness, options = {}) {
194
210
  statement.run(...deletableSessionIds);
195
211
  }
196
212
  deleteSessionActivity(db, deletableSessionIds);
213
+ if (!options.preserveTagRevisionTombstones) {
214
+ const retireOwner = db.prepare(harness === undefined ? "DELETE FROM schema_migrations_meta WHERE key >= ? AND key < ?" : "DELETE FROM schema_migrations_meta WHERE key = ?");
215
+ const survivingRows = harnessTables.map((definition) => `EXISTS (SELECT 1 FROM ${definition.table} WHERE session_id = ?${definition.extraPredicate ? ` AND ${definition.extraPredicate}` : ""})`).join(" OR ");
216
+ const retire = db.prepare(`DELETE FROM schema_migrations_meta WHERE key IN (?, ?)
217
+ AND NOT (${survivingRows})
218
+ AND NOT EXISTS (SELECT 1 FROM schema_migrations_meta AS owners WHERE owners.key >= ? AND owners.key < ?)`);
219
+ for (const id of deletableSessionIds) {
220
+ if (harness === undefined)
221
+ retireOwner.run(...tagTombstoneOwnerRange(id));
222
+ else
223
+ retireOwner.run(tagTombstoneOwnerKey(id, harness));
224
+ retire.run(tagIdentityRevisionKey(id), tagRevisionKey(id), ...harnessTables.map(() => id), ...tagTombstoneOwnerRange(id));
225
+ }
226
+ }
197
227
  return deletableSessionIds.length;
198
228
  }
199
229
 
@@ -650,12 +680,19 @@ function persistMessageHistoryOrphanSweepState(db, cursor, lastSweptAt, harness)
650
680
  last_swept_at = excluded.last_swept_at`).run(harness, cursor, lastSweptAt);
651
681
  }
652
682
  function getOpenCodeSessionScopedCandidateSourceSql(harness) {
653
- return SESSION_SCOPED_TABLES.filter((definition) => definition.harnessScoped === true).map((definition) => {
683
+ const sources = SESSION_SCOPED_TABLES.filter((definition) => definition.harnessScoped === true).map((definition) => {
654
684
  const predicates = ["session_id IS NOT NULL", `harness = '${harness}'`];
655
685
  if (definition.extraPredicate)
656
686
  predicates.push(definition.extraPredicate);
657
687
  return `SELECT session_id FROM ${definition.table} WHERE ${predicates.join(" AND ")}`;
658
- }).join(`
688
+ });
689
+ const jsonId = `SUBSTR(key, ${TAG_TOMBSTONE_OWNER_PREFIX.length + 1}, LENGTH(key) - ${TAG_TOMBSTONE_OWNER_PREFIX.length + harness.length + 1})`;
690
+ sources.push(`SELECT CASE WHEN json_valid(${jsonId}) THEN
691
+ CASE WHEN json_type(${jsonId}) = 'text' THEN json_extract(${jsonId}, '$') END END AS session_id
692
+ FROM schema_migrations_meta WHERE value = '${harness}'
693
+ AND key >= '${TAG_TOMBSTONE_OWNER_PREFIX}' AND key < '${TAG_TOMBSTONE_OWNER_PREFIX.slice(0, -1)};'
694
+ AND SUBSTR(key, -${harness.length + 1}) = ':${harness}'`);
695
+ return sources.join(`
659
696
  UNION
660
697
  `);
661
698
  }
@@ -8,10 +8,10 @@ import {
8
8
  getMagicContextStorageDir,
9
9
  importPluginModule,
10
10
  log2
11
- } from "./server-5m3dt5r1.js";
11
+ } from "./server-t4k4qexw.js";
12
12
  import {
13
13
  getSynapseLaneIdentity
14
- } from "./server-4k748ke6.js";
14
+ } from "./server-hb6xhh9q.js";
15
15
  import {
16
16
  computeNormalizedHash
17
17
  } from "./server-2bvekkfy.js";
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  log2
3
- } from "./server-5m3dt5r1.js";
3
+ } from "./server-t4k4qexw.js";
4
4
  import {
5
5
  getSdkWindowGeometry,
6
6
  getSdkContextLimit,
7
7
  getSdkInputLimit
8
- } from "./server-v06jcv0w.js";
8
+ } from "./server-8k2agx29.js";
9
9
  import {
10
10
  localBudget,
11
11
  calibrationForModelKey
@@ -4,7 +4,7 @@ import {
4
4
  } from "./server-kb9nn0a0.js";
5
5
  import {
6
6
  logSlowWriteTransaction
7
- } from "./server-aan4q8mx.js";
7
+ } from "./server-3t0q2cqx.js";
8
8
 
9
9
  // src/features/magic-context/message-fts-rowid-map.ts
10
10
  import { createHash } from "node:crypto";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  log2
3
- } from "./server-5m3dt5r1.js";
3
+ } from "./server-t4k4qexw.js";
4
4
 
5
5
  // src/shared/write-transaction-timing.ts
6
6
  var SLOW_WRITE_TRANSACTION_THRESHOLD_MS = 1000;
@@ -12,7 +12,7 @@ import {
12
12
  providerVisiblePart,
13
13
  getCandidateToolOwners2,
14
14
  pickNearestPriorOwner2
15
- } from "./server-686jg6eb.js";
15
+ } from "./server-c5rrgrcd.js";
16
16
  import {
17
17
  OMO_INTERNAL_INITIATOR_MARKER,
18
18
  isSystemDirective,
@@ -29,13 +29,13 @@ import {
29
29
  formatBlock,
30
30
  compactTextForSummary,
31
31
  mergeCommitHashes
32
- } from "./server-1r6pmz4f.js";
32
+ } from "./server-kzns2hbz.js";
33
33
  import {
34
34
  sessionLog2
35
- } from "./server-5m3dt5r1.js";
35
+ } from "./server-t4k4qexw.js";
36
36
  import {
37
37
  stableStringify
38
- } from "./server-52awr2mw.js";
38
+ } from "./server-6byqfbqf.js";
39
39
  import {
40
40
  renderToolTemplate
41
41
  } from "./server-mfkzp7qj.js";
@@ -53,19 +53,20 @@ import {
53
53
  readRawSessionMessageByIdFromDb2,
54
54
  hasRawSessionMessageByIdFromDb2,
55
55
  readRawSeedTailFromDb2,
56
+ readRawSessionBoundaryEndpointsFromDb2,
56
57
  prewarmRawSessionOrdinalsForDb
57
- } from "./server-g5r0n3b6.js";
58
+ } from "./server-7h861yms.js";
58
59
  import {
59
60
  openCodeDbExists,
60
61
  withReadOnlySessionDb,
61
62
  getRawSessionMessageCountFromDb,
62
63
  getMessageTimesFromOpenCodeDb
63
- } from "./server-xdfwt6kh.js";
64
+ } from "./server-pj4pjv02.js";
64
65
  import {
65
66
  getToolDefinitionMeasurementSignature,
66
67
  getLargestMeasuredToolDefinitionTokens,
67
68
  getMeasuredToolDefinitionTokens
68
- } from "./server-qye6ykf7.js";
69
+ } from "./server-7ekna9zs.js";
69
70
  import {
70
71
  canonicalModelIdentity
71
72
  } from "./server-avwt563y.js";
@@ -2680,6 +2681,13 @@ function readRawSessionMessagePartsById2(sessionId, messageId, onQuery) {
2680
2681
  return null;
2681
2682
  return withReadOnlySessionDb((db) => readRawSessionMessagePartsByIdFromDb2(db, sessionId, messageId, onQuery));
2682
2683
  }
2684
+ function readRawSessionBoundaryEndpoints2(sessionId, ids, blockIds) {
2685
+ if (sessionProviders.get(sessionId)?.provider)
2686
+ return null;
2687
+ if (!openCodeDbExists())
2688
+ return new Map(ids.map((id) => [id, null]));
2689
+ return withReadOnlySessionDb((db) => readRawSessionBoundaryEndpointsFromDb2(db, sessionId, ids, blockIds));
2690
+ }
2683
2691
  function hasRawSessionMessageById2(sessionId, messageId) {
2684
2692
  const provider = sessionProviders.get(sessionId)?.provider;
2685
2693
  if (provider?.hasMessageById)
@@ -3202,4 +3210,4 @@ function readRawSessionSeedTail2(sessionId, boundaryId, onQuery) {
3202
3210
  });
3203
3211
  }
3204
3212
 
3205
- export { detectLatestTurnThinkingMismatch, isPrefixBoundThinkingModel, detectOverflow, expandToolPart, markHostUnservedRow, retreatPastHostUnservedRows, snapTerminalCompartmentToServedRow, isHostRenderedSystemMessage, completedToolArcCrossesBoundary, estimateTrueRawMessageTokens, buildToolArcs, fenceBoundaryForCompletedToolArcs, fenceBoundaryForToolArcs, buildTrueRawTokenIndex, computeRawRangeFingerprint, stripSystemInjection, isTextPart, isToolPartWithOutput, isFilePart, buildFileSourceContent, toolPartHasUserAnswer, DreamTokenBudgetExceeded, TOKEN_BUDGET_FINALIZE_MESSAGE, registerBudgetFinalizeChild, releaseBudgetFinalizeChild, createDreamTokenBudget, recordToolParameters, createDroppedInputGuard, assertExecutableToolInput, isEditTool, describeFinalWireTail, estimateMessageTokens, wireContentBytes, createFinalWireUsageTracker, estimateFinalWireInputTokens, estimateAppendedWireTokens, modelAcceptsEmptyContent, isAnthropicFamilyRoute, neutralizeDroppedReasoningPart, restoreNeutralizedReasoningPart, isNeutralizedReasoningPart, neutralizedReasoningSource, variantChangeBustsProviderCache, makeSentinel, makeWholeMessageSentinel, neutralizeWholeMessage, isSentinel, replaySentinelByMessageIds, SKELETON_REAL_INPUT_MAX_BYTES, partHasCompletedResult, extractToolCallObservation, ToolMutationBatch, createToolDropTarget, resolveHostServedBoundaryId2, hasRawMessageProvider2, setRawMessageProvider2, setBoundedRawMessageProvider2, withRawMessageProvider2, cleanUserText2, withRawSessionMessageCache2, readRawSessionMessages2, readRawSessionMessagePage2, getRawSessionMessageOrdinalCount2, RAW_MESSAGE_VISIT_PAGE_SIZE2, visitRawSessionMessages2, readRawSessionMessageRange2, prepareRawSessionOrdinals2, primeTailRawMessageCache2, getCachedAbsoluteMessageCount2, primeInMemoryTailRawMessageCache2, readRawSessionMessageOrdinalPage2, getRawSessionStoredMessageCount2, readRawSessionMessageIdOrdinalsForRange2, readRawSessionMessageIdOrdinals2, readRawSessionMessagePartsById2, hasRawSessionMessageById2, readRawSessionMessageOrdinalById2, compareRawSessionMessageOrder2, readRawSessionMessageById2, getRawSessionMessageCount2, RAW_SESSION_TAG_KEY_PAGE_SIZE2, getRawSessionTagKeysThrough2, getLegacyProtectedTailStartOrdinal2, getProtectedTailStartOrdinal2, readSessionChunk2, getRawSessionMessageIdsThrough2, readRawSessionSeedTail2 };
3213
+ export { detectLatestTurnThinkingMismatch, isPrefixBoundThinkingModel, detectOverflow, expandToolPart, markHostUnservedRow, retreatPastHostUnservedRows, snapTerminalCompartmentToServedRow, isHostRenderedSystemMessage, completedToolArcCrossesBoundary, estimateTrueRawMessageTokens, buildToolArcs, fenceBoundaryForCompletedToolArcs, fenceBoundaryForToolArcs, buildTrueRawTokenIndex, computeRawRangeFingerprint, stripSystemInjection, isTextPart, isToolPartWithOutput, isFilePart, buildFileSourceContent, toolPartHasUserAnswer, DreamTokenBudgetExceeded, TOKEN_BUDGET_FINALIZE_MESSAGE, registerBudgetFinalizeChild, releaseBudgetFinalizeChild, createDreamTokenBudget, recordToolParameters, createDroppedInputGuard, assertExecutableToolInput, isEditTool, describeFinalWireTail, estimateMessageTokens, wireContentBytes, createFinalWireUsageTracker, estimateFinalWireInputTokens, estimateAppendedWireTokens, modelAcceptsEmptyContent, isAnthropicFamilyRoute, neutralizeDroppedReasoningPart, restoreNeutralizedReasoningPart, isNeutralizedReasoningPart, neutralizedReasoningSource, variantChangeBustsProviderCache, makeSentinel, makeWholeMessageSentinel, neutralizeWholeMessage, isSentinel, replaySentinelByMessageIds, SKELETON_REAL_INPUT_MAX_BYTES, partHasCompletedResult, extractToolCallObservation, ToolMutationBatch, createToolDropTarget, resolveHostServedBoundaryId2, hasRawMessageProvider2, setRawMessageProvider2, setBoundedRawMessageProvider2, withRawMessageProvider2, cleanUserText2, withRawSessionMessageCache2, readRawSessionMessages2, readRawSessionMessagePage2, getRawSessionMessageOrdinalCount2, RAW_MESSAGE_VISIT_PAGE_SIZE2, visitRawSessionMessages2, readRawSessionMessageRange2, prepareRawSessionOrdinals2, primeTailRawMessageCache2, getCachedAbsoluteMessageCount2, primeInMemoryTailRawMessageCache2, readRawSessionMessageOrdinalPage2, getRawSessionStoredMessageCount2, readRawSessionMessageIdOrdinalsForRange2, readRawSessionMessageIdOrdinals2, readRawSessionMessagePartsById2, readRawSessionBoundaryEndpoints2, hasRawSessionMessageById2, readRawSessionMessageOrdinalById2, compareRawSessionMessageOrder2, readRawSessionMessageById2, getRawSessionMessageCount2, RAW_SESSION_TAG_KEY_PAGE_SIZE2, getRawSessionTagKeysThrough2, getLegacyProtectedTailStartOrdinal2, getProtectedTailStartOrdinal2, readSessionChunk2, getRawSessionMessageIdsThrough2, readRawSessionSeedTail2 };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  log2
3
- } from "./server-5m3dt5r1.js";
3
+ } from "./server-t4k4qexw.js";
4
4
 
5
5
  // src/shared/safe-notification-target.ts
6
6
  var DEFAULT_TITLE_RE = /^(New session - |Child session - )\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionLog2
3
- } from "./server-5m3dt5r1.js";
3
+ } from "./server-t4k4qexw.js";
4
4
  import {
5
5
  isKnownAutocommit
6
6
  } from "./server-8ajstryz.js";
@@ -353,12 +353,42 @@ function tagOrderConstraintIndex(db) {
353
353
 
354
354
  // src/features/magic-context/storage-tag-identity-revision.ts
355
355
  var TAG_IDENTITY_REVISION_PREFIX = "tag_identity_revision:";
356
+ var TAG_REVISION_PREFIX = "tag_revision:";
357
+ var TAG_TOMBSTONE_OWNER_PREFIX = "tag_revision_owner:";
358
+ var TAG_REVISION_INCARNATION_KEY = "tag_revision_incarnation";
359
+ var tagRevisionIncarnationSql = (value) => `CASE WHEN INSTR(${value}, ':') > 0 THEN SUBSTR(${value}, 1, INSTR(${value}, ':') - 1) ELSE '0' END`;
360
+ var tagRevisionCountSql = (value) => `CAST(CASE WHEN INSTR(${value}, ':') > 0 THEN SUBSTR(${value}, INSTR(${value}, ':') + 1) ELSE ${value} END AS INTEGER)`;
361
+ var ADVANCE = (delta = "1") => `CASE
362
+ WHEN ${tagRevisionCountSql("value")} <= 9223372036854775807 - ${delta}
363
+ THEN (${tagRevisionIncarnationSql("value")}) || ':' || CAST(${tagRevisionCountSql("value")} + ${delta} AS TEXT)
364
+ ELSE NULL END`;
365
+ function tagTombstoneOwnerRange(sessionId) {
366
+ const stem = `${TAG_TOMBSTONE_OWNER_PREFIX}${JSON.stringify(sessionId)}`;
367
+ return [`${stem}:`, `${stem};`];
368
+ }
369
+ function tagTombstoneOwnerKey(sessionId, harness) {
370
+ return `${tagTombstoneOwnerRange(sessionId)[0]}${harness}`;
371
+ }
372
+ function tagRevisionKey(sessionId) {
373
+ return `${TAG_REVISION_PREFIX}${sessionId}`;
374
+ }
356
375
  function tagIdentityRevisionKey(sessionId) {
357
376
  return `${TAG_IDENTITY_REVISION_PREFIX}${sessionId}`;
358
377
  }
359
- var BUMP = (session) => `INSERT INTO schema_migrations_meta (key, value)
360
- VALUES ('${TAG_IDENTITY_REVISION_PREFIX}' || ${session}, '1')
361
- ON CONFLICT(key) DO UPDATE SET value = CAST(CAST(value AS INTEGER) + 1 AS TEXT)`;
378
+ var BUMP = (session, prefix = TAG_IDENTITY_REVISION_PREFIX) => `INSERT INTO schema_migrations_meta (key, value)
379
+ VALUES ('${prefix}' || ${session}, '1')
380
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE()}`;
381
+ var TAG_INSERT_CONFLICT_ROWS = `SELECT id, session_id, tag_number FROM tags WHERE id = NEW.id
382
+ UNION SELECT id, session_id, tag_number FROM tags WHERE session_id = NEW.session_id AND tag_number = NEW.tag_number
383
+ UNION SELECT id, session_id, tag_number FROM tags
384
+ WHERE NEW.type = 'tool' AND NEW.tool_owner_message_id IS NOT NULL
385
+ AND type = 'tool' AND tool_owner_message_id IS NOT NULL
386
+ AND session_id = NEW.session_id AND message_id = NEW.message_id
387
+ AND tool_owner_message_id = NEW.tool_owner_message_id`;
388
+ var BUMP_INSERT_CONFLICTS = (prefix) => `INSERT INTO schema_migrations_meta (key, value)
389
+ SELECT '${prefix}' || session_id, CAST(COUNT(*) AS TEXT)
390
+ FROM (${TAG_INSERT_CONFLICT_ROWS}) GROUP BY session_id
391
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE("CAST(excluded.value AS INTEGER)")}`;
362
392
  var TRIGGER_SQL = `CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_identity_revision_au
363
393
  AFTER UPDATE OF id, session_id, message_id, tag_number, type, tool_owner_message_id, reasoning_token_count
364
394
  ON main.tags
@@ -367,15 +397,69 @@ var TRIGGER_SQL = `CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_identity_revision_au
367
397
  INSERT INTO schema_migrations_meta (key, value)
368
398
  SELECT '${TAG_IDENTITY_REVISION_PREFIX}' || NEW.session_id, '1'
369
399
  WHERE NEW.session_id IS NOT OLD.session_id
370
- ON CONFLICT(key) DO UPDATE SET value = CAST(CAST(value AS INTEGER) + 1 AS TEXT);
400
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE()};
371
401
  END`;
372
402
  function installTagIdentityRevisionTrigger(db) {
403
+ db.exec(`DROP TRIGGER IF EXISTS temp.mc_tag_identity_revision_au;
404
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_bi;
405
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_ai;
406
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_au;
407
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_ad;
408
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_seed_ai;`);
409
+ db.exec(`CREATE TEMP TRIGGER mc_tag_revision_seed_ai AFTER INSERT ON main.schema_migrations_meta
410
+ WHEN INSTR(NEW.value, ':') = 0 AND (
411
+ SUBSTR(NEW.key, 1, ${TAG_REVISION_PREFIX.length}) = '${TAG_REVISION_PREFIX}'
412
+ OR SUBSTR(NEW.key, 1, ${TAG_IDENTITY_REVISION_PREFIX.length}) = '${TAG_IDENTITY_REVISION_PREFIX}')
413
+ BEGIN
414
+ INSERT INTO schema_migrations_meta (key, value) VALUES ('${TAG_REVISION_INCARNATION_KEY}', '1')
415
+ ON CONFLICT(key) DO UPDATE SET value = CAST(CASE
416
+ WHEN CAST(value AS INTEGER) < 9223372036854775807 THEN CAST(value AS INTEGER) + 1
417
+ ELSE NULL END AS TEXT);
418
+ UPDATE schema_migrations_meta SET value =
419
+ (SELECT value FROM schema_migrations_meta WHERE key = '${TAG_REVISION_INCARNATION_KEY}')
420
+ || ':' || CAST(NEW.value AS TEXT) WHERE key = NEW.key;
421
+ INSERT INTO schema_migrations_meta (key, value)
422
+ SELECT '${TAG_REVISION_INCARNATION_KEY}', '1'
423
+ WHERE SUBSTR(NEW.key, 1, ${TAG_REVISION_PREFIX.length}) = '${TAG_REVISION_PREFIX}'
424
+ AND NOT EXISTS (SELECT 1 FROM schema_migrations_meta
425
+ WHERE key = '${TAG_IDENTITY_REVISION_PREFIX}' || SUBSTR(NEW.key, ${TAG_REVISION_PREFIX.length + 1}))
426
+ ON CONFLICT(key) DO UPDATE SET value = CAST(CASE
427
+ WHEN CAST(value AS INTEGER) < 9223372036854775807 THEN CAST(value AS INTEGER) + 1
428
+ ELSE NULL END AS TEXT);
429
+ INSERT INTO schema_migrations_meta (key, value)
430
+ SELECT '${TAG_IDENTITY_REVISION_PREFIX}' || SUBSTR(NEW.key, ${TAG_REVISION_PREFIX.length + 1}),
431
+ (SELECT value FROM schema_migrations_meta WHERE key = '${TAG_REVISION_INCARNATION_KEY}') || ':0'
432
+ WHERE SUBSTR(NEW.key, 1, ${TAG_REVISION_PREFIX.length}) = '${TAG_REVISION_PREFIX}'
433
+ AND NOT EXISTS (SELECT 1 FROM schema_migrations_meta
434
+ WHERE key = '${TAG_IDENTITY_REVISION_PREFIX}' || SUBSTR(NEW.key, ${TAG_REVISION_PREFIX.length + 1}));
435
+ END;`);
373
436
  db.exec(TRIGGER_SQL);
437
+ db.exec(`CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_bi BEFORE INSERT ON main.tags BEGIN
438
+ ${BUMP_INSERT_CONFLICTS(TAG_REVISION_PREFIX)};
439
+ ${BUMP_INSERT_CONFLICTS(TAG_IDENTITY_REVISION_PREFIX)};
440
+ UPDATE session_meta SET tags_version = tags_version + 1
441
+ WHERE session_id IN (SELECT session_id FROM (${TAG_INSERT_CONFLICT_ROWS}));
442
+ END;`);
443
+ db.exec(`CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_ai AFTER INSERT ON main.tags BEGIN
444
+ ${BUMP("NEW.session_id", TAG_REVISION_PREFIX)};
445
+ END;
446
+ CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_au AFTER UPDATE ON main.tags BEGIN
447
+ ${BUMP("OLD.session_id", TAG_REVISION_PREFIX)};
448
+ INSERT INTO schema_migrations_meta (key, value)
449
+ SELECT '${TAG_REVISION_PREFIX}' || NEW.session_id, '1'
450
+ WHERE NEW.session_id IS NOT OLD.session_id
451
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE()};
452
+ END;
453
+ CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_ad AFTER DELETE ON main.tags BEGIN
454
+ ${BUMP("OLD.session_id", TAG_REVISION_PREFIX)};
455
+ END;`);
374
456
  }
375
457
  function deleteTagIdentityRevisions(db, sessionIds) {
376
- const statement = db.prepare("DELETE FROM schema_migrations_meta WHERE key = ? AND NOT EXISTS (SELECT 1 FROM tags WHERE session_id = ?)");
377
- for (const sessionId of sessionIds)
378
- statement.run(tagIdentityRevisionKey(sessionId), sessionId);
458
+ const statement = db.prepare(`INSERT INTO schema_migrations_meta (key, value) VALUES (?, '1')
459
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE()}`);
460
+ for (const sessionId of sessionIds) {
461
+ statement.run(tagIdentityRevisionKey(sessionId));
462
+ }
379
463
  }
380
464
 
381
465
  // src/shared/stable-json.ts
@@ -426,4 +510,4 @@ function writeStable(value, seen, pieces) {
426
510
  pieces.push("}");
427
511
  }
428
512
 
429
- export { getTableColumnNames, ensureColumn, healAllNullColumns, stableStringify, getTemporalDecisions, observeTemporalDecisions, freezeTemporalDecisions, installV95PerfSchema, tagOrderConstraintIndex, tagIdentityRevisionKey, installTagIdentityRevisionTrigger, deleteTagIdentityRevisions };
513
+ export { getTableColumnNames, ensureColumn, healAllNullColumns, stableStringify, getTemporalDecisions, observeTemporalDecisions, freezeTemporalDecisions, installV95PerfSchema, tagOrderConstraintIndex, TAG_TOMBSTONE_OWNER_PREFIX, tagTombstoneOwnerRange, tagTombstoneOwnerKey, tagRevisionKey, tagIdentityRevisionKey, installTagIdentityRevisionTrigger, deleteTagIdentityRevisions };
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  estimateTokens
3
- } from "./server-1r6pmz4f.js";
3
+ } from "./server-kzns2hbz.js";
4
4
  import {
5
5
  stableStringify
6
- } from "./server-52awr2mw.js";
6
+ } from "./server-6byqfbqf.js";
7
7
 
8
8
  // src/features/magic-context/tool-definition-tokens.ts
9
9
  import { createHash } from "node:crypto";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  log2
3
- } from "./server-5m3dt5r1.js";
3
+ } from "./server-t4k4qexw.js";
4
4
  import {
5
5
  getSqliteDatabasePath2,
6
6
  releaseIndexOwner2
@@ -171,30 +171,46 @@ function readRawMessagePageRows(db, sessionId, afterOrdinal, limit, finalWaterma
171
171
  const pageSize = Math.min(Math.max(1, Math.floor(limit)), remaining);
172
172
  if (pageSize === 0)
173
173
  return [];
174
- const parameters = [sessionId];
175
- if (after)
176
- parameters.push(after.timeCreated, after.timeCreated, after.timeCreated, after.id);
177
- parameters.push(pageSize);
178
- if (!after)
179
- parameters.push(Math.max(0, Math.floor(afterOrdinal)));
180
- return db.prepare(`SELECT id, data, time_created, time_updated
181
- FROM message
182
- WHERE session_id = ?
183
- ${after ? "AND time_created >= ? AND (time_created > ? OR (time_created = ? AND id > ?))" : ""}
184
- AND NOT (
185
- CASE WHEN json_valid(data) = 1
186
- THEN COALESCE(json_extract(data, '$.summary'), 0)
187
- ELSE 0 END = 1
188
- AND CASE WHEN json_valid(data) = 1
189
- THEN COALESCE(json_extract(data, '$.finish'), '')
190
- ELSE '' END = 'stop'
191
- )
192
- ORDER BY time_created ASC, id ASC
193
- LIMIT ? ${after ? "" : "OFFSET ?"}`).all(...parameters).filter(isRawMessageRow).map((row, index) => ({
194
- ...row,
195
- ordinal: Math.floor(afterOrdinal) + index + 1
196
- }));
174
+ return withReadSnapshot(db, () => {
175
+ const ordinal = Math.max(0, Math.floor(afterOrdinal));
176
+ const points = currentOrdinalCheckpoints(db, sessionId)?.scan.checkpoints ?? [];
177
+ let low = 0;
178
+ let high = points.length;
179
+ while (low < high) {
180
+ const middle = Math.floor((low + high) / 2);
181
+ if (points[middle].ordinal <= ordinal)
182
+ low = middle + 1;
183
+ else
184
+ high = middle;
185
+ }
186
+ const floor = points[low - 1];
187
+ const useFloor = floor && (!after || compareOrdinalKeys(floor, after) > 0);
188
+ const anchor = useFloor ? floor : after;
189
+ const skip = anchor === after && after ? 0 : ordinal - (floor?.ordinal ?? 0);
190
+ if (skip > ORDINAL_LOOKUP_LIMIT) {
191
+ prewarmRawSessionOrdinalsForDb(db, sessionId);
192
+ throw new RawOrdinalsNotReady;
193
+ }
194
+ const rawLimit = skip + pageSize + ORDINAL_LOOKUP_LIMIT;
195
+ const rows = db.prepare(`SELECT id, data, time_created, time_updated, ${EXCLUDED_ROW_SQL} AS excluded
196
+ FROM message WHERE id IN (
197
+ SELECT id FROM message WHERE session_id = ?
198
+ ${anchor ? "AND (time_created, id) > (?, ?)" : ""}
199
+ ORDER BY time_created, id LIMIT ?)
200
+ ORDER BY time_created, id`).all(sessionId, ...anchor ? [anchor.timeCreated, anchor.id] : [], rawLimit);
201
+ rawMessagePageRowsVisited += rows.length;
202
+ const eligible = rows.filter((row) => row.excluded !== 1);
203
+ if (eligible.length <= skip && rows.length === rawLimit) {
204
+ prewarmRawSessionOrdinalsForDb(db, sessionId);
205
+ throw new RawOrdinalsNotReady;
206
+ }
207
+ return eligible.slice(skip, skip + pageSize).filter(isRawMessageRow).map((row, index) => ({
208
+ ...row,
209
+ ordinal: ordinal + index + 1
210
+ }));
211
+ });
197
212
  }
213
+ var rawMessagePageRowsVisited = 0;
198
214
  function assembleRawMessagePage(messageRows, partRows) {
199
215
  const partsByMessageId = new Map;
200
216
  for (const part of partRows) {
@@ -994,6 +1010,125 @@ function readRawSeedTailFromDb2(db, sessionId, boundaryId) {
994
1010
  throw new Error("state_sync materialized boundary is missing from raw storage");
995
1011
  return messages;
996
1012
  }
1013
+ var BOUNDARY_ORDINAL_SQL = `
1014
+ SELECT id, ordinal FROM (
1015
+ SELECT id, ROW_NUMBER() OVER (ORDER BY time_created, id) AS ordinal
1016
+ FROM message
1017
+ WHERE session_id = ?
1018
+ AND typeof(id) = 'text' AND typeof(data) = 'text'
1019
+ AND CASE WHEN json_valid(data) THEN NOT (
1020
+ COALESCE(json_type(data, '$.summary'), '') = 'true'
1021
+ AND COALESCE(json_extract(data, '$.finish'), '') = 'stop'
1022
+ ) ELSE 1 END
1023
+ )
1024
+ WHERE id IN (SELECT value FROM json_each(?))`;
1025
+ var BOUNDARY_MESSAGE_SQL = `
1026
+ SELECT id, data, time_created FROM message
1027
+ WHERE +session_id = ? AND id IN (SELECT value FROM json_each(?))`;
1028
+ var BOUNDARY_BLOCK_COUNT_SQL = `
1029
+ SELECT message_id AS id, SUM(
1030
+ CASE
1031
+ WHEN NOT json_valid(data) OR json_type(data) <> 'object' THEN 0
1032
+ ELSE CASE (CASE WHEN json_type(data, '$.type') = 'text'
1033
+ THEN json_extract(data, '$.type') ELSE 'unknown' END)
1034
+ WHEN 'text' THEN CASE WHEN json_type(data, '$.ignored') = 'true' THEN 0 ELSE 1 END
1035
+ WHEN 'reasoning' THEN 1
1036
+ WHEN 'thinking' THEN 1
1037
+ WHEN 'redacted_thinking' THEN 1
1038
+ WHEN 'tool' THEN 1 + CASE
1039
+ WHEN json_type(data, '$.state') = 'object'
1040
+ AND json_type(data, '$.state.status') = 'text'
1041
+ AND json_extract(data, '$.state.status') IN ('completed', 'error')
1042
+ THEN 1 ELSE 0 END
1043
+ WHEN 'compaction' THEN 0
1044
+ WHEN 'step-finish' THEN 0
1045
+ WHEN 'snapshot' THEN 0
1046
+ WHEN 'patch' THEN 0
1047
+ WHEN 'agent' THEN 0
1048
+ WHEN 'retry' THEN 0
1049
+ ELSE 1
1050
+ END
1051
+ END) AS blocks
1052
+ FROM part
1053
+ WHERE +session_id = ?
1054
+ AND message_id IN (SELECT value FROM json_each(?))
1055
+ AND typeof(message_id) = 'text' AND typeof(data) = 'text'
1056
+ GROUP BY message_id`;
1057
+ var boundaryEndpointCaches = new WeakMap;
1058
+ var BOUNDARY_ENDPOINT_CACHE_SESSIONS = 16;
1059
+ var boundaryEndpointRowsRead = 0;
1060
+ function readBoundaryEndpointRows(db, sessionId, ids, blockIds, into) {
1061
+ if (ids.length > 0) {
1062
+ boundaryEndpointRowsRead += ids.length;
1063
+ const wanted = JSON.stringify(ids);
1064
+ const ordinals = new Map;
1065
+ for (const row of db.prepare(BOUNDARY_ORDINAL_SQL).all(sessionId, wanted)) {
1066
+ ordinals.set(row.id, row.ordinal);
1067
+ }
1068
+ const rows = db.prepare(BOUNDARY_MESSAGE_SQL).all(sessionId, wanted);
1069
+ for (const id of ids)
1070
+ into.set(id, null);
1071
+ for (const row of rows) {
1072
+ if (!isRawMessageRow(row) || typeof row.time_created !== "number")
1073
+ continue;
1074
+ const info = parseJsonRecord(row.data);
1075
+ if (!info || isRawCompactionSummaryInfo2(info))
1076
+ continue;
1077
+ into.set(row.id, {
1078
+ ordinal: ordinals.get(row.id) ?? null,
1079
+ createdAt: row.time_created
1080
+ });
1081
+ }
1082
+ }
1083
+ const servable = blockIds.filter((id) => {
1084
+ const endpoint = into.get(id);
1085
+ return endpoint && endpoint.lastBlockIndex === undefined;
1086
+ });
1087
+ if (servable.length === 0)
1088
+ return;
1089
+ const counts = new Map;
1090
+ for (const row of db.prepare(BOUNDARY_BLOCK_COUNT_SQL).all(sessionId, JSON.stringify(servable))) {
1091
+ counts.set(row.id, row.blocks);
1092
+ }
1093
+ for (const id of servable) {
1094
+ const endpoint = into.get(id);
1095
+ if (!endpoint)
1096
+ continue;
1097
+ const blocks = counts.get(id) ?? 0;
1098
+ into.set(id, { ...endpoint, lastBlockIndex: blocks > 0 ? blocks - 1 : 0 });
1099
+ }
1100
+ }
1101
+ function readRawSessionBoundaryEndpointsFromDb2(db, sessionId, ids, blockIds = []) {
1102
+ const wanted = [...new Set(ids)];
1103
+ const wantedBlocks = [...new Set(blockIds)];
1104
+ let sessions = boundaryEndpointCaches.get(db);
1105
+ if (!sessions) {
1106
+ sessions = new Map;
1107
+ boundaryEndpointCaches.set(db, sessions);
1108
+ }
1109
+ for (let attempt = 1;; attempt += 1) {
1110
+ const before = readStoreStamp(db);
1111
+ const cached = sessions.get(sessionId);
1112
+ const reuse = attempt === 1 && cached && sameStoreStamp(cached.stamp, before);
1113
+ const endpoints = new Map(reuse ? cached.endpoints : []);
1114
+ const missing = wanted.filter((id) => !endpoints.has(id));
1115
+ withReadSnapshot(db, () => readBoundaryEndpointRows(db, sessionId, missing, wantedBlocks, endpoints));
1116
+ const unchanged = before !== null && sameStoreStamp(before, readStoreStamp(db));
1117
+ if (unchanged) {
1118
+ sessions.delete(sessionId);
1119
+ sessions.set(sessionId, { stamp: before, endpoints });
1120
+ while (sessions.size > BOUNDARY_ENDPOINT_CACHE_SESSIONS) {
1121
+ const oldest = sessions.keys().next().value;
1122
+ if (oldest === undefined)
1123
+ break;
1124
+ sessions.delete(oldest);
1125
+ }
1126
+ } else if (reuse) {
1127
+ continue;
1128
+ }
1129
+ return new Map(wanted.map((id) => [id, endpoints.get(id) ?? null]));
1130
+ }
1131
+ }
997
1132
 
998
1133
  // src/hooks/magic-context/raw-ordinal-warmup.ts
999
1134
  var ACCEPT_TIMEOUT_MS = 2000;
@@ -1134,4 +1269,4 @@ function recordFailure(key, sessionId, failure, detail) {
1134
1269
  log2(`[magic-context] WARN canonical ordinal warm-up failed for ${sessionId} (${failure}: ${detail}); counts remain bounded and callers must defer or retry`);
1135
1270
  }
1136
1271
 
1137
- export { isStrictGapHealingMessage2, isRawCompactionSummaryInfo2, readRawSessionMessagesFromDb2, readRawSessionMessagePageFromDb2, readRawSessionMessageSummaryPageFromDb2, countRawSessionMessageOrdinalsFromDb2, readRawSessionMessageIdOrdinalsForRangeFromDb2, readRawSessionMessageOrdinalPageFromDb2, countStoredRawSessionMessagesFromDb2, readRawSessionTailFromDb2, extractInMemoryMessageViews2, buildInMemoryTailRawMessages2, readRawSessionMessagePartsByIdFromDb2, forgetRawSessionOrdinalWatermark2, forgetRawSessionSummaryRows2, noteRawSessionSummaryRowWritten2, rawOrdinalSummarySeed2, scanRawSessionSummaryRows2, getRawSessionSummaryEpoch2, installRawSessionSummaryScan2, isRawSessionSummaryWarm2, readRawSessionMessageOrdinalByIdFromDb2, readRawSessionMessageByIdFromDb2, hasRawSessionMessageByIdFromDb2, readRawSeedTailFromDb2, runSessionWarmupWorker, prewarmRawSessionOrdinalsForDb };
1272
+ export { isStrictGapHealingMessage2, isRawCompactionSummaryInfo2, readRawSessionMessagesFromDb2, readRawSessionMessagePageFromDb2, readRawSessionMessageSummaryPageFromDb2, countRawSessionMessageOrdinalsFromDb2, readRawSessionMessageIdOrdinalsForRangeFromDb2, readRawSessionMessageOrdinalPageFromDb2, countStoredRawSessionMessagesFromDb2, readRawSessionTailFromDb2, extractInMemoryMessageViews2, buildInMemoryTailRawMessages2, readRawSessionMessagePartsByIdFromDb2, forgetRawSessionOrdinalWatermark2, forgetRawSessionSummaryRows2, noteRawSessionSummaryRowWritten2, rawOrdinalSummarySeed2, scanRawSessionSummaryRows2, getRawSessionSummaryEpoch2, installRawSessionSummaryScan2, isRawSessionSummaryWarm2, readRawSessionMessageOrdinalByIdFromDb2, readRawSessionMessageByIdFromDb2, hasRawSessionMessageByIdFromDb2, readRawSeedTailFromDb2, readRawSessionBoundaryEndpointsFromDb2, runSessionWarmupWorker, prewarmRawSessionOrdinalsForDb };
@@ -5,7 +5,7 @@ import {
5
5
  getDataDir,
6
6
  getMagicContextStorageDir,
7
7
  sessionLog2
8
- } from "./server-5m3dt5r1.js";
8
+ } from "./server-t4k4qexw.js";
9
9
  import {
10
10
  writeStorageFileAtomicSync
11
11
  } from "./server-1bc61ans.js";