@cortexkit/opencode-magic-context 0.44.4 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (679) hide show
  1. package/dist/agents/hidden-agent-registrations.d.ts +3 -2
  2. package/dist/agents/hidden-agent-registrations.d.ts.map +1 -1
  3. package/dist/agents/magic-context-prompt.d.ts +1 -0
  4. package/dist/agents/magic-context-prompt.d.ts.map +1 -1
  5. package/dist/agents/permissions.d.ts +8 -28
  6. package/dist/agents/permissions.d.ts.map +1 -1
  7. package/dist/{announcement-n8hs7kjw.js → announcement-f75t58v9.js} +4 -2
  8. package/dist/config/index.d.ts.map +1 -1
  9. package/dist/config/project-security.d.ts +48 -0
  10. package/dist/config/project-security.d.ts.map +1 -1
  11. package/dist/config/raw-loader.d.ts.map +1 -1
  12. package/dist/config/schema/magic-context.d.ts +10 -7
  13. package/dist/config/schema/magic-context.d.ts.map +1 -1
  14. package/dist/{conflict-warning-hook-hmpzxep6.js → conflict-warning-hook-5yrz2r24.js} +10 -6
  15. package/dist/{derive-budgets-ncwn1jk9.js → derive-budgets-a63zsm5c.js} +3 -3
  16. package/dist/embedding-worker.js +49 -0
  17. package/dist/emscripten-module-0g8f45e6.js +602 -0
  18. package/dist/emscripten-module-0pekdjxz.js +1532 -0
  19. package/dist/emscripten-module-e67xwsp3.js +503 -0
  20. package/dist/emscripten-module-pj1vyb44.js +4559 -0
  21. package/dist/features/magic-context/compartment-chunk-embedding.d.ts +23 -3
  22. package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
  23. package/dist/features/magic-context/compartment-embedding.d.ts.map +1 -1
  24. package/dist/features/magic-context/compartment-storage.d.ts +14 -3
  25. package/dist/features/magic-context/compartment-storage.d.ts.map +1 -1
  26. package/dist/features/magic-context/context-store-uuid.d.ts +7 -0
  27. package/dist/features/magic-context/context-store-uuid.d.ts.map +1 -0
  28. package/dist/features/magic-context/dreamer/classify.d.ts +1 -3
  29. package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
  30. package/dist/features/magic-context/dreamer/cron.d.ts +5 -4
  31. package/dist/features/magic-context/dreamer/cron.d.ts.map +1 -1
  32. package/dist/features/magic-context/dreamer/docs-proposals.d.ts.map +1 -1
  33. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
  34. package/dist/features/magic-context/dreamer/expire-memories.d.ts.map +1 -1
  35. package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts +24 -0
  36. package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts.map +1 -0
  37. package/dist/features/magic-context/dreamer/manual-summary.d.ts.map +1 -1
  38. package/dist/features/magic-context/dreamer/map-memories.d.ts +5 -5
  39. package/dist/features/magic-context/dreamer/module-apply.d.ts +4 -25
  40. package/dist/features/magic-context/dreamer/module-apply.d.ts.map +1 -1
  41. package/dist/features/magic-context/dreamer/retrospective-learnings.d.ts.map +1 -1
  42. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts +5 -1
  43. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
  44. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts +12 -5
  45. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts.map +1 -1
  46. package/dist/features/magic-context/dreamer/task-executor.d.ts +6 -0
  47. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  48. package/dist/features/magic-context/dreamer/task-gates.d.ts +34 -0
  49. package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
  50. package/dist/features/magic-context/dreamer/task-prompts.d.ts +1 -1
  51. package/dist/features/magic-context/dreamer/task-prompts.d.ts.map +1 -1
  52. package/dist/features/magic-context/dreamer/task-registry.d.ts +7 -5
  53. package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
  54. package/dist/features/magic-context/dreamer/task-scheduler.d.ts +10 -3
  55. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  56. package/dist/features/magic-context/dreamer/token-budget.d.ts +3 -0
  57. package/dist/features/magic-context/dreamer/token-budget.d.ts.map +1 -1
  58. package/dist/features/magic-context/dreamer/verify.d.ts +2 -2
  59. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  60. package/dist/features/magic-context/git-commits/git-log-reader.d.ts +11 -2
  61. package/dist/features/magic-context/git-commits/git-log-reader.d.ts.map +1 -1
  62. package/dist/features/magic-context/git-commits/indexer.d.ts.map +1 -1
  63. package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
  64. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts +2 -0
  65. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts.map +1 -1
  66. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts +6 -0
  67. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts.map +1 -0
  68. package/dist/features/magic-context/lkg-prefix-chunks.d.ts +53 -0
  69. package/dist/features/magic-context/lkg-prefix-chunks.d.ts.map +1 -0
  70. package/dist/features/magic-context/memory/embedding-backfill.d.ts.map +1 -1
  71. package/dist/features/magic-context/memory/embedding-local.d.ts +8 -0
  72. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  73. package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
  74. package/dist/features/magic-context/memory/embedding-worker-client.d.ts +27 -0
  75. package/dist/features/magic-context/memory/embedding-worker-client.d.ts.map +1 -0
  76. package/dist/features/magic-context/memory/embedding-worker.d.ts +2 -0
  77. package/dist/features/magic-context/memory/embedding-worker.d.ts.map +1 -0
  78. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts +2 -0
  79. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts.map +1 -0
  80. package/dist/features/magic-context/memory/memory-selection.d.ts.map +1 -1
  81. package/dist/features/magic-context/memory/project-identity-cache.d.ts +4 -3
  82. package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
  83. package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -1
  84. package/dist/features/magic-context/memory/storage-memory-fts.d.ts.map +1 -1
  85. package/dist/features/magic-context/memory/visibility.d.ts +1 -1
  86. package/dist/features/magic-context/memory/visibility.d.ts.map +1 -1
  87. package/dist/features/magic-context/message-fts-rowid-map.d.ts +14 -1
  88. package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -1
  89. package/dist/features/magic-context/message-fts-session-filter.d.ts +14 -0
  90. package/dist/features/magic-context/message-fts-session-filter.d.ts.map +1 -0
  91. package/dist/features/magic-context/message-index.d.ts +1 -7
  92. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  93. package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -1
  94. package/dist/features/magic-context/migration-v94-write-split.d.ts +62 -0
  95. package/dist/features/magic-context/migration-v94-write-split.d.ts.map +1 -0
  96. package/dist/features/magic-context/migration-worker-client.d.ts +23 -0
  97. package/dist/features/magic-context/migration-worker-client.d.ts.map +1 -0
  98. package/dist/features/magic-context/migration-worker-protocol.d.ts +30 -0
  99. package/dist/features/magic-context/migration-worker-protocol.d.ts.map +1 -0
  100. package/dist/features/magic-context/migration-worker.d.ts +2 -0
  101. package/dist/features/magic-context/migration-worker.d.ts.map +1 -0
  102. package/dist/features/magic-context/migrations.d.ts +7 -0
  103. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  104. package/dist/features/magic-context/mural/render-mural.d.ts +24 -2
  105. package/dist/features/magic-context/mural/render-mural.d.ts.map +1 -1
  106. package/dist/features/magic-context/mural/render-trigger.d.ts +1 -1
  107. package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
  108. package/dist/features/magic-context/overflow-detection.d.ts +18 -7
  109. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
  110. package/dist/features/magic-context/project-embedding-registry.d.ts +2 -0
  111. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  112. package/dist/features/magic-context/range-parser.d.ts +2 -3
  113. package/dist/features/magic-context/range-parser.d.ts.map +1 -1
  114. package/dist/features/magic-context/resolve-subagent-fallback.d.ts +2 -0
  115. package/dist/features/magic-context/resolve-subagent-fallback.d.ts.map +1 -1
  116. package/dist/features/magic-context/scheduler.d.ts +2 -0
  117. package/dist/features/magic-context/scheduler.d.ts.map +1 -1
  118. package/dist/features/magic-context/search.d.ts +7 -0
  119. package/dist/features/magic-context/search.d.ts.map +1 -1
  120. package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -1
  121. package/dist/features/magic-context/session-project-storage.d.ts +10 -1
  122. package/dist/features/magic-context/session-project-storage.d.ts.map +1 -1
  123. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts +1 -1
  124. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts.map +1 -1
  125. package/dist/features/magic-context/smart-notes/compiler.d.ts +4 -0
  126. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  127. package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
  128. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts +2 -0
  129. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts.map +1 -1
  130. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts +10 -8
  131. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts.map +1 -1
  132. package/dist/features/magic-context/smart-notes/storage.d.ts +2 -2
  133. package/dist/features/magic-context/smart-notes/storage.d.ts.map +1 -1
  134. package/dist/features/magic-context/smart-notes/types.d.ts +7 -2
  135. package/dist/features/magic-context/smart-notes/types.d.ts.map +1 -1
  136. package/dist/features/magic-context/storage-caveman-rules.d.ts +21 -0
  137. package/dist/features/magic-context/storage-caveman-rules.d.ts.map +1 -0
  138. package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
  139. package/dist/features/magic-context/storage-compartment-history-version.d.ts +4 -0
  140. package/dist/features/magic-context/storage-compartment-history-version.d.ts.map +1 -0
  141. package/dist/features/magic-context/storage-db.d.ts +62 -2
  142. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  143. package/dist/features/magic-context/storage-identity-merge.d.ts +6 -0
  144. package/dist/features/magic-context/storage-identity-merge.d.ts.map +1 -1
  145. package/dist/features/magic-context/storage-meta-persisted.d.ts +15 -0
  146. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  147. package/dist/features/magic-context/storage-meta-session.d.ts +1 -1
  148. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  149. package/dist/features/magic-context/storage-meta-shared.d.ts +1 -1
  150. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  151. package/dist/features/magic-context/storage-notes.d.ts +2 -2
  152. package/dist/features/magic-context/storage-notes.d.ts.map +1 -1
  153. package/dist/features/magic-context/storage-reasoning-removal.d.ts +30 -0
  154. package/dist/features/magic-context/storage-reasoning-removal.d.ts.map +1 -0
  155. package/dist/features/magic-context/storage-replay-document.d.ts +42 -5
  156. package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
  157. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  158. package/dist/features/magic-context/storage-tags.d.ts +7 -1
  159. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  160. package/dist/features/magic-context/storage.d.ts +1 -1
  161. package/dist/features/magic-context/storage.d.ts.map +1 -1
  162. package/dist/features/magic-context/store-generation-rebase.d.ts.map +1 -1
  163. package/dist/features/magic-context/tag-input.d.ts +4 -0
  164. package/dist/features/magic-context/tag-input.d.ts.map +1 -0
  165. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  166. package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
  167. package/dist/features/magic-context/user-memory/storage-user-memory.d.ts.map +1 -1
  168. package/dist/ffi-3cx1cxpk.js +78 -0
  169. package/dist/ffi-7bqqe4cd.js +91 -0
  170. package/dist/ffi-7e6gryj5.js +91 -0
  171. package/dist/ffi-bpvkebwr.js +78 -0
  172. package/dist/hooks/magic-context/apply-operations.d.ts +9 -1
  173. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  174. package/dist/hooks/magic-context/auto-search-deadline.d.ts +10 -0
  175. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -0
  176. package/dist/hooks/magic-context/auto-search-hint.d.ts +3 -0
  177. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
  178. package/dist/hooks/magic-context/auto-search-runner.d.ts +3 -0
  179. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  180. package/dist/hooks/magic-context/caveman-cleanup.d.ts +8 -1
  181. package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -1
  182. package/dist/hooks/magic-context/caveman.d.ts +56 -1
  183. package/dist/hooks/magic-context/caveman.d.ts.map +1 -1
  184. package/dist/hooks/magic-context/child-session-spawn.d.ts +2 -0
  185. package/dist/hooks/magic-context/child-session-spawn.d.ts.map +1 -1
  186. package/dist/hooks/magic-context/command-handler.d.ts +1 -1
  187. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  188. package/dist/hooks/magic-context/compaction-marker-manager.d.ts +1 -1
  189. package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
  190. package/dist/hooks/magic-context/compartment-parser.d.ts +3 -3
  191. package/dist/hooks/magic-context/compartment-parser.d.ts.map +1 -1
  192. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  193. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +0 -1
  194. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  195. package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -1
  196. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  197. package/dist/hooks/magic-context/compartment-runner-types.d.ts +3 -0
  198. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  199. package/dist/hooks/magic-context/compartment-runner-validation.d.ts +6 -0
  200. package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -1
  201. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  202. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +35 -0
  203. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -0
  204. package/dist/hooks/magic-context/derive-budgets.d.ts.map +1 -1
  205. package/dist/hooks/magic-context/dropped-input-guard.d.ts.map +1 -1
  206. package/dist/hooks/magic-context/embed-history-runner.d.ts.map +1 -1
  207. package/dist/hooks/magic-context/emergency-drop.d.ts +15 -0
  208. package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
  209. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  210. package/dist/hooks/magic-context/execute-status.d.ts +1 -0
  211. package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
  212. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +17 -0
  213. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  214. package/dist/hooks/magic-context/heuristic-cleanup.d.ts +2 -0
  215. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
  216. package/dist/hooks/magic-context/historian-host-runner.d.ts +5 -0
  217. package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
  218. package/dist/hooks/magic-context/historian-prompt-fit.d.ts +116 -0
  219. package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -0
  220. package/dist/hooks/magic-context/historian-prompt.generated.d.ts +1 -1
  221. package/dist/hooks/magic-context/historian-prompt.generated.d.ts.map +1 -1
  222. package/dist/hooks/magic-context/history-boundary-repair.d.ts +44 -0
  223. package/dist/hooks/magic-context/history-boundary-repair.d.ts.map +1 -0
  224. package/dist/hooks/magic-context/hook.d.ts +4 -0
  225. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  226. package/dist/hooks/magic-context/inject-compartments.d.ts +8 -0
  227. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  228. package/dist/hooks/magic-context/lkg-persist.d.ts +12 -0
  229. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  230. package/dist/hooks/magic-context/lkg-replay-fit.d.ts +104 -0
  231. package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -0
  232. package/dist/hooks/magic-context/lkg-replay.d.ts +64 -0
  233. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  234. package/dist/hooks/magic-context/module-client.d.ts.map +1 -1
  235. package/dist/hooks/magic-context/module-state-sync-timing.d.ts +1 -1
  236. package/dist/hooks/magic-context/module-state-sync-timing.d.ts.map +1 -1
  237. package/dist/hooks/magic-context/module-state-sync.d.ts +6 -68
  238. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  239. package/dist/hooks/magic-context/module-tool-backends.d.ts +1 -34
  240. package/dist/hooks/magic-context/module-tool-backends.d.ts.map +1 -1
  241. package/dist/hooks/magic-context/module-transport.d.ts +1 -55
  242. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  243. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  244. package/dist/hooks/magic-context/note-nudger.d.ts +2 -0
  245. package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
  246. package/dist/hooks/magic-context/pass-outcome.d.ts +59 -2
  247. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
  248. package/dist/hooks/magic-context/producer-window-guard.d.ts +6 -0
  249. package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -1
  250. package/dist/hooks/magic-context/read-session-chunk.d.ts +13 -2
  251. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  252. package/dist/hooks/magic-context/read-session-formatting.d.ts +11 -0
  253. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  254. package/dist/hooks/magic-context/reasoning-removal.d.ts +60 -0
  255. package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -0
  256. package/dist/hooks/magic-context/recomp-orchestrator.d.ts +1 -0
  257. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
  258. package/dist/hooks/magic-context/reference-retrieval.d.ts +1 -1
  259. package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -1
  260. package/dist/hooks/magic-context/reply-pages.d.ts +3 -0
  261. package/dist/hooks/magic-context/reply-pages.d.ts.map +1 -0
  262. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts +62 -0
  263. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts.map +1 -0
  264. package/dist/hooks/magic-context/rust-mode-transform.d.ts +17 -85
  265. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  266. package/dist/hooks/magic-context/send-session-notification.d.ts.map +1 -1
  267. package/dist/hooks/magic-context/sentinel.d.ts +35 -0
  268. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
  269. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +28 -0
  270. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -0
  271. package/dist/hooks/magic-context/single-store-refusal.d.ts +14 -0
  272. package/dist/hooks/magic-context/single-store-refusal.d.ts.map +1 -0
  273. package/dist/hooks/magic-context/storage-busy-refusal.d.ts +7 -0
  274. package/dist/hooks/magic-context/storage-busy-refusal.d.ts.map +1 -1
  275. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  276. package/dist/hooks/magic-context/stripped-command.d.ts +1 -1
  277. package/dist/hooks/magic-context/stripped-command.d.ts.map +1 -1
  278. package/dist/hooks/magic-context/system-injection-stripper.d.ts +7 -0
  279. package/dist/hooks/magic-context/system-injection-stripper.d.ts.map +1 -1
  280. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  281. package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -1
  282. package/dist/hooks/magic-context/tag-id-fallback.d.ts.map +1 -1
  283. package/dist/hooks/magic-context/tag-messages.d.ts +18 -1
  284. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  285. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  286. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  287. package/dist/hooks/magic-context/transform-compartment-phase.d.ts +1 -0
  288. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  289. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +37 -4
  290. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  291. package/dist/hooks/magic-context/transform.d.ts +12 -39
  292. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  293. package/dist/hooks/magic-context/unmanaged-over-window.d.ts +36 -0
  294. package/dist/hooks/magic-context/unmanaged-over-window.d.ts.map +1 -0
  295. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts +15 -0
  296. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts.map +1 -0
  297. package/dist/hooks/magic-context/user-profile-render.d.ts +3 -0
  298. package/dist/hooks/magic-context/user-profile-render.d.ts.map +1 -0
  299. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  300. package/dist/{index-sqp1hz9v.js → index-16ny736w.js} +10190 -25296
  301. package/dist/{index-mrc0twf3.js → index-2aq21j41.js} +1201 -428
  302. package/dist/{index-32b096cc.js → index-2ntg5sd4.js} +6 -2
  303. package/dist/index-4krbw8z9.js +6034 -0
  304. package/dist/{index-33q7s9y2.js → index-75zjgwga.js} +61 -85
  305. package/dist/{index-zx7pmr39.js → index-8fgkmxmy.js} +28 -10
  306. package/dist/index-a4m2b1yv.js +530 -0
  307. package/dist/index-anq4nn6f.js +131 -0
  308. package/dist/index-avwt563y.js +62 -0
  309. package/dist/index-bmzf7zxv.js +445 -0
  310. package/dist/index-e44zzy84.js +10 -0
  311. package/dist/index-en1k8h8m.js +244 -0
  312. package/dist/{index-638hf49n.js → index-f85teqck.js} +15 -6
  313. package/dist/index-fr2z4qy8.js +7810 -0
  314. package/dist/{index-kwe03yde.js → index-fzbvakh0.js} +1 -1
  315. package/dist/{module-asyncify-2EFITU5U-rkqjhjxd.js → index-g20jdh0p.js} +114 -105
  316. package/dist/index-gd5qx1j9.js +398 -0
  317. package/dist/{index-3bygzk2d.js → index-hybnrwq0.js} +169 -4
  318. package/dist/{index-jqcbs2k1.js → index-mc22ayvf.js} +24 -5
  319. package/dist/index-q7yesyk9.js +9118 -0
  320. package/dist/index-remp7e2g.js +214 -0
  321. package/dist/{index-7k55qm8a.js → index-sfpzqvdz.js} +8 -8
  322. package/dist/{index-msqr3x6m.js → index-vvtfyw1z.js} +12 -75
  323. package/dist/index-w9jwmntv.js +202 -0
  324. package/dist/{index-kr5qehbd.js → index-x23gah8c.js} +1 -1
  325. package/dist/{index-jdxxq8cz.js → index-x8a7jmkh.js} +6 -1
  326. package/dist/{index-wprsye9w.js → index-xgt9k6c6.js} +23 -12
  327. package/dist/index-y8v6yerm.js +77 -0
  328. package/dist/index.d.ts.map +1 -1
  329. package/dist/index.js +7519 -8096
  330. package/dist/message-time-backfill-an311pmk.js +124 -0
  331. package/dist/migration-worker.js +53 -0
  332. package/dist/{model-resolution-dxatzjde.js → model-resolution-xhfmyyvy.js} +5 -1
  333. package/dist/module-ES6BEMUI-3cet1pyp.js +12 -0
  334. package/dist/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  335. package/dist/plugin/boot-deadline.d.ts.map +1 -1
  336. package/dist/plugin/conflict-warning-hook.d.ts.map +1 -1
  337. package/dist/plugin/dream-timer-module-client.d.ts +1 -11
  338. package/dist/plugin/dream-timer-module-client.d.ts.map +1 -1
  339. package/dist/plugin/dream-timer.d.ts.map +1 -1
  340. package/dist/plugin/hooks/create-session-hooks.d.ts +8 -0
  341. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  342. package/dist/plugin/messages-transform.d.ts +20 -13
  343. package/dist/plugin/messages-transform.d.ts.map +1 -1
  344. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  345. package/dist/plugin/stale-build-notice.d.ts +16 -0
  346. package/dist/plugin/stale-build-notice.d.ts.map +1 -0
  347. package/dist/{read-session-chunk-339hg90t.js → read-session-chunk-8rxs0tc9.js} +24 -6
  348. package/dist/recomp-orchestrator-nzamtw29.js +39 -0
  349. package/dist/{rpc-notifications-4amf6mf4.js → rpc-notifications-3hed126v.js} +3 -1
  350. package/dist/{safe-notification-target-50gm9c58.js → safe-notification-target-43r8jsxw.js} +3 -3
  351. package/dist/send-session-notification-nqpv7cne.js +28 -0
  352. package/dist/shared/assistant-message-extractor.d.ts +4 -0
  353. package/dist/shared/assistant-message-extractor.d.ts.map +1 -1
  354. package/dist/shared/background-batch-drain.d.ts +8 -0
  355. package/dist/shared/background-batch-drain.d.ts.map +1 -0
  356. package/dist/{features/builtin-commands/commands.d.ts → shared/builtin-commands.d.ts} +1 -1
  357. package/dist/shared/builtin-commands.d.ts.map +1 -0
  358. package/dist/shared/embedding-activity.d.ts +13 -0
  359. package/dist/shared/embedding-activity.d.ts.map +1 -0
  360. package/dist/shared/historian-tool-expansions.d.ts +5 -0
  361. package/dist/shared/historian-tool-expansions.d.ts.map +1 -0
  362. package/dist/shared/historian-tool-template.d.ts +5 -0
  363. package/dist/shared/historian-tool-template.d.ts.map +1 -0
  364. package/dist/shared/historian-transient-error.d.ts +2 -0
  365. package/dist/shared/historian-transient-error.d.ts.map +1 -0
  366. package/dist/shared/jsonc-edit.d.ts.map +1 -1
  367. package/dist/shared/logger.d.ts +7 -0
  368. package/dist/shared/logger.d.ts.map +1 -1
  369. package/dist/shared/model-suggestion-retry.d.ts +2 -1
  370. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  371. package/dist/shared/models-dev-cache.d.ts.map +1 -1
  372. package/dist/shared/off-thread-migration-clock.d.ts +38 -0
  373. package/dist/shared/off-thread-migration-clock.d.ts.map +1 -0
  374. package/dist/shared/plugin-package-version.d.ts +14 -0
  375. package/dist/shared/plugin-package-version.d.ts.map +1 -0
  376. package/dist/shared/project-directory-key.d.ts +26 -0
  377. package/dist/shared/project-directory-key.d.ts.map +1 -0
  378. package/dist/shared/prompt-async-transport.d.ts +4 -0
  379. package/dist/shared/prompt-async-transport.d.ts.map +1 -1
  380. package/dist/shared/prompt-surface-runtime.d.ts +3 -3
  381. package/dist/shared/provider-response-completion.d.ts +12 -0
  382. package/dist/shared/provider-response-completion.d.ts.map +1 -0
  383. package/dist/shared/redaction.d.ts.map +1 -1
  384. package/dist/shared/rpc-client.d.ts +23 -2
  385. package/dist/shared/rpc-client.d.ts.map +1 -1
  386. package/dist/shared/rpc-types.d.ts +19 -0
  387. package/dist/shared/rpc-types.d.ts.map +1 -1
  388. package/dist/shared/rpc-utils.d.ts +34 -0
  389. package/dist/shared/rpc-utils.d.ts.map +1 -1
  390. package/dist/shared/sqlite.d.ts +13 -2
  391. package/dist/shared/sqlite.d.ts.map +1 -1
  392. package/dist/shared/stale-plugin-build.d.ts +21 -0
  393. package/dist/shared/stale-plugin-build.d.ts.map +1 -0
  394. package/dist/shared/status-summary.d.ts +29 -0
  395. package/dist/shared/status-summary.d.ts.map +1 -1
  396. package/dist/shared/status-view-check.d.ts +124 -0
  397. package/dist/shared/status-view-check.d.ts.map +1 -0
  398. package/dist/shared/status-view.d.ts +38 -2
  399. package/dist/shared/status-view.d.ts.map +1 -1
  400. package/dist/shared/tag-owner-id.d.ts +19 -0
  401. package/dist/shared/tag-owner-id.d.ts.map +1 -0
  402. package/dist/shared/tag-transcript.d.ts +2 -1
  403. package/dist/shared/tag-transcript.d.ts.map +1 -1
  404. package/dist/shared/test-temp-dir.d.ts +8 -2
  405. package/dist/shared/test-temp-dir.d.ts.map +1 -1
  406. package/dist/shared/user-facing-codes.d.ts +41 -6
  407. package/dist/shared/user-facing-codes.d.ts.map +1 -1
  408. package/dist/shared/xml-unescape.d.ts +9 -0
  409. package/dist/shared/xml-unescape.d.ts.map +1 -0
  410. package/dist/task-config-v81k8jvk.js +17 -0
  411. package/dist/tools/ctx-expand/constants.d.ts +1 -1
  412. package/dist/tools/ctx-expand/constants.d.ts.map +1 -1
  413. package/dist/tools/ctx-expand/mode.d.ts +4 -0
  414. package/dist/tools/ctx-expand/mode.d.ts.map +1 -1
  415. package/dist/tools/ctx-expand/render.d.ts +5 -1
  416. package/dist/tools/ctx-expand/render.d.ts.map +1 -1
  417. package/dist/tools/ctx-expand/tools.d.ts +2 -0
  418. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  419. package/dist/tools/ctx-expand/types.d.ts +1 -0
  420. package/dist/tools/ctx-expand/types.d.ts.map +1 -1
  421. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  422. package/dist/tools/ctx-note/render.d.ts +2 -0
  423. package/dist/tools/ctx-note/render.d.ts.map +1 -1
  424. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  425. package/dist/tools/ctx-reduce/constants.d.ts +1 -1
  426. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
  427. package/dist/tools/ctx-search/constants.d.ts +1 -1
  428. package/dist/tools/ctx-search/constants.d.ts.map +1 -1
  429. package/dist/tools/light-descriptions.d.ts +3 -3
  430. package/dist/tools/light-descriptions.d.ts.map +1 -1
  431. package/dist/tools/parameter-descriptions.d.ts +14 -14
  432. package/dist/transform-postprocess-phase-414phndq.js +61 -0
  433. package/dist/tui/data/context-db.d.ts +34 -10
  434. package/dist/tui/data/context-db.d.ts.map +1 -1
  435. package/dist/tui/data/notification-socket.d.ts +6 -0
  436. package/dist/tui/data/notification-socket.d.ts.map +1 -1
  437. package/dist/tui/data/session-directory.d.ts +16 -0
  438. package/dist/tui/data/session-directory.d.ts.map +1 -0
  439. package/dist/tui-compiled/data/context-db.d.ts +34 -10
  440. package/dist/tui-compiled/data/context-db.d.ts.map +1 -1
  441. package/dist/tui-compiled/data/notification-socket.d.ts +6 -0
  442. package/dist/tui-compiled/data/notification-socket.d.ts.map +1 -1
  443. package/dist/tui-compiled/data/session-directory.d.ts +16 -0
  444. package/dist/tui-compiled/data/session-directory.d.ts.map +1 -0
  445. package/dist/v2/derive-budgets-v0krf3t7.js +18 -0
  446. package/dist/v2/embedding-worker.js +47 -0
  447. package/dist/v2/emscripten-module-0g8f45e6.js +602 -0
  448. package/dist/v2/emscripten-module-0pekdjxz.js +1532 -0
  449. package/dist/v2/emscripten-module-e67xwsp3.js +503 -0
  450. package/dist/v2/emscripten-module-pj1vyb44.js +4559 -0
  451. package/dist/v2/ffi-3cx1cxpk.js +78 -0
  452. package/dist/v2/ffi-7bqqe4cd.js +91 -0
  453. package/dist/v2/ffi-7e6gryj5.js +91 -0
  454. package/dist/v2/ffi-bpvkebwr.js +78 -0
  455. package/dist/v2/fold/boundary.d.ts.map +1 -1
  456. package/dist/v2/fork-inheritance.d.ts +101 -0
  457. package/dist/v2/fork-inheritance.d.ts.map +1 -0
  458. package/dist/v2/hidden-child-cleanup.d.ts +11 -0
  459. package/dist/v2/hidden-child-cleanup.d.ts.map +1 -0
  460. package/dist/v2/hidden-child-native.d.ts +29 -0
  461. package/dist/v2/hidden-child-native.d.ts.map +1 -0
  462. package/dist/v2/hidden-child-record.d.ts +135 -0
  463. package/dist/v2/hidden-child-record.d.ts.map +1 -0
  464. package/dist/v2/hidden-completion.d.ts +12 -97
  465. package/dist/v2/hidden-completion.d.ts.map +1 -1
  466. package/dist/v2/hooks/context.d.ts +20 -8
  467. package/dist/v2/hooks/context.d.ts.map +1 -1
  468. package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
  469. package/dist/v2/hooks/dream-trigger.d.ts +5 -0
  470. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  471. package/dist/v2/hooks/generate.d.ts +10 -0
  472. package/dist/v2/hooks/generate.d.ts.map +1 -0
  473. package/dist/v2/hooks/hidden-child.d.ts +33 -2
  474. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  475. package/dist/v2/hooks/payload.d.ts +3 -0
  476. package/dist/v2/hooks/payload.d.ts.map +1 -1
  477. package/dist/v2/hooks/session-api-gate.d.ts +4 -0
  478. package/dist/v2/hooks/session-api-gate.d.ts.map +1 -0
  479. package/dist/v2/hooks/storage-gate.d.ts +3 -1
  480. package/dist/v2/hooks/storage-gate.d.ts.map +1 -1
  481. package/dist/v2/hooks/tools.d.ts.map +1 -1
  482. package/dist/v2/hooks/types.d.ts +10 -0
  483. package/dist/v2/hooks/types.d.ts.map +1 -1
  484. package/dist/v2/hooks/update-check.d.ts.map +1 -1
  485. package/dist/v2/hooks/usage-persist.d.ts.map +1 -1
  486. package/dist/v2/hooks/usage-reading.d.ts +4 -0
  487. package/dist/v2/hooks/usage-reading.d.ts.map +1 -1
  488. package/dist/v2/index-6e4mwffh.js +5662 -0
  489. package/dist/v2/index-en1k8h8m.js +244 -0
  490. package/dist/{message-time-backfill-q374fxc5.js → v2/message-time-backfill-0n93vrd7.js} +19 -5
  491. package/dist/v2/migration-worker.js +52 -0
  492. package/dist/v2/model-resolution-xhfmyyvy.js +16 -0
  493. package/dist/v2/module-ES6BEMUI-3cet1pyp.js +12 -0
  494. package/dist/v2/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  495. package/dist/v2/prompt-context-5y5ms8f9.js +6 -0
  496. package/dist/v2/read-session-chunk-hjza38hr.js +83 -0
  497. package/dist/v2/recomp-orchestrator-1aq7h44c.js +36 -0
  498. package/dist/v2/retrospective-raw-provider.d.ts +21 -0
  499. package/dist/v2/retrospective-raw-provider.d.ts.map +1 -0
  500. package/dist/v2/rpc-notifications-3hed126v.js +16 -0
  501. package/dist/v2/safe-notification-target-wtj0bbc2.js +9 -0
  502. package/dist/{send-session-notification-04hvd54c.js → v2/send-session-notification-mq9frrtm.js} +10 -5
  503. package/dist/v2/server-0jqw05sa.js +803 -0
  504. package/dist/v2/server-5317ykaf.js +40 -0
  505. package/dist/v2/server-a4m2b1yv.js +530 -0
  506. package/dist/v2/server-avwt563y.js +62 -0
  507. package/dist/v2/server-c4g2y1z8.js +28824 -0
  508. package/dist/v2/server-ckpc8pxy.js +662 -0
  509. package/dist/v2/server-e36nf2p1.js +7702 -0
  510. package/dist/v2/server-e44zzy84.js +10 -0
  511. package/dist/v2/server-fgmxwrgy.js +16 -0
  512. package/dist/v2/server-fmsr7v69.js +75 -0
  513. package/dist/v2/server-g20jdh0p.js +1273 -0
  514. package/dist/{index-qm36k34q.js → v2/server-hfjfbg59.js} +796 -737
  515. package/dist/v2/server-n96ag4rk.js +633 -0
  516. package/dist/v2/server-qdjnb2z1.js +181 -0
  517. package/dist/v2/server-qpg6wf72.js +187 -0
  518. package/dist/v2/server-r7cmye3k.js +131 -0
  519. package/dist/v2/server-remp7e2g.js +214 -0
  520. package/dist/v2/server-rhdgxp1t.js +398 -0
  521. package/dist/v2/server-sfpzqvdz.js +137 -0
  522. package/dist/v2/server-syahy8j8.js +50 -0
  523. package/dist/v2/server-v5xgft5v.js +9116 -0
  524. package/dist/v2/server-w99cyt6a.js +361 -0
  525. package/dist/v2/server-x8a7jmkh.js +104 -0
  526. package/dist/v2/server-y8v6yerm.js +77 -0
  527. package/dist/v2/server-z19x7eqz.js +423 -0
  528. package/dist/v2/server.d.ts.map +1 -1
  529. package/dist/v2/server.js +8796 -107376
  530. package/dist/v2/store-reader.d.ts +50 -0
  531. package/dist/v2/store-reader.d.ts.map +1 -1
  532. package/dist/v2/task-config-tbndqyny.js +17 -0
  533. package/dist/v2/transformers-node-wasm.js +26768 -0
  534. package/dist/v2/transformers-web.js +25670 -0
  535. package/dist/v2/transformers.node-hj754h7s.js +29997 -0
  536. package/dist/v2/tui/index.d.ts +10 -1
  537. package/dist/v2/tui/index.d.ts.map +1 -1
  538. package/dist/v2/tui/sidebar-mount.d.ts +6 -0
  539. package/dist/v2/tui/sidebar-mount.d.ts.map +1 -1
  540. package/dist/v2/tui/status-dialog-mount.d.ts +7 -4
  541. package/dist/v2/tui/status-dialog-mount.d.ts.map +1 -1
  542. package/dist/v2/tui/types.d.ts +12 -0
  543. package/dist/v2/tui/types.d.ts.map +1 -1
  544. package/dist/v2/wrapup-orchestrator-tbyx78dz.js +425 -0
  545. package/dist/wrapup-orchestrator-h28bqsy6.js +26 -0
  546. package/package.json +8 -8
  547. package/src/agents/hidden-agent-registrations.ts +24 -16
  548. package/src/agents/magic-context-prompt.test.ts +41 -0
  549. package/src/agents/magic-context-prompt.ts +8 -5
  550. package/src/agents/permissions.test.ts +31 -49
  551. package/src/agents/permissions.ts +8 -28
  552. package/src/config/index.test.ts +60 -20
  553. package/src/config/index.ts +53 -1
  554. package/src/config/live-run-config.test.ts +5 -5
  555. package/src/config/live-snapshot.test.ts +4 -4
  556. package/src/config/migrate-config-location.test.ts +3 -10
  557. package/src/config/project-config-trust-boundary.test.ts +207 -0
  558. package/src/config/project-security.hostile-matrix.test.ts +4 -4
  559. package/src/config/project-security.ts +218 -1
  560. package/src/config/protected-tokens.test.ts +14 -9
  561. package/src/config/raw-loader.test.ts +31 -3
  562. package/src/config/raw-loader.ts +8 -3
  563. package/src/config/schema/magic-context.ts +20 -3
  564. package/src/config/variable.test.ts +3 -2
  565. package/src/features/magic-context/dreamer/cron.ts +30 -9
  566. package/src/features/magic-context/dreamer/task-registry.ts +7 -5
  567. package/src/shared/announcement.test.ts +2 -1
  568. package/src/shared/assistant-message-extractor.test.ts +27 -1
  569. package/src/shared/assistant-message-extractor.ts +27 -0
  570. package/src/shared/background-batch-drain.test.ts +38 -0
  571. package/src/shared/background-batch-drain.ts +29 -0
  572. package/src/shared/builtin-commands.ts +50 -0
  573. package/src/shared/console-diagnostics-fence.test.ts +145 -0
  574. package/src/shared/data-path.test.ts +6 -5
  575. package/src/shared/embedding-activity.test.ts +21 -0
  576. package/src/shared/embedding-activity.ts +36 -0
  577. package/src/shared/historian-tool-defaults.json +13 -0
  578. package/src/shared/historian-tool-expansions.ts +18 -0
  579. package/src/shared/historian-tool-template.ts +248 -0
  580. package/src/shared/historian-transient-error.test.ts +36 -0
  581. package/src/shared/historian-transient-error.ts +22 -0
  582. package/src/shared/jsonc-edit.ts +20 -1
  583. package/src/shared/logger.test.ts +3 -2
  584. package/src/shared/logger.ts +40 -1
  585. package/src/shared/model-suggestion-retry.test.ts +46 -0
  586. package/src/shared/model-suggestion-retry.ts +16 -1
  587. package/src/shared/models-dev-cache.test.ts +74 -2
  588. package/src/shared/models-dev-cache.ts +5 -1
  589. package/src/shared/off-thread-migration-clock.test.ts +55 -0
  590. package/src/shared/off-thread-migration-clock.ts +124 -0
  591. package/src/shared/opencode-db-path.test.ts +3 -2
  592. package/src/shared/plugin-package-version.ts +52 -0
  593. package/src/shared/project-directory-key.test.ts +111 -0
  594. package/src/shared/project-directory-key.ts +54 -0
  595. package/src/shared/prompt-async-transport.test.ts +249 -72
  596. package/src/shared/prompt-async-transport.ts +131 -24
  597. package/src/shared/prompt-surface-a1-golden.md +41 -25
  598. package/src/shared/prompt-surface-runtime.test.ts +3 -3
  599. package/src/shared/provider-response-completion.ts +23 -0
  600. package/src/shared/redaction.test.ts +51 -1
  601. package/src/shared/redaction.ts +33 -0
  602. package/src/shared/rpc-async-probes.test.ts +32 -2
  603. package/src/shared/rpc-client.test.ts +3 -2
  604. package/src/shared/rpc-client.ts +76 -18
  605. package/src/shared/rpc-types.ts +15 -0
  606. package/src/shared/rpc-utils.test.ts +164 -10
  607. package/src/shared/rpc-utils.ts +144 -15
  608. package/src/shared/sqlite-acquisition-routing.test.ts +46 -3
  609. package/src/shared/sqlite-pass-scope.test.ts +3 -2
  610. package/src/shared/sqlite-transaction-mode-guard.test.ts +4 -0
  611. package/src/shared/sqlite-writer-diagnostics.test.ts +134 -0
  612. package/src/shared/sqlite.ts +225 -41
  613. package/src/shared/stale-plugin-build.test.ts +129 -0
  614. package/src/shared/stale-plugin-build.ts +151 -0
  615. package/src/shared/status-summary.ts +40 -13
  616. package/src/shared/status-view-check.test.ts +253 -0
  617. package/src/shared/status-view-check.ts +536 -0
  618. package/src/shared/status-view.test.ts +6 -1
  619. package/src/shared/status-view.ts +176 -4
  620. package/src/shared/storage-busy.test.ts +3 -2
  621. package/src/shared/tag-owner-id.test.ts +33 -0
  622. package/src/shared/tag-owner-id.ts +29 -0
  623. package/src/shared/tag-transcript.ts +13 -2
  624. package/src/shared/test-temp-dir-policy.test.ts +33 -0
  625. package/src/shared/test-temp-dir.test.ts +27 -0
  626. package/src/shared/test-temp-dir.ts +36 -12
  627. package/src/shared/tui-config.test.ts +6 -5
  628. package/src/shared/tui-preferences.test.ts +3 -2
  629. package/src/shared/user-facing-codes.ts +52 -6
  630. package/src/shared/window-geometry.test.ts +3 -2
  631. package/src/shared/write-transaction-attribution.test.ts +11 -7
  632. package/src/shared/write-transaction-hold-clock.test.ts +160 -0
  633. package/src/shared/xml-unescape.ts +19 -0
  634. package/src/tui/data/context-db.test.ts +92 -4
  635. package/src/tui/data/context-db.ts +184 -18
  636. package/src/tui/data/notification-socket.test.ts +49 -2
  637. package/src/tui/data/notification-socket.ts +47 -9
  638. package/src/tui/data/session-directory.ts +19 -0
  639. package/src/tui/dialogs/status-dialog-render.test.ts +284 -0
  640. package/src/tui/dialogs/status-dialog.tsx +41 -38
  641. package/src/tui/index.tsx +30 -18
  642. package/src/tui/slots/sidebar-content.tsx +9 -2
  643. package/src/tui-compiled/data/context-db.ts +184 -18
  644. package/src/tui-compiled/data/notification-socket.ts +47 -9
  645. package/src/tui-compiled/data/session-directory.ts +19 -0
  646. package/src/tui-compiled/dialogs/status-dialog.tsx +38 -29
  647. package/src/tui-compiled/index.tsx +29 -16
  648. package/src/tui-compiled/slots/sidebar-content.tsx +3 -2
  649. package/src/v2/tui/host-contract.test.ts +9 -10
  650. package/src/v2/tui/index.ts +78 -23
  651. package/src/v2/tui/load-compiled-sidebar.d.mts +5 -1
  652. package/src/v2/tui/load-compiled-status-dialog.d.mts +3 -2
  653. package/src/v2/tui/session-directory.test.ts +53 -0
  654. package/src/v2/tui/sidebar-mount.ts +19 -1
  655. package/src/v2/tui/status-dialog-mount.ts +10 -7
  656. package/src/v2/tui/types.ts +10 -0
  657. package/dist/features/builtin-commands/commands.d.ts.map +0 -1
  658. package/dist/features/builtin-commands/types.d.ts +0 -3
  659. package/dist/features/builtin-commands/types.d.ts.map +0 -1
  660. package/dist/features/magic-context/context-authority.d.ts +0 -272
  661. package/dist/features/magic-context/context-authority.d.ts.map +0 -1
  662. package/dist/features/magic-context/memory/mirror-reembed.d.ts +0 -22
  663. package/dist/features/magic-context/memory/mirror-reembed.d.ts.map +0 -1
  664. package/dist/hooks/magic-context/historian-state-file.d.ts +0 -43
  665. package/dist/hooks/magic-context/historian-state-file.d.ts.map +0 -1
  666. package/dist/index-4an2p8qa.js +0 -1056
  667. package/dist/index-rn7gafjr.js +0 -8
  668. package/dist/index-v6t0tg85.js +0 -13
  669. package/dist/plugin/memory-id-translation.d.ts +0 -109
  670. package/dist/plugin/memory-id-translation.d.ts.map +0 -1
  671. package/dist/plugin/rust-note-backend.d.ts +0 -84
  672. package/dist/plugin/rust-note-backend.d.ts.map +0 -1
  673. package/dist/recomp-orchestrator-0ers6smx.js +0 -22
  674. package/dist/task-config-2bm68628.js +0 -9
  675. package/dist/transform-postprocess-phase-ttdkrm6r.js +0 -36
  676. package/dist/v2/host-service.d.ts +0 -66
  677. package/dist/v2/host-service.d.ts.map +0 -1
  678. package/dist/wrapup-orchestrator-x0jvvrqn.js +0 -19
  679. /package/dist/{index-s70wtd8k.js → index-q6hef7fh.js} +0 -0
