@cortexkit/opencode-magic-context 0.45.0 → 0.46.1

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 (396) hide show
  1. package/README.md +26 -0
  2. package/dist/{announcement-f75t58v9.js → announcement-y35wzg2r.js} +1 -1
  3. package/dist/config/index.d.ts.map +1 -1
  4. package/dist/config/live-run-config.d.ts.map +1 -1
  5. package/dist/config/migrate-config-location.d.ts.map +1 -1
  6. package/dist/config/schema/magic-context.d.ts +13 -7
  7. package/dist/config/schema/magic-context.d.ts.map +1 -1
  8. package/dist/{conflict-warning-hook-5yrz2r24.js → conflict-warning-hook-7fj2b9jw.js} +6 -5
  9. package/dist/context-sh2m2vde.js +4525 -0
  10. package/dist/{derive-budgets-a63zsm5c.js → derive-budgets-7nj7r1rv.js} +2 -2
  11. package/dist/embedding-worker.js +4 -4
  12. package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts +45 -0
  13. package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts.map +1 -0
  14. package/dist/features/magic-context/checkout-claim.d.ts +155 -0
  15. package/dist/features/magic-context/checkout-claim.d.ts.map +1 -0
  16. package/dist/features/magic-context/compaction-marker.d.ts +20 -3
  17. package/dist/features/magic-context/compaction-marker.d.ts.map +1 -1
  18. package/dist/features/magic-context/compartment-storage.d.ts +23 -2
  19. package/dist/features/magic-context/compartment-storage.d.ts.map +1 -1
  20. package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
  21. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
  22. package/dist/features/magic-context/dreamer/provider-output-failure.d.ts +6 -2
  23. package/dist/features/magic-context/dreamer/provider-output-failure.d.ts.map +1 -1
  24. package/dist/features/magic-context/dreamer/provider-output-failure.test-support.d.ts +30 -0
  25. package/dist/features/magic-context/dreamer/provider-output-failure.test-support.d.ts.map +1 -0
  26. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
  27. package/dist/features/magic-context/dreamer/task-executor.d.ts +9 -0
  28. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  29. package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
  30. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  31. package/dist/features/magic-context/dreamer/verify-diff.d.ts.map +1 -1
  32. package/dist/features/magic-context/dreamer/verify-gate.d.ts.map +1 -1
  33. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  34. package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
  35. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  36. package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
  37. package/dist/features/magic-context/memory/storage-memory-verifications.d.ts.map +1 -1
  38. package/dist/features/magic-context/memory/storage-memory.d.ts +3 -0
  39. package/dist/features/magic-context/memory/storage-memory.d.ts.map +1 -1
  40. package/dist/features/magic-context/memory/verification-paths.d.ts +2 -2
  41. package/dist/features/magic-context/memory/verification-paths.d.ts.map +1 -1
  42. package/dist/features/magic-context/merged-reasoning-decisions.d.ts.map +1 -1
  43. package/dist/features/magic-context/message-index-async.d.ts +3 -3
  44. package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
  45. package/dist/features/magic-context/message-index.d.ts +2 -0
  46. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  47. package/dist/features/magic-context/migration-v95-perf-indexes.d.ts +12 -0
  48. package/dist/features/magic-context/migration-v95-perf-indexes.d.ts.map +1 -0
  49. package/dist/features/magic-context/migration-worker-client.d.ts +4 -4
  50. package/dist/features/magic-context/migration-worker-client.d.ts.map +1 -1
  51. package/dist/features/magic-context/migrations.d.ts +1 -0
  52. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  53. package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
  54. package/dist/features/magic-context/mural/resolve-mural.d.ts +15 -4
  55. package/dist/features/magic-context/mural/resolve-mural.d.ts.map +1 -1
  56. package/dist/features/magic-context/mural/source-revision.d.ts +7 -0
  57. package/dist/features/magic-context/mural/source-revision.d.ts.map +1 -0
  58. package/dist/features/magic-context/mural/storage-mural-cues.d.ts.map +1 -1
  59. package/dist/features/magic-context/reclaim-protection.d.ts +15 -10
  60. package/dist/features/magic-context/reclaim-protection.d.ts.map +1 -1
  61. package/dist/features/magic-context/session-cache-ttl.d.ts +4 -2
  62. package/dist/features/magic-context/session-cache-ttl.d.ts.map +1 -1
  63. package/dist/features/magic-context/smart-notes/capabilities.d.ts +3 -0
  64. package/dist/features/magic-context/smart-notes/capabilities.d.ts.map +1 -1
  65. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  66. package/dist/features/magic-context/smart-notes/github-token.d.ts +5 -0
  67. package/dist/features/magic-context/smart-notes/github-token.d.ts.map +1 -0
  68. package/dist/features/magic-context/smart-notes/runner.d.ts +1 -0
  69. package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
  70. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts +12 -0
  71. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts.map +1 -1
  72. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts +6 -0
  73. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts.map +1 -1
  74. package/dist/features/magic-context/smart-notes/storage.d.ts.map +1 -1
  75. package/dist/features/magic-context/smart-notes/types.d.ts +2 -0
  76. package/dist/features/magic-context/smart-notes/types.d.ts.map +1 -1
  77. package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
  78. package/dist/features/magic-context/storage-db.d.ts +6 -9
  79. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  80. package/dist/features/magic-context/storage-meta-shared.d.ts +1 -1
  81. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  82. package/dist/features/magic-context/storage-ops.d.ts +8 -1
  83. package/dist/features/magic-context/storage-ops.d.ts.map +1 -1
  84. package/dist/features/magic-context/storage-replay-document.d.ts +7 -0
  85. package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
  86. package/dist/features/magic-context/storage-schema-helpers.d.ts +2 -0
  87. package/dist/features/magic-context/storage-schema-helpers.d.ts.map +1 -1
  88. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  89. package/dist/features/magic-context/storage-source.d.ts.map +1 -1
  90. package/dist/features/magic-context/storage-tags.d.ts +11 -3
  91. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  92. package/dist/features/magic-context/storage.d.ts +2 -2
  93. package/dist/features/magic-context/storage.d.ts.map +1 -1
  94. package/dist/features/magic-context/temporal-decisions.d.ts +10 -0
  95. package/dist/features/magic-context/temporal-decisions.d.ts.map +1 -0
  96. package/dist/features/magic-context/tool-definition-tokens.d.ts +2 -0
  97. package/dist/features/magic-context/tool-definition-tokens.d.ts.map +1 -1
  98. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  99. package/dist/features/magic-context/types.d.ts +7 -6
  100. package/dist/features/magic-context/types.d.ts.map +1 -1
  101. package/dist/features/magic-context/window-report-ledger.d.ts.map +1 -1
  102. package/dist/hooks/auto-update-checker/index.d.ts.map +1 -1
  103. package/dist/hooks/magic-context/apply-operations.d.ts +8 -0
  104. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  105. package/dist/hooks/magic-context/cache-busting-signals.d.ts +6 -3
  106. package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -1
  107. package/dist/hooks/magic-context/channel2-cycle.d.ts +2 -0
  108. package/dist/hooks/magic-context/channel2-cycle.d.ts.map +1 -1
  109. package/dist/hooks/magic-context/compaction-marker-manager.d.ts +7 -0
  110. package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
  111. package/dist/hooks/magic-context/compartment-prompt.d.ts +2 -2
  112. package/dist/hooks/magic-context/compartment-prompt.d.ts.map +1 -1
  113. package/dist/hooks/magic-context/compartment-render-epoch.d.ts +8 -0
  114. package/dist/hooks/magic-context/compartment-render-epoch.d.ts.map +1 -1
  115. package/dist/hooks/magic-context/compartment-runner-drop-queue.d.ts +18 -4
  116. package/dist/hooks/magic-context/compartment-runner-drop-queue.d.ts.map +1 -1
  117. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  118. package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -1
  119. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  120. package/dist/hooks/magic-context/ctx-reduce-availability.d.ts +12 -0
  121. package/dist/hooks/magic-context/ctx-reduce-availability.d.ts.map +1 -1
  122. package/dist/hooks/magic-context/decision-calibration.d.ts +3 -0
  123. package/dist/hooks/magic-context/decision-calibration.d.ts.map +1 -1
  124. package/dist/hooks/magic-context/default-protection-pressure.test-support.d.ts +37 -0
  125. package/dist/hooks/magic-context/default-protection-pressure.test-support.d.ts.map +1 -0
  126. package/dist/hooks/magic-context/drop-stale-reduce-calls.d.ts +4 -0
  127. package/dist/hooks/magic-context/drop-stale-reduce-calls.d.ts.map +1 -1
  128. package/dist/hooks/magic-context/edit-marker.d.ts.map +1 -1
  129. package/dist/hooks/magic-context/emergency-drop.d.ts +2 -0
  130. package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
  131. package/dist/hooks/magic-context/emergency-fail-closed.d.ts +21 -1
  132. package/dist/hooks/magic-context/emergency-fail-closed.d.ts.map +1 -1
  133. package/dist/hooks/magic-context/event-handler.d.ts +5 -0
  134. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  135. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +30 -1
  136. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  137. package/dist/hooks/magic-context/heuristic-cleanup.d.ts +2 -0
  138. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
  139. package/dist/hooks/magic-context/historian-prompt-fit.d.ts +4 -2
  140. package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -1
  141. package/dist/hooks/magic-context/hook.d.ts +2 -1
  142. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  143. package/dist/hooks/magic-context/inject-compartments.d.ts +9 -10
  144. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  145. package/dist/hooks/magic-context/lkg-measured-request.d.ts +69 -0
  146. package/dist/hooks/magic-context/lkg-measured-request.d.ts.map +1 -0
  147. package/dist/hooks/magic-context/lkg-persist.d.ts +2 -0
  148. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  149. package/dist/hooks/magic-context/lkg-replay-fit.d.ts +14 -0
  150. package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -1
  151. package/dist/hooks/magic-context/lkg-replay.d.ts +10 -1
  152. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  153. package/dist/hooks/magic-context/lkg-slot.d.ts +4 -0
  154. package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
  155. package/dist/hooks/magic-context/module-state-sync.d.ts +2 -0
  156. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  157. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  158. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  159. package/dist/hooks/magic-context/note-nudger.d.ts +17 -5
  160. package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
  161. package/dist/hooks/magic-context/read-session-chunk.d.ts +1 -1
  162. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  163. package/dist/hooks/magic-context/read-session-db.d.ts +1 -0
  164. package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -1
  165. package/dist/hooks/magic-context/read-session-formatting.d.ts +7 -0
  166. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  167. package/dist/hooks/magic-context/read-session-raw.d.ts +4 -0
  168. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
  169. package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts.map +1 -1
  170. package/dist/hooks/magic-context/recomp-orchestrator.d.ts +2 -0
  171. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
  172. package/dist/hooks/magic-context/reference-retrieval.d.ts +27 -17
  173. package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -1
  174. package/dist/hooks/magic-context/request-hook-order.d.ts +56 -0
  175. package/dist/hooks/magic-context/request-hook-order.d.ts.map +1 -0
  176. package/dist/hooks/magic-context/rust-mode-transform.d.ts +22 -3
  177. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  178. package/dist/hooks/magic-context/strip-content.d.ts +4 -2
  179. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  180. package/dist/hooks/magic-context/supersession-reclaim.d.ts +4 -0
  181. package/dist/hooks/magic-context/supersession-reclaim.d.ts.map +1 -1
  182. package/dist/hooks/magic-context/system-prompt-hash.d.ts +7 -0
  183. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  184. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts +12 -3
  185. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  186. package/dist/hooks/magic-context/temporal-awareness.d.ts +6 -3
  187. package/dist/hooks/magic-context/temporal-awareness.d.ts.map +1 -1
  188. package/dist/hooks/magic-context/temporal-served-projection.d.ts +4 -0
  189. package/dist/hooks/magic-context/temporal-served-projection.d.ts.map +1 -0
  190. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  191. package/dist/hooks/magic-context/tool-reclaim.d.ts +2 -0
  192. package/dist/hooks/magic-context/tool-reclaim.d.ts.map +1 -1
  193. package/dist/hooks/magic-context/transform-message-helpers.d.ts +5 -0
  194. package/dist/hooks/magic-context/transform-message-helpers.d.ts.map +1 -1
  195. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +41 -17
  196. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  197. package/dist/hooks/magic-context/transform.d.ts +12 -0
  198. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  199. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  200. package/dist/{index-vvtfyw1z.js → index-0d3g3461.js} +5 -13
  201. package/dist/index-1bc61ans.js +154 -0
  202. package/dist/{index-n96ag4rk.js → index-1zx87sdm.js} +5 -1
  203. package/dist/{index-4krbw8z9.js → index-3h0ybwah.js} +608 -102
  204. package/dist/{index-gd5qx1j9.js → index-5eqk6z3s.js} +62 -1
  205. package/dist/index-5gq3b2ya.js +494 -0
  206. package/dist/{index-8fgkmxmy.js → index-5p8jdswx.js} +4 -3
  207. package/dist/{index-75zjgwga.js → index-7qw742ev.js} +1 -1
  208. package/dist/{index-f85teqck.js → index-8da2zjhz.js} +3 -256
  209. package/dist/{index-q7yesyk9.js → index-8x2v7gg9.js} +25 -24
  210. package/dist/{index-w9jwmntv.js → index-b35pxds2.js} +9 -1
  211. package/dist/{v2/server-a4m2b1yv.js → index-fg34g6a5.js} +55 -1
  212. package/dist/index-hpecdzec.js +28506 -0
  213. package/dist/{index-2ntg5sd4.js → index-k5bdx1bx.js} +9 -5
  214. package/dist/{index-bmzf7zxv.js → index-majxda46.js} +23 -5
  215. package/dist/{index-2aq21j41.js → index-pkbcrdqs.js} +418 -127
  216. package/dist/{index-remp7e2g.js → index-q4yp4b52.js} +16 -1
  217. package/dist/{index-fr2z4qy8.js → index-r5hmbx3t.js} +132 -169
  218. package/dist/index-sfnj6h8h.js +259 -0
  219. package/dist/{index-xgt9k6c6.js → index-sgthv3f7.js} +2 -1
  220. package/dist/index-sj29b3z2.js +30 -0
  221. package/dist/{index-16ny736w.js → index-sjthx78w.js} +20526 -19817
  222. package/dist/index.d.ts.map +1 -1
  223. package/dist/index.js +1983 -33118
  224. package/dist/{message-time-backfill-an311pmk.js → message-time-backfill-68gj6t3e.js} +2 -2
  225. package/dist/migration-worker.js +12 -7
  226. package/dist/plugin/dream-timer.d.ts +25 -1
  227. package/dist/plugin/dream-timer.d.ts.map +1 -1
  228. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -1
  229. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  230. package/dist/plugin/messages-transform.d.ts +13 -0
  231. package/dist/plugin/messages-transform.d.ts.map +1 -1
  232. package/dist/plugin/rpc-handlers.d.ts +4 -0
  233. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  234. package/dist/plugin/subagent-tool-policy.d.ts +14 -0
  235. package/dist/plugin/subagent-tool-policy.d.ts.map +1 -0
  236. package/dist/plugin/tool-registry.d.ts +1 -0
  237. package/dist/plugin/tool-registry.d.ts.map +1 -1
  238. package/dist/{read-session-chunk-8rxs0tc9.js → read-session-chunk-egz7r68d.js} +8 -8
  239. package/dist/{recomp-orchestrator-nzamtw29.js → recomp-orchestrator-y15j0rb9.js} +15 -15
  240. package/dist/{send-session-notification-nqpv7cne.js → send-session-notification-dyw42dtr.js} +4 -4
  241. package/dist/shared/announcement.d.ts.map +1 -1
  242. package/dist/shared/cache-ttl-display.d.ts +6 -4
  243. package/dist/shared/cache-ttl-display.d.ts.map +1 -1
  244. package/dist/shared/model-cache-ttl.d.ts +1 -1
  245. package/dist/shared/model-cache-ttl.d.ts.map +1 -1
  246. package/dist/shared/model-suggestion-retry.d.ts +2 -0
  247. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  248. package/dist/shared/models-dev-cache.d.ts.map +1 -1
  249. package/dist/shared/protected-tools-policy.d.ts +6 -0
  250. package/dist/shared/protected-tools-policy.d.ts.map +1 -0
  251. package/dist/shared/quota-diagnostic.d.ts +4 -0
  252. package/dist/shared/quota-diagnostic.d.ts.map +1 -0
  253. package/dist/shared/rpc-server.d.ts.map +1 -1
  254. package/dist/shared/sqlite-context-pragmas.d.ts +12 -0
  255. package/dist/shared/sqlite-context-pragmas.d.ts.map +1 -0
  256. package/dist/shared/sqlite-helpers.d.ts +9 -0
  257. package/dist/shared/sqlite-helpers.d.ts.map +1 -1
  258. package/dist/shared/sqlite.d.ts +10 -0
  259. package/dist/shared/sqlite.d.ts.map +1 -1
  260. package/dist/shared/status-summary.d.ts +1 -0
  261. package/dist/shared/status-summary.d.ts.map +1 -1
  262. package/dist/shared/status-view-check.d.ts.map +1 -1
  263. package/dist/shared/status-view.d.ts +4 -0
  264. package/dist/shared/status-view.d.ts.map +1 -1
  265. package/dist/shared/storage-permissions.d.ts +24 -0
  266. package/dist/shared/storage-permissions.d.ts.map +1 -1
  267. package/dist/shared/temporal-upgrade-fixture.d.ts +19 -0
  268. package/dist/shared/temporal-upgrade-fixture.d.ts.map +1 -0
  269. package/dist/shared/user-facing-codes.d.ts +5 -0
  270. package/dist/shared/user-facing-codes.d.ts.map +1 -1
  271. package/dist/shared/write-transaction-timing.d.ts +8 -1
  272. package/dist/shared/write-transaction-timing.d.ts.map +1 -1
  273. package/dist/tools/ctx-expand/render.d.ts.map +1 -1
  274. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  275. package/dist/tools/ctx-reduce/constants.d.ts +2 -0
  276. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
  277. package/dist/tools/ctx-reduce/tools.d.ts +4 -4
  278. package/dist/tools/ctx-reduce/tools.d.ts.map +1 -1
  279. package/dist/{transform-postprocess-phase-414phndq.js → transform-postprocess-phase-bqhz6vdr.js} +15 -15
  280. package/dist/v2/context-zecmzk5s.js +52209 -0
  281. package/dist/v2/{derive-budgets-v0krf3t7.js → derive-budgets-kdgp4s3r.js} +4 -3
  282. package/dist/v2/embedding-worker.js +6 -5
  283. package/dist/v2/fold/boundary.d.ts +2 -0
  284. package/dist/v2/fold/boundary.d.ts.map +1 -1
  285. package/dist/v2/fold/owner.d.ts.map +1 -1
  286. package/dist/v2/hidden-child-native.d.ts +7 -0
  287. package/dist/v2/hidden-child-native.d.ts.map +1 -1
  288. package/dist/v2/hidden-child-record.d.ts +8 -0
  289. package/dist/v2/hidden-child-record.d.ts.map +1 -1
  290. package/dist/v2/hidden-completion.d.ts.map +1 -1
  291. package/dist/v2/hooks/channel2.d.ts +2 -0
  292. package/dist/v2/hooks/channel2.d.ts.map +1 -1
  293. package/dist/v2/hooks/context.d.ts +2 -2
  294. package/dist/v2/hooks/context.d.ts.map +1 -1
  295. package/dist/v2/hooks/dream-timer.d.ts +39 -0
  296. package/dist/v2/hooks/dream-timer.d.ts.map +1 -0
  297. package/dist/v2/hooks/dream-trigger.d.ts +15 -1
  298. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  299. package/dist/v2/hooks/hidden-child.d.ts +54 -3
  300. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  301. package/dist/v2/hooks/payload.d.ts.map +1 -1
  302. package/dist/v2/hooks/store.d.ts.map +1 -1
  303. package/dist/v2/hooks/tools.d.ts +1 -1
  304. package/dist/v2/hooks/tools.d.ts.map +1 -1
  305. package/dist/v2/hooks/types.d.ts +12 -1
  306. package/dist/v2/hooks/types.d.ts.map +1 -1
  307. package/dist/v2/hooks/update-check.d.ts.map +1 -1
  308. package/dist/v2/{message-time-backfill-0n93vrd7.js → message-time-backfill-r6qkem1x.js} +3 -3
  309. package/dist/v2/migration-worker.js +13 -8
  310. package/dist/v2/{read-session-chunk-hjza38hr.js → read-session-chunk-8vjp6581.js} +9 -9
  311. package/dist/v2/recomp-orchestrator-8ejxvrzz.js +39 -0
  312. package/dist/v2/{safe-notification-target-wtj0bbc2.js → safe-notification-target-eb1n1vfb.js} +2 -2
  313. package/dist/v2/{send-session-notification-mq9frrtm.js → send-session-notification-qs0j78v6.js} +6 -6
  314. package/dist/v2/server-14vq4kpm.js +30 -0
  315. package/dist/v2/server-1bc61ans.js +154 -0
  316. package/dist/v2/{server-n96ag4rk.js → server-1zx87sdm.js} +5 -1
  317. package/dist/v2/server-3n4q9xme.js +79 -0
  318. package/dist/v2/{server-rhdgxp1t.js → server-51dv1pr5.js} +63 -2
  319. package/dist/v2/{server-5317ykaf.js → server-6r257mf5.js} +1 -1
  320. package/dist/v2/server-84w6rvvf.js +14 -0
  321. package/dist/v2/{server-qpg6wf72.js → server-ajzeteqw.js} +9 -1
  322. package/dist/v2/server-c5gz8wph.js +3892 -0
  323. package/dist/v2/{server-v5xgft5v.js → server-e29d7p7c.js} +188 -3533
  324. package/dist/{index-a4m2b1yv.js → v2/server-fg34g6a5.js} +55 -1
  325. package/dist/v2/{server-e36nf2p1.js → server-frbm99q5.js} +1595 -1599
  326. package/dist/v2/{server-remp7e2g.js → server-g0fjrkta.js} +16 -1
  327. package/dist/v2/{server-c4g2y1z8.js → server-jc7y02q0.js} +2816 -5392
  328. package/dist/v2/{server-z19x7eqz.js → server-mcfawjgc.js} +4 -4
  329. package/dist/v2/{server-hfjfbg59.js → server-qp5hx1ad.js} +608 -105
  330. package/dist/v2/server-vs5gpnd4.js +493 -0
  331. package/dist/v2/{server-w99cyt6a.js → server-wvjvfhck.js} +14 -6
  332. package/dist/v2/server-xa4xe3rv.js +3351 -0
  333. package/dist/v2/{server-0jqw05sa.js → server-y8maxeft.js} +6 -84
  334. package/dist/v2/server.d.ts.map +1 -1
  335. package/dist/v2/server.js +104 -49288
  336. package/dist/v2/store-reader.d.ts +39 -1
  337. package/dist/v2/store-reader.d.ts.map +1 -1
  338. package/dist/v2/tool-result.d.ts +8 -0
  339. package/dist/v2/tool-result.d.ts.map +1 -0
  340. package/dist/v2/tui/index.d.ts.map +1 -1
  341. package/dist/v2/{wrapup-orchestrator-tbyx78dz.js → wrapup-orchestrator-0snhvwcv.js} +20 -16
  342. package/dist/wrapup-orchestrator-39amhv9s.js +26 -0
  343. package/package.json +26 -10
  344. package/src/config/index.ts +21 -4
  345. package/src/config/latch-permanence-guard.test.ts +6 -1
  346. package/src/config/live-run-config.ts +1 -0
  347. package/src/config/migrate-config-location.test.ts +31 -1
  348. package/src/config/migrate-config-location.ts +8 -41
  349. package/src/config/protected-tools.test.ts +70 -0
  350. package/src/config/raw-loader.test.ts +15 -0
  351. package/src/config/raw-loader.ts +1 -1
  352. package/src/config/removed-agent-source-fence.test.ts +10 -1
  353. package/src/config/schema/magic-context.test.ts +20 -1
  354. package/src/config/schema/magic-context.ts +26 -7
  355. package/src/shared/announcement.ts +6 -5
  356. package/src/shared/cache-ttl-display.test.ts +1 -1
  357. package/src/shared/cache-ttl-display.ts +17 -16
  358. package/src/shared/fold-render-lock-fence.test.ts +84 -0
  359. package/src/shared/fold-render-lock-fixtures.test.ts +276 -0
  360. package/src/shared/model-cache-ttl.test.ts +2 -2
  361. package/src/shared/model-cache-ttl.ts +8 -4
  362. package/src/shared/model-suggestion-retry.test.ts +104 -1
  363. package/src/shared/model-suggestion-retry.ts +63 -6
  364. package/src/shared/models-dev-cache.ts +3 -11
  365. package/src/shared/protected-tools-policy.ts +23 -0
  366. package/src/shared/quota-diagnostic.ts +9 -0
  367. package/src/shared/rpc-server.ts +6 -54
  368. package/src/shared/sqlite-context-pragmas.test.ts +105 -0
  369. package/src/shared/sqlite-context-pragmas.ts +24 -0
  370. package/src/shared/sqlite-helpers.ts +17 -0
  371. package/src/shared/sqlite.ts +75 -0
  372. package/src/shared/status-detail-text.test.ts +18 -1
  373. package/src/shared/status-summary.ts +11 -0
  374. package/src/shared/status-view-check.ts +5 -0
  375. package/src/shared/status-view.test.ts +11 -2
  376. package/src/shared/status-view.ts +12 -1
  377. package/src/shared/storage-permissions.test.ts +204 -0
  378. package/src/shared/storage-permissions.ts +192 -0
  379. package/src/shared/temporal-upgrade-fixture.ts +50 -0
  380. package/src/shared/user-facing-codes.ts +6 -0
  381. package/src/shared/write-transaction-timing.test.ts +39 -0
  382. package/src/shared/write-transaction-timing.ts +25 -1
  383. package/src/tui/dialogs/status-dialog-render.test.ts +1 -1
  384. package/src/tui/index.tsx +3 -1
  385. package/src/tui/startup-order.test.ts +16 -0
  386. package/src/tui-compiled/index.tsx +3 -1
  387. package/src/v2/tui/index.ts +9 -2
  388. package/dist/index-anq4nn6f.js +0 -131
  389. package/dist/index-e44zzy84.js +0 -10
  390. package/dist/index-x23gah8c.js +0 -16
  391. package/dist/v2/recomp-orchestrator-1aq7h44c.js +0 -36
  392. package/dist/v2/server-e44zzy84.js +0 -10
  393. package/dist/v2/server-fgmxwrgy.js +0 -16
  394. package/dist/v2/server-r7cmye3k.js +0 -131
  395. package/dist/wrapup-orchestrator-h28bqsy6.js +0 -26
  396. package/dist/v2/{server-ckpc8pxy.js → server-1qbnzc80.js} +8 -8
