@cortexkit/opencode-magic-context 0.49.5 → 0.49.7

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 (156) hide show
  1. package/dist/auto-search-worker.js +10 -7
  2. package/dist/{compaction-marker-candidates-dd638ypn.js → compaction-marker-candidates-a0edbqrr.js} +2 -2
  3. package/dist/compaction-marker-candidates-worker.js +2 -2
  4. package/dist/{conflict-warning-hook-ae8nmv7c.js → conflict-warning-hook-myk5hbt9.js} +5 -5
  5. package/dist/{context-yg023c5r.js → context-ffr7e0g7.js} +46 -34
  6. package/dist/{embedding-backfill-aj488s8x.js → embedding-backfill-re16xncd.js} +6 -6
  7. package/dist/features/magic-context/compaction-marker.d.ts.map +1 -1
  8. package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts +6 -3
  9. package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts.map +1 -1
  10. package/dist/features/magic-context/dreamer/map-memories-prompt.d.ts +7 -1
  11. package/dist/features/magic-context/dreamer/map-memories-prompt.d.ts.map +1 -1
  12. package/dist/features/magic-context/dreamer/map-memories.d.ts +2 -2
  13. package/dist/features/magic-context/dreamer/map-memories.d.ts.map +1 -1
  14. package/dist/features/magic-context/dreamer/primer-seed.d.ts +2 -0
  15. package/dist/features/magic-context/dreamer/primer-seed.d.ts.map +1 -1
  16. package/dist/features/magic-context/dreamer/refresh-primers.d.ts +2 -2
  17. package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
  18. package/dist/features/magic-context/storage-meta-persisted.d.ts +10 -3
  19. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  20. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  21. package/dist/features/magic-context/storage-replay-document.d.ts +4 -0
  22. package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
  23. package/dist/hooks/magic-context/apply-operations.d.ts +7 -0
  24. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  25. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
  26. package/dist/hooks/magic-context/history-boundary-repair.d.ts.map +1 -1
  27. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  28. package/dist/hooks/magic-context/note-nudger.d.ts +5 -3
  29. package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
  30. package/dist/hooks/magic-context/postprocess-read-cache.d.ts.map +1 -1
  31. package/dist/hooks/magic-context/read-session-chunk.d.ts +7 -0
  32. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  33. package/dist/hooks/magic-context/replay-committed-drops.d.ts +9 -0
  34. package/dist/hooks/magic-context/replay-committed-drops.d.ts.map +1 -0
  35. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts +2 -2
  36. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts.map +1 -1
  37. package/dist/hooks/magic-context/rust-mode-transform.d.ts +3 -0
  38. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  39. package/dist/hooks/magic-context/rust-served-raw.d.ts +29 -0
  40. package/dist/hooks/magic-context/rust-served-raw.d.ts.map +1 -0
  41. package/dist/hooks/magic-context/strip-content.d.ts +23 -24
  42. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  43. package/dist/hooks/magic-context/tag-messages.d.ts +2 -0
  44. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  45. package/dist/hooks/magic-context/tool-drop-target.d.ts +2 -0
  46. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  47. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  48. package/dist/{index-m4p77myp.js → index-0gyq3djm.js} +1 -1
  49. package/dist/{index-jpm52v9x.js → index-37q80veb.js} +1 -1
  50. package/dist/{index-znzgze2v.js → index-4btknbqh.js} +9 -8
  51. package/dist/{index-v4bqjy56.js → index-5tbvdff4.js} +59 -28
  52. package/dist/{index-7jzrrxap.js → index-9yyqq3mm.js} +1 -1
  53. package/dist/{index-qvr78ej6.js → index-a8acx4gc.js} +2 -2
  54. package/dist/{index-gcdb3rqw.js → index-ax2jhztn.js} +1 -1
  55. package/dist/{index-2mqps3c1.js → index-ebnngykq.js} +145 -94
  56. package/dist/{index-41gqa557.js → index-g8qbdb03.js} +1 -1
  57. package/dist/{index-fst3t0d9.js → index-j58gqrn2.js} +65 -65
  58. package/dist/{index-xfbfrngb.js → index-j5hce1ab.js} +2 -2
  59. package/dist/{index-kb9nn0a0.js → index-j8epsc0g.js} +35 -14
  60. package/dist/{index-7zg9dvx0.js → index-n5a170gs.js} +227 -38
  61. package/dist/{index-fjtgekd4.js → index-n7kwfw2r.js} +4 -4
  62. package/dist/{index-dd18gej8.js → index-rwmpkss5.js} +3 -3
  63. package/dist/{index-7w18gg78.js → index-rzmjkdd6.js} +1 -1
  64. package/dist/{index-c0b01zrc.js → index-sf94at64.js} +3 -3
  65. package/dist/{index-yxawqmdd.js → index-sh91t19a.js} +1 -1
  66. package/dist/{index-x3y1np1h.js → index-tagss15p.js} +857 -125
  67. package/dist/{index-yqps2zsv.js → index-tmtty2x5.js} +1 -1
  68. package/dist/{index-bhk710rw.js → index-vt4sf4ep.js} +1 -1
  69. package/dist/{index-6m7rdv7y.js → index-w4mw92w3.js} +1 -1
  70. package/dist/{index-7ndnvw7a.js → index-w6bd03dc.js} +1 -1
  71. package/dist/{index-p2hs3rps.js → index-w6vr754t.js} +4 -4
  72. package/dist/{index-3wckxwfp.js → index-wq16ahsn.js} +5 -5
  73. package/dist/index.js +36 -36
  74. package/dist/{message-index-bounded-pv6ct15d.js → message-index-bounded-04rycpx4.js} +9 -9
  75. package/dist/{message-index-jqa7qd0s.js → message-index-rqtse28y.js} +9 -9
  76. package/dist/{message-time-backfill-8x06r9kx.js → message-time-backfill-a5ytnp53.js} +1 -1
  77. package/dist/migration-worker.js +6 -6
  78. package/dist/plugin/messages-transform.d.ts.map +1 -1
  79. package/dist/{project-embedding-registry-fcmszatg.js → project-embedding-registry-k0sd9k7v.js} +5 -5
  80. package/dist/raw-ordinal-warmup-worker.js +17 -15
  81. package/dist/{read-session-chunk-cwgjwjd0.js → read-session-chunk-h1btx938.js} +7 -5
  82. package/dist/{read-session-raw-z38cn0as.js → read-session-raw-vdf4wh78.js} +2 -2
  83. package/dist/{recomp-orchestrator-xw9wt5bm.js → recomp-orchestrator-trcgmm23.js} +20 -20
  84. package/dist/{search-v1t47s2q.js → search-3rbdx6hw.js} +16 -16
  85. package/dist/{send-session-notification-yp9m5g4p.js → send-session-notification-2tp44tfa.js} +4 -4
  86. package/dist/shared/processed-image-eligibility.d.ts +22 -0
  87. package/dist/shared/processed-image-eligibility.d.ts.map +1 -0
  88. package/dist/shared/recovery-reasoning-prefix.d.ts +9 -0
  89. package/dist/shared/recovery-reasoning-prefix.d.ts.map +1 -0
  90. package/dist/shared/sqlite.d.ts +1 -1
  91. package/dist/shared/sqlite.d.ts.map +1 -1
  92. package/dist/shared/tag-transcript.d.ts +9 -0
  93. package/dist/shared/tag-transcript.d.ts.map +1 -1
  94. package/dist/{sqlite-mhjkerzq.js → sqlite-j3tvg8r0.js} +1 -1
  95. package/dist/{storage-memory-07fx57k6.js → storage-memory-8168bgef.js} +2 -2
  96. package/dist/{storage-tags-0ssbmzg9.js → storage-tags-61z5j2f9.js} +2 -2
  97. package/dist/tools/ctx-expand/search-archive.d.ts +4 -0
  98. package/dist/tools/ctx-expand/search-archive.d.ts.map +1 -0
  99. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  100. package/dist/{transform-postprocess-phase-ttra554y.js → transform-postprocess-phase-7qts7h54.js} +20 -20
  101. package/dist/v2/auto-search-worker.js +10 -7
  102. package/dist/v2/{compaction-marker-candidates-1s21e2fz.js → compaction-marker-candidates-6nypjkpf.js} +2 -2
  103. package/dist/v2/compaction-marker-candidates-worker.js +2 -2
  104. package/dist/v2/{context-6en6a8ar.js → context-xq4rtywr.js} +1019 -233
  105. package/dist/v2/{embedding-backfill-9hbkfvnz.js → embedding-backfill-xd9ygzgd.js} +6 -6
  106. package/dist/v2/hooks/payload.d.ts.map +1 -1
  107. package/dist/v2/{message-index-h8ssgq3q.js → message-index-8e5z2xx8.js} +9 -9
  108. package/dist/v2/{message-index-bounded-c0810p5w.js → message-index-bounded-5vh1h2g7.js} +9 -9
  109. package/dist/v2/{message-time-backfill-cje68egj.js → message-time-backfill-2z365239.js} +1 -1
  110. package/dist/v2/migration-worker.js +6 -6
  111. package/dist/v2/{project-embedding-registry-42th7k1z.js → project-embedding-registry-b77awytr.js} +5 -5
  112. package/dist/v2/raw-ordinal-warmup-worker.js +17 -15
  113. package/dist/v2/{read-session-chunk-n86v9xfg.js → read-session-chunk-4sat83cx.js} +7 -5
  114. package/dist/v2/{read-session-raw-3b3ehga4.js → read-session-raw-a3hw9jsp.js} +2 -2
  115. package/dist/v2/{recomp-orchestrator-krvsbnds.js → recomp-orchestrator-n11zv1f1.js} +19 -19
  116. package/dist/v2/{search-048v8y02.js → search-mvgqtkkz.js} +16 -16
  117. package/dist/v2/{send-session-notification-a4h2azxa.js → send-session-notification-ppgc8qdz.js} +4 -4
  118. package/dist/v2/{server-cvgn49tr.js → server-1rfgbjfn.js} +1 -1
  119. package/dist/v2/{server-3bc6k4k4.js → server-7srtwsa4.js} +5 -5
  120. package/dist/v2/{server-7jzrrxap.js → server-9yyqq3mm.js} +1 -1
  121. package/dist/v2/{server-2htmbqbv.js → server-brhj8qtd.js} +1 -1
  122. package/dist/v2/{server-3dqjhchy.js → server-dd0nja67.js} +1 -1
  123. package/dist/v2/{server-8wcf79fe.js → server-fpqe39as.js} +1 -1
  124. package/dist/v2/{server-cjz51jm2.js → server-fw31krgq.js} +3 -3
  125. package/dist/v2/{server-4n2tknpc.js → server-gtv9wbhq.js} +227 -38
  126. package/dist/v2/{server-8pqnnmf9.js → server-hcvcxzx7.js} +2 -2
  127. package/dist/v2/{server-kb9nn0a0.js → server-j8epsc0g.js} +35 -14
  128. package/dist/v2/{server-rygvffsf.js → server-jdwd03ep.js} +4 -4
  129. package/dist/v2/{server-q6j5dasr.js → server-kdrezdy0.js} +1 -1
  130. package/dist/v2/{server-e2v4m8xe.js → server-mv1w7t6z.js} +61 -30
  131. package/dist/v2/{server-hetyb88z.js → server-nfan6zb6.js} +65 -65
  132. package/dist/v2/{server-4enr7s6x.js → server-qcw43339.js} +1 -1
  133. package/dist/v2/{server-5zrpr764.js → server-sy4b1sra.js} +1 -1
  134. package/dist/v2/{server-9a6v0wth.js → server-v4fwha43.js} +9 -8
  135. package/dist/v2/{server-pcygfdbs.js → server-w3zeywp1.js} +1 -1
  136. package/dist/v2/{server-czb2rkpk.js → server-wkdgjjch.js} +1 -1
  137. package/dist/v2/{server-9290a1mb.js → server-x08d1xf3.js} +1 -1
  138. package/dist/v2/server.js +4 -4
  139. package/dist/v2/{sqlite-mhjkerzq.js → sqlite-j3tvg8r0.js} +1 -1
  140. package/dist/v2/{storage-memory-07fx57k6.js → storage-memory-8168bgef.js} +2 -2
  141. package/dist/v2/{storage-tags-3a4cavqb.js → storage-tags-j2fzq3sw.js} +2 -2
  142. package/dist/v2/{wrapup-orchestrator-r2v7kgy3.js → wrapup-orchestrator-s92ebfzv.js} +19 -19
  143. package/dist/{wrapup-orchestrator-z7agncp8.js → wrapup-orchestrator-df61jmz9.js} +21 -21
  144. package/package.json +3 -3
  145. package/src/shared/processed-image-eligibility.test.ts +68 -0
  146. package/src/shared/processed-image-eligibility.ts +41 -0
  147. package/src/shared/processed-image-position-review.json +20 -0
  148. package/src/shared/processed-image-position-review.test.ts +19 -0
  149. package/src/shared/recovery-reasoning-prefix.test.ts +34 -0
  150. package/src/shared/recovery-reasoning-prefix.ts +35 -0
  151. package/src/shared/sqlite-acquisition-routing.test.ts +4 -3
  152. package/src/shared/sqlite-foreground-wait.test.ts +140 -0
  153. package/src/shared/sqlite-pass-scope.test.ts +4 -4
  154. package/src/shared/sqlite-writer-diagnostics.test.ts +31 -0
  155. package/src/shared/sqlite.ts +64 -23
  156. package/src/shared/tag-transcript.ts +118 -0