@@ -1,17 +1,42 @@
1
+ import {
2
+ OMO_INTERNAL_INITIATOR_MARKER,
3
+ isSystemDirective,
4
+ hasMeaningfulUserText2,
5
+ extractTexts2,
6
+ extractToolResultBodyTokens,
7
+ extractToolCallSummaries,
8
+ estimateTokens,
9
+ normalizeText,
10
+ compactRole,
11
+ formatBlock,
12
+ compactTextForSummary,
13
+ mergeCommitHashes
14
+ } from "./server-rhdgxp1t.js";
1
15
  import {
2
16
  getHarness
3
- } from "./index-s70wtd8k.js";
17
+ } from "./server-ckpc8pxy.js";
18
+ import {
19
+ renderToolTemplate
20
+ } from "./server-remp7e2g.js";
4
21
  import {
5
22
  openCodeDbExists,
6
23
  withReadOnlySessionDb,
7
24
  getRawSessionMessageCountFromDb,
8
25
  getMessageTimesFromOpenCodeDb
9
- } from "./index-4an2p8qa.js";
26
+ } from "./server-w99cyt6a.js";
27
+ import {
28
+ stableStringify,
29
+ getLargestMeasuredToolDefinitionTokens,
30
+ getMeasuredToolDefinitionTokens
31
+ } from "./server-r7cmye3k.js";
10
32
  import {
11
33
  UNKNOWN_FIT_RATIO,
12
34
  resolveDecisionCalibration,
13
35
  providerMass
14
- } from "./index-n96ag4rk.js";
36
+ } from "./server-n96ag4rk.js";
37
+ import {
38
+ canonicalModelIdentity
39
+ } from "./server-avwt563y.js";
15
40
 