@@ -1,3 +1,9 @@
1
+ import {
2
+ UNKNOWN_FIT_RATIO,
3
+ resolveDecisionCalibration,
4
+ hasMeasuredDecisionCalibration,
5
+ providerMass
6
+ } from "./server-1zx87sdm.js";
1
7
  import {
2
8
  OMO_INTERNAL_INITIATOR_MARKER,
3
9
  isSystemDirective,
@@ -5,43 +11,70 @@ import {
5
11
  extractTexts2,
6
12
  extractToolResultBodyTokens,
7
13
  extractToolCallSummaries,
14
+ hasTokenizerForFit,
15
+ tokenCountUsesByteBound,
8
16
  estimateTokens,
17
+ createTokenCountMemo,
9
18
  normalizeText,
10
19
  compactRole,
11
20
  formatBlock,
12
21
  compactTextForSummary,
13
22
  mergeCommitHashes
14
- } from "./server-rhdgxp1t.js";
23
+ } from "./server-51dv1pr5.js";
15
24
  import {
16
- getHarness
17
- } from "./server-ckpc8pxy.js";
25
+ getHarness,
26
+ sessionLog
27
+ } from "./server-1qbnzc80.js";
18
28
  import {
19
- renderToolTemplate
20
- } from "./server-remp7e2g.js";
29
+ stableStringify,
30
+ tagOrderConstraintIndex,
31
+ getToolDefinitionMeasurementSignature,
32
+ getLargestMeasuredToolDefinitionTokens,
33
+ getMeasuredToolDefinitionTokens
34
+ } from "./server-vs5gpnd4.js";
35
+ import {
36
+ renderToolTemplate,
37
+ DEFAULT_PROTECTED_TOOLS,
38
+ normalizeProtectedToolName,
39
+ mergeProtectedTools
40
+ } from "./server-g0fjrkta.js";
21
41
  import {
22
42
  openCodeDbExists,
23
43
  withReadOnlySessionDb,
24
44
  getRawSessionMessageCountFromDb,
25
45
  getMessageTimesFromOpenCodeDb
26
- } from "./server-w99cyt6a.js";
27
- import {
28
- stableStringify,
29
- getLargestMeasuredToolDefinitionTokens,
30
- getMeasuredToolDefinitionTokens
31
- } from "./server-r7cmye3k.js";
32
- import {
33
- UNKNOWN_FIT_RATIO,
34
- resolveDecisionCalibration,
35
- providerMass
36
- } from "./server-n96ag4rk.js";
46
+ } from "./server-wvjvfhck.js";
37
47
  import {
38
48
  canonicalModelIdentity
39
49
  } from "./server-avwt563y.js";