@@ -3,7 +3,7 @@ import {
3
3
  } from "./server-pavzsdc6.js";
4
4
  import {
5
5
  prepareCachedStatement2
6
- } from "./server-kb9nn0a0.js";
6
+ } from "./server-j8epsc0g.js";
7
7
  import {
8
8
  UNKNOWN_FIT_RATIO,
9
9
  resolveDecisionCalibration,
@@ -23,7 +23,7 @@ import {
23
23
  TAG_SELECT_COLUMNS2,
24
24
  getCandidateToolOwners2,
25
25
  pickNearestPriorOwner2
26
- } from "./server-pcygfdbs.js";
26
+ } from "./server-w3zeywp1.js";
27
27
  import {
28
28
  OMO_INTERNAL_INITIATOR_MARKER,
29
29
  isSystemDirective,
@@ -68,13 +68,13 @@ import {
68
68
  readRawSeedTailFromDb2,
69
69
  readRawSessionBoundaryEndpointsFromDb2,
70
70
  prewarmRawSessionOrdinalsForDb
71
- } from "./server-3dqjhchy.js";
71
+ } from "./server-dd0nja67.js";
72
72
  import {
73
73
  openCodeDbExists,
74
74
  withReadOnlySessionDb,
75
75
  getRawSessionMessageCountFromDb,
76
76
  getMessageTimesFromOpenCodeDb
77
- } from "./server-czb2rkpk.js";
77
+ } from "./server-wkdgjjch.js";
78
78
  import {
79
79
  getToolDefinitionMeasurementSignature,
80
80
  getLargestMeasuredToolDefinitionTokens,
@@ -2101,8 +2101,25 @@ function getProtectionWindowForSession(db, sessionId, floor) {
2101
2101
  }
2102
2102
 
2103
2103
  // src/features/magic-context/storage-replay-document.ts
2104
+ import { AsyncLocalStorage } from "node:async_hooks";
2104
2105
  var CAS_RETRY_LIMIT = 5;
2105
2106
  var MISSING_REPLAY_DOCUMENT_COLUMN = Symbol("missing replay document column");
2107
+ var replaySnapshots = new AsyncLocalStorage;
2108
+ async function withReplayEnvelopeSnapshot(db, sessionId, work) {
2109
+ const snapshot = { db, sessionId, active: true, loaded: false };
2110
+ return replaySnapshots.run(snapshot, async () => {
2111
+ try {
2112
+ return await work();
2113
+ } finally {
2114
+ snapshot.active = false;
2115
+ }
2116
+ });
2117
+ }
2118
+ function invalidateReplayEnvelopeSnapshot(db, sessionId) {
2119
+ const snapshot = replaySnapshots.getStore();
2120
+ if (snapshot?.db === db && snapshot.sessionId === sessionId)
2121
+ snapshot.loaded = false;
2122
+ }
2106
2123
  function isRustMarkerAdmissionFenced(db, sessionId) {
2107
2124
  const row = db.prepare("SELECT COALESCE(json_extract(NULLIF(trailing_blank_decisions, ''), '$.rustMarkerAdmissionFence'), 0) AS fenced FROM session_meta WHERE session_id=?").get(sessionId);
2108
2125
  return row?.fenced === 1;
@@ -2225,16 +2242,30 @@ function readDecisionRows(db, sessionId, messageIds) {
2225
2242
  return db.prepare(`SELECT message_id, decision FROM session_replay_decisions
2226
2243
  WHERE session_id = ? AND message_id IN (SELECT value FROM json_each(?))`).all(sessionId, JSON.stringify(messageIds));
2227
2244
  }
2228
- function readRawReplayDocument(db, sessionId) {
2245
+ function readRawReplayDocument(db, sessionId, fresh = false) {
2246
+ const snapshot = replaySnapshots.getStore();
2247
+ const reusable = !fresh && snapshot?.active && snapshot.db === db && snapshot.sessionId === sessionId;
2248
+ if (reusable && snapshot.loaded)
2249
+ return snapshot.raw;
2229
2250
  try {
2230
2251
  const row = db.prepare("SELECT trailing_blank_decisions FROM session_meta WHERE session_id = ?").get(sessionId);
2231
2252
  const raw = row?.trailing_blank_decisions;
2232
- if (raw === null || raw === undefined || typeof raw === "string")
2253
+ if (raw === null || raw === undefined || typeof raw === "string") {
2254
+ if (reusable) {
2255
+ snapshot.raw = raw;
2256
+ snapshot.loaded = true;
2257
+ }
2233
2258
  return raw;
2259
+ }
2234
2260
  throw invalidReplayDocument("stored value is not text");
2235
2261
  } catch (error) {
2236
- if (isMissingReplayDocumentColumn(error))
2262
+ if (isMissingReplayDocumentColumn(error)) {
2263
+ if (reusable) {
2264
+ snapshot.raw = MISSING_REPLAY_DOCUMENT_COLUMN;
2265
+ snapshot.loaded = true;
2266
+ }
2237
2267
  return MISSING_REPLAY_DOCUMENT_COLUMN;
2268
+ }
2238
2269
  throw error;
2239
2270
  }
2240
2271
  }
@@ -2333,9 +2364,10 @@ function readAllTrailingBlankDecisions(db, sessionId, rawColumn) {
2333
2364
  return decisions;
2334
2365
  }
2335
2366
  function updateReplayDocument(db, sessionId, mutate) {
2367
+ invalidateReplayEnvelopeSnapshot(db, sessionId);
2336
2368
  let initial;
2337
2369
  try {
2338
- initial = readRawReplayDocument(db, sessionId);
2370
+ initial = readRawReplayDocument(db, sessionId, true);
2339
2371
  } catch (error) {
2340
2372
  if (error instanceof ReplayDocumentError)
2341
2373
  return false;
@@ -2347,7 +2379,7 @@ function updateReplayDocument(db, sessionId, mutate) {
2347
2379
  for (let attempt = 0;attempt < CAS_RETRY_LIMIT; attempt += 1) {
2348
2380
  let raw;
2349
2381
  try {
2350
- raw = readRawReplayDocument(db, sessionId);
2382
+ raw = readRawReplayDocument(db, sessionId, true);
2351
2383
  } catch (error) {
2352
2384
  if (error instanceof ReplayDocumentError)
2353
2385
  return false;
@@ -2402,7 +2434,7 @@ function updateTrailingBlankDecisions(db, sessionId, messageIds, decide) {
2402
2434
  }
2403
2435
  let initial;
2404
2436
  try {
2405
- initial = readRawReplayDocument(db, sessionId);
2437
+ initial = readRawReplayDocument(db, sessionId, true);
2406
2438
  } catch (error) {
2407
2439
  if (error instanceof ReplayDocumentError)
2408
2440
  return false;
@@ -2414,7 +2446,7 @@ function updateTrailingBlankDecisions(db, sessionId, messageIds, decide) {
2414
2446
  for (let attempt = 0;attempt < CAS_RETRY_LIMIT; attempt += 1) {
2415
2447
  let columnDecisions;
2416
2448
  try {
2417
- const raw = readRawReplayDocument(db, sessionId);
2449
+ const raw = readRawReplayDocument(db, sessionId, true);
2418
2450
  if (raw === MISSING_REPLAY_DOCUMENT_COLUMN)
2419
2451
  return false;
2420
2452
  columnDecisions = parseReplayDocument(raw).trailingBlank;
@@ -2469,6 +2501,7 @@ function updateTrailingBlankDecisions(db, sessionId, messageIds, decide) {
2469
2501
  return false;
2470
2502
  }
2471
2503
  function writeReplayDocument(db, sessionId, doc) {
2504
+ invalidateReplayEnvelopeSnapshot(db, sessionId);
2472
2505
  if (!hasReplayDecisionTable(db)) {
2473
2506
  db.prepare("UPDATE session_meta SET trailing_blank_decisions = ? WHERE session_id = ?").run(serializeReplayDocument(doc), sessionId);
2474
2507
  return;
@@ -3814,10 +3847,32 @@ function addStaleReduceStrippedIds(db, sessionId, ids) {
3814
3847
  return false;
3815
3848
  }
3816
3849
  function getProcessedImageStrippedIds(db, sessionId) {
3850
+ return new Set(getProcessedImageMarkers(db, sessionId).keys());
3851
+ }
3852
+ function parseProcessedImageMarkers(raw) {
3853
+ if (!raw)
3854
+ return new Map;
3855
+ try {
3856
+ const parsed = JSON.parse(raw);
3857
+ const ids = Array.isArray(parsed) ? parsed : parsed?.ids;
3858
+ const textIds = new Set(Array.isArray(parsed?.textMarkerIds) ? parsed.textMarkerIds : []);
3859
+ return new Map((Array.isArray(ids) ? ids : []).filter((id) => typeof id === "string").map((id) => [id, textIds.has(id) ? "[image stripped]" : ""]));
3860
+ } catch {
3861
+ return new Map;
3862
+ }
3863
+ }
3864
+ function serializeProcessedImageMarkers(markers) {
3865
+ const ids = [...markers.keys()];
3866
+ if (ids.length === 0)
3867
+ return "";
3868
+ const textMarkerIds = ids.filter((id) => markers.get(id) === "[image stripped]");
3869
+ return JSON.stringify(textMarkerIds.length > 0 ? { ids, textMarkerIds } : ids);
3870
+ }
3871
+ function getProcessedImageMarkers(db, sessionId) {
3817
3872
  const row = db.prepare("SELECT processed_image_stripped_ids FROM session_meta WHERE session_id = ?").get(sessionId);
3818
- return new Set(parseStrippedBlob(row?.processed_image_stripped_ids));
3873
+ return parseProcessedImageMarkers(row?.processed_image_stripped_ids);
3819
3874
  }
3820
- function addProcessedImageStrippedIds(db, sessionId, ids) {
3875
+ function addProcessedImageStrippedIds(db, sessionId, ids, marker = "") {
3821
3876
  const add = [...ids];
3822
3877
  if (add.length === 0)
3823
3878
  return true;
@@ -3825,17 +3880,17 @@ function addProcessedImageStrippedIds(db, sessionId, ids) {
3825
3880
  for (let attempt = 0;attempt < CAS_RETRY_LIMIT2; attempt += 1) {
3826
3881
  const row = db.prepare("SELECT processed_image_stripped_ids FROM session_meta WHERE session_id = ?").get(sessionId);
3827
3882
  const rawStored = row ? row.processed_image_stripped_ids ?? null : null;
3828
- const current = new Set(parseStrippedBlob(rawStored));
3883
+ const current = parseProcessedImageMarkers(rawStored);
3829
3884
  let changed = false;
3830
3885
  for (const id of add) {
3831
3886
  if (!current.has(id)) {
3832
- current.add(id);
3887
+ current.set(id, typeof marker === "string" ? marker : marker.get(id) ?? "");
3833
3888
  changed = true;
3834
3889
  }
3835
3890
  }
3836
3891
  if (!changed)
3837
3892
  return true;
3838
- const nextBlob = JSON.stringify([...current]);
3893
+ const nextBlob = serializeProcessedImageMarkers(current);
3839
3894
  const result = db.prepare("UPDATE session_meta SET processed_image_stripped_ids = ? WHERE session_id = ? AND processed_image_stripped_ids IS ?").run(nextBlob, sessionId, rawStored);
3840
3895
  if (result.changes > 0)
3841
3896
  return true;
@@ -3889,7 +3944,8 @@ function loadPostprocessReplaySnapshot(db, sessionId) {
3889
3944
  const thinkingBindingRecoveryTarget = row?.thinking_binding_recovery_target;
3890
3945
  return {
3891
3946
  staleReduceStrippedIds: new Set(parseStrippedBlob(row?.stale_reduce_stripped_ids)),
3892
- processedImageStrippedIds: new Set(parseStrippedBlob(row?.processed_image_stripped_ids)),
3947
+ processedImageStrippedIds: new Set(parseProcessedImageMarkers(row?.processed_image_stripped_ids).keys()),
3948
+ processedImageMarkers: parseProcessedImageMarkers(row?.processed_image_stripped_ids),
3893
3949
  strippedPlaceholderIds: new Set(placeholders.ids),
3894
3950
  hiddenSeamPlaceholderIds: new Set(placeholders.hiddenSeamIds),
3895
3951
  noteNudgeAnchors: parseJsonArray(row?.note_nudge_anchors, isValidNoteNudgeAnchor),
@@ -3933,15 +3989,22 @@ function getPendingPiCompactionMarkerState(db, sessionId) {
3933
3989
  return parsed;
3934
3990
  }
3935
3991
  } catch {}
3936
- db.prepare("UPDATE session_meta SET pending_pi_compaction_marker_state = NULL WHERE session_id = ? AND pending_pi_compaction_marker_state = ?").run(sessionId, raw);
3992
+ const cleared = db.prepare("UPDATE session_meta SET pending_pi_compaction_marker_state = NULL WHERE session_id = ? AND pending_pi_compaction_marker_state = ?").run(sessionId, raw);
3993
+ if (cleared.changes > 0)
3994
+ sessionLog2(sessionId, "Pi compaction-marker clear: reason=malformed-state");
3937
3995
  return null;
3938
3996
  }
3939
- function clearPendingPiCompactionMarkerStateIf(db, sessionId, expected) {
3997
+ function clearPendingPiCompactionMarkerStateIf(db, sessionId, expected, reason = "explicit-clear") {
3940
3998
  const expectedBlob = stableStringify(expected);
3941
3999
  const result = db.prepare(`UPDATE session_meta SET pending_pi_compaction_marker_state = NULL
3942
4000
  WHERE session_id = ? AND pending_pi_compaction_marker_state = ?`).run(sessionId, expectedBlob);
4001
+ if (result.changes > 0 && reason !== null)
4002
+ logPiCompactionMarkerClear(sessionId, expected, reason);
3943
4003
  return result.changes > 0;
3944
4004
  }
4005
+ function logPiCompactionMarkerClear(sessionId, marker, reason) {
4006
+ sessionLog2(sessionId, `Pi compaction-marker clear: reason=${reason} endMessageId=${marker.endMessageId} ordinal=${marker.ordinal} firstKeptEntryId=${marker.firstKeptEntryId ?? "<none>"}`);
4007
+ }
3945
4008
  function setSessionWorkMetrics(db, sessionId, newWorkTokens, totalInputTokens) {
3946
4009
  ensureSessionMetaRow(db, sessionId);
3947
4010
  db.prepare(`UPDATE session_meta
@@ -4329,6 +4392,27 @@ function hasAnthropicReasoning(messages) {
4329
4392
  });
4330
4393
  }
4331
4394
 
4395
+ // src/shared/processed-image-eligibility.ts
4396
+ function createProcessedImageEligibility(messages, messageTagNumbers, options) {
4397
+ const ageTags = new Map;
4398
+ let nextTag;
4399
+ for (let index = messages.length - 1;index >= 0; index--) {
4400
+ const message = messages[index];
4401
+ const ownTag = messageTagNumbers.get(message);
4402
+ if (ownTag !== undefined && Number.isFinite(ownTag) && ownTag > 0)
4403
+ nextTag = ownTag;
4404
+ if (nextTag !== undefined)
4405
+ ageTags.set(message, nextTag);
4406
+ }
4407
+ return {
4408
+ ageTags,
4409
+ mayStrip: (message) => {
4410
+ const age = ageTags.get(message);
4411
+ return options.watermark > 0 && age !== undefined && age <= options.watermark && ((options.contextPercentage ?? 0) >= 95 || options.protectedCutoff == null || age < options.protectedCutoff);
4412
+ }
4413
+ };
4414
+ }
4415
+
4332
4416
  // src/hooks/magic-context/strip-content.ts
4333
4417
  var MARKER_ONLY_PATTERN = /^(?:(?:§\d+§|\[dropped(?: §\d+§)?\]|\[cleared\])\s*)+$/;
4334
4418
  function isMarkerOnlyText(text) {
@@ -4878,59 +4962,142 @@ function stripReasoningFromMergedAssistants(messages, providerID, options) {
4878
4962
  }
4879
4963
  return stripped;
4880
4964
  }
4965
+ var emptyImageParts = new WeakMap;
4966
+ function getEmptyImageParts(messages) {
4967
+ return emptyImageParts.get(messages) ?? new Map;
4968
+ }
4969
+ function imageOmissionBreaksStructure(messages, index, omitted) {
4970
+ let before = index - 1;
4971
+ let after = index + 1;
4972
+ while (omitted.has(before))
4973
+ before--;
4974
+ while (omitted.has(after))
4975
+ after++;
4976
+ const previous = messages[before];
4977
+ const next = messages[after];
4978
+ return previous !== undefined && next !== undefined && previous.info.role === next.info.role;
4979
+ }
4881
4980
  function stripProcessedImages(messages, frozenIds, options) {
4882
- const { detect, watermark, messageTagNumbers } = options;
4981
+ const omissions = new Map;
4982
+ emptyImageParts.set(messages, omissions);
4983
+ const { detect, messageTagNumbers } = options;
4984
+ const eligibility = createProcessedImageEligibility(messages, messageTagNumbers, options);
4883
4985
  let stripped = 0;
4884
4986
  const newlyStrippedIds = [];
4885
4987
  const planned = [];
4988
+ const newMarkers = new Map;
4886
4989
  let hasAssistantResponse = false;
4887
4990
  for (let i = messages.length - 1;i >= 0; i--) {
4888
4991
  const msg = messages[i];
4992
+ const answered = hasAssistantResponse;
4889
4993
  if (msg.info.role === "assistant") {
4890
4994
  hasAssistantResponse = true;
4891
- continue;
4892
4995
  }
4893
- if (msg.info.role !== "user") {
4996
+ if (msg.info.role !== "user" && msg.info.role !== "assistant") {
4894
4997
  continue;
4895
4998
  }
4896
4999
  const id = typeof msg.info.id === "string" ? msg.info.id : undefined;
4897
5000
  const inFrozen = id !== undefined && frozenIds.has(id);
4898
- const maxTag = messageTagNumbers.get(msg) ?? 0;
4899
- const isNewDetection = !inFrozen && detect && hasAssistantResponse && id !== undefined && maxTag <= watermark;
5001
+ const isNewDetection = !inFrozen && detect && answered && id !== undefined && eligibility.mayStrip(msg) && !options.protectedMessageIds?.has(id);
4900
5002
  if (!inFrozen && !isNewDetection) {
4901
5003
  continue;
4902
5004
  }
4903
5005
  let touchedThisMsg = false;
4904
5006
  for (let j = 0;j < msg.parts.length; j++) {
4905
5007
  const part = msg.parts[j];
4906
- if (!isRecord(part) || part.type !== "file") {
4907
- continue;
4908
- }
4909
- if (typeof part.mime !== "string" || !part.mime.startsWith("image/")) {
4910
- continue;
4911
- }
4912
- if (typeof part.url === "string" && part.url.startsWith("data:") && part.url.length > 200) {
4913
- planned.push({ message: msg, partIndex: j, firstApplication: isNewDetection });
5008
+ const tool = msg.info.role === "assistant" && isRecord(part) && part.type === "tool" && isRecord(part.state) && part.state.status === "completed";
5009
+ const images = tool && isRecord(part) && isRecord(part.state) && Array.isArray(part.state.attachments) ? part.state.attachments : msg.info.role === "user" ? [part] : [];
5010
+ if (images.some(isProcessedImagePart)) {
5011
+ planned.push({
5012
+ message: msg,
5013
+ partIndex: j,
5014
+ firstApplication: isNewDetection,
5015
+ tool
5016
+ });
4914
5017
  touchedThisMsg = true;
4915
5018
  }
4916
5019
  }
4917
5020
  if (touchedThisMsg && isNewDetection && id !== undefined) {
4918
5021
  newlyStrippedIds.push(id);
5022
+ newMarkers.set(id, msg.info.role === "assistant" ? "[image stripped]" : options.replacementText ?? "");
4919
5023
  }
4920
5024
  }
4921
- const persisted = newlyStrippedIds.length === 0 || options.persistNewIds?.(newlyStrippedIds) !== false;
5025
+ const imageIndices = new Map;
5026
+ for (const { message, partIndex, tool } of planned) {
5027
+ if (tool)
5028
+ continue;
5029
+ const indices = imageIndices.get(message) ?? new Set;
5030
+ indices.add(partIndex);
5031
+ imageIndices.set(message, indices);
5032
+ }
5033
+ const emptiedRows = new Set;
5034
+ const newEmptyRows = [];
5035
+ for (let index = 0;index < messages.length; index++) {
5036
+ const message = messages[index];
5037
+ if (message.parts.every((part) => isRecord(part) && part.type === "text" && part.text === ""))
5038
+ emptiedRows.add(index);
5039
+ const id = message.info.id;
5040
+ const indices = imageIndices.get(message);
5041
+ if (!id || !indices)
5042
+ continue;
5043
+ const marker = options.frozenMarkers?.get(id) ?? newMarkers.get(id) ?? "";
5044
+ if (marker !== "" || !message.parts.every((part, partIndex) => indices.has(partIndex) || isRecord(part) && part.type === "text" && part.text === ""))
5045
+ continue;
5046
+ if (newMarkers.has(id))
5047
+ newEmptyRows.push({ index, id });
5048
+ else
5049
+ emptiedRows.add(index);
5050
+ }
5051
+ for (const { index, id } of newEmptyRows) {
5052
+ if (imageOmissionBreaksStructure(messages, index, emptiedRows))
5053
+ newMarkers.set(id, "[image stripped]");
5054
+ else
5055
+ emptiedRows.add(index);
5056
+ }
5057
+ const persisted = newlyStrippedIds.length === 0 || options.persistNewIds?.(newlyStrippedIds, newMarkers) !== false;
4922
5058
  if (!persisted)
4923
5059
  newlyStrippedIds.length = 0;
4924
- for (const { message, partIndex, firstApplication } of planned) {
5060
+ for (const { message, partIndex, firstApplication, tool } of planned) {
4925
5061
  if (firstApplication && !persisted)
4926
5062
  continue;
4927
5063
  if (firstApplication)
4928
5064
  options.onFirstApplication?.(message, partIndex);
4929
- message.parts[partIndex] = makeSentinel(message.parts[partIndex]);
4930
- stripped++;
5065
+ const marker = tool ? "[image stripped]" : options.frozenMarkers?.get(message.info.id ?? "") ?? (firstApplication ? newMarkers.get(message.info.id ?? "") : "") ?? "";
5066
+ const original = message.parts[partIndex];
5067
+ if (tool && isRecord(original) && isRecord(original.state) && Array.isArray(original.state.attachments)) {
5068
+ const attachments = original.state.attachments;
5069
+ const count = attachments.filter(isProcessedImagePart).length;
5070
+ const output = typeof original.state.output === "string" ? original.state.output : "";
5071
+ message.parts[partIndex] = {
5072
+ ...original,
5073
+ state: {
5074
+ ...original.state,
5075
+ output: [output, ...Array(count).fill(marker)].filter(Boolean).join(`
5076
+ `),
5077
+ attachments: attachments.filter((part) => !isProcessedImagePart(part))
5078
+ }
5079
+ };
5080
+ stripped += count;
5081
+ } else {
5082
+ message.parts[partIndex] = { ...makeSentinel(original), text: marker };
5083
+ if (marker === "" && message.info.id) {
5084
+ const indices = omissions.get(message.info.id) ?? new Set;
5085
+ indices.add(partIndex);
5086
+ omissions.set(message.info.id, indices);
5087
+ }
5088
+ stripped++;
5089
+ }
4931
5090
  }
4932
5091
  return { stripped, newlyStrippedIds };
4933
5092
  }
5093
+ function isProcessedImagePart(part) {
5094
+ if (isRecord(part) && part.type === "media" && isRecord(part.media)) {
5095
+ const { source, mediaType } = part.media;
5096
+ const inlineLength = isRecord(source) ? source.type === "base64" && typeof source.data === "string" ? source.data.length : source.type === "bytes" && source.data instanceof Uint8Array ? Math.ceil(source.data.byteLength / 3) * 4 : 0 : 0;
5097
+ return typeof mediaType === "string" && mediaType.startsWith("image/") && inlineLength > 0 && inlineLength + `data:${mediaType};base64,`.length > 200;
5098
+ }
5099
+ return isRecord(part) && part.type === "file" && typeof part.mime === "string" && part.mime.startsWith("image/") && typeof part.url === "string" && part.url.startsWith("data:") && part.url.length > 200;
5100
+ }
4934
5101
 
4935
5102
  // src/hooks/magic-context/reasoning-budget.ts
4936
5103
  function projectOpencodeReasoningBudgetCutoff(db, sessionId, messages, budget, watermark, proseRatio) {
@@ -5918,6 +6085,10 @@ function createToolDropTarget(compositeKey, thinkingParts, index, batch, tagId)
5918
6085
  return false;
5919
6086
  return batch.wouldStrandConversationEnd(entry.occurrences);
5920
6087
  },
6088
+ prepareDrop: () => {
6089
+ const entry = index.get(compositeKey);
6090
+ return !!entry && entry.occurrences.length > 0 && entry.hasResult;
6091
+ },
5921
6092
  canDrop: () => {
5922
6093
  const entry = index.get(compositeKey);
5923
6094
  return !!entry && entry.occurrences.length > 0 && entry.hasResult && !entry.occurrences.some((occurrence) => toolPartHasUserAnswer(occurrence.part));
@@ -6180,6 +6351,21 @@ function visitRawSessionMessages2(sessionId, fromOrdinal, toOrdinal, visit, opti
6180
6351
  after = last ? { timeCreated: last.createdAt ?? 0, id: last.id } : undefined;
6181
6352
  }
6182
6353
  }
6354
+ async function visitRawSessionMessagesAsync2(sessionId, fromOrdinal, toOrdinal, visit, options = {}) {
6355
+ const from = Math.max(1, Math.floor(fromOrdinal));
6356
+ const to = Math.floor(toOrdinal);
6357
+ if (to < from)
6358
+ return;
6359
+ const provider = sessionProviders.get(sessionId)?.provider;
6360
+ if (!provider?.iterateMessageRangeAsync) {
6361
+ visitRawSessionMessages2(sessionId, from, to, visit, options);
6362
+ return;
6363
+ }
6364
+ for await (const message of provider.iterateMessageRangeAsync(from, to)) {
6365
+ if (!visit(message))
6366
+ return;
6367
+ }
6368
+ }
6183
6369
  function readRawSessionMessageRange2(sessionId, fromOrdinal, toOrdinal) {
6184
6370
  const from = Math.max(1, Math.floor(fromOrdinal));
6185
6371
  const to = Math.floor(toOrdinal);
@@ -6605,7 +6791,10 @@ function readSessionChunk2(sessionId, tokenBudget, offset = 1, eligibleEndOrdina
6605
6791
  if (state?.input === undefined && state?.output !== undefined && typeof p.callID === "string") {
6606
6792
  const call = calls.get(p.callID);
6607
6793
  if (call) {
6608
- const expansion = expandToolPart({ ...call, state: { ...call.state, output: state.output } }, options.expandTools);
6794
+ const expansion = expandToolPart({
6795
+ ...call,
6796
+ state: { ...call.state, output: state.output }
6797
+ }, options.expandTools);
6609
6798
  if (expansion !== null) {
6610
6799
  expandedParts.set(call, expansion);
6611
6800
  expandedResults.add(part);
@@ -6888,4 +7077,4 @@ function readRawSessionSeedTail2(sessionId, boundaryId, onQuery) {
6888
7077
  });
6889
7078
  }
6890
7079
 
6891
- export { detectLatestTurnThinkingMismatch, isPrefixBoundThinkingModel, detectOverflow, SESSION_META_SELECT_COLUMNS, META_COLUMNS, BOOLEAN_META_KEYS, NULL_BIND_META_KEYS, isSessionMetaRow, getDefaultSessionMeta, ensureSessionMetaRow, toSessionMeta, persistCachedM0, clearCachedM0M1, 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, MERGED_REASONING_PARTS_PREFIX, decodeMergedReasoningParts, MAX_EXECUTE_THRESHOLD, escalationBands, HYGIENE_PROVIDER_UNITS_VERSION, sessionDecisionCalibration, transitionSessionHygieneUnits, getProtectionWindowForSession, isRustMarkerAdmissionFenced, setRustMarkerAdmissionFence, ReplayDocumentError, readReplayEnvelope, readReplayDocument, updateReplayDocument, writeReplayDocument, isEmergencyRecoveryArmed, isProviderOverflowReconfirmed, isProviderOverflowFailClosedProven, getEmergencyRecoveryArmedAt, describeProtectedTailDrainBudgetSkip, loadPersistedUsage, loadProtectedTailMeta, markProtectedTailPolicyV3Seeded, recordProtectedTailPublicationFloor, recordProtectedTailNoEligibleHead, resetProtectedTailNoEligibleHead, getWrapupInProgressState, isWrapupInProgress, acquireWrapupInProgress, updateWrapupInProgress, releaseWrapupInProgress, resolveCompactionModeRecord, getCompactionModeRecord, setCompactionModeRecord, getProtectedTailDrainBudgetSkip, reserveProtectedTailDrainTokens, clearEmergencyDrainLatch, recordHistorianDrainFailure, clearHistorianDrainFailure, rollbackProtectedTailDrainReservation, clearPersistedReasoningWatermark, getEmergencyInputSample, setEmergencyDropSample, clearEmergencyDropSample, getLastNudgeUndropped, setLastNudgeUndropped, getChannel1NudgeState, setChannel1NudgeState, markChannel1PostReduceGracePending, captureChannel1PostReduceGraceBaseline, getChannel2NudgeState, setChannel2NudgeState, casChannel2NudgeState, claimChannel2NudgeState, casChannel2NudgeClaim, getPersistedNoteNudge, setPersistedNoteNudgeTrigger, setPersistedNoteNudgeTriggerMessageId, getNoteNudgeAnchors, getAutoSearchHintDecisions, deliverNoteNudgeAtomic, appendAutoSearchHintDecision, pruneNoteNudgeAnchors, queueAutoSearchHintDecisionRetirement, flushAutoSearchHintDecisionRetirement, getPersistedTodoPermissionDenied, setPersistedTodoPermissionDenied, getPersistedTodoSyntheticAnchor, setPersistedTodoSyntheticAnchor, clearPersistedTodoSyntheticAnchor, getNoteLastReadAt, setNoteLastReadAt, getHistorianFailureState, incrementHistorianFailure, clearHistorianFailureState, getOverflowState, loadTransformPassStateSnapshot, recordOverflowDetected, recordDetectedContextLimit, clearEmergencyRecovery, clearDetectedContextLimit, getPersistedCompactionMarkerState, setPersistedCompactionMarkerState, getDeferredClearedCompactionMarkerState, retireDeferredClearedCompactionMarkerState, parseStrippedPlaceholderState, serializeStrippedPlaceholderState, getStrippedPlaceholderIds, applyStrippedPlaceholderDelta, THINKING_BINDING_RECOVERY_FROZEN_PREFIX, THINKING_BINDING_STRIP_ORDER_END_MARKER, thinkingBindingRecoveryFrozenId, getThinkingBindingRecoveryTarget, clearThinkingBindingRecoveryIf, getMergedReasoningStrippedIds, addMergedReasoningStrippedIds, getTrailingBlankDecisions, addTrailingBlankDecisions, demoteTrailingBlankKeepDecisions, getStaleReduceStrippedIds, addStaleReduceStrippedIds, getProcessedImageStrippedIds, addProcessedImageStrippedIds, getPendingCompactionMarkerState, getCompactionMarkerHealth, loadPostprocessReplaySnapshot, setPendingCompactionMarkerState, replacePendingCompactionMarkerStateIf, clearPendingCompactionMarkerStateIf, getPendingPiCompactionMarkerState, clearPendingPiCompactionMarkerStateIf, setSessionWorkMetrics, getObservedEpochFloor, resolveEpochFloorForPass, getReasoningRemovalState, addRemovedReasoningIds, markDropLeavesReasoning, modelAcceptsEmptyContent, isAnthropicFamilyRoute, neutralizeDroppedReasoningPart, restoreNeutralizedReasoningPart, isNeutralizedReasoningPart, variantChangeBustsProviderCache, makeSentinel, makeWholeMessageSentinel, isSentinel, replaySentinelByMessageIds, isInActiveAnthropicTurn, activeAnthropicTurnStart, hasAnthropicReasoning, stripSystemInjectedMessages, stripDroppedPlaceholderMessages, replayClearedReasoning, replayStrippedInlineThinking, clearOldReasoning, stripClearedReasoning, stripInlineThinking, findReasoningBearingAssistantIds, findLatestAssistantReasoningMutationExemptMessage, snapshotTrailingBlankSourceDecisions, findTrailingBlankDecisionCandidates, applyFrozenTrailingBlankDecisions, stripReasoningFromAssistantIds, findMergedReasoningStripDecisions, stripReasoningFromMergedAssistants, stripProcessedImages, projectOpencodeReasoningBudgetCutoff, DEFAULT_KEEP_REASONING_TOKENS, resolveKeepReasoningTokens, reasoningBudgetCutoff, reasoningTextAndOpaque, opencodeReasoningBudgetCutoff, describeFinalWireTail, estimateMessageTokens, wireContentBytes, createFinalWireUsageTracker, estimateFinalWireInputTokens, estimateAppendedWireTokens, 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 };
7080
+ export { detectLatestTurnThinkingMismatch, isPrefixBoundThinkingModel, detectOverflow, SESSION_META_SELECT_COLUMNS, META_COLUMNS, BOOLEAN_META_KEYS, NULL_BIND_META_KEYS, isSessionMetaRow, getDefaultSessionMeta, ensureSessionMetaRow, toSessionMeta, persistCachedM0, clearCachedM0M1, 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, MERGED_REASONING_PARTS_PREFIX, decodeMergedReasoningParts, MAX_EXECUTE_THRESHOLD, escalationBands, HYGIENE_PROVIDER_UNITS_VERSION, sessionDecisionCalibration, transitionSessionHygieneUnits, getProtectionWindowForSession, withReplayEnvelopeSnapshot, invalidateReplayEnvelopeSnapshot, isRustMarkerAdmissionFenced, setRustMarkerAdmissionFence, ReplayDocumentError, readReplayEnvelope, readReplayDocument, updateReplayDocument, writeReplayDocument, isEmergencyRecoveryArmed, isProviderOverflowReconfirmed, isProviderOverflowFailClosedProven, getEmergencyRecoveryArmedAt, describeProtectedTailDrainBudgetSkip, loadPersistedUsage, loadProtectedTailMeta, markProtectedTailPolicyV3Seeded, recordProtectedTailPublicationFloor, recordProtectedTailNoEligibleHead, resetProtectedTailNoEligibleHead, getWrapupInProgressState, isWrapupInProgress, acquireWrapupInProgress, updateWrapupInProgress, releaseWrapupInProgress, resolveCompactionModeRecord, getCompactionModeRecord, setCompactionModeRecord, getProtectedTailDrainBudgetSkip, reserveProtectedTailDrainTokens, clearEmergencyDrainLatch, recordHistorianDrainFailure, clearHistorianDrainFailure, rollbackProtectedTailDrainReservation, clearPersistedReasoningWatermark, getEmergencyInputSample, setEmergencyDropSample, clearEmergencyDropSample, getLastNudgeUndropped, setLastNudgeUndropped, getChannel1NudgeState, setChannel1NudgeState, markChannel1PostReduceGracePending, captureChannel1PostReduceGraceBaseline, getChannel2NudgeState, setChannel2NudgeState, casChannel2NudgeState, claimChannel2NudgeState, casChannel2NudgeClaim, getPersistedNoteNudge, setPersistedNoteNudgeTrigger, setPersistedNoteNudgeTriggerMessageId, getNoteNudgeAnchors, getAutoSearchHintDecisions, deliverNoteNudgeAtomic, appendAutoSearchHintDecision, pruneNoteNudgeAnchors, queueAutoSearchHintDecisionRetirement, flushAutoSearchHintDecisionRetirement, getPersistedTodoPermissionDenied, setPersistedTodoPermissionDenied, getPersistedTodoSyntheticAnchor, setPersistedTodoSyntheticAnchor, clearPersistedTodoSyntheticAnchor, getNoteLastReadAt, setNoteLastReadAt, getHistorianFailureState, incrementHistorianFailure, clearHistorianFailureState, getOverflowState, loadTransformPassStateSnapshot, recordOverflowDetected, recordDetectedContextLimit, clearEmergencyRecovery, clearDetectedContextLimit, getPersistedCompactionMarkerState, setPersistedCompactionMarkerState, getDeferredClearedCompactionMarkerState, retireDeferredClearedCompactionMarkerState, parseStrippedPlaceholderState, serializeStrippedPlaceholderState, getStrippedPlaceholderIds, applyStrippedPlaceholderDelta, THINKING_BINDING_RECOVERY_FROZEN_PREFIX, THINKING_BINDING_STRIP_ORDER_END_MARKER, thinkingBindingRecoveryFrozenId, getThinkingBindingRecoveryTarget, clearThinkingBindingRecoveryIf, getMergedReasoningStrippedIds, addMergedReasoningStrippedIds, getTrailingBlankDecisions, addTrailingBlankDecisions, demoteTrailingBlankKeepDecisions, getStaleReduceStrippedIds, addStaleReduceStrippedIds, getProcessedImageStrippedIds, parseProcessedImageMarkers, serializeProcessedImageMarkers, getProcessedImageMarkers, addProcessedImageStrippedIds, getPendingCompactionMarkerState, getCompactionMarkerHealth, loadPostprocessReplaySnapshot, setPendingCompactionMarkerState, replacePendingCompactionMarkerStateIf, clearPendingCompactionMarkerStateIf, getPendingPiCompactionMarkerState, clearPendingPiCompactionMarkerStateIf, logPiCompactionMarkerClear, setSessionWorkMetrics, getObservedEpochFloor, resolveEpochFloorForPass, getReasoningRemovalState, addRemovedReasoningIds, markDropLeavesReasoning, modelAcceptsEmptyContent, isAnthropicFamilyRoute, neutralizeDroppedReasoningPart, restoreNeutralizedReasoningPart, isNeutralizedReasoningPart, variantChangeBustsProviderCache, makeSentinel, makeWholeMessageSentinel, isSentinel, replaySentinelByMessageIds, isInActiveAnthropicTurn, activeAnthropicTurnStart, hasAnthropicReasoning, stripSystemInjectedMessages, stripDroppedPlaceholderMessages, replayClearedReasoning, replayStrippedInlineThinking, clearOldReasoning, stripClearedReasoning, stripInlineThinking, findReasoningBearingAssistantIds, findLatestAssistantReasoningMutationExemptMessage, snapshotTrailingBlankSourceDecisions, findTrailingBlankDecisionCandidates, applyFrozenTrailingBlankDecisions, stripReasoningFromAssistantIds, findMergedReasoningStripDecisions, stripReasoningFromMergedAssistants, getEmptyImageParts, stripProcessedImages, projectOpencodeReasoningBudgetCutoff, DEFAULT_KEEP_REASONING_TOKENS, resolveKeepReasoningTokens, reasoningBudgetCutoff, reasoningTextAndOpaque, opencodeReasoningBudgetCutoff, describeFinalWireTail, estimateMessageTokens, wireContentBytes, createFinalWireUsageTracker, estimateFinalWireInputTokens, estimateAppendedWireTokens, 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, visitRawSessionMessagesAsync2, 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 };
@@ -16,11 +16,11 @@ import {
16
16
  } from "./server-2ra6pwf3.js";
17
17
  import {
18
18
  Database2
19
- } from "./server-kb9nn0a0.js";
19
+ } from "./server-j8epsc0g.js";
20
20
  import {
21
21
  normalizeStoredProjectPath,
22
22
  storedPathBelongsToIdentity
23
- } from "./server-q6j5dasr.js";
23
+ } from "./server-kdrezdy0.js";
24
24
  import {
25
25
  logSlowWriteTransaction
26
26
  } from "./server-3t0q2cqx.js";
@@ -6,12 +6,15 @@ function registerSlowWriteReporter2(reporter) {
6
6
  reportSlowPrivilegedWrite = reporter;
7
7
  }
8
8
  var sqliteDiagnosticSink;
9
- function registerSqliteDiagnosticSink2(sink) {
9
+ var sqliteDiagnosticHost = () => "unknown";
10
+ function registerSqliteDiagnosticSink2(sink, host) {
10
11
  sqliteDiagnosticSink = sink;
12
+ if (host)
13
+ sqliteDiagnosticHost = host;
11
14
  }
12
15
  function reportSqliteDiagnostic(message) {
13
16
  try {
14
- sqliteDiagnosticSink?.(`[magic-context] ${message}`);
17
+ sqliteDiagnosticSink?.(`[magic-context] ${message} pid=${process.pid} host=${sqliteDiagnosticHost()}`);
15
18
  } catch {}
16
19
  }
17
20
  function detectSqliteRuntime2() {
@@ -170,10 +173,18 @@ function installTransactionRouting(db, readonly) {
170
173
  assertTransformWrite2();
171
174
  if (/^\s*BEGIN\s+(?:IMMEDIATE|EXCLUSIVE)(?:\s+TRANSACTION)?\s*;?\s*$/i.test(sql)) {
172
175
  openWriterTransactions.delete(db);
173
- if (transformPassScope.getStore()?.active || backgroundWriterScope.getStore())
176
+ if (transformPassScope.getStore()?.active || backgroundWriterScope.getStore()) {
174
177
  acquireShort(db, () => nativeExec(sql), sql.trim());
175
- else
178
+ } else {
176
179
  nativeExec(sql);
180
+ openWriterTransactions.set(db, {
181
+ site: sql.trim(),
182
+ lane: "background",
183
+ acquireMs: 0,
184
+ attempts: 1,
185
+ acquiredAt: performance.now()
186
+ });
187
+ }
177
188
  return db;
178
189
  }
179
190
  if (WRITER_TRANSACTION_END.test(sql) && openWriterTransactions.has(db))
@@ -556,9 +567,9 @@ class SqliteAcquisitionBusyError2 extends Error {
556
567
  }
557
568
  }
558
569
  var SHORT_BUSY_TIMEOUT_MS = 25;
559
- var FOREGROUND_IN_PASS_BUSY_TIMEOUT_MS = 250;
570
+ var FOREGROUND_IN_PASS_BUSY_TIMEOUT_MS = 2000;
560
571
  var FOREGROUND_ACQUISITION_BUDGET_MS = 16500;
561
- var SLOW_WRITER_LOG_MS = 250;
572
+ var SLOW_WRITER_LOG_MS = 100;
562
573
  var WRITER_TRANSACTION_END = /^\s*(?:COMMIT|END|ROLLBACK)(?:\s+TRANSACTION)?\s*;?\s*$/i;
563
574
  var writerAcquisitionScope = new AsyncLocalStorage;
564
575
  var openWriterTransactions = new WeakMap;
@@ -569,22 +580,30 @@ function foregroundWaitLease() {
569
580
  function withAutocommitTimeout(db, operation) {
570
581
  assertTransformWrite2();
571
582
  const lease = foregroundWaitLease();
572
- if (isInTransaction(db) || !lease && !backgroundWriterScope.getStore())
583
+ if (isInTransaction(db))
573
584
  return operation();
574
- const previous = pragmaNumber(db, "busy_timeout");
575
- db.exec(`PRAGMA busy_timeout=${lease ? Math.floor(lease.remainingWaitMs) : SHORT_BUSY_TIMEOUT_MS}`);
585
+ const scoped = lease || backgroundWriterScope.getStore();
586
+ const previous = scoped ? pragmaNumber(db, "busy_timeout") : null;
587
+ if (scoped)
588
+ db.exec(`PRAGMA busy_timeout=${lease ? Math.floor(Math.min(lease.remainingWaitMs, lease.guard?.remainingMs() ?? Infinity)) : SHORT_BUSY_TIMEOUT_MS}`);
576
589
  const started = performance.now();
590
+ let completed = false;
577
591
  try {
578
- return operation();
592
+ const result = operation();
593
+ completed = true;
594
+ return result;
579
595
  } catch (error) {
580
596
  if (lease && isTransientSqliteError2(error))
581
597
  throw new SqliteAcquisitionBusyError2(error, "autocommit");
582
598
  throw error;
583
599
  } finally {
600
+ const elapsed = performance.now() - started;
584
601
  if (lease)
585
- lease.remainingWaitMs = Math.max(0, lease.remainingWaitMs - (performance.now() - started));
602
+ lease.remainingWaitMs = Math.max(0, lease.remainingWaitMs - elapsed);
586
603
  if (previous !== null)
587
604
  db.exec(`PRAGMA busy_timeout=${previous}`);
605
+ if (elapsed >= SLOW_WRITER_LOG_MS)
606
+ reportSqliteDiagnostic(`sqlite writer site=autocommit lane=${lease ? "foreground" : "background"} elapsed_ms=${Math.round(elapsed)} timing=statement_including_acquisition outcome=${completed ? "completed" : "failed"} caller=${writerCaller()}`);
588
607
  }
589
608
  }
590
609
  function acquireShort(db, acquire, site) {
@@ -630,24 +649,26 @@ function acquireShort(db, acquire, site) {
630
649
  }
631
650
  function endWriterTransaction(db, end, sql) {
632
651
  let ended = false;
633
- const endStarted = performance.now();
634
652
  try {
635
653
  const result = end();
636
654
  ended = true;
637
655
  return result;
638
656
  } finally {
639
657
  const open = openWriterTransactions.get(db);
640
- const endMs = performance.now() - endStarted;
641
658
  if (open && !isInTransaction(db)) {
642
659
  openWriterTransactions.delete(db);
643
660
  const holdMs = performance.now() - open.acquiredAt;
644
661
  if (open.acquireMs >= SLOW_WRITER_LOG_MS || holdMs >= SLOW_WRITER_LOG_MS) {
645
662
  const outcome = /^\s*ROLLBACK/i.test(sql) ? "rolled_back" : ended ? "committed" : "failed";
646
- reportSqliteDiagnostic(`sqlite writer site=${open.site} lane=${open.lane} acquire_ms=${Math.round(open.acquireMs)} hold_ms=${Math.round(holdMs)} end_ms=${Math.round(endMs)} attempts=${open.attempts} outcome=${outcome}`);
663
+ reportSqliteDiagnostic(`sqlite writer site=${open.site} lane=${open.lane} acquire_ms=${Math.round(open.acquireMs)} hold_ms=${Math.round(holdMs)} attempts=${open.attempts} outcome=${outcome} timing=through_commit_upper_bound caller=${writerCaller()}`);
647
664
  }
648
665
  }
649
666
  }
650
667
  }
668
+ function writerCaller() {
669
+ return new Error().stack?.split(`
670
+ `).find((line) => line.includes(" at ") && !/[/\\]sqlite\.[tj]s[:)]/.test(line) && !/\b(?:writerCaller|endWriterTransaction|withAutocommitTimeout|value)\b/.test(line))?.trim().replace(/\s+/g, "_") ?? "unknown";
671
+ }
651
672
  async function beginSqliteWriterAsync2(db, site) {
652
673
  const started = performance.now();
653
674
  let attempts = 0;
@@ -3,7 +3,7 @@ import {
3
3
  } from "./server-pavzsdc6.js";
4
4
  import {
5
5
  isTransientSqliteError2
6
- } from "./server-kb9nn0a0.js";
6
+ } from "./server-j8epsc0g.js";
7
7
  import {
8
8
  PROMOTABLE_CATEGORIES,
9
9
  CATEGORY_DEFAULT_TTL
@@ -14,10 +14,10 @@ import {
14
14
  } from "./server-t4k4qexw.js";
15
15
  import {
16
16
  managedAuthorityNoteRow
17
- } from "./server-8pqnnmf9.js";
17
+ } from "./server-hcvcxzx7.js";
18
18
  import {
19
19
  embedTextForProject2
20
- } from "./server-cjz51jm2.js";
20
+ } from "./server-fw31krgq.js";
21
21
  import {
22
22
  saveEmbeddingIfHashMatches
23
23
  } from "./server-4dhv7mqz.js";
@@ -30,7 +30,7 @@ import {
30
30
  buildWorkspaceMemorySqlFilter2,
31
31
  getMemoryById2,
32
32
  updateMemorySeenCount2
33
- } from "./server-7jzrrxap.js";
33
+ } from "./server-9yyqq3mm.js";
34
34
  import {
35
35
  computeNormalizedHash
36
36
  } from "./server-2bvekkfy.js";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./server-t4k4qexw.js";
5
5
  import {
6
6
  projectDirectoryKey
7
- } from "./server-2htmbqbv.js";
7
+ } from "./server-brhj8qtd.js";
8
8
  import {
9
9
  writeStorageFileAtomicSync
10
10
  } from "./server-fvnzcnww.js";