@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
@@ -5,6 +5,7 @@ import { promptSyncWithValidatedOutputRetry } from "./model-suggestion-retry";
5
5
  import {
6
6
  createPromptAsyncTransport,
7
7
  promptAsyncAndWaitForIdle,
8
+ recordPromptSessionError,
8
9
  supportsPromptAsync,
9
10
  } from "./prompt-async-transport";
10
11
 
@@ -190,6 +191,96 @@ describe("promptAsyncAndWaitForIdle", () => {
190
191
  });
191
192
 
192
193
  describe("dreamer budget on an async child", () => {
194
+ test("forwards Pi's finalized per-child budget before manifest application", async () => {
195
+ let ready = false;
196
+ const states: unknown[] = [];
197
+ const client = {
198
+ session: {
199
+ prompt: async () => {
200
+ ready = true;
201
+ },
202
+ },
203
+ readChildTokenBudget: (id: string) => {
204
+ expect(id).toBe("ses-child");
205
+ expect(ready).toBe(true);
206
+ return { spent: 58, finalizeFired: true };
207
+ },
208
+ };
209
+ const transport = createPromptAsyncTransport(client as never, "ses-child", {
210
+ onBudgetUpdate: (state) => states.push(state),
211
+ });
212
+ expect(transport).toBeDefined();
213
+ await transport?.(request());
214
+ expect(states).toEqual([{ spent: 58, finalizeFired: true, sessionId: "ses-child" }]);
215
+ });
216
+ test("finalizes a zero-usage OpenCode mapper at 58 steps, before the hard ceiling", async () => {
217
+ const messages: unknown[] = [];
218
+ let sends = 0;
219
+ let aborted = false;
220
+ const states: unknown[] = [];
221
+ const client = {
222
+ session: {
223
+ messages: async () => ({ data: [...messages] }),
224
+ promptAsync: async (req: { body: { parts: unknown[] } }) => {
225
+ sends++;
226
+ if (sends === 2)
227
+ expect(JSON.stringify(req.body.parts)).toContain("no more tool calls");
228
+ messages.push({
229
+ info: { id: `u${sends}`, role: "user" },
230
+ parts: req.body.parts,
231
+ });
232
+ },
233
+ abort: async () => {
234
+ aborted = true;
235
+ },
236
+ status: async () => {
237
+ if (sends === 1 && messages.length === 1) {
238
+ for (let step = 1; step <= 58; step++)
239
+ messages.push({
240
+ info: {
241
+ id: `a${step}`,
242
+ role: "assistant",
243
+ finish: "tool-calls",
244
+ tokens: { input: 0 },
245
+ time: { completed: 1 },
246
+ },
247
+ parts: [{ type: "tool" }],
248
+ });
249
+ }
250
+ if (sends === 2 && messages.length === 60)
251
+ messages.push({
252
+ info: {
253
+ id: "final",
254
+ role: "assistant",
255
+ finish: "stop",
256
+ tokens: { input: 1 },
257
+ time: { completed: 2 },
258
+ },
259
+ parts: [{ type: "text", text: "<verify/>" }],
260
+ });
261
+ return {
262
+ data: sends === 1 && !aborted ? { "ses-child": { type: "busy" } } : {},
263
+ };
264
+ },
265
+ },
266
+ };
267
+ await promptAsyncAndWaitForIdle(
268
+ client as never,
269
+ {
270
+ ...request(),
271
+ signal: AbortSignal.timeout(200),
272
+ body: { ...request().body, agent: "dreamer-memory-mapper" },
273
+ },
274
+ {
275
+ tokenBudget: 3_000_000,
276
+ pollIntervalMs: 1,
277
+ startGraceMs: 100,
278
+ onBudgetUpdate: (state) => states.push(state),
279
+ },
280
+ );
281
+ expect(sends).toBe(2);
282
+ expect(states).toContainEqual(expect.objectContaining({ finalizeFired: true, spent: 0 }));
283
+ });
193
284
  test("sums prompt usage across validation retries in the same child", async () => {
194
285
  const messages: unknown[] = [];
195
286
  const states: Array<{ spent: number }> = [];
@@ -281,80 +372,121 @@ describe("dreamer budget on an async child", () => {
281
372
  expect(host.promptAsync).toHaveBeenCalledTimes(1);
282
373
  expect(host.abort).not.toHaveBeenCalled();
283
374
  });
284
- test("returns the final manifest after a soft nudge without changing the child agent", async () => {
285
- const host = asyncHost({ plan: ["busy", "settle"] });
286
- const messages: Array<{
287
- info: {
288
- id: string;
289
- role: string;
290
- tokens?: unknown;
291
- time?: { completed: number };
292
- finish?: string;
293
- };
294
- parts: unknown[];
295
- }> = [];
296
- let sends = 0;
297
- const client = {
298
- session: {
299
- messages: async () => ({ data: [...messages] }),
300
- promptAsync: mock(async (_req: unknown) => {
301
- sends++;
302
- messages.push({ info: { id: `u${sends}`, role: "user" }, parts: [] });
303
- return { data: undefined };
304
- }),
305
- abort: host.abort,
306
- status: async () => {
307
- if (sends === 1 && !messages.some((m) => m.info.id === "a1")) {
308
- messages.push({
309
- info: {
310
- id: "a1",
311
- role: "assistant",
312
- tokens: { input: 81 },
313
- time: { completed: 1 },
314
- finish: "tool-calls",
315
- },
316
- parts: [],
317
- });
318
- }
319
- if (sends === 2 && !messages.some((m) => m.info.id === "a2")) {
320
- messages.push({
321
- info: {
322
- id: "a2",
323
- role: "assistant",
324
- tokens: { input: 1 },
325
- time: { completed: 2 },
326
- finish: "stop",
327
- },
328
- parts: [{ type: "text", text: "<mappings/>" }],
329
- });
330
- }
331
- return {
332
- data:
333
- sends === 1 && host.abort.mock.calls.length === 0
334
- ? { "ses-child": { type: "busy" } }
335
- : {},
336
- };
337
- },
338
- },
339
- } as never;
340
- const body = {
341
- ...request(),
342
- body: {
343
- agent: "dreamer-memory-mapper",
344
- system: "same system",
345
- parts: [{ type: "text", text: "work" }],
375
+ test("keeps a completed answer when a poll receives over-budget tool usage and completion together", async () => {
376
+ const host = asyncHost({ plan: ["settle"] });
377
+ const originalMessages = host.client.session.messages;
378
+ host.client.session.messages = mock(
379
+ async (...args: Parameters<typeof originalMessages>) => {
380
+ const response = await originalMessages(...args);
381
+ if (response.data.some((message) => message.info.role === "assistant")) {
382
+ response.data.unshift({
383
+ info: {
384
+ id: "coarse-tool",
385
+ role: "assistant",
386
+ finish: "tool-calls",
387
+ tokens: { input: 120 },
388
+ time: { created: 1, completed: 2 },
389
+ },
390
+ parts: [],
391
+ } as never);
392
+ }
393
+ return response;
346
394
  },
347
- };
348
- await promptAsyncAndWaitForIdle(client, body, { pollIntervalMs: 1, tokenBudget: 100 });
349
- const prompts = (client as { session: { promptAsync: ReturnType<typeof mock> } }).session
350
- .promptAsync.mock.calls;
351
- expect(prompts).toHaveLength(2);
352
- expect((prompts[1]?.[0] as typeof body).body.agent).toBe(
353
- (prompts[0]?.[0] as typeof body).body.agent,
354
395
  );
355
- expect(messages.at(-1)?.parts).toEqual([{ type: "text", text: "<mappings/>" }]);
356
- expect(host.abort).toHaveBeenCalledTimes(1);
396
+ await promptAsyncAndWaitForIdle(host.client as never, request(), {
397
+ pollIntervalMs: 1,
398
+ tokenBudget: 100,
399
+ });
400
+ expect(host.promptAsync).toHaveBeenCalledTimes(1);
401
+ expect(host.abort).not.toHaveBeenCalled();
357
402
  });
403
+
404
+ for (const finalUsage of [1, 25]) {
405
+ test(`returns the final manifest after a soft nudge with ${finalUsage} final tokens`, async () => {
406
+ const host = asyncHost({ plan: ["busy", "settle"] });
407
+ const messages: Array<{
408
+ info: {
409
+ id: string;
410
+ role: string;
411
+ tokens?: unknown;
412
+ time?: { completed: number };
413
+ finish?: string;
414
+ };
415
+ parts: unknown[];
416
+ }> = [];
417
+ let sends = 0;
418
+ const client = {
419
+ session: {
420
+ messages: async () => ({ data: [...messages] }),
421
+ promptAsync: mock(async (_req: unknown) => {
422
+ sends++;
423
+ messages.push({ info: { id: `u${sends}`, role: "user" }, parts: [] });
424
+ return { data: undefined };
425
+ }),
426
+ abort: async () => {
427
+ recordPromptSessionError("ses-child", {
428
+ name: "MessageAbortedError",
429
+ data: { message: "Aborted" },
430
+ });
431
+ return host.abort();
432
+ },
433
+ status: async () => {
434
+ if (sends === 1 && !messages.some((m) => m.info.id === "a1")) {
435
+ messages.push({
436
+ info: {
437
+ id: "a1",
438
+ role: "assistant",
439
+ tokens: { input: 81 },
440
+ time: { completed: 1 },
441
+ finish: "tool-calls",
442
+ },
443
+ parts: [],
444
+ });
445
+ }
446
+ if (sends === 2 && !messages.some((m) => m.info.id === "a2")) {
447
+ if (finalUsage === 25) {
448
+ refuseBudgetedToolCall("ses-child");
449
+ refuseBudgetedToolCall("ses-child");
450
+ }
451
+ messages.push({
452
+ info: {
453
+ id: "a2",
454
+ role: "assistant",
455
+ tokens: { input: finalUsage },
456
+ time: { completed: 2 },
457
+ finish: "stop",
458
+ },
459
+ parts: [{ type: "text", text: "<mappings/>" }],
460
+ });
461
+ }
462
+ return {
463
+ data:
464
+ sends === 1 && host.abort.mock.calls.length === 0
465
+ ? { "ses-child": { type: "busy" } }
466
+ : {},
467
+ };
468
+ },
469
+ },
470
+ } as never;
471
+ const body = {
472
+ ...request(),
473
+ body: {
474
+ agent: "dreamer-memory-mapper",
475
+ system: "same system",
476
+ parts: [{ type: "text", text: "work" }],
477
+ },
478
+ };
479
+ await promptAsyncAndWaitForIdle(client, body, { pollIntervalMs: 1, tokenBudget: 100 });
480
+ const prompts = (client as { session: { promptAsync: ReturnType<typeof mock> } })
481
+ .session.promptAsync.mock.calls;
482
+ expect(prompts).toHaveLength(2);
483
+ expect((prompts[1]?.[0] as typeof body).body.agent).toBe(
484
+ (prompts[0]?.[0] as typeof body).body.agent,
485
+ );
486
+ expect(messages.at(-1)?.parts).toEqual([{ type: "text", text: "<mappings/>" }]);
487
+ expect(host.abort).toHaveBeenCalledTimes(1);
488
+ });
489
+ }
358
490
  test("finalizes once, refuses two tool calls, and keeps agent and tools unchanged", async () => {
359
491
  const messages: Array<{
360
492
  info: {
@@ -405,7 +537,7 @@ describe("dreamer budget on an async child", () => {
405
537
  role: "assistant",
406
538
  tokens: { input: 1, cache: { read: 1, write: 0 } },
407
539
  time: { completed: 2 },
408
- finish: "stop",
540
+ finish: "tool-calls",
409
541
  },
410
542
  parts: [{ type: "text", text: "<manifest/>" }],
411
543
  });
@@ -468,3 +600,48 @@ describe("prompt_async transport under the retry chain", () => {
468
600
  expect(host.abort).toHaveBeenCalledWith({ path: { id: "ses-child" } });
469
601
  });
470
602
  });
603
+
604
+ test("an idle accepted user row is not a no-output completion after 30 seconds", async () => {
605
+ const host = asyncHost({ plan: ["idle-pending"] });
606
+ await expect(
607
+ promptAsyncAndWaitForIdle(host.client, request(), {
608
+ pollIntervalMs: 1,
609
+ startGraceMs: 20,
610
+ }),
611
+ ).rejects.toThrow("settled assistant");
612
+ });
613
+
614
+ test("an early child session error preserves DeepSeek's unsupported-model 400 without waiting for an assistant", async () => {
615
+ const host = asyncHost({ plan: ["idle-pending"] });
616
+ const message =
617
+ "The supported API model names are deepseek-flash, deepseek-v4-pro, but you passed deepseek-v4-flash";
618
+ host.promptAsync.mockImplementation(async () => {
619
+ recordPromptSessionError("ses-child", {
620
+ name: "APIError",
621
+ data: { statusCode: 400, message },
622
+ });
623
+ recordPromptSessionError("ses-child", {
624
+ name: "UnknownError",
625
+ data: { message: "duplicate stack" },
626
+ });
627
+ return { data: undefined };
628
+ });
629
+ await expect(
630
+ promptAsyncAndWaitForIdle(host.client, request(), {
631
+ pollIntervalMs: 1,
632
+ startGraceMs: 60000,
633
+ }),
634
+ ).rejects.toThrow(`${message} (status=400)`);
635
+ expect(host.polls()).toBe(0);
636
+ });
637
+
638
+ test("session errors belonging to another child do not fail the run", async () => {
639
+ const host = asyncHost({ plan: ["settle"] });
640
+ const send = host.promptAsync.getMockImplementation()!;
641
+ host.promptAsync.mockImplementation(async (req) => {
642
+ recordPromptSessionError("other-child", "unrelated");
643
+ return send(req);
644
+ });
645
+ await promptAsyncAndWaitForIdle(host.client, request(), { pollIntervalMs: 1 });
646
+ expect(host.polls()).toBe(1);
647
+ });
@@ -1,4 +1,5 @@
1
1
  import type { createOpencodeClient } from "@opencode-ai/sdk";
2
+ import { buildHiddenAgentRegistrations } from "../agents/hidden-agent-registrations";
2
3
  import {
3
4
  createDreamTokenBudget,
4
5
  DreamTokenBudgetExceeded,
@@ -7,10 +8,28 @@ import {
7
8
  TOKEN_BUDGET_FINALIZE_MESSAGE,
8
9
  } from "../features/magic-context/dreamer/token-budget";
9
10
  import { sumTokensFromChildMessages } from "../features/magic-context/subagent-token-capture";
11
+ import { describeAssistantError } from "./assistant-message-extractor";
12
+ import { sessionLog } from "./logger";
10
13
  import type { PromptArgs, PromptTransport } from "./model-suggestion-retry";
11
14
 
12
15
  type Client = ReturnType<typeof createOpencodeClient> | undefined;
13
16
 
17
+ const activeSessionErrors = new Map<string, unknown>();
18
+ const budgetAbortedSessions = new Set<string>();
19
+
20
+ /** Feed host errors only to active background waits, not ordinary user sessions. */
21
+ export function recordPromptSessionError(sessionId: string, error: unknown): void {
22
+ // The finalize nudge intentionally aborts the previous generation. Its late
23
+ // event must not poison the replacement turn; other provider errors still count.
24
+ if (
25
+ budgetAbortedSessions.has(sessionId) &&
26
+ describeAssistantError(error).startsWith("MessageAbortedError")
27
+ )
28
+ return;
29
+ if (activeSessionErrors.has(sessionId) && activeSessionErrors.get(sessionId) === undefined)
30
+ activeSessionErrors.set(sessionId, error);
31
+ }
32
+
14
33
  /**
15
34
  * Why this exists: a synchronous `session.prompt` keeps one HTTP request open
16
35
  * for a child's whole agent loop, which for a dreamer batch is many minutes.
@@ -29,6 +48,12 @@ const DEFAULT_START_GRACE_MS = 30_000;
29
48
  /** The wait only looks at the newest messages: the ones this send appended and
30
49
  * the ones just before it. The host returns the most recent `limit` messages. */
31
50
  const MESSAGE_WINDOW = 100;
51
+ const MAPPER_STEP_CAP = buildHiddenAgentRegistrations({
52
+ dreamerPrompt: undefined,
53
+ historianPrompt: undefined,
54
+ historianEditorPrompt: undefined,
55
+ historianDisallowed: [],
56
+ }).find((agent) => agent.id === "dreamer-memory-mapper")?.maxSteps;
32
57
 
33
58
  export interface PromptAsyncWaitOptions {
34
59
  pollIntervalMs?: number;
@@ -44,6 +69,7 @@ export interface PromptAsyncWaitOptions {
44
69
  }
45
70
 
46
71
  type SessionApi = {
72
+ prompt?: (options: unknown) => Promise<unknown>;
47
73
  promptAsync?: (options: unknown) => Promise<unknown>;
48
74
  status?: (options?: unknown) => Promise<unknown>;
49
75
  messages?: (options: unknown) => Promise<unknown>;
@@ -54,6 +80,18 @@ function sessionApi(client: Client): SessionApi | undefined {
54
80
  return (client as { session?: SessionApi } | undefined)?.session;
55
81
  }
56
82
 
83
+ /** Marks the error the wait throws when the host reported a session error for the child. */
84
+ const HOST_SESSION_ERROR = Symbol("promptAsyncHostSessionError");
85
+
86
+ /** True for the error the wait throws when the host recorded a session error for the child. */
87
+ export function isHostSessionError(error: unknown): boolean {
88
+ return (
89
+ error !== null &&
90
+ typeof error === "object" &&
91
+ (error as { [HOST_SESSION_ERROR]?: unknown })[HOST_SESSION_ERROR] === true
92
+ );
93
+ }
94
+
57
95
  /** True when the host client can send without waiting and report session status. */
58
96
  export function supportsPromptAsync(client: Client): boolean {
59
97
  const session = sessionApi(client);
@@ -74,7 +112,31 @@ export function createPromptAsyncTransport(
74
112
  childSessionId: string,
75
113
  options: PromptAsyncWaitOptions = {},
76
114
  ): PromptTransport | undefined {
77
- if (!supportsPromptAsync(client)) return undefined;
115
+ if (!supportsPromptAsync(client)) {
116
+ // Pi's synchronous facade owns the subprocess budget. Forward its final
117
+ // per-child state before manifest application, not just into the run ledger.
118
+ const readChildTokenBudget = (
119
+ client as unknown as
120
+ | {
121
+ readChildTokenBudget?: (
122
+ id: string,
123
+ ) =>
124
+ | ReturnType<ReturnType<typeof createDreamTokenBudget>["snapshot"]>
125
+ | undefined;
126
+ }
127
+ | undefined
128
+ )?.readChildTokenBudget;
129
+ const session = sessionApi(client);
130
+ if (!readChildTokenBudget || !session?.prompt) return undefined;
131
+ return Object.assign(
132
+ async (request: PromptArgs) => {
133
+ await session.prompt?.(request);
134
+ const state = readChildTokenBudget(childSessionId);
135
+ if (state) options.onBudgetUpdate?.({ ...state, sessionId: childSessionId });
136
+ },
137
+ { childSessionId },
138
+ );
139
+ }
78
140
  const budgetGuard = options.tokenBudget
79
141
  ? createDreamTokenBudget(options.tokenBudget)
80
142
  : undefined;
@@ -224,9 +286,11 @@ export async function promptAsyncAndWaitForIdle(
224
286
  const budget =
225
287
  options.budgetGuard ??
226
288
  (options.tokenBudget ? createDreamTokenBudget(options.tokenBudget) : undefined);
227
- if (budget?.snapshot().finalizeFired)
289
+ if (budget && (budget.snapshot().finalizeFired || budget.snapshot().hardStopped))
228
290
  throw new DreamTokenBudgetExceeded(sessionId, budget.snapshot().spent);
229
291
  const seenUsage = new Set<string>();
292
+ const seenSteps = new Set<string>();
293
+ const mapper = request.body.agent === "dreamer-memory-mapper";
230
294
  let finalizing = false;
231
295
  let completionBaseline = new Set(
232
296
  (await readMessages(session, sessionId, dir, signal))
@@ -234,35 +298,74 @@ export async function promptAsyncAndWaitForIdle(
234
298
  .filter((id): id is string => id !== null),
235
299
  );
236
300
  const initialBaseline = new Set(completionBaseline);
237
- const sent = await session.promptAsync?.(request);
238
- if (sent && typeof sent === "object" && "error" in sent) {
239
- const rejection = (sent as { error?: unknown }).error;
240
- if (rejection)
241
- throw new Error(`prompt_async was rejected: ${describeRejection(rejection)}`);
242
- }
243
- let sentAt = Date.now();
244
- let sawBusy = false;
245
-
301
+ // Dispatch can fail before an assistant row exists. The plugin event hook
302
+ // retains that provider/model error while this child is actively awaited.
303
+ activeSessionErrors.set(sessionId, undefined);
246
304
  try {
305
+ const sent = await session.promptAsync?.(request);
306
+ if (sent && typeof sent === "object" && "error" in sent) {
307
+ const rejection = (sent as { error?: unknown }).error;
308
+ if (rejection) {
309
+ throw new Error(`prompt_async was rejected: ${describeRejection(rejection)}`);
310
+ }
311
+ }
312
+ let sentAt = Date.now();
313
+ let sawBusy = false;
314
+
247
315
  for (;;) {
248
316
  await sleep(pollIntervalMs, signal);
317
+ const hostError = activeSessionErrors.get(sessionId);
318
+ if (hostError !== undefined) {
319
+ const error = new Error(
320
+ `Host recorded session error: ${describeAssistantError(hostError)}`,
321
+ );
322
+ Object.assign(error, {
323
+ name: "DreamerProviderOutputFailureError",
324
+ transient: true,
325
+ [HOST_SESSION_ERROR]: true,
326
+ });
327
+ throw error;
328
+ }
249
329
  const status = await readStatus(session, sessionId, dir, signal);
250
330
  const messages = await readMessages(session, sessionId, dir, signal);
251
331
  if (budget) {
332
+ const latest = messages.at(-1);
333
+ const latestId = messageId(latest);
334
+ const completedAnswer =
335
+ latestId !== null &&
336
+ !completionBaseline.has(latestId) &&
337
+ isTerminalAssistant(latest) &&
338
+ infoOf(latest).error == null;
252
339
  for (const message of messages) {
253
340
  const id = messageId(message);
254
- if (!id || seenUsage.has(id) || infoOf(message).role !== "assistant") continue;
341
+ if (!id || infoOf(message).role !== "assistant") continue;
255
342
  // The initial baseline belongs to a previous child attempt.
256
343
  if (initialBaseline.has(id)) continue;
344
+ if (isSettledAssistant(message)) seenSteps.add(id);
345
+ if (seenUsage.has(id)) continue;
257
346
  const tokens = sumTokensFromChildMessages([message]);
258
- if (tokens.input + tokens.cacheRead + tokens.cacheWrite === 0) continue;
259
- seenUsage.add(id);
260
- const decision = budget.charge(
347
+ // A streaming row may not have usage yet; let a later poll
348
+ // charge its final report rather than remembering zero tokens.
349
+ if (tokens.input + tokens.cacheRead + tokens.cacheWrite > 0) seenUsage.add(id);
350
+ let decision = budget.charge(
261
351
  tokens.input,
262
352
  tokens.cacheRead,
263
353
  tokens.cacheWrite,
264
- isTerminalAssistant(message),
354
+ // A poll can receive several usage rows together. Charge
355
+ // all of them, but never abort an answer already completed.
356
+ completedAnswer ||
357
+ (isTerminalAssistant(message) && infoOf(message).error == null),
265
358
  );
359
+ // Polling can see an in-flight turn after the newest usage row;
360
+ // reserve it and a final answer before OpenCode's hard step cap.
361
+ if (
362
+ mapper &&
363
+ MAPPER_STEP_CAP !== undefined &&
364
+ !completedAnswer &&
365
+ decision === "continue" &&
366
+ seenSteps.size >= MAPPER_STEP_CAP - 2
367
+ )
368
+ decision = budget.finalize();
266
369
  options.onBudgetUpdate?.({ ...budget.snapshot(), sessionId });
267
370
  if (decision === "stop") {
268
371
  await session.abort?.({ path: { id: sessionId } });
@@ -270,6 +373,12 @@ export async function promptAsyncAndWaitForIdle(
270
373
  }
271
374
  if (decision === "finalize") {
272
375
  finalizing = true;
376
+ sessionLog(
377
+ sessionId,
378
+ "dreamer token budget: finalize fired",
379
+ budget.snapshot(),
380
+ );
381
+ budgetAbortedSessions.add(sessionId);
273
382
  registerBudgetFinalizeChild(sessionId, budget);
274
383
  if (!session.abort)
275
384
  throw new DreamTokenBudgetExceeded(sessionId, budget.snapshot().spent);
@@ -311,7 +420,7 @@ export async function promptAsyncAndWaitForIdle(
311
420
  break;
312
421
  }
313
422
  }
314
- if (budget.snapshot().hardStopped) {
423
+ if (budget.snapshot().hardStopped && !completedAnswer) {
315
424
  await session.abort?.({ path: { id: sessionId } });
316
425
  throw new DreamTokenBudgetExceeded(sessionId, budget.snapshot().spent);
317
426
  }
@@ -333,19 +442,17 @@ export async function promptAsyncAndWaitForIdle(
333
442
  isSettledAssistant(last)
334
443
  )
335
444
  return;
336
- const fresh = current.some((message) => {
337
- const id = messageId(message);
338
- return id !== null && !completionBaseline.has(id);
339
- });
340
- if (sawBusy && fresh) return;
445
+ // An accepted user message is not a completion. A host-side rejection
446
+ // can leave only that row behind while the session remains idle.
341
447
  if (Date.now() - sentAt >= startGraceMs) {
342
- if (fresh) return;
343
448
  throw new Error(
344
- `prompt_async did not start a run in child session ${sessionId} within ${startGraceMs}ms`,
449
+ `prompt_async did not start a run with a settled assistant in child session ${sessionId} within ${startGraceMs}ms (observed_busy=${sawBusy})`,
345
450
  );
346
451
  }
347
452
  }
348
453
  } finally {
454
+ activeSessionErrors.delete(sessionId);
455
+ budgetAbortedSessions.delete(sessionId);
349
456
  if (budget) releaseBudgetFinalizeChild(sessionId);
350
457
  }
351
458
  }