40
50
 
41
51
  // src/features/magic-context/reclaim-protection.ts
42
- var CTX_REDUCE_KEEP = 3;
43
- function newestCtxReduceTagNumbers(tags) {
44
- return new Set(tags.filter((tag) => tag.toolName === "ctx_reduce").sort((left, right) => right.tagNumber - left.tagNumber).slice(0, CTX_REDUCE_KEEP).map((tag) => tag.tagNumber));
52
+ var CTX_REDUCE_KEEP = DEFAULT_PROTECTED_TOOLS.ctx_reduce;
53
+ function adoptedProtectedToolsPolicy(current, previous, rebuilding, hasBaseline) {
54
+ if (rebuilding || !hasBaseline)
55
+ return mergeProtectedTools(current);
56
+ return { ...previous ?? { todowrite: 0, ctx_reduce: 3 } };
57
+ }
58
+ function protectedToolTagNumbers(tags, protectedTools) {
59
+ const counts = mergeProtectedTools(protectedTools);
60
+ const protectedTags = new Set;
61
+ for (const tag of [...tags].sort((left, right) => right.tagNumber - left.tagNumber)) {
62
+ if (tag.status !== undefined && tag.status !== "active")
63
+ continue;
64
+ if (tag.type !== undefined && tag.type !== "tool")
65
+ continue;
66
+ const name = normalizeProtectedToolName(tag.toolName);
67
+ if (!Object.hasOwn(counts, name) || counts[name] <= 0)
68
+ continue;
69
+ protectedTags.add(tag.tagNumber);
70
+ counts[name] -= 1;
71
+ }
72
+ return protectedTags;
73
+ }
74
+ function protectedToolTokenCount(tags, counts, calibration) {
75
+ const protectedTags = protectedToolTagNumbers(tags, counts);
76
+ const tokens = tags.reduce((sum, tag) => sum + (protectedTags.has(tag.tagNumber) ? tag.tokenCount ?? 0 : 0), 0);
77
+ return calibration && hasMeasuredDecisionCalibration(calibration) ? providerMass({ tools: tokens }, calibration) : 0;
45
78
  }
46
79
 
47
80
  // src/hooks/magic-context/tag-content-primitives.ts
@@ -413,6 +446,7 @@ function isTodoItem(value) {
413
446
  var MAX_CONTENT_MEMO_ENTRIES = 1e5;
414
447
  var MAX_CONTENT_MEMO_BYTES = 64 * 1024 * 1024;
415
448
  var contentMemo = new Map;
449
+ var contentMemoOrder = new Set;
416
450
  var contentMemoBytes = 0;
417
451
  var FNV1A_32_OFFSET = 2166136261;
418
452
  var FNV1A_32_PRIME = 16777619;
@@ -434,25 +468,38 @@ function fnv1a32(value) {
434
468
  return hash.toString(16).padStart(8, "0");
435
469
  }
436
470
  function memoizedContent(kind, content) {
437
- const key = `${kind}\x00${content}`;
438
- const cached = contentMemo.get(key);
471
+ let byContent = contentMemo.get(kind);
472
+ if (!byContent) {
473
+ byContent = new Map;
474
+ contentMemo.set(kind, byContent);
475
+ }
476
+ const cached = byContent.get(content);
439
477
  if (cached)
440
478
  return cached;
479
+ let hash = FNV1A_32_OFFSET;
480
+ for (const segment of [kind, "\x00", content]) {
481
+ for (let index = 0;index < segment.length; index += 1) {
482
+ hash ^= segment.charCodeAt(index);
483
+ hash = Math.imul(hash, FNV1A_32_PRIME) >>> 0;
484
+ }
485
+ }
441
486
  const measured = {
442
- hash: fnv1a32(key),
487
+ hash: hash.toString(16).padStart(8, "0"),
443
488
  tokens: kind === "excluded" ? 0 : undefined,
444
- keyBytes: key.length * 2 + 32
489
+ keyBytes: (kind.length + 1 + content.length) * 2 + 32,
490
+ kind,
491
+ content
445
492
  };
446
- contentMemo.set(key, measured);
493
+ byContent.set(content, measured);
494
+ contentMemoOrder.add(measured);
447
495
  contentMemoBytes += measured.keyBytes;
448
- while (contentMemo.size > MAX_CONTENT_MEMO_ENTRIES || contentMemoBytes > MAX_CONTENT_MEMO_BYTES) {
449
- const oldest = contentMemo.keys().next().value;
450
- if (typeof oldest !== "string")
496
+ while (contentMemoOrder.size > MAX_CONTENT_MEMO_ENTRIES || contentMemoBytes > MAX_CONTENT_MEMO_BYTES) {
497
+ const oldest = contentMemoOrder.values().next().value;
498
+ if (!oldest)
451
499
  break;
452
- const removed = contentMemo.get(oldest);
453
- if (removed)
454
- contentMemoBytes -= removed.keyBytes;
455
- contentMemo.delete(oldest);
500
+ contentMemoBytes -= oldest.keyBytes;
501
+ contentMemo.get(oldest.kind)?.delete(oldest.content);
502
+ contentMemoOrder.delete(oldest);
456
503
  }
457
504
  return measured;
458
505
  }
@@ -624,9 +671,9 @@ function messageIdForTag(tag) {
624
671
  return tag.toolOwnerMessageId;
625
672
  return contentTagOwnerMessageId(tag.messageId);
626
673
  }
627
- function resolveProtectedTagNumbers(tags, protectedTagNumbersInput) {
674
+ function resolveProtectedTagNumbers(tags, protectedTagNumbersInput, protectedToolTags) {
628
675
  const protectedNumbers = new Set(protectedTagNumbersInput);
629
- const protectedCtxReduceTags = newestCtxReduceTagNumbers(tags.filter((tag) => tag.status === "active" && tag.type === "tool"));
676
+ const protectedCtxReduceTags = protectedToolTags ?? protectedToolTagNumbers(tags);
630
677
  for (const tagNumber of protectedCtxReduceTags)
631
678
  protectedNumbers.add(tagNumber);
632
679
  return protectedNumbers;
@@ -649,7 +696,7 @@ function neighborhoodConsistent(args) {
649
696
  return args.orphanTagNumber >= previousMax && args.orphanTagNumber <= nextMin;
650
697
  }
651
698
  function buildTagAttribution(args) {
652
- const protectedNumbers = resolveProtectedTagNumbers(args.tags, args.protectedTagNumbers);
699
+ const protectedNumbers = resolveProtectedTagNumbers(args.tags, args.protectedTagNumbers, args.protectedToolTags);
653
700
  const messageTags = new Map;
654
701
  const exactToolTags = new Map;
655
702
  const orphanTagsByCall = new Map;
@@ -808,19 +855,34 @@ function sameTailHygieneStructuralSignature(expected, actual) {
808
855
  return expected.partCounts.every((count, index) => count === actual.partCounts[index]);
809
856
  }
810
857
  function measureTailHygiene(input) {
858
+ return measureWithReplay(input);
859
+ }
860
+ function measureWithReplay(input, replay) {
811
861
  const pendingDropTagNumbers = input.pendingDropTagNumbers ?? new Set;
862
+ const unchanged = input.messages.map((message, index) => {
863
+ const previous = replay?.messages[index];
864
+ return previous !== undefined && sameReplayMessage(previous, message);
865
+ });
812
866
  const toolIdentities = collectToolPartIdentities(input.messages);
813
867
  const attribution = buildTagAttribution({
814
868
  messages: input.messages,
815
869
  tags: input.tags,
816
870
  toolIdentities,
817
- protectedTagNumbers: input.protectedTagNumbers
871
+ protectedTagNumbers: input.protectedTagNumbers,
872
+ protectedToolTags: input.protectedToolTags
873
+ });
874
+ const toolOutputs = input.messages.map((message, index) => message.parts.map((part, partIndex) => unchanged[index] ? replay?.measured.toolOutputs[index][partIndex] ?? null : isRecord(part) ? toolOutputText(part) : null));
875
+ const outputByPart = new Map;
876
+ input.messages.forEach((message, index) => {
877
+ message.parts.forEach((part, partIndex) => {
878
+ outputByPart.set(part, toolOutputs[index][partIndex]);
879
+ });
818
880
  });
819
881
  const droppedToolOwners = new Set;
820
882
  for (const [part, identity] of toolIdentities) {
821
883
  if (!isRecord(part))
822
884
  continue;
823
- const output = toolOutputText(part);
885
+ const output = outputByPart.get(part) ?? null;
824
886
  if (output !== null && isDropSentinel(output)) {
825
887
  droppedToolOwners.add(`${identity.ownerMessageId}\x00${identity.callId}`);
826
888
  }
@@ -829,11 +891,47 @@ function measureTailHygiene(input) {
829
891
  let t = 0;
830
892
  let u = 0;
831
893
  let newestMessagePartStart = 0;
894
+ const messagePartStarts = [];
832
895
  for (let messageIndex = 0;messageIndex < input.messages.length; messageIndex += 1) {
833
896
  const message = input.messages[messageIndex];
897
+ messagePartStarts.push(parts.length);
834
898
  if (messageIndex === input.messages.length - 1)
835
899
  newestMessagePartStart = parts.length;
836
900
  const messageKey = messageIdentity(message, messageIndex);
901
+ const priorMessage = replay?.messages[messageIndex];
902
+ const reusable = unchanged[messageIndex] && priorMessage && message.parts.every((part, index) => {
903
+ const current = toolIdentities.get(part);
904
+ const prior = replay?.measured.toolOwners.get(priorMessage.parts[index]);
905
+ if (!current || !prior)
906
+ return current === prior;
907
+ const currentKey = `${current.ownerMessageId}\x00${current.callId}`;
908
+ const priorKey = `${prior.ownerMessageId}\x00${prior.callId}`;
909
+ return currentKey === priorKey && droppedToolOwners.has(currentKey) === replay?.measured.droppedToolOwners.has(priorKey);
910
+ });
911
+ if (reusable && replay) {
912
+ const start = replay.measured.messagePartStarts[messageIndex];
913
+ const end = replay.measured.messagePartStarts[messageIndex + 1] ?? replay.measured.parts.length;
914
+ for (let index = start;index < end; index += 1) {
915
+ const prior = replay.measured.parts[index];
916
+ const partIndex = Number(prior.key.slice(messageKey.length + 1).split("\x00")[0]);
917
+ const tag = prior.kind === "text" ? attribution.messageTags.get(`${message.info.id}:p${partIndex}`) : prior.kind === "file" ? attribution.messageTags.get(`${message.info.id}:file${partIndex}`) : prior.kind === "toolInput" || prior.kind === "toolOutput" ? attribution.toolTagsByPart.get(message.parts[partIndex]) : undefined;
918
+ const protectedPart = tag ? attribution.protectedNumbers.has(tag.tagNumber) : false;
919
+ const queuedForDrop = tag ? pendingDropTagNumbers.has(tag.tagNumber) : false;
920
+ const uTokens = tag?.status === "active" && !protectedPart && !queuedForDrop && prior.kind !== "excluded" ? prior.tokens : 0;
921
+ const measured = prior.tagNumber === (tag?.tagNumber ?? null) && prior.tagStatus === (tag?.status ?? null) && prior.protected === protectedPart && prior.queuedForDrop === queuedForDrop && prior.uTokens === uTokens ? prior : {
922
+ ...prior,
923
+ tagNumber: tag?.tagNumber ?? null,
924
+ tagStatus: tag?.status ?? null,
925
+ protected: protectedPart,
926
+ queuedForDrop,
927
+ uTokens
928
+ };
929
+ parts.push(measured);
930
+ t += measured.tokens;
931
+ u += measured.uTokens;
932
+ }
933
+ continue;
934
+ }
837
935
  const messageSynthetic = isSyntheticMessage(message);
838
936
  for (let partIndex = 0;partIndex < message.parts.length; partIndex += 1) {
839
937
  const part = message.parts[partIndex];
@@ -915,7 +1013,7 @@ function measureTailHygiene(input) {
915
1013
  t += measured.tokens;
916
1014
  u += measured.uTokens;
917
1015
  }
918
- const rawOutput = toolOutputText(part);
1016
+ const rawOutput = outputByPart.get(part) ?? null;
919
1017
  if (rawOutput !== null) {
920
1018
  const output = stripChannel1ReminderSpans(rawOutput);
921
1019
  if (isDropSentinel(output)) {
@@ -949,7 +1047,11 @@ function measureTailHygiene(input) {
949
1047
  t: Math.max(0, t),
950
1048
  contentSignature: contentSignature(parts),
951
1049
  parts,
952
- newestMessagePartStart
1050
+ newestMessagePartStart,
1051
+ messagePartStarts,
1052
+ toolOutputs,
1053
+ toolOwners: toolIdentities,
1054
+ droppedToolOwners
953
1055
  };
954
1056
  }
955
1057
  function messageIdFromPartKey(key) {
@@ -1056,6 +1158,20 @@ function sameReplayValue(before, after) {
1056
1158
  }
1057
1159
  return true;
1058
1160
  }
1161
+ function copyReplayValue(value) {
1162
+ if (Array.isArray(value))
1163
+ return value.map(copyReplayValue);
1164
+ if (value !== null && typeof value === "object") {
1165
+ const prototype = Object.getPrototypeOf(value);
1166
+ if (prototype !== Object.prototype && prototype !== null)
1167
+ return structuredClone(value);
1168
+ const copy = Object.create(prototype);
1169
+ for (const key of Object.keys(value))
1170
+ copy[key] = copyReplayValue(value[key]);
1171
+ return copy;
1172
+ }
1173
+ return value;
1174
+ }
1059
1175
  function sameNumbers(before, after) {
1060
1176
  if (before.size !== after.size)
1061
1177
  return false;
@@ -1064,19 +1180,22 @@ function sameNumbers(before, after) {
1064
1180
  return false;
1065
1181
  return true;
1066
1182
  }
1183
+ function sameReplayMessage(left, right) {
1184
+ return left.info.id === right.info.id && left.info.role === right.info.role && left.info.summary === right.info.summary && sameReplayValue(left.parts, right.parts);
1185
+ }
1067
1186
  function sameReplayMessages(before, after) {
1068
1187
  if (before.length !== after.length)
1069
1188
  return false;
1070
1189
  for (let index = 0;index < before.length; index += 1) {
1071
1190
  const left = before[index];
1072
1191
  const right = after[index];
1073
- if (left.info.id !== right.info.id || left.info.role !== right.info.role || left.info.summary !== right.info.summary || !sameReplayValue(left.parts, right.parts))
1192
+ if (!sameReplayMessage(left, right))
1074
1193
  return false;
1075
1194
  }
1076
1195
  return true;
1077
1196
  }
1078
1197
  var baselineMeasurementMemo = new Map;
1079
- var MAX_BASELINE_MEMO_SIZE = 32 * 1024 * 1024;
1198
+ var MAX_BASELINE_MEMO_SIZE = 128 * 1024 * 1024;
1080
1199
  var baselineMemoSize = 0;
1081
1200
  function retainBaselineMeasurement(key, memo) {
1082
1201
  const previous = baselineMeasurementMemo.get(key);
@@ -1121,10 +1240,17 @@ function freezeTailHygieneMeasurement(measured) {
1121
1240
  };
1122
1241
  }
1123
1242
  function refreshTailHygieneBaseline(input) {
1243
+ const protectedToolsPolicy = adoptedProtectedToolsPolicy(input.protectedTools, input.previous?.protectedToolsPolicy, input.cacheBusting, !!input.previous);
1244
+ const protectedToolTags = protectedToolTagNumbers(input.tags, protectedToolsPolicy);
1245
+ input = {
1246
+ ...input,
1247
+ protectedToolTags,
1248
+ protectedTagNumbers: new Set([...input.protectedTagNumbers, ...protectedToolTags])
1249
+ };
1124
1250
  const pendingDropTagNumbers = input.pendingDropTagNumbers ?? new Set;
1125
1251
  const cached = input.previous ? baselineMeasurementMemo.get(input.previous.baselineParts) : undefined;
1126
1252
  const hit = !input.cacheBusting && cached && sameReplayMessages(cached.messages, input.messages) && sameReplayValue(cached.tags, input.tags) && sameNumbers(cached.protectedTagNumbers, input.protectedTagNumbers) && sameNumbers(cached.pendingDropTagNumbers, pendingDropTagNumbers);
1127
- const rawMeasured = hit ? cached.measured : measureTailHygiene(input);
1253
+ const rawMeasured = hit ? cached.measured : measureWithReplay(input, cached);
1128
1254
  const frozenCalibration = !input.cacheBusting && input.previous ? {
1129
1255
  toolsRatio: input.previous.toolsRatio,
1130
1256
  proseRatio: input.previous.proseRatio,
@@ -1143,26 +1269,38 @@ function refreshTailHygieneBaseline(input) {
1143
1269
  })
1144
1270
  };
1145
1271
  const memo = hit ? cached : {
1146
- messages: structuredClone(input.messages.map((message) => ({
1272
+ messages: input.messages.map((message, index) => cached?.messages[index] && sameReplayMessage(cached.messages[index], message) ? cached.messages[index] : {
1147
1273
  info: {
1148
1274
  id: message.info.id,
1149
1275
  role: message.info.role,
1150
1276
  summary: message.info.summary
1151
1277
  },
1152
- parts: message.parts
1153
- }))),
1278
+ parts: copyReplayValue(message.parts)
1279
+ }),
1154
1280
  tags: structuredClone(input.tags),
1155
1281
  protectedTagNumbers: new Set(input.protectedTagNumbers),
1156
1282
  pendingDropTagNumbers: new Set(pendingDropTagNumbers),
1157
1283
  measured: rawMeasured,
1158
1284
  size: 2 * structuralSize(input.messages) + 512 * input.tags.length
1159
1285
  };
1286
+ if (!hit) {
1287
+ const owners = new Map;
1288
+ input.messages.forEach((message, index) => {
1289
+ message.parts.forEach((part, partIndex) => {
1290
+ const identity = rawMeasured.toolOwners.get(part);
1291
+ if (identity)
1292
+ owners.set(memo.messages[index].parts[partIndex], identity);
1293
+ });
1294
+ });
1295
+ rawMeasured.toolOwners = owners;
1296
+ }
1160
1297
  const now = input.now ?? Date.now();
1161
1298
  const refrozen = (mismatch) => {
1162
1299
  const frozen = freezeTailHygieneMeasurement(measured);
1163
1300
  retainBaselineMeasurement(frozen.baselineParts, memo);
1164
1301
  return {
1165
1302
  ...frozen,
1303
+ protectedToolsPolicy,
1166
1304
  hygieneUnitsVersion: frozenCalibration.hygieneUnitsVersion,
1167
1305
  toolsRatio: frozenCalibration.toolsRatio,
1168
1306
  proseRatio: frozenCalibration.proseRatio,
@@ -1191,6 +1329,7 @@ function refreshTailHygieneBaseline(input) {
1191
1329
  }
1192
1330
  return {
1193
1331
  ...input.previous,
1332
+ protectedToolsPolicy,
1194
1333
  turnDeltaU,
1195
1334
  turnDeltaT,
1196
1335
  evaluable: true,
@@ -1210,6 +1349,11 @@ function assertTailHygieneContentUnchanged(input) {
1210
1349
  throw new Error(`tail hygiene walk was not the last byte-affecting operation: expected ${input.expectedSignature}, got ${actual}`);
1211
1350
  }
1212
1351
  }
1352
+ function assertTailHygieneContentUnchangedIfEnabled(input) {
1353
+ if (process.env.MAGIC_CONTEXT_DEBUG_ASSERTIONS === "1") {
1354
+ assertTailHygieneContentUnchanged(input);
1355
+ }
1356
+ }
1213
1357
 
1214
1358
  // src/hooks/magic-context/ctx-reduce-nudge.ts
1215
1359
  var CHANNEL1_SENTINEL = "<system-reminder>";
@@ -1599,7 +1743,7 @@ function planEmergencyDrop(input) {
1599
1743
  reserved.add(nums[i]);
1600
1744
  }
1601
1745
  }
1602
- const protectedCtxReduceTags = newestCtxReduceTagNumbers(floorTags.filter((tag) => tag.status === "active" && tag.type === "tool"));
1746
+ const protectedTags = input.protectedToolTags ?? protectedToolTagNumbers(floorTags, input.protectedTools);
1603
1747
  const byTier = { 1: [], 2: [], 3: [] };
1604
1748
  for (const tag of tags) {
1605
1749
  if (tag.status !== "active" || tag.type !== "tool")
@@ -1610,7 +1754,7 @@ function planEmergencyDrop(input) {
1610
1754
  continue;
1611
1755
  }
1612
1756
  }
1613
- if (protectedCtxReduceTags.has(tag.tagNumber))
1757
+ if (protectedTags.has(tag.tagNumber))
1614
1758
  continue;
1615
1759
  const tier = resolveToolTier(tag.toolName);
1616
1760
  if ((tier === 1 || tier === 2) && reserved.has(tag.tagNumber))
@@ -1655,6 +1799,124 @@ function measureEmergencyTag(tag, target, calibration, skeleton) {
1655
1799
  return { ...tag, servedTokens: served, reclaimableTokens: 0 };
1656
1800
  }
1657
1801
 
1802
+ // src/features/magic-context/storage-ops.ts
1803
+ var queuePendingOpStatements = new WeakMap;
1804
+ var queueUnchangedDropStatements = new WeakMap;
1805
+ var getPendingOpsStatements = new WeakMap;
1806
+ var getPendingOpsCountStatements = new WeakMap;
1807
+ var hasPendingDropOpsStatements = new WeakMap;
1808
+ var clearPendingOpsStatements = new WeakMap;
1809
+ var removePendingOpStatements = new WeakMap;
1810
+ function getQueuePendingOpStatement(db) {
1811
+ let stmt = queuePendingOpStatements.get(db);
1812
+ if (!stmt) {
1813
+ stmt = db.prepare(`INSERT INTO pending_ops (session_id, tag_id, operation, queued_at, harness)
1814
+ SELECT ?, ?, ?, ?, ? WHERE NOT EXISTS (
1815
+ SELECT 1 FROM pending_ops WHERE session_id = ? AND tag_id = ? AND operation = ?
1816
+ )`);
1817
+ queuePendingOpStatements.set(db, stmt);
1818
+ }
1819
+ return stmt;
1820
+ }
1821
+ function getPendingOpsStatement(db) {
1822
+ let stmt = getPendingOpsStatements.get(db);
1823
+ if (!stmt) {
1824
+ stmt = db.prepare("SELECT id, session_id, tag_id, operation, queued_at FROM pending_ops WHERE session_id = ? ORDER BY queued_at ASC, id ASC");
1825
+ getPendingOpsStatements.set(db, stmt);
1826
+ }
1827
+ return stmt;
1828
+ }
1829
+ function getClearPendingOpsStatement(db) {
1830
+ let stmt = clearPendingOpsStatements.get(db);
1831
+ if (!stmt) {
1832
+ stmt = db.prepare("DELETE FROM pending_ops WHERE session_id = ?");
1833
+ clearPendingOpsStatements.set(db, stmt);
1834
+ }
1835
+ return stmt;
1836
+ }
1837
+ function getRemovePendingOpStatement(db) {
1838
+ let stmt = removePendingOpStatements.get(db);
1839
+ if (!stmt) {
1840
+ stmt = db.prepare("DELETE FROM pending_ops WHERE session_id = ? AND tag_id = ?");
1841
+ removePendingOpStatements.set(db, stmt);
1842
+ }
1843
+ return stmt;
1844
+ }
1845
+ function isPendingOpRow(row) {
1846
+ if (row === null || typeof row !== "object")
1847
+ return false;
1848
+ const r = row;
1849
+ return typeof r.id === "number" && typeof r.session_id === "string" && typeof r.tag_id === "number" && typeof r.operation === "string" && typeof r.queued_at === "number";
1850
+ }
1851
+ function toPendingOp(row) {
1852
+ if (row.operation !== "drop") {
1853
+ sessionLog(row.session_id, `unknown pending operation "${row.operation}"; ignoring`);
1854
+ return null;
1855
+ }
1856
+ return {
1857
+ id: row.id,
1858
+ sessionId: row.session_id,
1859
+ tagId: row.tag_id,
1860
+ operation: row.operation,
1861
+ queuedAt: row.queued_at
1862
+ };
1863
+ }
1864
+ function queuePendingOp(db, sessionId, tagId, operation, queuedAt = Date.now()) {
1865
+ getQueuePendingOpStatement(db).run(sessionId, tagId, operation, queuedAt, getHarness(), sessionId, tagId, operation);
1866
+ }
1867
+ function queuePendingDropForUnchangedTag(db, sessionId, tag) {
1868
+ let statement = queueUnchangedDropStatements.get(db);
1869
+ if (!statement) {
1870
+ statement = db.prepare(`INSERT INTO pending_ops (session_id, tag_id, operation, queued_at, harness)
1871
+ SELECT session_id, tag_number, 'drop', ?, ? FROM tags
1872
+ WHERE id = ? AND session_id = ? AND tag_number = ? AND message_id = ?
1873
+ AND type = ? AND tool_owner_message_id IS ? AND status = 'active'
1874
+ AND NOT EXISTS (
1875
+ SELECT 1 FROM pending_ops WHERE session_id = tags.session_id
1876
+ AND tag_id = tags.tag_number AND operation = 'drop'
1877
+ )`);
1878
+ queueUnchangedDropStatements.set(db, statement);
1879
+ }
1880
+ return statement.run(Date.now(), getHarness(), tag.id ?? null, sessionId, tag.tagNumber, tag.messageId, tag.type, tag.toolOwnerMessageId).changes > 0;
1881
+ }
1882
+ function getPendingOps(db, sessionId) {
1883
+ const rows = getPendingOpsStatement(db).all(sessionId).filter(isPendingOpRow);
1884
+ return rows.map(toPendingOp).filter((op) => op !== null);
1885
+ }
1886
+ function hasPendingDropOps(db, sessionId) {
1887
+ let statement = hasPendingDropOpsStatements.get(db);
1888
+ if (!statement) {
1889
+ statement = db.prepare(`SELECT EXISTS (
1890
+ SELECT 1 FROM pending_ops WHERE session_id = ? AND operation = 'drop'
1891
+ AND typeof(id) IN ('integer', 'real')
1892
+ AND typeof(session_id) = 'text'
1893
+ AND typeof(tag_id) IN ('integer', 'real')
1894
+ AND typeof(queued_at) IN ('integer', 'real')
1895
+ ) AS present`);
1896
+ hasPendingDropOpsStatements.set(db, statement);
1897
+ }
1898
+ return statement.get(sessionId).present === 1;
1899
+ }
1900
+ function getPendingOpsCount(db, sessionId) {
1901
+ try {
1902
+ let statement = getPendingOpsCountStatements.get(db);
1903
+ if (!statement) {
1904
+ statement = db.prepare("SELECT COUNT(*) AS count FROM pending_ops WHERE session_id = ?");
1905
+ getPendingOpsCountStatements.set(db, statement);
1906
+ }
1907
+ const row = statement.get(sessionId);
1908
+ return typeof row?.count === "number" && Number.isFinite(row.count) ? row.count : null;
1909
+ } catch {
1910
+ return null;
1911
+ }
1912
+ }
1913
+ function clearPendingOps(db, sessionId) {
1914
+ getClearPendingOpsStatement(db).run(sessionId);
1915
+ }
1916
+ function removePendingOp(db, sessionId, tagId) {
1917
+ getRemovePendingOpStatement(db).run(sessionId, tagId);
1918
+ }
1919
+
1658
1920
  // src/features/magic-context/storage-tags.ts
1659
1921
  var insertTagStatements = new WeakMap;
1660
1922
  var updateTagStatusStatements = new WeakMap;
@@ -1800,8 +2062,7 @@ function getActiveToolTagsForAgeReclaim(db, sessionId) {
1800
2062
  reclaimableTokens: outputTokens === null && inputTokens === null ? null : (outputTokens ?? 0) + (inputTokens ?? 0)
1801
2063
  };
1802
2064
  });
1803
- const protectedCtxReduceTags = newestCtxReduceTagNumbers(tags);
1804
- return tags.filter((tag) => !protectedCtxReduceTags.has(tag.tagNumber));
2065
+ return tags;
1805
2066
  }
1806
2067
  function getTriggerTagTokenUpperBound(db, sessionId, floor = 0) {
1807
2068
  const sql = floor > 0 ? `SELECT
@@ -1816,13 +2077,43 @@ function getTriggerTagTokenUpperBound(db, sessionId, floor = 0) {
1816
2077
  const row = floor > 0 ? db.prepare(sql).get(sessionId, floor) : db.prepare(sql).get(sessionId);
1817
2078
  return { bound: row?.bound ?? 0, nullCount: row?.null_count ?? 0 };
1818
2079
  }
1819
- function getActiveTagTokenTotalsByMessage(db, sessionId) {
1820
- const rows = db.prepare(`SELECT type, message_id, tool_owner_message_id, token_count, input_token_count, reasoning_token_count
2080
+ var scopedActiveTokenTotalStatements = new WeakMap;
2081
+ function getActiveTagTokenTotalsByMessage(db, sessionId, messageIds) {
2082
+ if (messageIds?.length === 0)
2083
+ return new Map;
2084
+ const fields = "id, tag_number, type, message_id, tool_owner_message_id, token_count, input_token_count, reasoning_token_count".split(", ").map((field) => `tags.${field}`).join(", ");
2085
+ let scoped = scopedActiveTokenTotalStatements.get(db);
2086
+ if (messageIds && !scoped) {
2087
+ scoped = db.prepare(`
2088
+ SELECT ${fields} FROM json_each(?) AS owners
2089
+ CROSS JOIN tags INDEXED BY idx_tags_session_message_id
2090
+ WHERE session_id = ? AND tags.type != 'tool' AND +status = 'active'
2091
+ AND message_id >= owners.value || ':' AND message_id < owners.value || ';'
2092
+ UNION
2093
+ SELECT ${fields} FROM tags INDEXED BY idx_tags_session_message_id
2094
+ WHERE session_id = ? AND type != 'tool' AND +status = 'active'
2095
+ AND message_id IN (SELECT value FROM json_each(?))
2096
+ UNION
2097
+ SELECT ${fields} FROM tags INDEXED BY idx_tags_pi_fallback_tool_owner
2098
+ WHERE session_id = ? AND type = 'tool' AND +status = 'active'
2099
+ AND tool_owner_message_id IN (SELECT value FROM json_each(?))
2100
+ UNION
2101
+ SELECT ${fields} FROM tags INDEXED BY idx_tags_session_message_id
2102
+ WHERE session_id = ? AND type = 'tool' AND +status = 'active'
2103
+ AND tool_owner_message_id IS NULL AND message_id IN (SELECT value FROM json_each(?))
2104
+ ORDER BY tag_number, id`);
2105
+ scopedActiveTokenTotalStatements.set(db, scoped);
2106
+ }
2107
+ const owners = messageIds ? new Set(messageIds) : undefined;
2108
+ const encoded = owners ? JSON.stringify([...owners]) : "";
2109
+ const rows = messageIds && scoped ? scoped.all(encoded, sessionId, sessionId, encoded, sessionId, encoded, sessionId, encoded) : db.prepare(`SELECT type, message_id, tool_owner_message_id, token_count, input_token_count, reasoning_token_count
1821
2110
  FROM tags
1822
2111
  WHERE session_id = ? AND status = 'active'`).all(sessionId);
1823
2112
  const out = new Map;
1824
2113
  for (const row of rows) {
1825
2114
  const owner = ownerMessageIdForTagRow(row);
2115
+ if (owners && !owners.has(owner))
2116
+ continue;
1826
2117
  let entry = out.get(owner);
1827
2118
  if (!entry) {
1828
2119
  entry = { conversation: 0, toolCall: 0, toolOutput: 0, hasNull: false };
@@ -1902,7 +2193,7 @@ function getMaxTagNumberBySessionStatement(db) {
1902
2193
  function getTagNumberByMessageIdStatement(db) {
1903
2194
  let stmt = getTagNumberByMessageIdStatements.get(db);
1904
2195
  if (!stmt) {
1905
- stmt = db.prepare("SELECT tag_number FROM tags WHERE session_id = ? AND message_id = ? ORDER BY tag_number ASC LIMIT 1");
2196
+ stmt = db.prepare("SELECT tag_number FROM tags INDEXED BY idx_tags_session_message_id WHERE session_id = ? AND message_id = ? ORDER BY tag_number ASC LIMIT 1");
1906
2197
  getTagNumberByMessageIdStatements.set(db, stmt);
1907
2198
  }
1908
2199
  return stmt;
@@ -1978,20 +2269,24 @@ function markWhitespaceAssistantTagInert(db, sessionId, tagNumber, contentId) {
1978
2269
  entry_fingerprint = ?
1979
2270
  WHERE session_id = ? AND tag_number = ? AND type = 'message'`).run(`${WHITESPACE_ASSISTANT_INERT_MESSAGE_PREFIX}${tagNumber}`, `${WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX}${contentId}`, sessionId, tagNumber);
1980
2271
  }
2272
+ var inertWhitespaceStatements = new WeakMap;
1981
2273
  function getInertWhitespaceAssistantTags(db, sessionId, messageIds) {
1982
2274
  if (messageIds) {
1983
- const statement = db.prepare(`SELECT tag_number AS tagNumber, entry_fingerprint AS entryFingerprint
1984
- FROM tags
1985
- WHERE session_id = ? AND type = 'message' AND status = 'compacted'
1986
- AND entry_fingerprint >= ? AND entry_fingerprint < ?`);
1987
- return [...new Set(messageIds)].flatMap((messageId) => {
1988
- const prefix = `${WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX}${messageId}:p`;
1989
- const rows = statement.all(sessionId, prefix, `${prefix.slice(0, -1)}q`);
1990
- return rows.map((row) => ({
1991
- tagNumber: row.tagNumber,
1992
- contentId: row.entryFingerprint.slice(WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX.length)
1993
- }));
1994
- });
2275
+ let statement = inertWhitespaceStatements.get(db);
2276
+ if (!statement) {
2277
+ statement = db.prepare(`SELECT tag_number AS tagNumber, entry_fingerprint AS entryFingerprint
2278
+ FROM json_each(?) AS owners CROSS JOIN tags
2279
+ WHERE tags.session_id = ? AND tags.type = 'message' AND tags.status = 'compacted'
2280
+ AND entry_fingerprint >= ? || owners.value || ':p'
2281
+ AND entry_fingerprint < ? || owners.value || ':q'
2282
+ ORDER BY CAST(owners.key AS INTEGER), entry_fingerprint, tags.id`);
2283
+ inertWhitespaceStatements.set(db, statement);
2284
+ }
2285
+ const rows = statement.all(JSON.stringify([...new Set(messageIds)]), sessionId, WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX, WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX);
2286
+ return rows.map((row) => ({
2287
+ tagNumber: row.tagNumber,
2288
+ contentId: row.entryFingerprint.slice(WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX.length)
2289
+ }));
1995
2290
  }
1996
2291
  const rows = db.prepare(`SELECT tag_number AS tagNumber, entry_fingerprint AS entryFingerprint
1997
2292
  FROM tags
@@ -2201,9 +2496,9 @@ function foldShrunkPartTags(db, sessionId, messages) {
2201
2496
  result.foldedTagNumbers.sort((a, b) => a - b);
2202
2497
  return result;
2203
2498
  }
2204
- function markTagsCompactedByMessageIds(db, sessionId, messageIds) {
2499
+ function markTagsCompactedByMessageIds(db, sessionId, messageIds, eligibleTagNumbers) {
2205
2500
  const ids = new Set(messageIds);
2206
- if (ids.size === 0)
2501
+ if (ids.size === 0 || eligibleTagNumbers?.size === 0)
2207
2502
  return 0;
2208
2503
  const asciiLower = (value) => value.replace(/[A-Z]/g, (char) => char.toLowerCase());
2209
2504
  const foldedIds = new Set(Array.from(ids, asciiLower));
@@ -2229,7 +2524,7 @@ function markTagsCompactedByMessageIds(db, sessionId, messageIds) {
2229
2524
  const rows = db.prepare(`WITH ids AS MATERIALIZED (
2230
2525
  SELECT value AS source_id, lower(value) AS folded_id FROM json_each(?)
2231
2526
  )
2232
- SELECT id, message_id, tool_owner_message_id FROM tags INDEXED BY idx_tags_session_tag_number
2527
+ SELECT id, tag_number, message_id, tool_owner_message_id FROM tags INDEXED BY ${tagOrderConstraintIndex(db)}
2233
2528
  WHERE session_id = ? AND status IN ('active', 'dropped') AND (
2234
2529
  message_id IN (SELECT source_id FROM ids)
2235
2530
  OR tool_owner_message_id IN (SELECT source_id FROM ids)
@@ -2240,14 +2535,14 @@ function markTagsCompactedByMessageIds(db, sessionId, messageIds) {
2240
2535
  OR (? AND instr(message_id, ':') > 0)
2241
2536
  OR ?
2242
2537
  )`).all(JSON.stringify(Array.from(ids)), sessionId, Array.from(ids).some((id) => id.includes(":")) ? 1 : 0, nulPrefixes.size > 0 ? 1 : 0);
2243
- const candidates = rows.filter((row) => matches(row.message_id, row.tool_owner_message_id));
2538
+ const candidates = rows.filter((row) => (eligibleTagNumbers === undefined || eligibleTagNumbers.has(row.tag_number)) && matches(row.message_id, row.tool_owner_message_id));
2244
2539
  if (candidates.length === 0)
2245
2540
  return 0;
2246
2541
  const update = db.prepare(`UPDATE tags SET status = 'compacted'
2247
2542
  WHERE id = ? AND session_id = ?
2248
2543
  AND status IN ('active', 'dropped')
2249
2544
  AND message_id IS ? AND tool_owner_message_id IS ?
2250
- RETURNING id`);
2545
+ RETURNING tag_number`);
2251
2546
  let cursor = 0;
2252
2547
  let changed = 0;
2253
2548
  const batch = db.transaction(() => {
@@ -2255,8 +2550,11 @@ function markTagsCompactedByMessageIds(db, sessionId, messageIds) {
2255
2550
  let processed = 0;
2256
2551
  do {
2257
2552
  const row = candidates[cursor++];
2258
- if (update.get(row.id, sessionId, row.message_id, row.tool_owner_message_id))
2553
+ const retired = update.get(row.id, sessionId, row.message_id, row.tool_owner_message_id);
2554
+ if (retired) {
2555
+ removePendingOp(db, sessionId, retired.tag_number);
2259
2556
  changed++;
2557
+ }
2260
2558
  processed++;
2261
2559
  } while (cursor < candidates.length && processed < 128 && performance.now() - start < 8);
2262
2560
  });
@@ -2324,10 +2622,6 @@ function deriveTagLoadFloor(db, sessionId, rawIds) {
2324
2622
  return Math.max(0, min - margin);
2325
2623
  }
2326
2624
  var TAG_SELECT_COLUMNS = "id, message_id, type, status, drop_mode, tool_name, input_byte_size, byte_size, reasoning_byte_size, session_id, tag_number, caveman_depth, tool_owner_message_id, token_count";
2327
- function getTagsBySession(db, sessionId) {
2328
- const rows = db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags WHERE session_id = ? ORDER BY tag_number ASC, id ASC`).all(sessionId).filter(isTagRow);
2329
- return rows.map(toTagEntry);
2330
- }
2331
2625
  var getActiveTagsBySessionStatements = new WeakMap;
2332
2626
  var getNullOwnerToolTagsBySessionStatements = new WeakMap;
2333
2627
  var getDroppedTagsBySessionStatements = new WeakMap;
@@ -2403,6 +2697,25 @@ function getTagsByNumbers(db, sessionId, tagNumbers) {
2403
2697
  const rows = db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags WHERE session_id = ? AND tag_number IN (${placeholders}) ORDER BY tag_number ASC, id ASC`).all(sessionId, ...tagNumbers).filter(isTagRow);
2404
2698
  return rows.map(toTagEntry);
2405
2699
  }
2700
+ var newestToolTagNumberStatements = new WeakMap;
2701
+ function getNewestToolTagNumbers(db, sessionId, limit) {
2702
+ if (limit <= 0)
2703
+ return [];
2704
+ let statement = newestToolTagNumberStatements.get(db);
2705
+ if (!statement) {
2706
+ statement = db.prepare(`SELECT tag_number FROM tags
2707
+ WHERE session_id = ? AND type = 'tool'
2708
+ AND typeof(message_id) = 'text'
2709
+ AND typeof(status) = 'text'
2710
+ AND typeof(byte_size) IN ('integer', 'real')
2711
+ AND typeof(tag_number) IN ('integer', 'real')
2712
+ ORDER BY tag_number DESC
2713
+ LIMIT ?`);
2714
+ newestToolTagNumberStatements.set(db, statement);
2715
+ }
2716
+ return statement.all(sessionId, limit).map((row) => row.tag_number);
2717
+ }
2718
+ var droppedNumberStatements = new WeakMap;
2406
2719
  function getDroppedTagsByNumbers(db, sessionId, tagNumbers) {
2407
2720
  if (tagNumbers.length === 0)
2408
2721
  return [];
@@ -2413,16 +2726,26 @@ function getDroppedTagsByNumbers(db, sessionId, tagNumbers) {
2413
2726
  }
2414
2727
  return all;
2415
2728
  }
2416
- const placeholders = tagNumbers.map(() => "?").join(",");
2417
- const rows = db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags WHERE session_id = ? AND status = 'dropped' AND tag_number IN (${placeholders}) ORDER BY tag_number ASC, id ASC`).all(sessionId, ...tagNumbers).filter(isTagRow);
2729
+ let statement = droppedNumberStatements.get(db);
2730
+ if (!statement) {
2731
+ statement = db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags WHERE session_id = ? AND status = 'dropped' AND tag_number IN (SELECT value FROM json_each(?)) ORDER BY tag_number ASC, id ASC`);
2732
+ droppedNumberStatements.set(db, statement);
2733
+ }
2734
+ const rows = statement.all(sessionId, JSON.stringify(tagNumbers)).filter(isTagRow);
2418
2735
  return rows.map(toTagEntry);
2419
2736
  }
2420
2737
  function getMaxDroppedTagNumber(db, sessionId) {
2421
2738
  const row = getMaxDroppedTagNumberStatement(db).get(sessionId);
2422
2739
  return isMaxTagNumberRow(row) ? row.max_tag_number : 0;
2423
2740
  }
2741
+ var tagByIdStatements = new WeakMap;
2424
2742
  function getTagById(db, sessionId, tagId) {
2425
- const result = db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags WHERE session_id = ? AND tag_number = ?`).get(sessionId, tagId);
2743
+ let statement = tagByIdStatements.get(db);
2744
+ if (!statement) {
2745
+ statement = db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags WHERE session_id = ? AND tag_number = ?`);
2746
+ tagByIdStatements.set(db, statement);
2747
+ }
2748
+ const result = statement.get(sessionId, tagId);
2426
2749
  if (!isTagRow(result)) {
2427
2750
  return null;
2428
2751
  }
@@ -2840,19 +3163,25 @@ function countRawSessionMessageOrdinalsFromDb(db, sessionId) {
2840
3163
  )`).get(sessionId);
2841
3164
  return typeof row?.count === "number" ? row.count : 0;
2842
3165
  }
2843
- function readRawSessionMessageIdOrdinalsFromDb(db, sessionId) {
2844
- const messageRows = db.prepare("SELECT id, data FROM message WHERE session_id = ? ORDER BY time_created ASC, id ASC").all(sessionId).filter(isRawMessageRow);
2845
- const ordinalById = new Map;
2846
- let ordinal = 0;
2847
- for (const row of messageRows) {
2848
- const info = parseJsonRecord(row.data);
2849
- if (isRawCompactionSummaryInfo(info))
2850
- continue;
2851
- ordinal += 1;
2852
- if (info)
2853
- ordinalById.set(row.id, ordinal);
3166
+ function readRawSessionMessageIdOrdinalsForRangeFromDb(db, sessionId, fromOrdinal, toOrdinal) {
3167
+ const from = Math.max(1, Math.floor(fromOrdinal));
3168
+ const to = Math.floor(toOrdinal);
3169
+ if (to < from)
3170
+ return new Map;
3171
+ const rows = db.prepare(`
3172
+ SELECT id, data FROM message WHERE session_id = ?
3173
+ AND CASE WHEN json_valid(data) THEN NOT (
3174
+ COALESCE(json_type(data, '$.summary'), '') = 'true'
3175
+ AND COALESCE(json_extract(data, '$.finish'), '') = 'stop'
3176
+ ) ELSE 1 END
3177
+ ORDER BY time_created, id LIMIT ? OFFSET ?
3178
+ `).all(sessionId, to - from + 1, from - 1).filter(isRawMessageRow);
3179
+ const result = new Map;
3180
+ for (const [index, row] of rows.entries()) {
3181
+ if (parseJsonRecord(row.data))
3182
+ result.set(row.id, from + index);
2854
3183
  }
2855
- return ordinalById;
3184
+ return result;
2856
3185
  }
2857
3186
  function readRawSessionMessageOrdinalPageFromDb(db, sessionId, after, limit) {
2858
3187
  const pageSize = Math.max(1, Math.floor(limit));
@@ -3061,6 +3390,17 @@ function readRawSessionMessageByIdFromDb(db, sessionId, messageId) {
3061
3390
  version: row.time_updated ?? null
3062
3391
  };
3063
3392
  }
3393
+ function hasRawSessionMessageByIdFromDb(db, sessionId, messageId) {
3394
+ const row = db.prepare("SELECT id, data, time_created FROM message WHERE session_id = ? AND id = ?").get(sessionId, messageId);
3395
+ if (!row || !isRawMessageRow(row) || typeof row.time_created !== "number")
3396
+ return false;
3397
+ const info = parseJsonRecord(row.data);
3398
+ if (!info || isRawCompactionSummaryInfo(info))
3399
+ return false;
3400
+ if (info.summary === 1 && info.finish === "stop")
3401
+ return readRawSessionMessageByIdFromDb(db, sessionId, messageId) !== null;
3402
+ return true;
3403
+ }
3064
3404
  function readRawSeedTailFromDb(db, sessionId, boundaryId) {
3065
3405
  const rows = db.prepare(`
3066
3406
  WITH canonical AS (
@@ -3109,6 +3449,7 @@ var MAX_MESSAGE_CACHE_KEY_BYTES = 64 * 1024 * 1024;
3109
3449
  var FNV1A_32_OFFSET2 = 2166136261;
3110
3450
  var FNV1A_32_PRIME2 = 16777619;
3111
3451
  var messageEstimateCache = new Map;
3452
+ var messageEstimateKeysByField = new Map;
3112
3453
  var messageEstimateCacheBytes = 0;
3113
3454
  var EMPTY_BREAKDOWN = {
3114
3455
  text: 0,
@@ -3316,16 +3657,33 @@ function setCachedEstimate(key, breakdown) {
3316
3657
  const existing = messageEstimateCache.get(key);
3317
3658
  if (existing)
3318
3659
  messageEstimateCacheBytes -= existing.keyEstimateBytes;
3660
+ else {
3661
+ for (const field of new Set(key.split("\x00").slice(1, -1))) {
3662
+ const keys = messageEstimateKeysByField.get(field) ?? new Set;
3663
+ keys.add(key);
3664
+ messageEstimateKeysByField.set(field, keys);
3665
+ }
3666
+ }
3319
3667
  messageEstimateCache.set(key, { breakdown, keyEstimateBytes });
3320
3668
  messageEstimateCacheBytes += keyEstimateBytes;
3321
3669
  while (messageEstimateCache.size > MAX_MESSAGE_CACHE_ENTRIES || messageEstimateCacheBytes > MAX_MESSAGE_CACHE_KEY_BYTES) {
3322
3670
  const first = messageEstimateCache.keys().next().value;
3323
3671
  if (typeof first !== "string")
3324
3672
  break;
3325
- const removed = messageEstimateCache.get(first);
3326
- if (removed)
3327
- messageEstimateCacheBytes -= removed.keyEstimateBytes;
3328
- messageEstimateCache.delete(first);
3673
+ deleteCachedEstimate(first);
3674
+ }
3675
+ }
3676
+ function deleteCachedEstimate(key) {
3677
+ const removed = messageEstimateCache.get(key);
3678
+ if (!removed)
3679
+ return;
3680
+ messageEstimateCacheBytes -= removed.keyEstimateBytes;
3681
+ messageEstimateCache.delete(key);
3682
+ for (const field of new Set(key.split("\x00").slice(1, -1))) {
3683
+ const keys = messageEstimateKeysByField.get(field);
3684
+ keys?.delete(key);
3685
+ if (keys?.size === 0)
3686
+ messageEstimateKeysByField.delete(field);
3329
3687
  }
3330
3688
  }
3331
3689
  function cloneBreakdown(value) {
@@ -4046,9 +4404,12 @@ function serializedText(value) {
4046
4404
  return "";
4047
4405
  return (typeof value === "string" ? value : JSON.stringify(value)) ?? "";
4048
4406
  }
4049
- function serializedTokens(value) {
4407
+ var wireTextTokens = createTokenCountMemo(1e5, 128 * 1024 * 1024);
4408
+ function serializedTokens(value, bounded = false) {
4050
4409
  const serialized = serializedText(value);
4051
- return serialized ? estimateTokens(serialized) : 0;
4410
+ if (bounded && tokenCountUsesByteBound(serialized))
4411
+ return Buffer.byteLength(serialized);
4412
+ return serialized ? wireTextTokens(serialized) : 0;
4052
4413
  }
4053
4414
  function visitWireContent(message, visit) {
4054
4415
  for (const part of message.parts) {
@@ -4108,11 +4469,11 @@ function visitWireContent(message, visit) {
4108
4469
  }
4109
4470
  }
4110
4471
  }
4111
- function estimateMessageTokens(message) {
4472
+ function estimateMessageTokens(message, bounded = false) {
4112
4473
  const total = { conversation: 0, toolCall: 0 };
4113
4474
  visitWireContent(message, {
4114
4475
  text: (bucket, value) => {
4115
- total[bucket] += serializedTokens(value);
4476
+ total[bucket] += serializedTokens(value, bounded);
4116
4477
  },
4117
4478
  image: (bucket, tokens) => {
4118
4479
  total[bucket] += tokens;
@@ -4140,9 +4501,99 @@ function wireContentBytes(messages, abortAboveBytes, bytesPerToken) {
4140
4501
  }
4141
4502
  return { bytes, aborted: false };
4142
4503
  }
4504
+ function createFinalWireUsageTracker() {
4505
+ const served = new Map;
4506
+ const wireRows = (input) => input.messages.filter((message) => message.parts.some((part) => !part || typeof part !== "object" || !["step-start", "step-finish"].includes(String(part.type))));
4507
+ const rowBytes = (message) => JSON.stringify({ id: message.info.id, role: message.info.role, parts: message.parts });
4508
+ const envelopeFor = (input) => {
4509
+ if (!input.providerID || !input.modelID || !input.systemPromptHash)
4510
+ return;
4511
+ const tools = getToolDefinitionMeasurementSignature(input.providerID, input.modelID, input.agentName);
4512
+ if (!tools)
4513
+ return;
4514
+ return JSON.stringify([
4515
+ input.providerID,
4516
+ input.modelID,
4517
+ input.agentName,
4518
+ input.systemPromptHash,
4519
+ input.systemPromptTokens,
4520
+ tools
4521
+ ]);
4522
+ };
4523
+ return {
4524
+ estimate(sessionId, input, limit) {
4525
+ let measuredPrefix;
4526
+ try {
4527
+ const previous = served.get(sessionId);
4528
+ const rows = wireRows(input);
4529
+ if (previous && previous.envelope === envelopeFor(input) && rows.length > previous.prefix.length && previous.prefix.every((bytes, i) => rowBytes(rows[i]) === bytes)) {
4530
+ const reply = rows[previous.prefix.length]?.info;
4531
+ const tokens = reply.tokens;
4532
+ const time = reply.time;
4533
+ const counts = [tokens?.input, tokens?.cache?.read, tokens?.cache?.write];
4534
+ if (reply.role === "assistant" && reply.parentID === previous.parent && reply.providerID === input.providerID && reply.modelID === input.modelID && ["stop", "tool-calls", "length"].includes(String(reply.finish)) && !reply.error && typeof time?.completed === "number" && time.completed >= previous.at && counts.every((n) => typeof n === "number" && Number.isSafeInteger(n) && n >= 0)) {
4535
+ const inputTokens = counts.reduce((sum, n) => sum + (n ?? 0), 0);
4536
+ if (inputTokens > 0)
4537
+ measuredPrefix = {
4538
+ inputTokens,
4539
+ appendedMessages: rows.slice(previous.prefix.length)
4540
+ };
4541
+ }
4542
+ }
4543
+ } catch {}
4544
+ return estimateOutgoingWireForRefusal({ ...input, measuredPrefix }, limit);
4545
+ },
4546
+ capture(sessionId, input) {
4547
+ served.delete(sessionId);
4548
+ try {
4549
+ const envelope = envelopeFor(input);
4550
+ const rows = wireRows(input);
4551
+ const parent = [...rows].reverse().find((row) => row.info.role === "user")?.info.id;
4552
+ if (!envelope || typeof parent !== "string" || !rows.every(hasCountableParts))
4553
+ return;
4554
+ const prefix = rows.map(rowBytes);
4555
+ if (prefix.reduce((sum, text) => sum + text.length, 0) > 4 * 1024 * 1024)
4556
+ return;
4557
+ if (served.size >= 16)
4558
+ served.delete(served.keys().next().value);
4559
+ served.set(sessionId, { envelope, prefix, parent, at: Date.now() });
4560
+ } catch {}
4561
+ }
4562
+ };
4563
+ }
4564
+ function estimateOutgoingWireForRefusal(input, limit) {
4565
+ if (typeof limit === "number" && Number.isFinite(limit) && limit > 0) {
4566
+ const measured = input.measuredPrefix;
4567
+ const baseline = measured?.inputTokens ?? 0;
4568
+ const pricedMessages = measured?.appendedMessages ?? input.messages;
4569
+ const bytes = wireContentBytes(pricedMessages, Math.max(0, limit - baseline) * 4, 4);
4570
+ if (bytes) {
4571
+ const lower = baseline + Math.ceil(bytes.bytes / 4);
4572
+ const calibration = resolveDecisionCalibration(input.providerID, input.modelID);
4573
+ const tools = input.providerID && input.modelID ? getMeasuredToolDefinitionTokens(input.providerID, input.modelID, input.agentName) : undefined;
4574
+ const envelope = measured ? baseline : tools !== undefined && Number.isFinite(input.systemPromptTokens) && input.systemPromptTokens > 0 ? providerMass({ system: input.systemPromptTokens, tools }, calibration, true) : undefined;
4575
+ const upper = envelope === undefined ? undefined : envelope + Math.ceil(bytes.bytes * Math.max(UNKNOWN_FIT_RATIO, calibration.toolsRatio, calibration.proseRatio));
4576
+ if (bytes.aborted || lower > limit || upper !== undefined && upper <= limit) {
4577
+ const over = bytes.aborted || lower > limit;
4578
+ return {
4579
+ tokens: over ? lower : upper,
4580
+ trusted: !over,
4581
+ refusalGrade: over && envelope !== undefined,
4582
+ refusalTokens: over ? lower : undefined,
4583
+ refusalBasis: "byte-bound",
4584
+ messageTokens: { conversation: 0, toolCall: 0 },
4585
+ systemTokens: input.systemPromptTokens,
4586
+ toolDefinitionTokens: tools,
4587
+ toolDefinitionsMeasured: tools !== undefined
4588
+ };
4589
+ }
4590
+ }
4591
+ }
4592
+ return estimateFinalWireInputTokens({ ...input, boundedTokenization: true });
4593
+ }
4143
4594
  function estimateFinalWireInputTokens(input) {
4144
4595
  const messageTokens = input.messages.reduce((total, message) => {
4145
- const next = estimateMessageTokens(message);
4596
+ const next = estimateMessageTokens(message, input.boundedTokenization);
4146
4597
  total.conversation += next.conversation;
4147
4598
  total.toolCall += next.toolCall;
4148
4599
  return total;
@@ -4158,11 +4609,25 @@ function estimateFinalWireInputTokens(input) {
4158
4609
  };
4159
4610
  const tokens = providerMass(rawComponents, calibration, true);
4160
4611
  const complete = Number.isFinite(tokens) && tokens > 0 && Number.isFinite(input.systemPromptTokens) && input.systemPromptTokens > 0 && toolDefinitions !== undefined && input.messages.every(hasCountableParts);
4612
+ const refusalGrade = complete && hasTokenizerForFit() && measuredToolDefinitions !== undefined && hasMeasuredDecisionCalibration(calibration) && input.messages.every(hasRefusalCountableParts);
4613
+ const measured = input.measuredPrefix;
4614
+ const useMeasured = refusalGrade && measured && Number.isSafeInteger(measured.inputTokens) && measured.inputTokens > 0 && measured.appendedMessages.every(hasCountableParts);
4615
+ const tail = useMeasured ? measured.appendedMessages.reduce((sum, message) => {
4616
+ const next = estimateMessageTokens(message, input.boundedTokenization);
4617
+ return {
4618
+ conversation: sum.conversation + next.conversation,
4619
+ toolCall: sum.toolCall + next.toolCall
4620
+ };
4621
+ }, { conversation: 0, toolCall: 0 }) : undefined;
4622
+ const refusalTokens = refusalGrade ? tail && measured ? measured.inputTokens + providerMass({ tools: tail.toolCall, prose: tail.conversation }, calibration) : providerMass(rawComponents, calibration) : undefined;
4161
4623
  const systemTokens = Math.round(Math.max(0, input.systemPromptTokens) * calibration.systemRatio);
4162
4624
  const toolDefinitionTokens = toolDefinitions === undefined ? undefined : Math.round(toolDefinitions * (calibration.seeded ? calibration.toolsRatio : UNKNOWN_FIT_RATIO));
4163
4625
  return {
4164
4626
  tokens,
4165
4627
  trusted: complete,
4628
+ refusalGrade,
4629
+ refusalTokens,
4630
+ refusalBasis: refusalGrade ? useMeasured ? "provider-prefix" : "calibrated" : undefined,
4166
4631
  rawTokens: rawComponents.system + rawComponents.tools + rawComponents.prose,
4167
4632
  rawComponents,
4168
4633
  completeness: complete ? "complete" : "partial",
@@ -4173,6 +4638,33 @@ function estimateFinalWireInputTokens(input) {
4173
4638
  toolDefinitionsMeasured: measuredToolDefinitions !== undefined
4174
4639
  };
4175
4640
  }
4641
+ function hasRefusalCountableParts(message) {
4642
+ let exact = true;
4643
+ visitWireContent(message, {
4644
+ text: (_bucket, value) => {
4645
+ if (tokenCountUsesByteBound(serializedText(value)))
4646
+ exact = false;
4647
+ },
4648
+ image: () => {}
4649
+ });
4650
+ return exact;
4651
+ }
4652
+ function estimateAppendedWireTokens(input) {
4653
+ const messageTokens = input.messages.reduce((total, message) => {
4654
+ const next = estimateMessageTokens(message);
4655
+ total.conversation += next.conversation;
4656
+ total.toolCall += next.toolCall;
4657
+ return total;
4658
+ }, { conversation: 0, toolCall: 0 });
4659
+ const tokens = providerMass({ prose: messageTokens.conversation, tools: messageTokens.toolCall }, resolveDecisionCalibration(input.providerID, input.modelID), true);
4660
+ return {
4661
+ tokens,
4662
+ trusted: hasTokenizerForFit() && Number.isFinite(tokens) && tokens >= 0 && input.messages.every(hasCountableParts),
4663
+ messageTokens,
4664
+ systemTokens: 0,
4665
+ toolDefinitionTokens: 0
4666
+ };
4667
+ }
4176
4668
  function hasCountableParts(message) {
4177
4669
  return message.parts.every((part) => {
4178
4670
  if (!part || typeof part !== "object")
@@ -4779,12 +5271,15 @@ class ToolMutationBatch {
4779
5271
  }
4780
5272
  const scopedSweep = this.resolveScopedSweep();
4781
5273
  const removed = new Set;
4782
- for (let i = this.messages.length - 1;i >= 0; i -= 1) {
5274
+ let writeIndex = 0;
5275
+ for (let i = 0;i < this.messages.length; i += 1) {
4783
5276
  if ((!scopedSweep || this.affectedMessages.has(this.messages[i])) && !this.messages[i].parts.some(hasMeaningfulPart)) {
4784
5277
  removed.add(this.messages[i]);
4785
- this.messages.splice(i, 1);
5278
+ } else {
5279
+ this.messages[writeIndex++] = this.messages[i];
4786
5280
  }
4787
5281
  }
5282
+ this.messages.length = writeIndex;
4788
5283
  this.pruneServedRows(removed);
4789
5284
  this.partsToRemove.clear();
4790
5285
  this.affectedMessages.clear();
@@ -5101,17 +5596,17 @@ function readRawSessionMessages2(sessionId) {
5101
5596
  }
5102
5597
  return readRawSessionMessagesFromSource(sessionId);
5103
5598
  }
5104
- function readRawSessionMessagePage2(sessionId, afterOrdinal, limit, finalWatermark) {
5599
+ function readRawSessionMessagePage2(sessionId, afterOrdinal, limit, finalWatermark, after) {
5105
5600
  const provider = sessionProviders.get(sessionId)?.provider;
5106
5601
  if (provider?.readMessagePage) {
5107
- return provider.readMessagePage(afterOrdinal, limit, finalWatermark);
5602
+ return provider.readMessagePage(afterOrdinal, limit, finalWatermark, after);
5108
5603
  }
5109
5604
  if (provider) {
5110
5605
  return provider.readMessages().filter((message) => message.ordinal > afterOrdinal && message.ordinal <= finalWatermark).slice(0, limit);
5111
5606
  }
5112
5607
  if (!openCodeDbExists())
5113
5608
  return [];
5114
- return withReadOnlySessionDb((db) => readRawSessionMessagePageFromDb(db, sessionId, afterOrdinal, limit, finalWatermark));
5609
+ return withReadOnlySessionDb((db) => readRawSessionMessagePageFromDb(db, sessionId, afterOrdinal, limit, finalWatermark, after));
5115
5610
  }
5116
5611
  function getRawSessionMessageOrdinalCount2(sessionId) {
5117
5612
  const provider = sessionProviders.get(sessionId)?.provider;
@@ -5324,7 +5819,10 @@ function readRawSessionMessageIdOrdinalsForRange2(sessionId, fromOrdinal, toOrdi
5324
5819
  if (provider?.readMessageIdOrdinalsForRange) {
5325
5820
  return provider.readMessageIdOrdinalsForRange(from, to);
5326
5821
  }
5327
- const all = provider?.readMessageIdOrdinals ? provider.readMessageIdOrdinals() : provider ? new Map(provider.readMessages().map((message) => [message.id, message.ordinal])) : !openCodeDbExists() ? new Map : withReadOnlySessionDb((db) => readRawSessionMessageIdOrdinalsFromDb(db, sessionId));
5822
+ if (!provider) {
5823
+ return !openCodeDbExists() ? new Map : withReadOnlySessionDb((db) => readRawSessionMessageIdOrdinalsForRangeFromDb(db, sessionId, from, to));
5824
+ }
5825
+ const all = provider?.readMessageIdOrdinals ? provider.readMessageIdOrdinals() : new Map(provider.readMessages().map((message) => [message.id, message.ordinal]));
5328
5826
  return new Map([...all].filter(([, ordinal]) => ordinal >= from && ordinal <= to));
5329
5827
  }
5330
5828
  function readRawSessionMessageIdOrdinals2(sessionId) {
@@ -5348,6 +5846,8 @@ function hasRawSessionMessageById2(sessionId, messageId) {
5348
5846
  const provider = sessionProviders.get(sessionId)?.provider;
5349
5847
  if (provider?.hasMessageById)
5350
5848
  return provider.hasMessageById(messageId);
5849
+ if (!provider)
5850
+ return openCodeDbExists() && withReadOnlySessionDb((db) => hasRawSessionMessageByIdFromDb(db, sessionId, messageId));
5351
5851
  return readRawSessionMessageById2(sessionId, messageId) !== null;
5352
5852
  }
5353
5853
  function readRawSessionMessageOrdinalById2(sessionId, messageId) {
@@ -5491,8 +5991,9 @@ async function getRawSessionTagKeysThrough2(sessionId, upToMessageIndex, options
5491
5991
  };
5492
5992
  const firstOrdinal = Number.isFinite(options.fromMessageIndex) ? Math.max(1, Math.floor(options.fromMessageIndex ?? 1)) : 1;
5493
5993
  let afterOrdinal = firstOrdinal - 1;
5994
+ let after;
5494
5995
  while (afterOrdinal < finalWatermark) {
5495
- const messages = readRawSessionMessages2.readPage(sessionId, afterOrdinal, pageSize, finalWatermark);
5996
+ const messages = readRawSessionMessages2.readPage(sessionId, afterOrdinal, pageSize, finalWatermark, after);
5496
5997
  if (messages.length === 0)
5497
5998
  break;
5498
5999
  let nextOrdinal = afterOrdinal;
@@ -5534,6 +6035,8 @@ async function getRawSessionTagKeysThrough2(sessionId, upToMessageIndex, options
5534
6035
  if (nextOrdinal <= afterOrdinal)
5535
6036
  break;
5536
6037
  afterOrdinal = nextOrdinal;
6038
+ const last = messages.at(-1);
6039
+ after = last ? { timeCreated: last.createdAt ?? 0, id: last.id } : undefined;
5537
6040
  if (afterOrdinal < finalWatermark)
5538
6041
  await yieldToEventLoop();
5539
6042
  }
@@ -5860,4 +6363,4 @@ function readRawSessionSeedTail2(sessionId, boundaryId, onQuery) {
5860
6363
  });
5861
6364
  }
5862
6365
 
5863
- export { isPrefixBoundThinkingModel, detectOverflow, CTX_REDUCE_KEEP, newestCtxReduceTagNumbers, stripWellFormedLeadingTagPrefix, byteSize, stripTagPrefix, peelLeadingMcTagNotation, prependTag, isThinkingPart, isRecord, contentTagOwnerMessageId, estimateImageTokensFromDataUrl, estimateToolAttachmentImageTokens, normalizeTodoStateJson, buildSyntheticTodoPart, computeSyntheticCallId, isSyntheticTodoPart, countRealUserMessages, tailHygieneStructuralSignature, sameTailHygieneStructuralSignature, formatTailHygienePrefixMismatch, refreshTailHygieneBaseline, effectiveTailHygiene, assertTailHygieneContentUnchanged, CHANNEL1_SENTINEL, CHANNEL1_FLOOR_TOKENS, isDroppedToolOutput, toolOutputTokens, decideChannel1, evaluateChannel2, formatChannel1Evaluation, formatChannel2Evaluation, reclaimableToolOutputCount, buildChannel2Reminder, buildChannel1Reminder, estimateEmergencyDropReclaimTokens, planEmergencyDrop, measureEmergencyTag, getRecentTagOwnerMessageIds, AGE_RECLAIM_MIN_TOKENS, getOldestActiveUnprotectedToolTags, getActiveToolTagsForAgeReclaim, getTriggerTagTokenUpperBound, getActiveTagTokenTotalsByMessage, getAllStatusTagTokenTotalsFlat, tagTokenCountIsNull, backfillTagTokenCounts, insertTag, updateTagStatus, markWhitespaceAssistantTagInert, getInertWhitespaceAssistantTags, updateTagDropMode, updateCavemanDepth, updateTagMessageId, foldShrunkPartTags, markTagsCompactedByMessageIds, getMaxTagNumberBySession, getTagNumberByMessageId, getAssignableTagNumberByMessageId, deriveTagLoadFloor, TAG_SELECT_COLUMNS, getTagsBySession, getActiveTagsBySession, getTailHygieneTags, getDroppedTagsBySession, getTagsByNumbers, getDroppedTagsByNumbers, getMaxDroppedTagNumber, getTagById, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, getCandidateToolOwners, pickNearestPriorOwner, expandToolPart, markHostUnservedRow, retreatPastHostUnservedRows, snapTerminalCompartmentToServedRow, isHostRenderedSystemMessage, isStrictGapHealingMessage, isRawCompactionSummaryInfo, extractInMemoryMessageViews, buildInMemoryTailRawMessages, 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, estimateFinalWireInputTokens, modelAcceptsEmptyContent, isAnthropicFamilyRoute, neutralizeDroppedReasoningPart, restoreNeutralizedReasoningPart, isNeutralizedReasoningPart, variantChangeBustsProviderCache, makeSentinel, makeWholeMessageSentinel, 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, 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 };
6366
+ export { isPrefixBoundThinkingModel, detectOverflow, protectedToolTagNumbers, protectedToolTokenCount, stripWellFormedLeadingTagPrefix, byteSize, stripTagPrefix, peelLeadingMcTagNotation, prependTag, isThinkingPart, isRecord, contentTagOwnerMessageId, estimateImageTokensFromDataUrl, estimateToolAttachmentImageTokens, normalizeTodoStateJson, buildSyntheticTodoPart, computeSyntheticCallId, isSyntheticTodoPart, countRealUserMessages, tailHygieneStructuralSignature, sameTailHygieneStructuralSignature, formatTailHygienePrefixMismatch, refreshTailHygieneBaseline, effectiveTailHygiene, assertTailHygieneContentUnchangedIfEnabled, CHANNEL1_SENTINEL, CHANNEL1_FLOOR_TOKENS, isDroppedToolOutput, toolOutputTokens, decideChannel1, evaluateChannel2, formatChannel1Evaluation, formatChannel2Evaluation, reclaimableToolOutputCount, buildChannel2Reminder, buildChannel1Reminder, estimateEmergencyDropReclaimTokens, planEmergencyDrop, measureEmergencyTag, queuePendingOp, queuePendingDropForUnchangedTag, getPendingOps, hasPendingDropOps, getPendingOpsCount, clearPendingOps, removePendingOp, getRecentTagOwnerMessageIds, AGE_RECLAIM_MIN_TOKENS, getOldestActiveUnprotectedToolTags, getActiveToolTagsForAgeReclaim, getTriggerTagTokenUpperBound, getActiveTagTokenTotalsByMessage, getAllStatusTagTokenTotalsFlat, tagTokenCountIsNull, backfillTagTokenCounts, insertTag, updateTagStatus, markWhitespaceAssistantTagInert, getInertWhitespaceAssistantTags, updateTagDropMode, updateCavemanDepth, updateTagMessageId, foldShrunkPartTags, markTagsCompactedByMessageIds, getMaxTagNumberBySession, getTagNumberByMessageId, getAssignableTagNumberByMessageId, deriveTagLoadFloor, TAG_SELECT_COLUMNS, getActiveTagsBySession, getTailHygieneTags, getDroppedTagsBySession, getTagsByNumbers, getNewestToolTagNumbers, getDroppedTagsByNumbers, getMaxDroppedTagNumber, getTagById, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, getCandidateToolOwners, pickNearestPriorOwner, expandToolPart, markHostUnservedRow, retreatPastHostUnservedRows, snapTerminalCompartmentToServedRow, isHostRenderedSystemMessage, isStrictGapHealingMessage, isRawCompactionSummaryInfo, extractInMemoryMessageViews, buildInMemoryTailRawMessages, 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, variantChangeBustsProviderCache, makeSentinel, makeWholeMessageSentinel, 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, 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 };