16
41
  // src/features/magic-context/reclaim-protection.ts
17
42
  var CTX_REDUCE_KEEP = 3;
@@ -19,411 +44,14 @@ function newestCtxReduceTagNumbers(tags) {
19
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));
20
45
  }
21
46
 
22
- // src/hooks/magic-context/read-session-formatting.ts
23
- import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
24
- import { createRequire } from "node:module";
25
- import { homedir } from "node:os";
26
- import { dirname, join, resolve } from "node:path";
27
- import { pathToFileURL } from "node:url";
28
-
29
- // src/shared/commit-detection.ts
30
- var HASH_HEX = "[0-9a-f]{7,12}";
31
- var COMMIT_HASH_TEST_PATTERN = new RegExp(`\\b${HASH_HEX}\\b`, "i");
32
- var COMMIT_VERB_PATTERN = /\b(?:commit(?:ted|ting|s)?|cherry-?pick(?:ed|ing|s)?|merge[ds]?|merging|rebas(?:e|ed|es|ing))\b/i;
33
- function textMentionsRecentCommit(text) {
34
- return COMMIT_HASH_TEST_PATTERN.test(text) && COMMIT_VERB_PATTERN.test(text);
35
- }
36
- function createCommitHashExtractPattern() {
37
- return new RegExp(`\`?\\b(${HASH_HEX})\\b\`?`, "gi");
38
- }
39
-
40
- // src/shared/internal-initiator-marker.ts
41
- var OMO_INTERNAL_INITIATOR_MARKER = "<!-- OMO_INTERNAL_INITIATOR -->";
42
-
43
- // src/shared/system-directive.ts
44
- var SYSTEM_DIRECTIVE_PREFIX = "[SYSTEM DIRECTIVE: MAGIC-CONTEXT";
45
- function isSystemDirective(text) {
46
- return text.trimStart().startsWith(SYSTEM_DIRECTIVE_PREFIX);
47
- }
48
- function removeSystemReminders(text) {
49
- return text.replace(/<system-reminder>[\s\S]*?<\/system-reminder>/gi, "").trim();
50
- }
51
-
52
- // src/hooks/magic-context/read-session-formatting.ts
53
- var MAX_COMMITS_PER_BLOCK = 5;
54
- function hasMeaningfulUserText2(parts) {
55
- for (const part of parts) {
56
- if (part === null || typeof part !== "object")
57
- continue;
58
- const candidate = part;
59
- if (candidate.type !== "text" || typeof candidate.text !== "string")
60
- continue;
61
- if (candidate.ignored === true)
62
- continue;
63
- const cleaned = removeSystemReminders(candidate.text).replace(OMO_INTERNAL_INITIATOR_MARKER, "").trim();
64
- if (!cleaned)
65
- continue;
66
- if (isSystemDirective(cleaned))
67
- continue;
68
- return true;
69
- }
70
- return false;
71
- }
72
- function extractTexts2(parts) {
73
- const texts = [];
74
- for (const part of parts) {
75
- if (part === null || typeof part !== "object")
76
- continue;
77
- const p = part;
78
- if (p.type === "text" && typeof p.text === "string" && p.text.trim().length > 0) {
79
- texts.push(p.text.trim());
80
- }
81
- }
82
- return texts;
83
- }
84
- function extractToolResultBodyTokens(parts) {
85
- let tokens = 0;
86
- for (const part of parts) {
87
- if (part === null || typeof part !== "object")
88
- continue;
89
- const p = part;
90
- if (p.type !== "tool")
91
- continue;
92
- const state = p.state;
93
- if (!state || typeof state !== "object")
94
- continue;
95
- const body = state.output ?? state.error;
96
- if (body === undefined)
97
- continue;
98
- const text = typeof body === "string" ? body : JSON.stringify(body);
99
- tokens += Math.ceil(text.length / 4);
100
- }
101
- return tokens;
102
- }
103
- function extractToolCallSummaries(parts) {
104
- const summaries = [];
105
- for (const part of parts) {
106
- if (part === null || typeof part !== "object")
107
- continue;
108
- const p = part;
109
- if (p.type !== "tool" || typeof p.tool !== "string")
110
- continue;
111
- const state = p.state;
112
- if (!state || typeof state !== "object")
113
- continue;
114
- const input = state.input;
115
- const metadata = state.metadata;
116
- const description = input && typeof input.description === "string" && input.description || metadata && typeof metadata.description === "string" && metadata.description;
117
- if (description) {
118
- summaries.push(`TC: ${description}`);
119
- continue;
120
- }
121
- const toolName = p.tool;
122
- const keyArg = extractKeyArg(toolName, input);
123
- summaries.push(keyArg ? `TC: ${toolName}(${keyArg})` : `TC: ${toolName}`);
124
- }
125
- return summaries;
126
- }
127
- function extractKeyArg(_toolName, input) {
128
- if (!input)
129
- return null;
130
- if (typeof input.filePath === "string")
131
- return truncateArg(input.filePath);
132
- if (typeof input.path === "string")
133
- return truncateArg(input.path);
134
- if (typeof input.pattern === "string")
135
- return truncateArg(input.pattern);
136
- if (typeof input.query === "string")
137
- return truncateArg(input.query);
138
- if (typeof input.symbol === "string")
139
- return input.symbol;
140
- if (typeof input.module === "string")
141
- return input.module;
142
- if (typeof input.action === "string")
143
- return input.action;
144
- return null;
145
- }
146
- function truncateArg(value, maxLen = 60) {
147
- if (value.length <= maxLen)
148
- return value;
149
- return `${value.slice(0, maxLen)}…`;
150
- }
151
- var TOKENIZER_PACKAGE_DIRS = [
152
- ["@cortexkit", "opencode-magic-context"],
153
- ["@cortexkit", "pi-magic-context"]
154
- ];
155
- var tokenizer;
156
- var tokenizerLoadAttempted = false;
157
- var tokenizerLoadPromise;
158
- var tokenizerWarningSent = false;
159
- var tokenizerEncodingPath;
160
- var tokenizerSerializedTableBytes;
161
- function tokenizerPackageRoots() {
162
- const cwd = process.cwd();
163
- const openCodeCache = join(process.env.XDG_CACHE_HOME ?? join(homedir(), ".cache"), "opencode");
164
- const roots = [cwd, openCodeCache];
165
- const candidates = [];
166
- for (const root of roots) {
167
- for (const packageDir of TOKENIZER_PACKAGE_DIRS) {
168
- candidates.push(join(root, "node_modules", ...packageDir, "node_modules", "ai-tokenizer"));
169
- }
170
- candidates.push(join(root, "node_modules", "ai-tokenizer"));
171
- }
172
- let ancestor = process.argv[1] ? dirname(resolve(process.argv[1])) : cwd;
173
- while (true) {
174
- candidates.push(join(ancestor, "node_modules", "ai-tokenizer"));
175
- const parent = dirname(ancestor);
176
- if (parent === ancestor)
177
- break;
178
- ancestor = parent;
179
- }
180
- return [...new Set(candidates)];
181
- }
182
- function packageImportTarget(value) {
183
- if (typeof value === "string")
184
- return value;
185
- if (!value || typeof value !== "object")
186
- return;
187
- const conditions = value;
188
- return packageImportTarget(conditions.import) ?? packageImportTarget(conditions.default);
189
- }
190
- function findTokenizerImportPaths() {
191
- for (const packageRoot of tokenizerPackageRoots()) {
192
- const packageJsonPath = join(packageRoot, "package.json");
193
- if (!existsSync(packageJsonPath))
194
- continue;
195
- try {
196
- const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
197
- const tokenizerTarget = packageImportTarget(packageJson.exports?.["."]) ?? (typeof packageJson.module === "string" ? packageJson.module : undefined) ?? (typeof packageJson.main === "string" ? packageJson.main : undefined);
198
- const encodingTarget = packageImportTarget(packageJson.exports?.["./encoding/claude"]);
199
- if (!tokenizerTarget || !encodingTarget)
200
- continue;
201
- return {
202
- tokenizerPath: realpathSync(join(packageRoot, tokenizerTarget)),
203
- encodingPath: realpathSync(join(packageRoot, encodingTarget))
204
- };
205
- } catch {}
206
- }
207
- return;
208
- }
209
- function constructTokenizer(tokenizerModule, claudeEncoding) {
210
- const typedModule = tokenizerModule;
211
- const Tokenizer = typedModule.default ?? typedModule.Tokenizer;
212
- if (!Tokenizer) {
213
- throw new Error("ai-tokenizer does not expose a Tokenizer constructor");
214
- }
215
- return new Tokenizer(claudeEncoding);
216
- }
217
- function loadTokenizer() {
218
- const requireFromThisModule = createRequire(import.meta.url);
219
- const encodingSpecifier = "ai-tokenizer/encoding/" + "claude";
220
- tokenizerEncodingPath = requireFromThisModule.resolve(encodingSpecifier);
221
- tokenizerSerializedTableBytes = undefined;
222
- return constructTokenizer(requireFromThisModule("ai-" + "tokenizer"), requireFromThisModule(encodingSpecifier));
223
- }
224
- async function loadTokenizerFromInstalledPackage() {
225
- const installedPaths = findTokenizerImportPaths();
226
- if (!installedPaths) {
227
- throw new Error("ai-tokenizer was not found under the project, runtime, or OpenCode cache node_modules roots");
228
- }
229
- const [tokenizerModule, claudeEncoding] = await Promise.all([
230
- import(pathToFileURL(installedPaths.tokenizerPath).href),
231
- import(pathToFileURL(installedPaths.encodingPath).href)
232
- ]);
233
- tokenizerEncodingPath = installedPaths.encodingPath;
234
- tokenizerSerializedTableBytes = undefined;
235
- return constructTokenizer(tokenizerModule, claudeEncoding);
236
- }
237
- function serializedTokenizerTableBytes(entryPath) {
238
- const root = dirname(entryPath);
239
- const pending = [entryPath];
240
- const visited = new Set;
241
- let total = 0;
242
- try {
243
- while (pending.length > 0) {
244
- const nextPath = pending.pop();
245
- if (!nextPath)
246
- break;
247
- const path = realpathSync(nextPath);
248
- if (visited.has(path))
249
- continue;
250
- visited.add(path);
251
- total += statSync(path).size;
252
- const source = readFileSync(path, "utf8");
253
- const localImports = source.matchAll(/(?:require\(|\bfrom\s+|\bimport\()\s*["'](\.\.?\/[^"']+)["']/g);
254
- for (const match of localImports) {
255
- const specifier = match[1];
256
- if (!specifier)
257
- continue;
258
- const dependency = resolve(dirname(path), specifier);
259
- if (dependency.startsWith(root))
260
- pending.push(dependency);
261
- }
262
- }
263
- return total;
264
- } catch {
265
- return null;
266
- }
267
- }
268
- function getTokenizerNativeMemoryStats() {
269
- if (tokenizerSerializedTableBytes === undefined) {
270
- tokenizerSerializedTableBytes = tokenizerEncodingPath ? serializedTokenizerTableBytes(tokenizerEncodingPath) : null;
271
- }
272
- return {
273
- loaded: tokenizer !== undefined,
274
- loadAttempted: tokenizerLoadAttempted || tokenizerLoadPromise !== undefined,
275
- tableBytes: tokenizerSerializedTableBytes,
276
- tablePath: tokenizerEncodingPath ?? null
277
- };
278
- }
279
- function warnTokenizerFallback(error) {
280
- if (tokenizerWarningSent)
281
- return;
282
- tokenizerWarningSent = true;
283
- const reason = error instanceof Error ? error.message : String(error);
284
- console.warn("[magic-context] ai-tokenizer is unavailable; using approximate character-based token counts for this process. Token budgets, persisted per-message counts, and protected-tail/compartment boundaries may be less accurate until restart:", reason);
285
- }
286
- async function preloadTokenizer() {
287
- if (tokenizer)
288
- return true;
289
- if (tokenizerLoadAttempted)
290
- return false;
291
- if (tokenizerLoadPromise)
292
- return tokenizerLoadPromise;
293
- tokenizerLoadPromise = (async () => {
294
- try {
295
- try {
296
- tokenizer = loadTokenizer();
297
- } catch {
298
- tokenizer = await loadTokenizerFromInstalledPackage();
299
- }
300
- tokenizerLoadAttempted = true;
301
- return true;
302
- } catch (error) {
303
- tokenizerLoadAttempted = true;
304
- warnTokenizerFallback(error);
305
- return false;
306
- } finally {
307
- tokenizerLoadPromise = undefined;
308
- }
309
- })();
310
- return tokenizerLoadPromise;
311
- }
312
- function getTokenizer() {
313
- if (tokenizer || tokenizerLoadAttempted)
314
- return tokenizer;
315
- tokenizerLoadAttempted = true;
316
- try {
317
- tokenizer = loadTokenizer();
318
- } catch (error) {
319
- warnTokenizerFallback(error);
320
- }
321
- return tokenizer;
322
- }
323
- function estimateTokensHeuristically(text) {
324
- return Math.ceil(text.length / 3.5);
325
- }
326
- function estimateTokens(text) {
327
- if (!text)
328
- return 0;
329
- const activeTokenizer = getTokenizer();
330
- if (!activeTokenizer)
331
- return estimateTokensHeuristically(text);
332
- try {
333
- return activeTokenizer.encode(text, "all").length;
334
- } catch (error) {
335
- tokenizer = undefined;
336
- tokenizerLoadAttempted = true;
337
- warnTokenizerFallback(error);
338
- return estimateTokensHeuristically(text);
339
- }
340
- }
341
- function normalizeText(text) {
342
- return text.replace(/\s+/g, " ").trim();
343
- }
344
- function compactRole(role) {
345
- if (role === "assistant")
346
- return "A";
347
- if (role === "user")
348
- return "U";
349
- return role.slice(0, 1).toUpperCase() || "M";
350
- }
351
- function formatBlock(block) {
352
- const range = block.startOrdinal === block.endOrdinal ? `[${block.startOrdinal}]` : `[${block.startOrdinal}-${block.endOrdinal}]`;
353
- const commitSuffix = block.commitHashes.length > 0 ? ` commits: ${block.commitHashes.join(", ")}` : "";
354
- return `${range} ${block.role}:${commitSuffix} ${block.parts.join(" / ")}`;
355
- }
356
- function extractCommitHashes(text) {
357
- const hashes = [];
358
- const seen = new Set;
359
- for (const match of text.matchAll(createCommitHashExtractPattern())) {
360
- const hash = match[1]?.toLowerCase();
361
- if (!hash || seen.has(hash))
362
- continue;
363
- seen.add(hash);
364
- hashes.push(hash);
365
- if (hashes.length >= MAX_COMMITS_PER_BLOCK)
366
- break;
367
- }
368
- return hashes;
369
- }
370
- function compactTextForSummary(text, role) {
371
- const commitHashes = role === "assistant" ? extractCommitHashes(text) : [];
372
- if (commitHashes.length === 0 || !COMMIT_VERB_PATTERN.test(text)) {
373
- return { text, commitHashes };
374
- }
375
- const withoutHashes = text.replace(createCommitHashExtractPattern(), "").replace(/\(\s*\)/g, "").replace(/\s+,/g, ",").replace(/,\s*,+/g, ", ").replace(/\s{2,}/g, " ").replace(/\s+([,.;:])/g, "$1").trim();
376
- return {
377
- text: withoutHashes.length > 0 ? withoutHashes : text,
378
- commitHashes
379
- };
380
- }
381
- function mergeCommitHashes(existing, next) {
382
- if (next.length === 0)
383
- return existing;
384
- const merged = [...existing];
385
- for (const hash of next) {
386
- if (merged.includes(hash))
387
- continue;
388
- merged.push(hash);
389
- if (merged.length >= MAX_COMMITS_PER_BLOCK)
390
- break;
391
- }
392
- return merged;
393
- }
394
-
395
47
  // src/hooks/magic-context/tag-content-primitives.ts
396
48
  var encoder = new TextEncoder;
397
49
  var TAG_PREFIX_REGEX = /^(?:§\d+§\s*)+/;
398
50
  var MALFORMED_TAG_PREFIX_REGEX = /^(?:§\d+">§(?:\d+§)?\s*)+/;
399
- var DANGLING_TAG_GLOBAL_REGEX = /\u00a7\d+(?!\.\d)[^\s\u00a7\w.]?/g;
400
51
  var DANGLING_TAG_PREFIX_REGEX = /^(?:\u00a7\d+(?!\.\d)[^\s\u00a7\w.]?\s*)+/;
401
- var COMPLETE_TAG_PAIR_GLOBAL_REGEX = /\u00a7\d+\u00a7/g;
402
- var MALFORMED_TAG_GLOBAL_REGEX = /\u00a7\d+">(?:\u00a7(?:\d+\u00a7)?)?/g;
403
- var STRAY_SECTION_CHAR_REGEX = /\u00a7/g;
404
52
  function stripWellFormedLeadingTagPrefix(value) {
405
53
  return value.replace(/^(\u00a7\d+\u00a7\s*)+/, "");
406
54
  }
407
- function stripCompleteTagPairsGlobally(value) {
408
- return value.replace(COMPLETE_TAG_PAIR_GLOBAL_REGEX, "");
409
- }
410
- function stripMalformedTagNotationGlobally(value) {
411
- return value.replace(MALFORMED_TAG_GLOBAL_REGEX, "");
412
- }
413
- function stripDanglingTagNotationGlobally(value) {
414
- return value.replace(DANGLING_TAG_GLOBAL_REGEX, "");
415
- }
416
- function stripTagSectionCharacters(value) {
417
- return value.replace(STRAY_SECTION_CHAR_REGEX, "");
418
- }
419
- function stripPersistedAssistantText(value) {
420
- let text = stripWellFormedLeadingTagPrefix(value);
421
- text = stripCompleteTagPairsGlobally(text);
422
- text = stripMalformedTagNotationGlobally(text);
423
- text = stripDanglingTagNotationGlobally(text);
424
- text = stripTagSectionCharacters(text);
425
- return text.trim();
426
- }
427
55
  function byteSize(value) {
428
56
  return encoder.encode(value).length;
429
57
  }
@@ -461,26 +89,17 @@ function isRecord(value) {
461
89
  return typeof value === "object" && value !== null && !Array.isArray(value);
462
90
  }
463
91
 
464
- // src/shared/stable-json.ts
465
- function stableStringify(value, seen = new WeakSet) {
466
- if (value === undefined)
467
- return "undefined";
468
- if (value === null || typeof value !== "object")
469
- return JSON.stringify(value) ?? String(value);
470
- if (seen.has(value))
471
- return '"[Circular]"';
472
- seen.add(value);
473
- if (Array.isArray(value)) {
474
- return `[${value.map((item) => stableStringify(item, seen)).join(",")}]`;
475
- }
476
- const entries = Object.entries(value).sort(([a], [b]) => {
477
- if (a < b)
478
- return -1;
479
- if (a > b)
480
- return 1;
481
- return 0;
482
- });
483
- return `{${entries.map(([key, child]) => `${JSON.stringify(key)}:${stableStringify(child, seen)}`).join(",")}}`;
92
+ // src/shared/tag-owner-id.ts
93
+ var POSITIONAL_CONTENT_SUFFIX = /:(?:p|file)\d+$/;
94
+ var CONTENT_DERIVED_TEXT_SUFFIX = /:mc-text-v1:[0-9a-f]+:[0-9a-f]+:o\d+$/;
95
+ function contentTagOwnerMessageId(contentId) {
96
+ const positional = POSITIONAL_CONTENT_SUFFIX.exec(contentId);
97
+ if (positional)
98
+ return contentId.slice(0, positional.index);
99
+ const derived = CONTENT_DERIVED_TEXT_SUFFIX.exec(contentId);
100
+ if (derived)
101
+ return contentId.slice(0, derived.index);
102
+ return contentId;
484
103
  }
485
104
 
486
105
  // src/hooks/magic-context/image-token-estimate.ts
@@ -506,7 +125,7 @@ function estimateImageTokensFromDataUrl(url) {
506
125
  if (dims)
507
126
  return clampImageTokens(Math.ceil(dims.w * dims.h / IMAGE_TOKEN_DIVISOR));
508
127
  } else if (header.includes("image/jpeg") || header.includes("image/jpg")) {
509
- const dims = parseJpegDimensions(bytes);
128
+ const dims = parseJpegDimensions(createBase64ByteReader(payload, bytes));
510
129
  if (dims)
511
130
  return clampImageTokens(Math.ceil(dims.w * dims.h / IMAGE_TOKEN_DIVISOR));
512
131
  } else if (header.includes("image/webp")) {
@@ -564,21 +183,46 @@ function parsePngDimensions(b) {
564
183
  return null;
565
184
  return { w, h };
566
185
  }
567
- function parseJpegDimensions(b) {
568
- if (b.length < 4 || b[0] !== 255 || b[1] !== 216)
186
+ var READER_PREVIEW_CHARS = 512;
187
+ var READER_PREVIEW_BYTES = 384;
188
+ var READER_WINDOW_CHARS = 4096;
189
+ var READER_WINDOW_BYTES = 3072;
190
+ function createBase64ByteReader(payload, preview) {
191
+ const windows = new Map;
192
+ return (offset) => {
193
+ if (offset < READER_PREVIEW_BYTES)
194
+ return preview[offset];
195
+ const index = Math.floor((offset - READER_PREVIEW_BYTES) / READER_WINDOW_BYTES);
196
+ let window = windows.get(index);
197
+ if (window === undefined) {
198
+ const start = READER_PREVIEW_CHARS + index * READER_WINDOW_CHARS;
199
+ const chars = payload.slice(start, start + READER_WINDOW_CHARS);
200
+ try {
201
+ window = chars.length > 0 ? base64Decode(chars) : null;
202
+ } catch {
203
+ window = null;
204
+ }
205
+ windows.set(index, window);
206
+ }
207
+ return window?.[offset - READER_PREVIEW_BYTES - index * READER_WINDOW_BYTES];
208
+ };
209
+ }
210
+ var JPEG_SCAN_LIMIT_BYTES = 256 * 1024;
211
+ function parseJpegDimensions(byteAt) {
212
+ if (byteAt(0) !== 255 || byteAt(1) !== 216 || byteAt(3) === undefined)
569
213
  return null;
570
214
  let i = 2;
571
- while (i < b.length - 8) {
572
- if (b[i] !== 255) {
215
+ while (i < JPEG_SCAN_LIMIT_BYTES && byteAt(i + 8) !== undefined) {
216
+ if (byteAt(i) !== 255) {
573
217
  i++;
574
218
  continue;
575
219
  }
576
- const marker = b[i + 1];
220
+ const marker = byteAt(i + 1);
577
221
  if (marker === undefined)
578
222
  break;
579
223
  if (isSofMarker(marker)) {
580
- const h = b[i + 5] << 8 | b[i + 6];
581
- const w = b[i + 7] << 8 | b[i + 8];
224
+ const h = byteAt(i + 5) << 8 | byteAt(i + 6);
225
+ const w = byteAt(i + 7) << 8 | byteAt(i + 8);
582
226
  if (w && h)
583
227
  return { w, h };
584
228
  return null;
@@ -587,7 +231,7 @@ function parseJpegDimensions(b) {
587
231
  i += 2;
588
232
  continue;
589
233
  }
590
- const segLen = b[i + 2] << 8 | b[i + 3];
234
+ const segLen = byteAt(i + 2) << 8 | byteAt(i + 3);
591
235
  if (segLen < 2)
592
236
  return null;
593
237
  i += 2 + segLen;
@@ -978,7 +622,7 @@ function toolInputText(part) {
978
622
  function messageIdForTag(tag) {
979
623
  if (tag.type === "tool")
980
624
  return tag.toolOwnerMessageId;
981
- return tag.messageId.replace(/:(?:p|file)\d+$/, "");
625
+ return contentTagOwnerMessageId(tag.messageId);
982
626
  }
983
627
  function resolveProtectedTagNumbers(tags, protectedTagNumbersInput) {
984
628
  const protectedNumbers = new Set(protectedTagNumbersInput);
@@ -1868,6 +1512,7 @@ ${body}${hintText}
1868
1512
  var TARGET_FRACTION = 0.3;
1869
1513
  var TIER_RECENCY_RESERVE = 0.2;
1870
1514
  var EMERGENCY_REARM_MIN_TOKENS = 2000;
1515
+ var EMERGENCY_MIN_ACHIEVABLE_RECLAIM_TOKENS = EMERGENCY_REARM_MIN_TOKENS;
1871
1516
  var T1_TOOLS = new Set(["read", "todowrite", "task", "aft_outline", "aft_zoom"]);
1872
1517
  var T2_TOOLS = new Set(["edit", "write", "apply_patch", "grep", "glob", "aft_search"]);
1873
1518
  function normalizeToolName(toolName) {
@@ -1929,8 +1574,9 @@ function planEmergencyDrop(input) {
1929
1574
  const workingSpan = Math.max(ceilingTokens - fixedFloor, 0);
1930
1575
  const target = fixedFloor + TARGET_FRACTION * workingSpan;
1931
1576
  const reclaimTokens = Math.round(currentTotalInputTokens - target);
1577
+ const floorNote = fixedFloor > ceilingTokens ? `; fixed floor ≈${Math.round(fixedFloor)} already exceeds ceiling ${Math.round(ceilingTokens)}: tool drops cannot reach the target` : "";
1932
1578
  if (reclaimTokens <= EMERGENCY_REARM_MIN_TOKENS) {
1933
- return noop(`reclaim<=min (${reclaimTokens} <= ${EMERGENCY_REARM_MIN_TOKENS})`);
1579
+ return noop(`reclaim<=min (${reclaimTokens} <= ${EMERGENCY_REARM_MIN_TOKENS})${floorNote}`);
1934
1580
  }
1935
1581
  const cutoff = input.protectedCutoff;
1936
1582
  const windowYields = absoluteEmergency;
@@ -1985,13 +1631,16 @@ function planEmergencyDrop(input) {
1985
1631
  }
1986
1632
  }
1987
1633
  if (selected.length === 0) {
1988
- return noop("no-candidates");
1634
+ return noop(`no-candidates${floorNote}`);
1635
+ }
1636
+ if (!input.passAlreadyPriced && reclaimed < EMERGENCY_MIN_ACHIEVABLE_RECLAIM_TOKENS) {
1637
+ return noop(`achievable reclaim below minimum (${selected.length} tags, reclaim≈${Math.round(reclaimed)} < ${EMERGENCY_MIN_ACHIEVABLE_RECLAIM_TOKENS} against gap ${reclaimTokens})${floorNote}`);
1989
1638
  }
1990
1639
  return {
1991
1640
  shouldDrop: true,
1992
1641
  tagNumbers: selected,
1993
1642
  reclaimTokens,
1994
- reason: `tiered drop: ${selected.length} tags, reclaim≈${reclaimed}/${reclaimTokens} tokens (floor≈${fixedFloor}, ceiling=${Math.round(ceilingTokens)})`
1643
+ reason: `tiered drop: ${selected.length} tags, reclaim≈${reclaimed}/${reclaimTokens} tokens (floor≈${fixedFloor}, ceiling=${Math.round(ceilingTokens)})${floorNote}`
1995
1644
  };
1996
1645
  }
1997
1646
  function measureEmergencyTag(tag, target, calibration, skeleton) {
@@ -2045,14 +1694,13 @@ function getUpdateTagDropModeStatement(db) {
2045
1694
  }
2046
1695
  var updateTagByteSizeStatements = new WeakMap;
2047
1696
  var updateTagInputByteSizeStatements = new WeakMap;
2048
- var CONTENT_ID_SUFFIX = /:(?:p|file)\d+$/;
2049
1697
  var RECENT_OWNER_SCAN_PAGE_SIZE = 128;
2050
1698
  var recentTagOwnerStatements = new WeakMap;
2051
1699
  function ownerMessageIdForTagRow(row) {
2052
1700
  if (row.type === "tool") {
2053
1701
  return row.tool_owner_message_id ?? row.message_id;
2054
1702
  }
2055
- return row.message_id.replace(CONTENT_ID_SUFFIX, "");
1703
+ return contentTagOwnerMessageId(row.message_id);
2056
1704
  }
2057
1705
  function getRecentTagOwnerStatement(db) {
2058
1706
  let statement = recentTagOwnerStatements.get(db);
@@ -2077,7 +1725,7 @@ function getRecentTagOwnerMessageIds(db, sessionId, maxOwners) {
2077
1725
  for (const row of rows) {
2078
1726
  if (typeof row.type !== "string" || typeof row.message_id !== "string")
2079
1727
  continue;
2080
- const ownerId = row.type === "tool" ? typeof row.tool_owner_message_id === "string" ? row.tool_owner_message_id : null : row.message_id.replace(CONTENT_ID_SUFFIX, "");
1728
+ const ownerId = row.type === "tool" ? typeof row.tool_owner_message_id === "string" ? row.tool_owner_message_id : null : contentTagOwnerMessageId(row.message_id);
2081
1729
  if (!ownerId || recent.has(ownerId))
2082
1730
  continue;
2083
1731
  recent.add(ownerId);
@@ -2243,22 +1891,6 @@ function getUpdateTagMessageIdStatement(db) {
2243
1891
  }
2244
1892
  return stmt;
2245
1893
  }
2246
- function getTagNumbersByMessageIdStatement(db) {
2247
- let stmt = getTagNumbersByMessageIdStatements.get(db);
2248
- if (!stmt) {
2249
- stmt = db.prepare("SELECT tag_number FROM tags WHERE session_id = ? AND (message_id = ? OR message_id LIKE ? ESCAPE '\\' OR message_id LIKE ? ESCAPE '\\') ORDER BY tag_number ASC");
2250
- getTagNumbersByMessageIdStatements.set(db, stmt);
2251
- }
2252
- return stmt;
2253
- }
2254
- function getDeleteTagsByMessageIdStatement(db) {
2255
- let stmt = deleteTagsByMessageIdStatements.get(db);
2256
- if (!stmt) {
2257
- stmt = db.prepare("DELETE FROM tags WHERE session_id = ? AND (message_id = ? OR message_id LIKE ? ESCAPE '\\' OR message_id LIKE ? ESCAPE '\\')");
2258
- deleteTagsByMessageIdStatements.set(db, stmt);
2259
- }
2260
- return stmt;
2261
- }
2262
1894
  function getMaxTagNumberBySessionStatement(db) {
2263
1895
  let stmt = getMaxTagNumberBySessionStatements.get(db);
2264
1896
  if (!stmt) {
@@ -2332,9 +1964,6 @@ function isMaxTagNumberRow(row) {
2332
1964
  const r = row;
2333
1965
  return typeof r.max_tag_number === "number";
2334
1966
  }
2335
- function escapeLikePattern(value) {
2336
- return value.replaceAll("\\", "\\\\").replaceAll("%", "\\%").replaceAll("_", "\\_");
2337
- }
2338
1967
  function insertTag(db, sessionId, messageId, type, byteSize, tagNumber, reasoningByteSize = 0, toolName = null, inputByteSize = 0, toolOwnerMessageId = null, entryFingerprint = null, tokenCounts = null) {
2339
1968
  getInsertTagStatement(db).run(sessionId, messageId, type, byteSize, reasoningByteSize, tagNumber, toolName, inputByteSize, getHarness(), toolOwnerMessageId, entryFingerprint, tokenCounts?.tokenCount ?? null, tokenCounts?.inputTokenCount ?? null, tokenCounts?.reasoningTokenCount ?? null);
2340
1969
  return tagNumber;
@@ -2349,7 +1978,21 @@ function markWhitespaceAssistantTagInert(db, sessionId, tagNumber, contentId) {
2349
1978
  entry_fingerprint = ?
2350
1979
  WHERE session_id = ? AND tag_number = ? AND type = 'message'`).run(`${WHITESPACE_ASSISTANT_INERT_MESSAGE_PREFIX}${tagNumber}`, `${WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX}${contentId}`, sessionId, tagNumber);
2351
1980
  }
2352
- function getInertWhitespaceAssistantTags(db, sessionId) {
1981
+ function getInertWhitespaceAssistantTags(db, sessionId, messageIds) {
1982
+ 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
+ });
1995
+ }
2353
1996
  const rows = db.prepare(`SELECT tag_number AS tagNumber, entry_fingerprint AS entryFingerprint
2354
1997
  FROM tags
2355
1998
  WHERE session_id = ?
@@ -2452,9 +2095,10 @@ function deleteFoldedDuplicateTag(db, sessionId, tagNumber) {
2452
2095
  foldStatement(db, "DELETE FROM tags WHERE session_id = ? AND tag_number = ?").run(sessionId, tagNumber);
2453
2096
  foldStatement(db, "DELETE FROM pending_ops WHERE session_id = ? AND tag_id = ?").run(sessionId, tagNumber);
2454
2097
  }
2455
- function foldDuplicateIntoSurvivor(db, sessionId, survivor, duplicate, duplicateMayHaveQueuedOps = true) {
2098
+ function foldDuplicateIntoSurvivor(db, sessionId, survivor, duplicate, duplicateMayHaveQueuedOps = true, propagateDroppedStatus = true) {
2456
2099
  mergeSizeAndTokenColumnsIntoSurvivor(db, sessionId, survivor, duplicate);
2457
- applyDroppedStatusIfNeeded(db, sessionId, survivor, duplicate);
2100
+ if (propagateDroppedStatus)
2101
+ applyDroppedStatusIfNeeded(db, sessionId, survivor, duplicate);
2458
2102
  if (duplicateMayHaveQueuedOps) {
2459
2103
  retargetPendingOps(db, sessionId, duplicate.tagNumber, survivor.tagNumber);
2460
2104
  }
@@ -2549,7 +2193,7 @@ function foldShrunkPartTags(db, sessionId, messages) {
2549
2193
  for (const orphan of orphans) {
2550
2194
  if (orphan.tagNumber === survivor.tagNumber)
2551
2195
  continue;
2552
- foldDuplicateIntoSurvivor(db, sessionId, survivor, orphan, queuedTags.any.has(orphan.tagNumber));
2196
+ foldDuplicateIntoSurvivor(db, sessionId, survivor, orphan, queuedTags.any.has(orphan.tagNumber), false);
2553
2197
  result.foldedTagNumbers.push(orphan.tagNumber);
2554
2198
  }
2555
2199
  }
@@ -2558,56 +2202,69 @@ function foldShrunkPartTags(db, sessionId, messages) {
2558
2202
  return result;
2559
2203
  }
2560
2204
  function markTagsCompactedByMessageIds(db, sessionId, messageIds) {
2561
- const update = db.prepare(`UPDATE tags
2562
- SET status = 'compacted'
2563
- WHERE session_id = ?
2564
- AND status IN ('active', 'dropped')
2565
- AND (
2566
- message_id = ?
2567
- OR message_id LIKE ? ESCAPE '\\'
2568
- OR message_id LIKE ? ESCAPE '\\'
2569
- OR tool_owner_message_id = ?
2570
- )
2571
- RETURNING id`);
2572
- return db.transaction(() => {
2573
- let changed = 0;
2574
- for (const messageId of new Set(messageIds)) {
2575
- const escaped = escapeLikePattern(messageId);
2576
- changed += update.all(sessionId, messageId, `${escaped}:p%`, `${escaped}:file%`, messageId).length;
2577
- }
2578
- return changed;
2579
- }).immediate();
2580
- }
2581
- function deleteTagsByMessageId(db, sessionId, messageId) {
2582
- const deleteTransaction = db.transaction(() => {
2583
- const escapedMessageId = escapeLikePattern(messageId);
2584
- const textPartPattern = `${escapedMessageId}:p%`;
2585
- const filePartPattern = `${escapedMessageId}:file%`;
2586
- const messageScopedTags = getTagNumbersByMessageIdStatement(db).all(sessionId, messageId, textPartPattern, filePartPattern).filter(isTagNumberRow).map((row) => row.tag_number);
2587
- const ownerScopedTagNumbers = getOwnerScopedToolTagNumbers(db, sessionId, messageId);
2588
- if (messageScopedTags.length === 0 && ownerScopedTagNumbers.length === 0) {
2589
- return [];
2590
- }
2591
- if (messageScopedTags.length > 0) {
2592
- getDeleteTagsByMessageIdStatement(db).run(sessionId, messageId, textPartPattern, filePartPattern);
2593
- }
2594
- if (ownerScopedTagNumbers.length > 0) {
2595
- deleteToolTagsByOwner(db, sessionId, messageId);
2205
+ const ids = new Set(messageIds);
2206
+ if (ids.size === 0)
2207
+ return 0;
2208
+ const asciiLower = (value) => value.replace(/[A-Z]/g, (char) => char.toLowerCase());
2209
+ const foldedIds = new Set(Array.from(ids, asciiLower));
2210
+ const nulPrefixes = new Set(Array.from(ids).filter((id) => id.includes("\x00")).map((id) => asciiLower(id.split("\x00")[0])));
2211
+ const matches = (messageId, owner) => {
2212
+ if (messageId !== null && ids.has(messageId))
2213
+ return true;
2214
+ if (owner !== null && ids.has(owner))
2215
+ return true;
2216
+ if (messageId === null)
2217
+ return false;
2218
+ const nul = messageId.indexOf("\x00");
2219
+ const value = nul < 0 ? messageId : messageId.slice(0, nul);
2220
+ if (nulPrefixes.size > 0 && nulPrefixes.has(asciiLower(value)))
2221
+ return true;
2222
+ for (let colon = value.indexOf(":");colon >= 0; colon = value.indexOf(":", colon + 1)) {
2223
+ const suffix = value[colon + 1];
2224
+ if ((suffix === "p" || suffix === "P" || asciiLower(value.slice(colon + 1, colon + 5)) === "file") && foldedIds.has(asciiLower(value.slice(0, colon))))
2225
+ return true;
2596
2226
  }
2597
- const merged = new Set([...messageScopedTags, ...ownerScopedTagNumbers]);
2598
- return Array.from(merged).sort((a, b) => a - b);
2227
+ return false;
2228
+ };
2229
+ const rows = db.prepare(`WITH ids AS MATERIALIZED (
2230
+ SELECT value AS source_id, lower(value) AS folded_id FROM json_each(?)
2231
+ )
2232
+ SELECT id, message_id, tool_owner_message_id FROM tags INDEXED BY idx_tags_session_tag_number
2233
+ WHERE session_id = ? AND status IN ('active', 'dropped') AND (
2234
+ message_id IN (SELECT source_id FROM ids)
2235
+ OR tool_owner_message_id IN (SELECT source_id FROM ids)
2236
+ OR (instr(lower(message_id), ':p') > 0 AND
2237
+ lower(substr(message_id, 1, instr(lower(message_id), ':p') - 1)) IN (SELECT folded_id FROM ids))
2238
+ OR (instr(lower(message_id), ':file') > 0 AND
2239
+ lower(substr(message_id, 1, instr(lower(message_id), ':file') - 1)) IN (SELECT folded_id FROM ids))
2240
+ OR (? AND instr(message_id, ':') > 0)
2241
+ OR ?
2242
+ )`).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));
2244
+ if (candidates.length === 0)
2245
+ return 0;
2246
+ const update = db.prepare(`UPDATE tags SET status = 'compacted'
2247
+ WHERE id = ? AND session_id = ?
2248
+ AND status IN ('active', 'dropped')
2249
+ AND message_id IS ? AND tool_owner_message_id IS ?
2250
+ RETURNING id`);
2251
+ let cursor = 0;
2252
+ let changed = 0;
2253
+ const batch = db.transaction(() => {
2254
+ const start = performance.now();
2255
+ let processed = 0;
2256
+ do {
2257
+ const row = candidates[cursor++];
2258
+ if (update.get(row.id, sessionId, row.message_id, row.tool_owner_message_id))
2259
+ changed++;
2260
+ processed++;
2261
+ } while (cursor < candidates.length && processed < 128 && performance.now() - start < 8);
2599
2262
  });
2600
- return deleteTransaction.immediate();
2263
+ while (cursor < candidates.length)
2264
+ batch.immediate();
2265
+ return changed;
2601
2266
  }
2602
2267
  var getOwnerScopedToolTagNumbersStatements = new WeakMap;
2603
- function getOwnerScopedToolTagNumbers(db, sessionId, ownerMsgId) {
2604
- let stmt = getOwnerScopedToolTagNumbersStatements.get(db);
2605
- if (!stmt) {
2606
- stmt = db.prepare("SELECT tag_number FROM tags WHERE session_id = ? AND type = 'tool' AND tool_owner_message_id = ? ORDER BY tag_number ASC");
2607
- getOwnerScopedToolTagNumbersStatements.set(db, stmt);
2608
- }
2609
- return stmt.all(sessionId, ownerMsgId).filter(isTagNumberRow).map((row) => row.tag_number);
2610
- }
2611
2268
  function getMaxTagNumberBySession(db, sessionId) {
2612
2269
  const row = getMaxTagNumberBySessionStatement(db).get(sessionId);
2613
2270
  return isMaxTagNumberRow(row) ? row.max_tag_number : 0;
@@ -2722,11 +2379,14 @@ function getTailHygieneTags(db, sessionId) {
2722
2379
  return active;
2723
2380
  }
2724
2381
  function getDroppedTagsBySession(db, sessionId, scope) {
2725
- const rows = (scope ? db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags
2726
- WHERE session_id = ? AND status = 'dropped'
2727
- AND ((type = 'tool' AND tool_owner_message_id IN (SELECT value FROM json_each(?)))
2728
- OR (type != 'tool' AND message_id IN (SELECT value FROM json_each(?))))
2729
- ORDER BY tag_number ASC, id ASC`).all(sessionId, JSON.stringify(scope.ownerIds), JSON.stringify(scope.messageAddresses)) : getDroppedTagsBySessionStatement(db).all(sessionId)).filter(isTagRow);
2382
+ const rows = (scope ? db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags INDEXED BY idx_tags_pi_fallback_tool_owner
2383
+ WHERE session_id = ? AND type = 'tool' AND +status = 'dropped'
2384
+ AND tool_owner_message_id IN (SELECT value FROM json_each(?))
2385
+ UNION ALL
2386
+ SELECT ${TAG_SELECT_COLUMNS} FROM tags INDEXED BY idx_tags_session_message_id
2387
+ WHERE session_id = ? AND type != 'tool' AND +status = 'dropped'
2388
+ AND message_id IN (SELECT value FROM json_each(?))
2389
+ ORDER BY tag_number ASC, id ASC`).all(sessionId, JSON.stringify(scope.ownerIds), sessionId, JSON.stringify(scope.messageAddresses)) : getDroppedTagsBySessionStatement(db).all(sessionId)).filter(isTagRow);
2730
2390
  return rows.map(toTagEntry);
2731
2391
  }
2732
2392
  function getTagsByNumbers(db, sessionId, tagNumbers) {
@@ -2868,20 +2528,33 @@ function pickNearestPriorOwner(candidates, currentMessageId, times) {
2868
2528
  }
2869
2529
  return best?.id ?? null;
2870
2530
  }
2871
- function getDeleteToolTagsByOwnerStatement(db) {
2872
- let stmt = deleteToolTagsByOwnerStatements.get(db);
2873
- if (!stmt) {
2874
- stmt = db.prepare(`DELETE FROM tags
2875
- WHERE session_id = ?
2876
- AND type = 'tool'
2877
- AND tool_owner_message_id = ?
2878
- RETURNING id`);
2879
- deleteToolTagsByOwnerStatements.set(db, stmt);
2880
- }
2881
- return stmt;
2882
- }
2883
- function deleteToolTagsByOwner(db, sessionId, ownerMsgId) {
2884
- return getDeleteToolTagsByOwnerStatement(db).all(sessionId, ownerMsgId).length;
2531
+ // src/shared/historian-tool-defaults.json
2532
+ var historian_tool_defaults_default = {
2533
+ ctx_note: "Note ${input.action} ${input.note_ids}: ${input.content} → ${output.truncate(160)}",
2534
+ ctx_memory: "Memory ${input.action} ${input.category} ${input.ids}: ${input.content} → ${output.truncate(160)}",
2535
+ todowrite: 'Todos (${input.todos.count}): ${input.todos.each("${status}: ${content}")}',
2536
+ question: 'Asked user: ${input.questions[*].question.join(" / ")} → ${output}',
2537
+ task: "Task ${input.subagent_type}: ${input.prompt} → ${output.truncate(200)}",
2538
+ ask: 'Asked: ${input.question.truncate(250)} [options: ${input.options.join(" / ")}] ${input.resolution} → ${output.truncate(300)}',
2539
+ peer_send: "PM to ${input.agent}${input.agent_id}: ${input.message.truncate(400)}",
2540
+ board: 'Board ${input.verb}: ${input.ops.each("${op} ${item}${lane.title} ${state}${lane.status}${props.text} ${lane.items[*].text}")}',
2541
+ room: "Room ${input.action} ${input.room_id}: ${input.text.truncate(400)}",
2542
+ work: "Work ${input.action} ${input.id}: ${input.prompt_file}${input.prompt.truncate(200)}${input.notes.truncate(200)} → ${output.truncate(160)}",
2543
+ knowhow: "Looked up how-to: ${input.query}${input.id}"
2544
+ };
2545
+
2546
+ // src/shared/historian-tool-expansions.ts
2547
+ function expandToolPart(part, overrides) {
2548
+ if (!part || typeof part !== "object")
2549
+ return null;
2550
+ const p = part;
2551
+ if (p.type !== "tool" || typeof p.tool !== "string")
2552
+ return null;
2553
+ const template = overrides && Object.hasOwn(overrides, p.tool) ? overrides[p.tool] : Object.hasOwn(historian_tool_defaults_default, p.tool) ? historian_tool_defaults_default[p.tool] : undefined;
2554
+ if (typeof template !== "string")
2555
+ return null;
2556
+ const state = p.state;
2557
+ return renderToolTemplate(template, state?.input, state?.output ?? state?.error);
2885
2558
  }
2886
2559
 
2887
2560
  // src/hooks/magic-context/host-served-rows.ts
@@ -3948,18 +3621,87 @@ function computeRawRangeFingerprint(messages, startInclusive, endExclusive) {
3948
3621
  }
3949
3622
  return pieces.join("|");
3950
3623
  }
3951
- function invalidateTrueRawTokenCache(args) {
3952
- const sessionNeedle = args.sessionId ? `${args.sessionId}` : null;
3953
- const messageNeedle = args.messageId ? `\x00${args.messageId}\x00` : null;
3954
- for (const [key, value] of messageEstimateCache) {
3955
- const sessionMatches = sessionNeedle === null || key.includes(sessionNeedle);
3956
- const messageMatches = messageNeedle === null || key.includes(messageNeedle);
3957
- if (sessionMatches && messageMatches) {
3958
- messageEstimateCache.delete(key);
3959
- messageEstimateCacheBytes -= value.keyEstimateBytes;
3624
+
3625
+ // src/hooks/magic-context/system-injection-stripper.ts
3626
+ var SYSTEM_INJECTION_MARKERS = [
3627
+ "<!-- OMO_INTERNAL_INITIATOR -->",
3628
+ "[SYSTEM DIRECTIVE: MAGIC-CONTEXT",
3629
+ "[SYSTEM DIRECTIVE: OH-MY-OPENCODE",
3630
+ "[Category+Skill Reminder]",
3631
+ "[EDIT ERROR - IMMEDIATE ACTION REQUIRED]",
3632
+ "[task CALL FAILED - IMMEDIATE RETRY REQUIRED]",
3633
+ "[EMERGENCY CONTEXT WINDOW WARNING]",
3634
+ "Unstable background agent appears idle",
3635
+ "**THE SUBAGENT JUST CLAIMED THIS TASK IS DONE."
3636
+ ];
3637
+ var SYSTEM_REMINDER_REGEX = /<system-reminder>[\s\S]*?<\/system-reminder>/gi;
3638
+ var OMO_MARKER_REGEX = /<!-- OMO_INTERNAL_INITIATOR -->/g;
3639
+ var STEERING_WRAPPER_REGEX = /<system-reminder>\nThe user sent the following message:\n[\s\S]*?\n\nPlease address this message and continue with your tasks\.\n<\/system-reminder>/g;
3640
+ function stripSystemInjection(text) {
3641
+ STEERING_WRAPPER_REGEX.lastIndex = 0;
3642
+ if (!STEERING_WRAPPER_REGEX.test(text))
3643
+ return stripInjectedRegions(text);
3644
+ STEERING_WRAPPER_REGEX.lastIndex = 0;
3645
+ let result = "";
3646
+ let changed = false;
3647
+ let cursor = 0;
3648
+ const keepOrStrip = (segment) => {
3649
+ const stripped = stripInjectedRegions(segment);
3650
+ if (stripped === null) {
3651
+ result += segment;
3652
+ } else {
3653
+ result += stripped;
3654
+ changed = true;
3655
+ }
3656
+ };
3657
+ for (const match of text.matchAll(STEERING_WRAPPER_REGEX)) {
3658
+ keepOrStrip(text.slice(cursor, match.index));
3659
+ result += match[0];
3660
+ cursor = match.index + match[0].length;
3661
+ }
3662
+ keepOrStrip(text.slice(cursor));
3663
+ return changed ? result.trim() : null;
3664
+ }
3665
+ function stripOutsideSteeringWrappers(text, strip) {
3666
+ STEERING_WRAPPER_REGEX.lastIndex = 0;
3667
+ let result = "";
3668
+ let cursor = 0;
3669
+ for (const match of text.matchAll(STEERING_WRAPPER_REGEX)) {
3670
+ result += strip(text.slice(cursor, match.index));
3671
+ result += match[0];
3672
+ cursor = match.index + match[0].length;
3673
+ }
3674
+ return result + strip(text.slice(cursor));
3675
+ }
3676
+ function stripInjectedRegions(text) {
3677
+ let hasInjection = false;
3678
+ for (const marker of SYSTEM_INJECTION_MARKERS) {
3679
+ if (text.includes(marker)) {
3680
+ hasInjection = true;
3681
+ break;
3960
3682
  }
3961
3683
  }
3962
- args.reason;
3684
+ if (SYSTEM_REMINDER_REGEX.test(text))
3685
+ hasInjection = true;
3686
+ SYSTEM_REMINDER_REGEX.lastIndex = 0;
3687
+ if (!hasInjection)
3688
+ return null;
3689
+ let cleaned = text;
3690
+ cleaned = cleaned.replace(SYSTEM_REMINDER_REGEX, "");
3691
+ cleaned = cleaned.replace(OMO_MARKER_REGEX, "");
3692
+ cleaned = cleaned.replace(/\[SYSTEM DIRECTIVE: OH-MY-(?:OPENCODE|CLAUDE)[^\]]*\][\s\S]*?(?=\n\n(?!\s*[-*])|$)/g, "");
3693
+ for (const marker of SYSTEM_INJECTION_MARKERS) {
3694
+ if (marker.startsWith("<!-- ") || marker.startsWith("[SYSTEM DIRECTIVE"))
3695
+ continue;
3696
+ const idx = cleaned.indexOf(marker);
3697
+ if (idx === -1)
3698
+ continue;
3699
+ const blockEnd = cleaned.indexOf(`
3700
+
3701
+ `, idx + marker.length);
3702
+ cleaned = blockEnd !== -1 ? cleaned.slice(0, idx) + cleaned.slice(blockEnd) : cleaned.slice(0, idx);
3703
+ }
3704
+ return cleaned.trim();
3963
3705
  }
3964
3706
 
3965
3707
  // src/hooks/magic-context/tag-part-guards.ts
@@ -4032,9 +3774,6 @@ function registerBudgetFinalizeChild(sessionId, guard) {
4032
3774
  function releaseBudgetFinalizeChild(sessionId) {
4033
3775
  finalizingChildren.delete(sessionId);
4034
3776
  }
4035
- function refuseBudgetedToolCall(sessionId) {
4036
- return finalizingChildren.get(sessionId)?.refuseTool() ?? null;
4037
- }
4038
3777
  function createDreamTokenBudget(budget) {
4039
3778
  if (!Number.isSafeInteger(budget) || budget <= 0)
4040
3779
  throw new Error("Invalid token budget");
@@ -4051,12 +3790,20 @@ function createDreamTokenBudget(budget) {
4051
3790
  });
4052
3791
  return {
4053
3792
  snapshot,
3793
+ finalize() {
3794
+ if (finalizeFired)
3795
+ return "continue";
3796
+ finalizeFired = true;
3797
+ return "finalize";
3798
+ },
4054
3799
  charge(input, cacheRead, cacheWrite, completed = false, canFinalize = true) {
4055
3800
  for (const value of [input, cacheRead, cacheWrite]) {
4056
3801
  if (!Number.isSafeInteger(value) || value < 0)
4057
3802
  throw new Error("Invalid prompt usage");
4058
3803
  }
4059
3804
  spent += input + cacheRead + cacheWrite;
3805
+ if (completed)
3806
+ return "continue";
4060
3807
  if (spent >= budget)
4061
3808
  return "stop";
4062
3809
  if (!completed && !finalizeFired && spent >= budget * 0.8) {
@@ -4070,7 +3817,7 @@ function createDreamTokenBudget(budget) {
4070
3817
  return "continue";
4071
3818
  },
4072
3819
  refuseTool() {
4073
- if (!finalizeFired)
3820
+ if (!finalizeFired && !snapshot().hardStopped)
4074
3821
  return null;
4075
3822
  refusedCalls += 1;
4076
3823
  return { message: TOKEN_BUDGET_TOOL_REFUSAL, hardStopped: snapshot().hardStopped };
@@ -4239,23 +3986,6 @@ function assertExecutableToolInput(guard, call) {
4239
3986
  if (refusal !== undefined)
4240
3987
  throw new Error(refusal);
4241
3988
  }
4242
- function createDroppedInputToolExecuteBeforeHook() {
4243
- const guard = createDroppedInputGuard();
4244
- return async (input, output) => {
4245
- const call = isRecord2(input) ? input : {};
4246
- const args = isRecord2(output) ? output.args : undefined;
4247
- if (typeof call.sessionID === "string") {
4248
- const refusal = refuseBudgetedToolCall(call.sessionID);
4249
- if (refusal)
4250
- throw new Error(refusal.message);
4251
- }
4252
- assertExecutableToolInput(guard, {
4253
- sessionID: typeof call.sessionID === "string" ? call.sessionID : undefined,
4254
- toolName: typeof call.tool === "string" ? call.tool : undefined,
4255
- input: args
4256
- });
4257
- };
4258
- }
4259
3989
 
4260
3990
  // src/hooks/magic-context/edit-marker.ts
4261
3991
  var TRUNCATION_SENTINEL = "...[truncated]";
@@ -4287,110 +4017,6 @@ function applyEditMarkerToInput(input) {
4287
4017
  }
4288
4018
  }
4289
4019
 
4290
- // src/features/magic-context/tool-definition-tokens.ts
4291
- import { createHash as createHash2 } from "node:crypto";
4292
- var measurements = new Map;
4293
- var fingerprints = new Map;
4294
- var persistenceDb = null;
4295
- var cachedInsertStmt = null;
4296
- function keyFor(providerID, modelID, agentName) {
4297
- const agent = agentName && agentName.length > 0 ? agentName : "default";
4298
- return `${providerID}/${modelID}/${agent}`;
4299
- }
4300
- function fingerprintFor(description, parameters) {
4301
- return createHash2("sha256").update(description).update("\x00").update(stableStringify(parameters)).digest("hex");
4302
- }
4303
- function getCurrentToolSetHash(providerID, modelID, agentName) {
4304
- if (!providerID || !modelID)
4305
- return "";
4306
- const toolIds = measurements.get(keyFor(providerID, modelID, agentName));
4307
- if (!toolIds || toolIds.size === 0)
4308
- return "";
4309
- return createHash2("sha256").update(Array.from(toolIds.keys()).sort().join("\x00")).digest("hex");
4310
- }
4311
- function setDatabase(db) {
4312
- persistenceDb = db;
4313
- cachedInsertStmt = null;
4314
- }
4315
- function loadToolDefinitionMeasurements(db) {
4316
- let rows = [];
4317
- try {
4318
- rows = db.prepare("SELECT provider_id, model_id, agent_name, tool_id, token_count FROM tool_definition_measurements").all();
4319
- } catch {
4320
- return;
4321
- }
4322
- for (const row of rows) {
4323
- const key = keyFor(row.provider_id, row.model_id, row.agent_name);
4324
- let inner = measurements.get(key);
4325
- if (!inner) {
4326
- inner = new Map;
4327
- measurements.set(key, inner);
4328
- }
4329
- inner.set(row.tool_id, row.token_count);
4330
- }
4331
- }
4332
- function recordToolDefinition(providerID, modelID, agentName, toolID, description, parameters) {
4333
- if (!providerID || !modelID || !toolID)
4334
- return;
4335
- const key = keyFor(providerID, modelID, agentName);
4336
- const fp = fingerprintFor(description ?? "", parameters);
4337
- let innerFp = fingerprints.get(key);
4338
- if (innerFp && innerFp.get(toolID) === fp)
4339
- return;
4340
- let paramsText = "";
4341
- try {
4342
- paramsText = parameters === undefined ? "" : JSON.stringify(parameters);
4343
- } catch {
4344
- paramsText = "";
4345
- }
4346
- const tokens = estimateTokens(description ?? "") + estimateTokens(paramsText);
4347
- let inner = measurements.get(key);
4348
- if (!inner) {
4349
- inner = new Map;
4350
- measurements.set(key, inner);
4351
- }
4352
- inner.set(toolID, tokens);
4353
- if (!innerFp) {
4354
- innerFp = new Map;
4355
- fingerprints.set(key, innerFp);
4356
- }
4357
- innerFp.set(toolID, fp);
4358
- if (persistenceDb) {
4359
- try {
4360
- const agent = agentName && agentName.length > 0 ? agentName : "default";
4361
- if (!cachedInsertStmt) {
4362
- cachedInsertStmt = persistenceDb.prepare(`INSERT OR REPLACE INTO tool_definition_measurements
4363
- (provider_id, model_id, agent_name, tool_id, token_count, recorded_at)
4364
- VALUES (?, ?, ?, ?, ?, ?)`);
4365
- }
4366
- cachedInsertStmt.run(providerID, modelID, agent, toolID, tokens, Date.now());
4367
- } catch {
4368
- cachedInsertStmt = null;
4369
- }
4370
- }
4371
- }
4372
- function getLargestMeasuredToolDefinitionTokens() {
4373
- let largest = 0;
4374
- for (const tools of measurements.values()) {
4375
- let total = 0;
4376
- for (const tokens of tools.values())
4377
- total += tokens;
4378
- largest = Math.max(largest, total);
4379
- }
4380
- return largest > 0 ? largest : undefined;
4381
- }
4382
- function getMeasuredToolDefinitionTokens(providerID, modelID, agentName) {
4383
- if (!providerID || !modelID)
4384
- return;
4385
- const inner = measurements.get(keyFor(providerID, modelID, agentName));
4386
- if (!inner || inner.size === 0)
4387
- return;
4388
- let total = 0;
4389
- for (const tokens of inner.values())
4390
- total += tokens;
4391
- return total;
4392
- }
4393
-
4394
4020
  // src/hooks/magic-context/final-wire-token-estimate.ts
4395
4021
  function compactWireLabel(value, fallback) {
4396
4022
  if (typeof value !== "string" || value.length === 0)
@@ -4415,75 +4041,104 @@ function describeFinalWireTail(messages) {
4415
4041
  return `${role}:${kinds}`;
4416
4042
  }).join(", ")}]`;
4417
4043
  }
4418
- function serializedTokens(value) {
4044
+ function serializedText(value) {
4419
4045
  if (value === undefined)
4420
- return 0;
4421
- const serialized = typeof value === "string" ? value : JSON.stringify(value);
4046
+ return "";
4047
+ return (typeof value === "string" ? value : JSON.stringify(value)) ?? "";
4048
+ }
4049
+ function serializedTokens(value) {
4050
+ const serialized = serializedText(value);
4422
4051
  return serialized ? estimateTokens(serialized) : 0;
4423
4052
  }
4424
- function estimateMessageTokens(message) {
4425
- let conversation = 0;
4426
- let toolCall = 0;
4053
+ function visitWireContent(message, visit) {
4427
4054
  for (const part of message.parts) {
4428
4055
  if (!part || typeof part !== "object")
4429
4056
  continue;
4430
4057
  const p = part;
4431
4058
  if (p.ignored)
4432
4059
  continue;
4060
+ const text = (value) => {
4061
+ if (typeof value === "string")
4062
+ visit.text("conversation", value);
4063
+ };
4064
+ const tool = (value) => visit.text("toolCall", value);
4433
4065
  switch (p.type) {
4434
4066
  case "text":
4435
- if (typeof p.text === "string")
4436
- conversation += estimateTokens(p.text);
4067
+ text(p.text);
4437
4068
  break;
4438
- case "reasoning": {
4439
- if (typeof p.text === "string")
4440
- conversation += estimateTokens(p.text);
4441
- const signature = p.metadata?.anthropic?.signature;
4442
- if (typeof signature === "string")
4443
- conversation += estimateTokens(signature);
4069
+ case "reasoning":
4070
+ text(p.text);
4071
+ text(p.metadata?.anthropic?.signature);
4444
4072
  break;
4445
- }
4446
4073
  case "thinking":
4447
- if (typeof p.thinking === "string")
4448
- conversation += estimateTokens(p.thinking);
4449
- if (typeof p.signature === "string")
4450
- conversation += estimateTokens(p.signature);
4074
+ text(p.thinking);
4075
+ text(p.signature);
4451
4076
  break;
4452
4077
  case "redacted_thinking":
4453
- if (typeof p.data === "string")
4454
- conversation += estimateTokens(p.data);
4078
+ text(p.data);
4455
4079
  break;
4456
4080
  case "file":
4457
4081
  if (typeof p.mime === "string" && p.mime.startsWith("image/")) {
4458
- conversation += typeof p.url === "string" && p.url.startsWith("data:") ? estimateImageTokensFromDataUrl(p.url) : 1200;
4082
+ visit.image("conversation", typeof p.url === "string" && p.url.startsWith("data:") ? estimateImageTokensFromDataUrl(p.url) : 1200);
4459
4083
  }
4460
4084
  break;
4461
4085
  case "tool":
4462
- toolCall += serializedTokens(p.state?.input ?? p.input ?? p.args);
4463
- toolCall += serializedTokens(p.state?.output ?? p.state?.content ?? p.output ?? p.result ?? p.content);
4464
- toolCall += serializedTokens(p.state?.error);
4465
- toolCall += estimateToolAttachmentImageTokens(p.state);
4086
+ tool(p.state?.input ?? p.input ?? p.args);
4087
+ tool(p.state?.output ?? p.state?.content ?? p.output ?? p.result ?? p.content);
4088
+ tool(p.state?.error);
4089
+ visit.image("toolCall", estimateToolAttachmentImageTokens(p.state));
4466
4090
  break;
4467
4091
  case "tool-call":
4468
- toolCall += serializedTokens(p.input ?? p.args);
4092
+ tool(p.input ?? p.args);
4469
4093
  break;
4470
4094
  case "tool-invocation":
4471
- toolCall += serializedTokens(p.args ?? p.input);
4472
- toolCall += serializedTokens(p.result ?? p.output ?? p.state?.output);
4473
- toolCall += serializedTokens(p.state?.error);
4095
+ tool(p.args ?? p.input);
4096
+ tool(p.result ?? p.output ?? p.state?.output);
4097
+ tool(p.state?.error);
4474
4098
  break;
4475
4099
  case "tool-result":
4476
- toolCall += serializedTokens(p.result ?? p.content ?? p.output);
4100
+ tool(p.result ?? p.content ?? p.output);
4477
4101
  break;
4478
4102
  case "tool_use":
4479
- toolCall += serializedTokens(p.input ?? p.args);
4103
+ tool(p.input ?? p.args);
4480
4104
  break;
4481
4105
  case "tool_result":
4482
- toolCall += serializedTokens(p.content ?? p.result ?? p.output);
4106
+ tool(p.content ?? p.result ?? p.output);
4483
4107
  break;
4484
4108
  }
4485
4109
  }
4486
- return { conversation, toolCall };
4110
+ }
4111
+ function estimateMessageTokens(message) {
4112
+ const total = { conversation: 0, toolCall: 0 };
4113
+ visitWireContent(message, {
4114
+ text: (bucket, value) => {
4115
+ total[bucket] += serializedTokens(value);
4116
+ },
4117
+ image: (bucket, tokens) => {
4118
+ total[bucket] += tokens;
4119
+ }
4120
+ });
4121
+ return total;
4122
+ }
4123
+ function wireContentBytes(messages, abortAboveBytes, bytesPerToken) {
4124
+ let bytes = 0;
4125
+ try {
4126
+ for (const message of messages) {
4127
+ visitWireContent(message, {
4128
+ text: (_bucket, value) => {
4129
+ bytes += Buffer.byteLength(serializedText(value));
4130
+ },
4131
+ image: (_bucket, tokens) => {
4132
+ bytes += tokens * bytesPerToken;
4133
+ }
4134
+ });
4135
+ if (bytes > abortAboveBytes)
4136
+ return { bytes, aborted: true };
4137
+ }
4138
+ } catch {
4139
+ return null;
4140
+ }
4141
+ return { bytes, aborted: false };
4487
4142
  }
4488
4143
  function estimateFinalWireInputTokens(input) {
4489
4144
  const messageTokens = input.messages.reduce((total, message) => {
@@ -4514,7 +4169,8 @@ function estimateFinalWireInputTokens(input) {
4514
4169
  componentsComplete: toolDefinitions !== undefined && input.messages.every(hasCountableParts),
4515
4170
  messageTokens,
4516
4171
  systemTokens,
4517
- toolDefinitionTokens
4172
+ toolDefinitionTokens,
4173
+ toolDefinitionsMeasured: measuredToolDefinitions !== undefined
4518
4174
  };
4519
4175
  }
4520
4176
  function hasCountableParts(message) {
@@ -4559,6 +4215,310 @@ function hasCountableParts(message) {
4559
4215
  });
4560
4216
  }
4561
4217
 
4218
+ // src/features/magic-context/overflow-detection.ts
4219
+ var OVERFLOW_PATTERNS = [
4220
+ /prompt is too long/i,
4221
+ /input is too long for requested model/i,
4222
+ /exceeds the context window/i,
4223
+ /input token count.*exceeds the maximum/i,
4224
+ /maximum prompt length is \d+/i,
4225
+ /reduce the length of the messages/i,
4226
+ /maximum context length is \d+ tokens/i,
4227
+ /maximum model length is \d+/i,
4228
+ /exceeds the limit of \d+/i,
4229
+ /exceeds the available context size/i,
4230
+ /greater than the context length/i,
4231
+ /context window exceeds limit/i,
4232
+ /exceeded model token limit/i,
4233
+ /context[_ ]length[_ ]exceeded/i,
4234
+ /request entity too large/i,
4235
+ /context length is only \d+ tokens/i,
4236
+ /input length.*exceeds.*context length/i,
4237
+ /prompt too long; exceeded (?:max )?context length/i,
4238
+ /too large for model with \d+ maximum context length/i,
4239
+ /model_context_window_exceeded/i,
4240
+ /context size has been exceeded/i,
4241
+ /prepared prompt exceeds engine max_context/i,
4242
+ /prompt exceeds (?:the )?.{0,32}\bmax_context\b/i
4243
+ ];
4244
+ var LIMIT_EXTRACTION_PATTERNS = [
4245
+ { pattern: /maximum prompt length is (\d+)/i, provenance: "prompt_only" },
4246
+ {
4247
+ pattern: /maximum context length is (\d+) tokens?/i,
4248
+ provenance: "combined"
4249
+ },
4250
+ { pattern: /maximum model length is (\d+)/i, provenance: "combined" },
4251
+ { pattern: /context length is only (\d+) tokens?/i, provenance: "combined" },
4252
+ { pattern: /exceeds the limit of (\d+)/i, provenance: "unknown" },
4253
+ {
4254
+ pattern: /too large for model with (\d+) maximum context length/i,
4255
+ provenance: "combined"
4256
+ },
4257
+ { pattern: /context size[^0-9]{0,40}(\d{4,})\s*tokens?/i, provenance: "combined" },
4258
+ { pattern: /exceeds? the context length of (\d+)/i, provenance: "combined" },
4259
+ {
4260
+ pattern: />\s*(\d+)\s*(?:tokens?\s*)?(?:maximum|max|limit)\b/i,
4261
+ provenance: "prompt_only"
4262
+ },
4263
+ {
4264
+ pattern: /maximum number of tokens allowed\s*\(?\s*(\d+)/i,
4265
+ provenance: "prompt_only"
4266
+ },
4267
+ { pattern: /prepared prompt exceeds engine max_context\s+(\d+)/i, provenance: "unknown" },
4268
+ { pattern: /prompt exceeds (?:the )?.{0,32}\bmax_context\s+(\d+)/i, provenance: "unknown" },
4269
+ { pattern: /max(?:imum)?.*context.*?(\d+)/i, provenance: "unknown" }
4270
+ ];
4271
+ var MIN_PLAUSIBLE_LIMIT = 1024;
4272
+ var MAX_PLAUSIBLE_LIMIT = 1e7;
4273
+ function extractErrorMessage(error) {
4274
+ if (!error)
4275
+ return "";
4276
+ if (typeof error === "string")
4277
+ return error;
4278
+ if (typeof error === "object") {
4279
+ const obj = error;
4280
+ const nested = obj.error;
4281
+ if (nested && typeof nested.message === "string" && nested.message.length > 0) {
4282
+ return nested.message;
4283
+ }
4284
+ }
4285
+ if (error instanceof Error)
4286
+ return error.message;
4287
+ if (typeof error === "object") {
4288
+ const obj = error;
4289
+ if (typeof obj.message === "string")
4290
+ return obj.message;
4291
+ if (typeof obj.responseBody === "string")
4292
+ return obj.responseBody;
4293
+ try {
4294
+ return JSON.stringify(error);
4295
+ } catch {
4296
+ return String(error);
4297
+ }
4298
+ }
4299
+ return String(error);
4300
+ }
4301
+ var PREFIX_BOUND_THINKING_MODELS = [
4302
+ ["fable", 5, 1],
4303
+ ["opus", 5, 5],
4304
+ ["sonnet", 5, 5]
4305
+ ];
4306
+ var PREFIX_BOUND_THINKING_PATTERN = new RegExp(`(?:^|[-_.:/])(?:${PREFIX_BOUND_THINKING_MODELS.map(([family, major, minor]) => `${family}[-_.]?${major}[-_.]${minor}`).join("|")})(?:$|[-_.:/@])`, "i");
4307
+ function isPrefixBoundThinkingModel(_providerID, modelID) {
4308
+ if (!modelID)
4309
+ return false;
4310
+ return PREFIX_BOUND_THINKING_PATTERN.test(modelID);
4311
+ }
4312
+ function isFable51ThinkingBindingModel(providerID, modelID) {
4313
+ if (providerID?.toLowerCase() !== "anthropic" || !modelID)
4314
+ return false;
4315
+ return /(?:^|[-_.])fable[-_.]?5[-_.]1(?:$|[-_.])/i.test(modelID);
4316
+ }
4317
+ function detectOverflow(error) {
4318
+ const message = extractErrorMessage(error);
4319
+ if (!message) {
4320
+ return { isOverflow: false };
4321
+ }
4322
+ const hasStatus413 = /\b413\b/.test(message) && /(entity|payload|context|prompt)/i.test(message);
4323
+ let matched;
4324
+ for (const pattern of OVERFLOW_PATTERNS) {
4325
+ if (pattern.test(message)) {
4326
+ matched = pattern;
4327
+ break;
4328
+ }
4329
+ }
4330
+ if (!matched && !hasStatus413) {
4331
+ return { isOverflow: false };
4332
+ }
4333
+ const reportedLimit = parseReportedLimit(message);
4334
+ const reportedInputTokens = parseReportedInputTokens(message);
4335
+ return {
4336
+ isOverflow: true,
4337
+ reportedInputTokens,
4338
+ reportedLimit: reportedLimit?.value,
4339
+ reportedLimitProvenance: reportedLimit?.provenance,
4340
+ matchedPattern: matched?.source
4341
+ };
4342
+ }
4343
+ function parseReportedInputTokens(message) {
4344
+ if (!message)
4345
+ return;
4346
+ const patterns = [
4347
+ /prompt is too long:\s*(\d+)/i,
4348
+ /input token count\s*\(?\s*(\d+)/i,
4349
+ /input length\s*(\d+)/i,
4350
+ /prompt was\s*(\d+)/i,
4351
+ /messages resulted in\s*(\d+)\s*tokens?/i
4352
+ ];
4353
+ for (const pattern of patterns) {
4354
+ const raw = message.match(pattern)?.[1];
4355
+ if (!raw)
4356
+ continue;
4357
+ const value = Number.parseInt(raw, 10);
4358
+ if (Number.isFinite(value) && value > 0)
4359
+ return value;
4360
+ }
4361
+ return;
4362
+ }
4363
+ function parseReportedLimit(message) {
4364
+ if (!message)
4365
+ return;
4366
+ for (const { pattern, provenance } of LIMIT_EXTRACTION_PATTERNS) {
4367
+ const match = message.match(pattern);
4368
+ if (!match)
4369
+ continue;
4370
+ const raw = match[1];
4371
+ if (!raw)
4372
+ continue;
4373
+ const value = Number.parseInt(raw, 10);
4374
+ if (!Number.isFinite(value))
4375
+ continue;
4376
+ if (value < MIN_PLAUSIBLE_LIMIT || value > MAX_PLAUSIBLE_LIMIT)
4377
+ continue;
4378
+ return { value, provenance };
4379
+ }
4380
+ return;
4381
+ }
4382
+
4383
+ // src/hooks/magic-context/sentinel.ts
4384
+ var WHOLE_MESSAGE_PLACEHOLDER_TEXT = "[dropped]";
4385
+ function modelAcceptsEmptyContent(providerID) {
4386
+ return providerID === "anthropic";
4387
+ }
4388
+ function isAnthropicFamilyRoute(providerID, modelID) {
4389
+ const provider = (providerID ?? "").toLowerCase();
4390
+ const model = (modelID ?? "").toLowerCase();
4391
+ return provider.includes("anthropic") || model.includes("claude") || model.includes("anthropic");
4392
+ }
4393
+ var REMOVED_REASONING_MARK = Symbol.for("magic-context.removed-reasoning");
4394
+ var NEUTRALIZED_ORIGINALS = new WeakMap;
4395
+ function neutralizeDroppedReasoningPart(part) {
4396
+ if (!isRecord(part))
4397
+ return;
4398
+ if (part.thinking === undefined && part.text === undefined)
4399
+ return;
4400
+ if (part.type === "text")
4401
+ return;
4402
+ NEUTRALIZED_ORIGINALS.set(part, { ...part });
4403
+ const cacheControl = part.cache_control;
4404
+ const cacheControlCamel = part.cacheControl;
4405
+ for (const key of Object.keys(part))
4406
+ delete part[key];
4407
+ part.type = "text";
4408
+ part.text = "";
4409
+ if (cacheControl !== undefined)
4410
+ part.cache_control = cacheControl;
4411
+ if (cacheControlCamel !== undefined)
4412
+ part.cacheControl = cacheControlCamel;
4413
+ Object.defineProperty(part, REMOVED_REASONING_MARK, {
4414
+ value: true,
4415
+ enumerable: false,
4416
+ configurable: true
4417
+ });
4418
+ }
4419
+ function restoreNeutralizedReasoningPart(part, legacyCleared) {
4420
+ if (!isRecord(part))
4421
+ return false;
4422
+ const original = NEUTRALIZED_ORIGINALS.get(part);
4423
+ if (!original)
4424
+ return false;
4425
+ for (const key of Object.keys(part))
4426
+ delete part[key];
4427
+ Object.assign(part, original);
4428
+ if (legacyCleared) {
4429
+ if (part.thinking !== undefined)
4430
+ part.thinking = "[cleared]";
4431
+ if (part.text !== undefined)
4432
+ part.text = "[cleared]";
4433
+ }
4434
+ NEUTRALIZED_ORIGINALS.delete(part);
4435
+ delete part[REMOVED_REASONING_MARK];
4436
+ return true;
4437
+ }
4438
+ function isNeutralizedReasoningPart(part) {
4439
+ return isRecord(part) && part[REMOVED_REASONING_MARK] === true;
4440
+ }
4441
+ var VARIANT_CACHE_PRESERVING_MODELS = {
4442
+ "anthropic/claude-fable-5-1": "2026-09-02",
4443
+ "openai/gpt-6-astra": "2026-09-05",
4444
+ "anthropic/claude-opus-5-5": "2026-09-23"
4445
+ };
4446
+ function canonicalVariantModelIdentity(providerID, modelID) {
4447
+ const normalizedProviderID = providerID.toLowerCase();
4448
+ const isAnthropicFamily = normalizedProviderID === "anthropic" || normalizedProviderID === "google-vertex-anthropic" || normalizedProviderID.includes("bedrock");
4449
+ if (isAnthropicFamily && isFable51ThinkingBindingModel("anthropic", modelID)) {
4450
+ return "anthropic/claude-fable-5-1";
4451
+ }
4452
+ return canonicalModelIdentity(`${providerID}/${modelID}`).toLowerCase();
4453
+ }
4454
+ function variantChangeBustsProviderCache(providerID, modelID) {
4455
+ if (!providerID || !modelID)
4456
+ return false;
4457
+ const identity = canonicalVariantModelIdentity(providerID, modelID);
4458
+ if (Object.hasOwn(VARIANT_CACHE_PRESERVING_MODELS, identity))
4459
+ return false;
4460
+ const normalizedProviderID = providerID.toLowerCase();
4461
+ return normalizedProviderID === "anthropic" || normalizedProviderID === "google-vertex-anthropic" || normalizedProviderID.includes("bedrock");
4462
+ }
4463
+ function makeSentinel(originalPart) {
4464
+ const sentinel = {
4465
+ type: "text",
4466
+ text: ""
4467
+ };
4468
+ if (isRecord(originalPart)) {
4469
+ if (originalPart.cache_control !== undefined) {
4470
+ sentinel.cache_control = originalPart.cache_control;
4471
+ }
4472
+ if (originalPart.cacheControl !== undefined) {
4473
+ sentinel.cacheControl = originalPart.cacheControl;
4474
+ }
4475
+ }
4476
+ return sentinel;
4477
+ }
4478
+ function makeWholeMessageSentinel(providerID) {
4479
+ return {
4480
+ type: "text",
4481
+ text: modelAcceptsEmptyContent(providerID) ? "" : WHOLE_MESSAGE_PLACEHOLDER_TEXT
4482
+ };
4483
+ }
4484
+ function isSentinel(part) {
4485
+ if (!isRecord(part))
4486
+ return false;
4487
+ if (part.type !== "text")
4488
+ return false;
4489
+ if (typeof part.text !== "string")
4490
+ return false;
4491
+ return part.text === "" || part.text === WHOLE_MESSAGE_PLACEHOLDER_TEXT;
4492
+ }
4493
+ function replaySentinelByMessageIds(messages, ids, providerID, hiddenSeamIds = new Set) {
4494
+ if (ids.size === 0)
4495
+ return { replayed: 0, missingIds: [] };
4496
+ const seen = new Set;
4497
+ let replayed = 0;
4498
+ for (let index = messages.length - 1;index >= 0; index -= 1) {
4499
+ const msg = messages[index];
4500
+ const id = msg.info.id;
4501
+ if (!id || !ids.has(id))
4502
+ continue;
4503
+ seen.add(id);
4504
+ if (!modelAcceptsEmptyContent(providerID) && hiddenSeamIds.has(id)) {
4505
+ messages.splice(index, 1);
4506
+ replayed += 1;
4507
+ continue;
4508
+ }
4509
+ if (msg.parts.length === 1 && isSentinel(msg.parts[0]))
4510
+ continue;
4511
+ msg.parts.length = 0;
4512
+ msg.parts.push(makeWholeMessageSentinel(providerID));
4513
+ replayed += 1;
4514
+ }
4515
+ const missingIds = [];
4516
+ for (const id of ids)
4517
+ if (!seen.has(id))
4518
+ missingIds.push(id);
4519
+ return { replayed, missingIds };
4520
+ }
4521
+
4562
4522
  // src/hooks/magic-context/tool-input-size.ts
4563
4523
  var SKELETON_REAL_INPUT_MAX_BYTES = 1024;
4564
4524
  var encoder2 = new TextEncoder;
@@ -4741,12 +4701,8 @@ function hasMeaningfulPart(part) {
4741
4701
  return true;
4742
4702
  }
4743
4703
  function clearThinkingParts(thinkingParts) {
4744
- for (const part of thinkingParts) {
4745
- if (part.thinking !== undefined)
4746
- part.thinking = "[cleared]";
4747
- if (part.text !== undefined)
4748
- part.text = "[cleared]";
4749
- }
4704
+ for (const part of thinkingParts)
4705
+ neutralizeDroppedReasoningPart(part);
4750
4706
  }
4751
4707
  function messageHasNativeReasoning(message) {
4752
4708
  return message.parts.some((part) => {
@@ -5040,29 +4996,77 @@ var sessionProviders = new Map;
5040
4996
  function resolveHostServedBoundaryId2(sessionId, messageId) {
5041
4997
  if (messageId.length === 0)
5042
4998
  return messageId;
5043
- return sessionProviders.get(sessionId)?.readServedBoundaryId?.(messageId) ?? messageId;
4999
+ return sessionProviders.get(sessionId)?.provider.readServedBoundaryId?.(messageId) ?? messageId;
5044
5000
  }
5045
5001
  function hasRawMessageProvider2(sessionId) {
5046
5002
  return sessionProviders.has(sessionId);
5047
5003
  }
5048
5004
  function setRawMessageProvider2(sessionId, provider) {
5049
- sessionProviders.set(sessionId, provider);
5005
+ const current = sessionProviders.get(sessionId);
5006
+ const registration = current?.provider === provider ? current : { provider, scopes: 0 };
5007
+ registration.scopes += 1;
5008
+ sessionProviders.set(sessionId, registration);
5009
+ let active = true;
5050
5010
  return () => {
5051
- const current = sessionProviders.get(sessionId);
5052
- if (current === provider)
5011
+ if (!active)
5012
+ return;
5013
+ active = false;
5014
+ registration.scopes -= 1;
5015
+ if (registration.scopes === 0 && sessionProviders.get(sessionId) === registration) {
5053
5016
  sessionProviders.delete(sessionId);
5017
+ }
5054
5018
  };
5055
5019
  }
5020
+ var boundedProviderWrappers = new WeakMap;
5056
5021
  function setBoundedRawMessageProvider2(sessionId, provider) {
5057
- return setRawMessageProvider2(sessionId, {
5058
- ...provider,
5059
- readMessages: () => {
5060
- throw new Error("Bounded raw-message providers cannot read complete history; full reads are reserved for store-generation conversion");
5061
- }
5062
- });
5022
+ let wrapper = boundedProviderWrappers.get(provider);
5023
+ if (!wrapper) {
5024
+ wrapper = {
5025
+ ...provider,
5026
+ readMessages: () => {
5027
+ throw new Error("Bounded raw-message providers cannot read complete history; full reads are reserved for store-generation conversion");
5028
+ }
5029
+ };
5030
+ boundedProviderWrappers.set(provider, wrapper);
5031
+ }
5032
+ return setRawMessageProvider2(sessionId, wrapper);
5033
+ }
5034
+ function withRawMessageProvider2(sessionId, provider, fn) {
5035
+ const cleanup = setRawMessageProvider2(sessionId, provider);
5036
+ let result;
5037
+ try {
5038
+ result = fn();
5039
+ } catch (error) {
5040
+ cleanup();
5041
+ throw error;
5042
+ }
5043
+ if (result !== null && typeof result === "object" && typeof result.then === "function") {
5044
+ return result.finally(cleanup);
5045
+ }
5046
+ cleanup();
5047
+ return result;
5063
5048
  }
5049
+ var SYSTEM_REMINDER_BLOCK_REGEX = /<system-reminder>[\s\S]*?<\/system-reminder>/gi;
5064
5050
  function cleanUserText2(text) {
5065
- return removeSystemReminders(text).replace(OMO_INTERNAL_INITIATOR_MARKER, "").trim();
5051
+ return stripOutsideSteeringWrappers(text, (segment) => segment.replace(SYSTEM_REMINDER_BLOCK_REGEX, "").replace(OMO_INTERNAL_INITIATOR_MARKER, "")).trim();
5052
+ }
5053
+ function hasMeaningfulChunkUserText(parts) {
5054
+ for (const part of parts) {
5055
+ if (part === null || typeof part !== "object")
5056
+ continue;
5057
+ const candidate = part;
5058
+ if (candidate.type !== "text" || typeof candidate.text !== "string")
5059
+ continue;
5060
+ if (candidate.ignored === true)
5061
+ continue;
5062
+ const cleaned = cleanUserText2(candidate.text);
5063
+ if (!cleaned)
5064
+ continue;
5065
+ if (isSystemDirective(cleaned))
5066
+ continue;
5067
+ return true;
5068
+ }
5069
+ return false;
5066
5070
  }
5067
5071
  function withRawSessionMessageCache2(fn) {
5068
5072
  const outerCache = activeRawMessageCache;
@@ -5098,7 +5102,7 @@ function readRawSessionMessages2(sessionId) {
5098
5102
  return readRawSessionMessagesFromSource(sessionId);
5099
5103
  }
5100
5104
  function readRawSessionMessagePage2(sessionId, afterOrdinal, limit, finalWatermark) {
5101
- const provider = sessionProviders.get(sessionId);
5105
+ const provider = sessionProviders.get(sessionId)?.provider;
5102
5106
  if (provider?.readMessagePage) {
5103
5107
  return provider.readMessagePage(afterOrdinal, limit, finalWatermark);
5104
5108
  }
@@ -5110,7 +5114,7 @@ function readRawSessionMessagePage2(sessionId, afterOrdinal, limit, finalWaterma
5110
5114
  return withReadOnlySessionDb((db) => readRawSessionMessagePageFromDb(db, sessionId, afterOrdinal, limit, finalWatermark));
5111
5115
  }
5112
5116
  function getRawSessionMessageOrdinalCount2(sessionId) {
5113
- const provider = sessionProviders.get(sessionId);
5117
+ const provider = sessionProviders.get(sessionId)?.provider;
5114
5118
  if (provider) {
5115
5119
  if (provider.getMessageCount)
5116
5120
  return provider.getMessageCount();
@@ -5123,7 +5127,7 @@ function getRawSessionMessageOrdinalCount2(sessionId) {
5123
5127
  }
5124
5128
  var RAW_MESSAGE_RANGE_PAGE_SIZE = 100;
5125
5129
  function readRawSessionMessageRangeFromSource(sessionId, fromOrdinal, toOrdinal) {
5126
- const provider = sessionProviders.get(sessionId);
5130
+ const provider = sessionProviders.get(sessionId)?.provider;
5127
5131
  if (provider?.iterateMessageRange)
5128
5132
  return [...provider.iterateMessageRange(fromOrdinal, toOrdinal)];
5129
5133
  if (provider && !provider.readMessagePage) {
@@ -5154,13 +5158,13 @@ function readRawSessionMessageRangeFromSource(sessionId, fromOrdinal, toOrdinal)
5154
5158
  }
5155
5159
  return messages;
5156
5160
  }
5157
- var RAW_MESSAGE_VISIT_PAGE_SIZE = 50;
5161
+ var RAW_MESSAGE_VISIT_PAGE_SIZE2 = 50;
5158
5162
  function visitRawSessionMessages2(sessionId, fromOrdinal, toOrdinal, visit, options = {}) {
5159
5163
  const from = Math.max(1, Math.floor(fromOrdinal));
5160
5164
  const to = Math.floor(toOrdinal);
5161
5165
  if (to < from)
5162
5166
  return;
5163
- const provider = sessionProviders.get(sessionId);
5167
+ const provider = sessionProviders.get(sessionId)?.provider;
5164
5168
  if (provider?.iterateMessageRange) {
5165
5169
  for (const message of provider.iterateMessageRange(from, to)) {
5166
5170
  if (!visit(message))
@@ -5179,7 +5183,7 @@ function visitRawSessionMessages2(sessionId, fromOrdinal, toOrdinal, visit, opti
5179
5183
  }
5180
5184
  if (!provider && !openCodeDbExists())
5181
5185
  return;
5182
- const pageSize = Math.max(1, Math.floor(options.pageSize ?? RAW_MESSAGE_VISIT_PAGE_SIZE));
5186
+ const pageSize = Math.max(1, Math.floor(options.pageSize ?? RAW_MESSAGE_VISIT_PAGE_SIZE2));
5183
5187
  let afterOrdinal = from - 1;
5184
5188
  let after;
5185
5189
  while (afterOrdinal < to) {
@@ -5237,7 +5241,7 @@ function primeTailRawMessageCache2(args) {
5237
5241
  return false;
5238
5242
  if (lastCompartmentEnd < 1 || !anchorMessageId)
5239
5243
  return false;
5240
- const provider = sessionProviders.get(sessionId);
5244
+ const provider = sessionProviders.get(sessionId)?.provider;
5241
5245
  if (provider) {
5242
5246
  if (!provider.readMessagePage || !provider.getMessageCount)
5243
5247
  return false;
@@ -5285,7 +5289,7 @@ function primeInMemoryTailRawMessageCache2(args) {
5285
5289
  return true;
5286
5290
  }
5287
5291
  function readRawSessionMessageOrdinalPage2(sessionId, after, limit) {
5288
- const provider = sessionProviders.get(sessionId);
5292
+ const provider = sessionProviders.get(sessionId)?.provider;
5289
5293
  if (provider?.readMessageOrdinalPage)
5290
5294
  return provider.readMessageOrdinalPage(after, limit);
5291
5295
  if (provider) {
@@ -5302,7 +5306,7 @@ function readRawSessionMessageOrdinalPage2(sessionId, after, limit) {
5302
5306
  return withReadOnlySessionDb((db) => readRawSessionMessageOrdinalPageFromDb(db, sessionId, after, limit));
5303
5307
  }
5304
5308
  function getRawSessionStoredMessageCount2(sessionId) {
5305
- const provider = sessionProviders.get(sessionId);
5309
+ const provider = sessionProviders.get(sessionId)?.provider;
5306
5310
  if (provider?.getStoredMessageCount)
5307
5311
  return provider.getStoredMessageCount();
5308
5312
  if (provider)
@@ -5316,15 +5320,19 @@ function readRawSessionMessageIdOrdinalsForRange2(sessionId, fromOrdinal, toOrdi
5316
5320
  const to = Math.floor(toOrdinal);
5317
5321
  if (to < from)
5318
5322
  return new Map;
5319
- const provider = sessionProviders.get(sessionId);
5323
+ const provider = sessionProviders.get(sessionId)?.provider;
5320
5324
  if (provider?.readMessageIdOrdinalsForRange) {
5321
5325
  return provider.readMessageIdOrdinalsForRange(from, to);
5322
5326
  }
5323
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));
5324
5328
  return new Map([...all].filter(([, ordinal]) => ordinal >= from && ordinal <= to));
5325
5329
  }
5330
+ function readRawSessionMessageIdOrdinals2(sessionId) {
5331
+ const count = getRawSessionMessageOrdinalCount2(sessionId);
5332
+ return readRawSessionMessageIdOrdinalsForRange2(sessionId, 1, count);
5333
+ }
5326
5334
  function readRawSessionMessagePartsById2(sessionId, messageId, onQuery) {
5327
- const provider = sessionProviders.get(sessionId);
5335
+ const provider = sessionProviders.get(sessionId)?.provider;
5328
5336
  if (provider?.readMessagePartsById)
5329
5337
  return provider.readMessagePartsById(messageId);
5330
5338
  if (provider?.readMessageById)
@@ -5337,13 +5345,13 @@ function readRawSessionMessagePartsById2(sessionId, messageId, onQuery) {
5337
5345
  return withReadOnlySessionDb((db) => readRawSessionMessagePartsByIdFromDb(db, sessionId, messageId, onQuery));
5338
5346
  }
5339
5347
  function hasRawSessionMessageById2(sessionId, messageId) {
5340
- const provider = sessionProviders.get(sessionId);
5348
+ const provider = sessionProviders.get(sessionId)?.provider;
5341
5349
  if (provider?.hasMessageById)
5342
5350
  return provider.hasMessageById(messageId);
5343
5351
  return readRawSessionMessageById2(sessionId, messageId) !== null;
5344
5352
  }
5345
5353
  function readRawSessionMessageOrdinalById2(sessionId, messageId) {
5346
- const provider = sessionProviders.get(sessionId);
5354
+ const provider = sessionProviders.get(sessionId)?.provider;
5347
5355
  if (provider?.readMessageOrdinalById) {
5348
5356
  return provider.readMessageOrdinalById(messageId);
5349
5357
  }
@@ -5380,7 +5388,7 @@ function readRawSessionMessageOrdinalById2(sessionId, messageId) {
5380
5388
  return withReadOnlySessionDb((db) => readRawSessionMessageOrdinalByIdFromDb(db, sessionId, messageId));
5381
5389
  }
5382
5390
  function compareRawSessionMessageOrder2(sessionId, leftId, rightId) {
5383
- const provider = sessionProviders.get(sessionId);
5391
+ const provider = sessionProviders.get(sessionId)?.provider;
5384
5392
  if (provider) {
5385
5393
  if (!provider.readMessageOrdinalById)
5386
5394
  return null;
@@ -5404,7 +5412,7 @@ function compareRawSessionMessageOrder2(sessionId, leftId, rightId) {
5404
5412
  });
5405
5413
  }
5406
5414
  function readRawSessionMessageById2(sessionId, messageId) {
5407
- const provider = sessionProviders.get(sessionId);
5415
+ const provider = sessionProviders.get(sessionId)?.provider;
5408
5416
  if (provider?.readMessageById) {
5409
5417
  return provider.readMessageById(messageId);
5410
5418
  }
@@ -5416,7 +5424,7 @@ function readRawSessionMessageById2(sessionId, messageId) {
5416
5424
  return withReadOnlySessionDb((db) => readRawSessionMessageByIdFromDb(db, sessionId, messageId));
5417
5425
  }
5418
5426
  function readRawSessionMessagesFromSource(sessionId) {
5419
- const provider = sessionProviders.get(sessionId);
5427
+ const provider = sessionProviders.get(sessionId)?.provider;
5420
5428
  if (provider)
5421
5429
  return provider.readMessages();
5422
5430
  if (!openCodeDbExists())
@@ -5424,7 +5432,7 @@ function readRawSessionMessagesFromSource(sessionId) {
5424
5432
  return withReadOnlySessionDb((db) => readRawSessionMessagesFromDb(db, sessionId));
5425
5433
  }
5426
5434
  function getRawSessionMessageCount2(sessionId) {
5427
- const provider = sessionProviders.get(sessionId);
5435
+ const provider = sessionProviders.get(sessionId)?.provider;
5428
5436
  if (provider) {
5429
5437
  if (provider.getMessageCount)
5430
5438
  return provider.getMessageCount();
@@ -5435,7 +5443,7 @@ function getRawSessionMessageCount2(sessionId) {
5435
5443
  return 0;
5436
5444
  return withReadOnlySessionDb((db) => getRawSessionMessageCountFromDb(db, sessionId));
5437
5445
  }
5438
- var RAW_SESSION_TAG_KEY_PAGE_SIZE = 32;
5446
+ var RAW_SESSION_TAG_KEY_PAGE_SIZE2 = 32;
5439
5447
  function yieldRawSessionTagKeyPage() {
5440
5448
  return new Promise((resolve) => {
5441
5449
  const immediate = globalThis.setImmediate;
@@ -5453,7 +5461,7 @@ async function getRawSessionTagKeysThrough2(sessionId, upToMessageIndex, options
5453
5461
  const candidateOwnersByCallId = new Map;
5454
5462
  const messageTimesById = new Map;
5455
5463
  const finalWatermark = Number.isFinite(upToMessageIndex) ? Math.max(0, Math.floor(upToMessageIndex)) : getRawSessionMessageOrdinalCount2(sessionId);
5456
- const pageSize = Number.isFinite(options.pageSize) ? Math.max(1, Math.floor(options.pageSize ?? RAW_SESSION_TAG_KEY_PAGE_SIZE)) : RAW_SESSION_TAG_KEY_PAGE_SIZE;
5464
+ const pageSize = Number.isFinite(options.pageSize) ? Math.max(1, Math.floor(options.pageSize ?? RAW_SESSION_TAG_KEY_PAGE_SIZE2)) : RAW_SESSION_TAG_KEY_PAGE_SIZE2;
5457
5465
  const yieldToEventLoop = options.yieldToEventLoop ?? yieldRawSessionTagKeyPage;
5458
5466
  const nearestPersistedOwner = (callId, currentMessageId) => {
5459
5467
  if (!options.db)
@@ -5551,11 +5559,42 @@ function getLegacyProtectedTailStartOrdinal2(sessionId) {
5551
5559
  }
5552
5560
  return userOrdinals.length < PROTECTED_TAIL_USER_TURNS ? 1 : userOrdinals[PROTECTED_TAIL_USER_TURNS - 1] ?? 1;
5553
5561
  }
5554
- function readSessionChunk2(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal) {
5562
+ function getProtectedTailStartOrdinal2(sessionId) {
5563
+ return getLegacyProtectedTailStartOrdinal2(sessionId);
5564
+ }
5565
+ function readSessionChunk2(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal, options = {}) {
5555
5566
  const totalMessageCount = getCachedAbsoluteMessageCount2(sessionId) ?? getRawSessionMessageOrdinalCount2(sessionId);
5556
5567
  const startOrdinal = Math.max(1, offset);
5557
5568
  const finalOrdinal = eligibleEndOrdinal === undefined ? totalMessageCount : Math.min(totalMessageCount, eligibleEndOrdinal - 1);
5558
5569
  const messages = readRawSessionMessageRange2(sessionId, Math.max(1, startOrdinal - 1), finalOrdinal);
5570
+ const expandedParts = new Map;
5571
+ const expandedResults = new Set;
5572
+ if (options.expand !== false) {
5573
+ const calls = new Map;
5574
+ for (const message of messages)
5575
+ for (const part of message.parts) {
5576
+ if (!part || typeof part !== "object")
5577
+ continue;
5578
+ const p = part;
5579
+ if (p.type !== "tool")
5580
+ continue;
5581
+ const state = p.state;
5582
+ if (state?.input !== undefined && typeof p.callID === "string")
5583
+ calls.set(p.callID, p);
5584
+ expandedParts.set(part, expandToolPart(part, options.expandTools));
5585
+ if (state?.input === undefined && state?.output !== undefined && typeof p.callID === "string") {
5586
+ const call = calls.get(p.callID);
5587
+ if (call) {
5588
+ const expansion = expandToolPart({ ...call, state: { ...call.state, output: state.output } }, options.expandTools);
5589
+ if (expansion !== null) {
5590
+ expandedParts.set(call, expansion);
5591
+ expandedResults.add(part);
5592
+ }
5593
+ calls.delete(p.callID);
5594
+ }
5595
+ }
5596
+ }
5597
+ }
5559
5598
  const completedToolArcs = buildToolArcs(messages).flatMap((arc) => arc.resOrdinal === null ? [] : [{ start: arc.invOrdinal, end: arc.resOrdinal }]);
5560
5599
  const completedToolComponents = [];
5561
5600
  for (const arc of completedToolArcs) {
@@ -5663,8 +5702,13 @@ function readSessionChunk2(sessionId, tokenBudget, offset = 1, eligibleEndOrdina
5663
5702
  const meta = { ordinal: msg.ordinal, messageId: msg.id };
5664
5703
  if (isHostUnservedRow(msg))
5665
5704
  markHostUnservedRow(meta);
5666
- if (msg.role === "user" && !hasMeaningfulUserText2(msg.parts)) {
5667
- const tcSummaries = extractToolCallSummaries(msg.parts);
5705
+ if (msg.role === "user" && !hasMeaningfulChunkUserText(msg.parts)) {
5706
+ const tcSummaries = msg.parts.flatMap((part) => {
5707
+ if (expandedResults.has(part))
5708
+ return [];
5709
+ const expansion = expandedParts.get(part) ?? null;
5710
+ return expansion === null ? extractToolCallSummaries([part]) : [`TC: ${expansion}`];
5711
+ });
5668
5712
  if (tcSummaries.length === 0) {
5669
5713
  recordFilteredNoise(meta);
5670
5714
  continue;
@@ -5704,8 +5748,18 @@ function readSessionChunk2(sessionId, tokenBudget, offset = 1, eligibleEndOrdina
5704
5748
  }
5705
5749
  const role = compactRole(msg.role);
5706
5750
  const textParts = extractTexts2(msg.parts).map((t) => msg.role === "user" ? cleanUserText2(t) : t).map(normalizeText).filter((value) => value.length > 0);
5707
- const toolSummaries = textParts.length === 0 ? extractToolCallSummaries(msg.parts) : [];
5708
- const allParts = [...textParts, ...toolSummaries];
5751
+ const allParts = options.expand === false ? [
5752
+ ...textParts,
5753
+ ...textParts.length === 0 ? extractToolCallSummaries(msg.parts) : []
5754
+ ] : msg.parts.flatMap((part) => {
5755
+ if (expandedResults.has(part))
5756
+ return [];
5757
+ const expansion = expandedParts.get(part) ?? null;
5758
+ if (expansion !== null)
5759
+ return [`TC: ${expansion}`];
5760
+ const texts = extractTexts2([part]).map((t) => msg.role === "user" ? cleanUserText2(t) : t).map(normalizeText).filter(Boolean);
5761
+ return texts.length ? texts : textParts.length === 0 ? extractToolCallSummaries([part]) : [];
5762
+ });
5709
5763
  const compacted = compactTextForSummary(allParts.join(" / "), msg.role);
5710
5764
  const text = compacted.text;
5711
5765
  if (!text) {
@@ -5781,8 +5835,13 @@ function readSessionChunk2(sessionId, tokenBudget, offset = 1, eligibleEndOrdina
5781
5835
  toolResultBoundaries
5782
5836
  };
5783
5837
  }
5838
+ function getRawSessionMessageIdsThrough2(sessionId, endOrdinal) {
5839
+ if (endOrdinal < 1)
5840
+ return [];
5841
+ return [...readRawSessionMessageIdOrdinalsForRange2(sessionId, 1, endOrdinal).entries()].sort((left, right) => left[1] - right[1]).map(([id]) => id);
5842
+ }
5784
5843
  function readRawSessionSeedTail2(sessionId, boundaryId, onQuery) {
5785
- const provider = sessionProviders.get(sessionId);
5844
+ const provider = sessionProviders.get(sessionId)?.provider;
5786
5845
  if (provider) {
5787
5846
  const boundaryOrdinal = boundaryId === null ? 1 : readRawSessionMessageOrdinalById2(sessionId, boundaryId);
5788
5847
  if (boundaryOrdinal === null)
@@ -5801,4 +5860,4 @@ function readRawSessionSeedTail2(sessionId, boundaryId, onQuery) {
5801
5860
  });
5802
5861
  }
5803
5862
 
5804
- export { textMentionsRecentCommit, removeSystemReminders, hasMeaningfulUserText2, extractTexts2, extractToolCallSummaries, getTokenizerNativeMemoryStats, preloadTokenizer, estimateTokens, normalizeText, stableStringify, getCurrentToolSetHash, setDatabase, loadToolDefinitionMeasurements, recordToolDefinition, getMeasuredToolDefinitionTokens, CTX_REDUCE_KEEP, newestCtxReduceTagNumbers, stripWellFormedLeadingTagPrefix, stripPersistedAssistantText, byteSize, stripTagPrefix, peelLeadingMcTagNotation, prependTag, isThinkingPart, isRecord, 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, deleteTagsByMessageId, getMaxTagNumberBySession, getTagNumberByMessageId, getAssignableTagNumberByMessageId, deriveTagLoadFloor, TAG_SELECT_COLUMNS, getTagsBySession, getActiveTagsBySession, getTailHygieneTags, getDroppedTagsBySession, getTagsByNumbers, getDroppedTagsByNumbers, getMaxDroppedTagNumber, getTagById, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, getCandidateToolOwners, pickNearestPriorOwner, markHostUnservedRow, retreatPastHostUnservedRows, snapTerminalCompartmentToServedRow, isHostRenderedSystemMessage, isStrictGapHealingMessage, isRawCompactionSummaryInfo, extractInMemoryMessageViews, buildInMemoryTailRawMessages, completedToolArcCrossesBoundary, estimateTrueRawMessageTokens, buildToolArcs, fenceBoundaryForCompletedToolArcs, fenceBoundaryForToolArcs, buildTrueRawTokenIndex, computeRawRangeFingerprint, invalidateTrueRawTokenCache, isTextPart, isToolPartWithOutput, isFilePart, buildFileSourceContent, toolPartHasUserAnswer, DreamTokenBudgetExceeded, TOKEN_BUDGET_FINALIZE_MESSAGE, registerBudgetFinalizeChild, releaseBudgetFinalizeChild, createDreamTokenBudget, recordToolParameters, createDroppedInputGuard, assertExecutableToolInput, createDroppedInputToolExecuteBeforeHook, isEditTool, describeFinalWireTail, estimateMessageTokens, estimateFinalWireInputTokens, SKELETON_REAL_INPUT_MAX_BYTES, partHasCompletedResult, extractToolCallObservation, ToolMutationBatch, createToolDropTarget, resolveHostServedBoundaryId2, hasRawMessageProvider2, setRawMessageProvider2, setBoundedRawMessageProvider2, cleanUserText2, withRawSessionMessageCache2, readRawSessionMessages2, readRawSessionMessagePage2, getRawSessionMessageOrdinalCount2, visitRawSessionMessages2, readRawSessionMessageRange2, primeTailRawMessageCache2, getCachedAbsoluteMessageCount2, primeInMemoryTailRawMessageCache2, readRawSessionMessageOrdinalPage2, getRawSessionStoredMessageCount2, readRawSessionMessageIdOrdinalsForRange2, readRawSessionMessagePartsById2, hasRawSessionMessageById2, readRawSessionMessageOrdinalById2, compareRawSessionMessageOrder2, readRawSessionMessageById2, getRawSessionMessageCount2, getRawSessionTagKeysThrough2, getLegacyProtectedTailStartOrdinal2, readSessionChunk2, readRawSessionSeedTail2 };
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 };