@cortexkit/opencode-magic-context 0.44.3 → 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 (701) 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-vjmvh6pz.js → derive-budgets-a63zsm5c.js} +4 -4
  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/map-memories.d.ts.map +1 -1
  40. package/dist/features/magic-context/dreamer/module-apply.d.ts +4 -25
  41. package/dist/features/magic-context/dreamer/module-apply.d.ts.map +1 -1
  42. package/dist/features/magic-context/dreamer/retrospective-learnings.d.ts.map +1 -1
  43. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts +5 -1
  44. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
  45. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts +12 -5
  46. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts.map +1 -1
  47. package/dist/features/magic-context/dreamer/task-executor.d.ts +6 -0
  48. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  49. package/dist/features/magic-context/dreamer/task-gates.d.ts +34 -0
  50. package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
  51. package/dist/features/magic-context/dreamer/task-prompts.d.ts +1 -1
  52. package/dist/features/magic-context/dreamer/task-prompts.d.ts.map +1 -1
  53. package/dist/features/magic-context/dreamer/task-registry.d.ts +7 -5
  54. package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
  55. package/dist/features/magic-context/dreamer/task-scheduler.d.ts +10 -3
  56. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  57. package/dist/features/magic-context/dreamer/token-budget.d.ts +3 -0
  58. package/dist/features/magic-context/dreamer/token-budget.d.ts.map +1 -1
  59. package/dist/features/magic-context/dreamer/verify.d.ts +2 -2
  60. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  61. package/dist/features/magic-context/git-commits/git-log-reader.d.ts +11 -2
  62. package/dist/features/magic-context/git-commits/git-log-reader.d.ts.map +1 -1
  63. package/dist/features/magic-context/git-commits/indexer.d.ts.map +1 -1
  64. package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
  65. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts +2 -0
  66. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts.map +1 -1
  67. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts +6 -0
  68. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts.map +1 -0
  69. package/dist/features/magic-context/lkg-prefix-chunks.d.ts +53 -0
  70. package/dist/features/magic-context/lkg-prefix-chunks.d.ts.map +1 -0
  71. package/dist/features/magic-context/memory/embedding-backfill.d.ts.map +1 -1
  72. package/dist/features/magic-context/memory/embedding-local.d.ts +8 -0
  73. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  74. package/dist/features/magic-context/memory/embedding-openai.d.ts +1 -0
  75. package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
  76. package/dist/features/magic-context/memory/embedding-worker-client.d.ts +27 -0
  77. package/dist/features/magic-context/memory/embedding-worker-client.d.ts.map +1 -0
  78. package/dist/features/magic-context/memory/embedding-worker.d.ts +2 -0
  79. package/dist/features/magic-context/memory/embedding-worker.d.ts.map +1 -0
  80. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts +2 -0
  81. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts.map +1 -0
  82. package/dist/features/magic-context/memory/memory-selection.d.ts.map +1 -1
  83. package/dist/features/magic-context/memory/project-identity-cache.d.ts +4 -3
  84. package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
  85. package/dist/features/magic-context/memory/project-identity.d.ts +5 -4
  86. package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -1
  87. package/dist/features/magic-context/memory/storage-memory-fts.d.ts.map +1 -1
  88. package/dist/features/magic-context/memory/visibility.d.ts +1 -1
  89. package/dist/features/magic-context/memory/visibility.d.ts.map +1 -1
  90. package/dist/features/magic-context/message-fts-rowid-map.d.ts +14 -1
  91. package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -1
  92. package/dist/features/magic-context/message-fts-session-filter.d.ts +14 -0
  93. package/dist/features/magic-context/message-fts-session-filter.d.ts.map +1 -0
  94. package/dist/features/magic-context/message-index.d.ts +1 -7
  95. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  96. package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -1
  97. package/dist/features/magic-context/migration-v94-write-split.d.ts +62 -0
  98. package/dist/features/magic-context/migration-v94-write-split.d.ts.map +1 -0
  99. package/dist/features/magic-context/migration-worker-client.d.ts +23 -0
  100. package/dist/features/magic-context/migration-worker-client.d.ts.map +1 -0
  101. package/dist/features/magic-context/migration-worker-protocol.d.ts +30 -0
  102. package/dist/features/magic-context/migration-worker-protocol.d.ts.map +1 -0
  103. package/dist/features/magic-context/migration-worker.d.ts +2 -0
  104. package/dist/features/magic-context/migration-worker.d.ts.map +1 -0
  105. package/dist/features/magic-context/migrations.d.ts +7 -0
  106. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  107. package/dist/features/magic-context/mural/render-mural.d.ts +24 -2
  108. package/dist/features/magic-context/mural/render-mural.d.ts.map +1 -1
  109. package/dist/features/magic-context/mural/render-trigger.d.ts +1 -1
  110. package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
  111. package/dist/features/magic-context/overflow-detection.d.ts +18 -7
  112. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
  113. package/dist/features/magic-context/project-embedding-registry.d.ts +2 -0
  114. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  115. package/dist/features/magic-context/range-parser.d.ts +2 -3
  116. package/dist/features/magic-context/range-parser.d.ts.map +1 -1
  117. package/dist/features/magic-context/resolve-subagent-fallback.d.ts +2 -0
  118. package/dist/features/magic-context/resolve-subagent-fallback.d.ts.map +1 -1
  119. package/dist/features/magic-context/scheduler.d.ts +2 -0
  120. package/dist/features/magic-context/scheduler.d.ts.map +1 -1
  121. package/dist/features/magic-context/search.d.ts +7 -0
  122. package/dist/features/magic-context/search.d.ts.map +1 -1
  123. package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -1
  124. package/dist/features/magic-context/session-project-storage.d.ts +10 -1
  125. package/dist/features/magic-context/session-project-storage.d.ts.map +1 -1
  126. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts +1 -1
  127. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts.map +1 -1
  128. package/dist/features/magic-context/smart-notes/compiler.d.ts +4 -0
  129. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  130. package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
  131. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts +2 -0
  132. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts.map +1 -1
  133. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts +10 -8
  134. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts.map +1 -1
  135. package/dist/features/magic-context/smart-notes/storage.d.ts +2 -2
  136. package/dist/features/magic-context/smart-notes/storage.d.ts.map +1 -1
  137. package/dist/features/magic-context/smart-notes/types.d.ts +7 -2
  138. package/dist/features/magic-context/smart-notes/types.d.ts.map +1 -1
  139. package/dist/features/magic-context/storage-caveman-rules.d.ts +21 -0
  140. package/dist/features/magic-context/storage-caveman-rules.d.ts.map +1 -0
  141. package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
  142. package/dist/features/magic-context/storage-compartment-history-version.d.ts +4 -0
  143. package/dist/features/magic-context/storage-compartment-history-version.d.ts.map +1 -0
  144. package/dist/features/magic-context/storage-db.d.ts +68 -3
  145. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  146. package/dist/features/magic-context/storage-identity-merge.d.ts +6 -0
  147. package/dist/features/magic-context/storage-identity-merge.d.ts.map +1 -1
  148. package/dist/features/magic-context/storage-meta-persisted.d.ts +15 -0
  149. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  150. package/dist/features/magic-context/storage-meta-session.d.ts +1 -1
  151. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  152. package/dist/features/magic-context/storage-meta-shared.d.ts +1 -1
  153. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  154. package/dist/features/magic-context/storage-notes.d.ts +2 -2
  155. package/dist/features/magic-context/storage-notes.d.ts.map +1 -1
  156. package/dist/features/magic-context/storage-reasoning-removal.d.ts +30 -0
  157. package/dist/features/magic-context/storage-reasoning-removal.d.ts.map +1 -0
  158. package/dist/features/magic-context/storage-replay-document.d.ts +42 -5
  159. package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
  160. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  161. package/dist/features/magic-context/storage-tags.d.ts +7 -1
  162. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  163. package/dist/features/magic-context/storage.d.ts +1 -1
  164. package/dist/features/magic-context/storage.d.ts.map +1 -1
  165. package/dist/features/magic-context/store-generation-rebase.d.ts.map +1 -1
  166. package/dist/features/magic-context/tag-input.d.ts +4 -0
  167. package/dist/features/magic-context/tag-input.d.ts.map +1 -0
  168. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  169. package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
  170. package/dist/features/magic-context/user-memory/storage-user-memory.d.ts.map +1 -1
  171. package/dist/features/magic-context/v22-deferred-backfill.d.ts.map +1 -1
  172. package/dist/ffi-3cx1cxpk.js +78 -0
  173. package/dist/ffi-7bqqe4cd.js +91 -0
  174. package/dist/ffi-7e6gryj5.js +91 -0
  175. package/dist/ffi-bpvkebwr.js +78 -0
  176. package/dist/hooks/magic-context/apply-operations.d.ts +9 -1
  177. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  178. package/dist/hooks/magic-context/auto-search-deadline.d.ts +10 -0
  179. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -0
  180. package/dist/hooks/magic-context/auto-search-hint.d.ts +3 -0
  181. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
  182. package/dist/hooks/magic-context/auto-search-runner.d.ts +3 -0
  183. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  184. package/dist/hooks/magic-context/caveman-cleanup.d.ts +8 -1
  185. package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -1
  186. package/dist/hooks/magic-context/caveman.d.ts +56 -1
  187. package/dist/hooks/magic-context/caveman.d.ts.map +1 -1
  188. package/dist/hooks/magic-context/child-session-spawn.d.ts +2 -0
  189. package/dist/hooks/magic-context/child-session-spawn.d.ts.map +1 -1
  190. package/dist/hooks/magic-context/command-handler.d.ts +1 -1
  191. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  192. package/dist/hooks/magic-context/compaction-marker-manager.d.ts +1 -1
  193. package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
  194. package/dist/hooks/magic-context/compartment-parser.d.ts +3 -3
  195. package/dist/hooks/magic-context/compartment-parser.d.ts.map +1 -1
  196. package/dist/hooks/magic-context/compartment-render-epoch.d.ts +12 -1
  197. package/dist/hooks/magic-context/compartment-render-epoch.d.ts.map +1 -1
  198. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  199. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +0 -1
  200. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  201. package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -1
  202. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  203. package/dist/hooks/magic-context/compartment-runner-types.d.ts +3 -0
  204. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  205. package/dist/hooks/magic-context/compartment-runner-validation.d.ts +6 -0
  206. package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -1
  207. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  208. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +35 -0
  209. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -0
  210. package/dist/hooks/magic-context/derive-budgets.d.ts.map +1 -1
  211. package/dist/hooks/magic-context/drop-stale-reduce-calls.d.ts.map +1 -1
  212. package/dist/hooks/magic-context/dropped-input-guard.d.ts.map +1 -1
  213. package/dist/hooks/magic-context/embed-history-runner.d.ts.map +1 -1
  214. package/dist/hooks/magic-context/emergency-drop.d.ts +15 -0
  215. package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
  216. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  217. package/dist/hooks/magic-context/event-resolvers.d.ts +7 -0
  218. package/dist/hooks/magic-context/event-resolvers.d.ts.map +1 -1
  219. package/dist/hooks/magic-context/execute-status.d.ts +1 -0
  220. package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
  221. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +17 -0
  222. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  223. package/dist/hooks/magic-context/heuristic-cleanup.d.ts +2 -0
  224. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
  225. package/dist/hooks/magic-context/historian-host-runner.d.ts +5 -0
  226. package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
  227. package/dist/hooks/magic-context/historian-prompt-fit.d.ts +116 -0
  228. package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -0
  229. package/dist/hooks/magic-context/historian-prompt.generated.d.ts +1 -1
  230. package/dist/hooks/magic-context/historian-prompt.generated.d.ts.map +1 -1
  231. package/dist/hooks/magic-context/history-boundary-repair.d.ts +44 -0
  232. package/dist/hooks/magic-context/history-boundary-repair.d.ts.map +1 -0
  233. package/dist/hooks/magic-context/hook.d.ts +4 -0
  234. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  235. package/dist/hooks/magic-context/inject-compartments.d.ts +13 -0
  236. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  237. package/dist/hooks/magic-context/lkg-persist.d.ts +12 -0
  238. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  239. package/dist/hooks/magic-context/lkg-replay-fit.d.ts +104 -0
  240. package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -0
  241. package/dist/hooks/magic-context/lkg-replay.d.ts +64 -0
  242. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  243. package/dist/hooks/magic-context/module-client.d.ts.map +1 -1
  244. package/dist/hooks/magic-context/module-state-sync-timing.d.ts +1 -1
  245. package/dist/hooks/magic-context/module-state-sync-timing.d.ts.map +1 -1
  246. package/dist/hooks/magic-context/module-state-sync.d.ts +6 -68
  247. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  248. package/dist/hooks/magic-context/module-tool-backends.d.ts +1 -34
  249. package/dist/hooks/magic-context/module-tool-backends.d.ts.map +1 -1
  250. package/dist/hooks/magic-context/module-transport.d.ts +1 -55
  251. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  252. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  253. package/dist/hooks/magic-context/note-nudger.d.ts +2 -0
  254. package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
  255. package/dist/hooks/magic-context/pass-outcome.d.ts +59 -2
  256. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
  257. package/dist/hooks/magic-context/producer-window-guard.d.ts +6 -0
  258. package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -1
  259. package/dist/hooks/magic-context/read-session-chunk.d.ts +17 -4
  260. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  261. package/dist/hooks/magic-context/read-session-formatting.d.ts +11 -0
  262. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  263. package/dist/hooks/magic-context/read-session-raw.d.ts +2 -2
  264. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
  265. package/dist/hooks/magic-context/reasoning-removal.d.ts +60 -0
  266. package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -0
  267. package/dist/hooks/magic-context/recomp-orchestrator.d.ts +1 -0
  268. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
  269. package/dist/hooks/magic-context/reference-retrieval.d.ts +1 -1
  270. package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -1
  271. package/dist/hooks/magic-context/reply-pages.d.ts +3 -0
  272. package/dist/hooks/magic-context/reply-pages.d.ts.map +1 -0
  273. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts +62 -0
  274. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts.map +1 -0
  275. package/dist/hooks/magic-context/rust-mode-transform.d.ts +17 -85
  276. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  277. package/dist/hooks/magic-context/send-session-notification.d.ts.map +1 -1
  278. package/dist/hooks/magic-context/sentinel.d.ts +35 -0
  279. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
  280. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +28 -0
  281. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -0
  282. package/dist/hooks/magic-context/single-store-refusal.d.ts +14 -0
  283. package/dist/hooks/magic-context/single-store-refusal.d.ts.map +1 -0
  284. package/dist/hooks/magic-context/storage-busy-refusal.d.ts +7 -0
  285. package/dist/hooks/magic-context/storage-busy-refusal.d.ts.map +1 -1
  286. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  287. package/dist/hooks/magic-context/stripped-command.d.ts +1 -1
  288. package/dist/hooks/magic-context/stripped-command.d.ts.map +1 -1
  289. package/dist/hooks/magic-context/system-injection-stripper.d.ts +7 -0
  290. package/dist/hooks/magic-context/system-injection-stripper.d.ts.map +1 -1
  291. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  292. package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -1
  293. package/dist/hooks/magic-context/tag-id-fallback.d.ts.map +1 -1
  294. package/dist/hooks/magic-context/tag-messages.d.ts +18 -1
  295. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  296. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  297. package/dist/hooks/magic-context/tokenizer-calibration.d.ts +1 -1
  298. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  299. package/dist/hooks/magic-context/transform-compartment-phase.d.ts +1 -0
  300. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  301. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +38 -4
  302. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  303. package/dist/hooks/magic-context/transform.d.ts +12 -39
  304. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  305. package/dist/hooks/magic-context/unmanaged-over-window.d.ts +36 -0
  306. package/dist/hooks/magic-context/unmanaged-over-window.d.ts.map +1 -0
  307. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts +15 -0
  308. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts.map +1 -0
  309. package/dist/hooks/magic-context/user-profile-render.d.ts +3 -0
  310. package/dist/hooks/magic-context/user-profile-render.d.ts.map +1 -0
  311. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  312. package/dist/{index-yhm60r53.js → index-16ny736w.js} +13622 -28584
  313. package/dist/{index-q5p1aqvv.js → index-2aq21j41.js} +1208 -429
  314. package/dist/{index-32b096cc.js → index-2ntg5sd4.js} +6 -2
  315. package/dist/index-4krbw8z9.js +6034 -0
  316. package/dist/{index-33q7s9y2.js → index-75zjgwga.js} +61 -85
  317. package/dist/{index-nf9sk8sh.js → index-8fgkmxmy.js} +28 -10
  318. package/dist/index-a4m2b1yv.js +530 -0
  319. package/dist/index-anq4nn6f.js +131 -0
  320. package/dist/index-avwt563y.js +62 -0
  321. package/dist/index-bmzf7zxv.js +445 -0
  322. package/dist/index-e44zzy84.js +10 -0
  323. package/dist/index-en1k8h8m.js +244 -0
  324. package/dist/{index-638hf49n.js → index-f85teqck.js} +15 -6
  325. package/dist/index-fr2z4qy8.js +7810 -0
  326. package/dist/{index-kwe03yde.js → index-fzbvakh0.js} +1 -1
  327. package/dist/{module-asyncify-2EFITU5U-rkqjhjxd.js → index-g20jdh0p.js} +114 -105
  328. package/dist/index-gd5qx1j9.js +398 -0
  329. package/dist/{index-3bygzk2d.js → index-hybnrwq0.js} +169 -4
  330. package/dist/{index-jqcbs2k1.js → index-mc22ayvf.js} +24 -5
  331. package/dist/{index-y5145x8k.js → index-n96ag4rk.js} +15 -1
  332. package/dist/index-q7yesyk9.js +9118 -0
  333. package/dist/index-remp7e2g.js +214 -0
  334. package/dist/{index-7k55qm8a.js → index-sfpzqvdz.js} +8 -8
  335. package/dist/{index-9y5p0d50.js → index-vvtfyw1z.js} +13 -76
  336. package/dist/index-w9jwmntv.js +202 -0
  337. package/dist/{index-kr5qehbd.js → index-x23gah8c.js} +1 -1
  338. package/dist/{index-jdxxq8cz.js → index-x8a7jmkh.js} +6 -1
  339. package/dist/{index-rdsaxnf2.js → index-xgt9k6c6.js} +23 -12
  340. package/dist/index-y8v6yerm.js +77 -0
  341. package/dist/index.d.ts.map +1 -1
  342. package/dist/index.js +7560 -8084
  343. package/dist/message-time-backfill-an311pmk.js +124 -0
  344. package/dist/migration-worker.js +53 -0
  345. package/dist/{model-resolution-dxatzjde.js → model-resolution-xhfmyyvy.js} +5 -1
  346. package/dist/module-ES6BEMUI-3cet1pyp.js +12 -0
  347. package/dist/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  348. package/dist/plugin/boot-deadline.d.ts.map +1 -1
  349. package/dist/plugin/conflict-warning-hook.d.ts.map +1 -1
  350. package/dist/plugin/dream-timer-module-client.d.ts +1 -11
  351. package/dist/plugin/dream-timer-module-client.d.ts.map +1 -1
  352. package/dist/plugin/dream-timer.d.ts.map +1 -1
  353. package/dist/plugin/hooks/create-session-hooks.d.ts +8 -0
  354. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  355. package/dist/plugin/messages-transform.d.ts +20 -13
  356. package/dist/plugin/messages-transform.d.ts.map +1 -1
  357. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  358. package/dist/plugin/stale-build-notice.d.ts +16 -0
  359. package/dist/plugin/stale-build-notice.d.ts.map +1 -0
  360. package/dist/read-session-chunk-8rxs0tc9.js +84 -0
  361. package/dist/recomp-orchestrator-nzamtw29.js +39 -0
  362. package/dist/{rpc-notifications-4amf6mf4.js → rpc-notifications-3hed126v.js} +3 -1
  363. package/dist/{safe-notification-target-50gm9c58.js → safe-notification-target-43r8jsxw.js} +3 -3
  364. package/dist/send-session-notification-nqpv7cne.js +28 -0
  365. package/dist/shared/assistant-message-extractor.d.ts +4 -0
  366. package/dist/shared/assistant-message-extractor.d.ts.map +1 -1
  367. package/dist/shared/background-batch-drain.d.ts +8 -0
  368. package/dist/shared/background-batch-drain.d.ts.map +1 -0
  369. package/dist/{features/builtin-commands/commands.d.ts → shared/builtin-commands.d.ts} +1 -1
  370. package/dist/shared/builtin-commands.d.ts.map +1 -0
  371. package/dist/shared/embedding-activity.d.ts +13 -0
  372. package/dist/shared/embedding-activity.d.ts.map +1 -0
  373. package/dist/shared/historian-tool-expansions.d.ts +5 -0
  374. package/dist/shared/historian-tool-expansions.d.ts.map +1 -0
  375. package/dist/shared/historian-tool-template.d.ts +5 -0
  376. package/dist/shared/historian-tool-template.d.ts.map +1 -0
  377. package/dist/shared/historian-transient-error.d.ts +2 -0
  378. package/dist/shared/historian-transient-error.d.ts.map +1 -0
  379. package/dist/shared/jsonc-edit.d.ts.map +1 -1
  380. package/dist/shared/logger.d.ts +7 -0
  381. package/dist/shared/logger.d.ts.map +1 -1
  382. package/dist/shared/model-suggestion-retry.d.ts +2 -1
  383. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  384. package/dist/shared/models-dev-cache.d.ts.map +1 -1
  385. package/dist/shared/off-thread-migration-clock.d.ts +38 -0
  386. package/dist/shared/off-thread-migration-clock.d.ts.map +1 -0
  387. package/dist/shared/plugin-package-version.d.ts +14 -0
  388. package/dist/shared/plugin-package-version.d.ts.map +1 -0
  389. package/dist/shared/project-directory-key.d.ts +26 -0
  390. package/dist/shared/project-directory-key.d.ts.map +1 -0
  391. package/dist/shared/prompt-async-transport.d.ts +4 -0
  392. package/dist/shared/prompt-async-transport.d.ts.map +1 -1
  393. package/dist/shared/prompt-surface-runtime.d.ts +3 -3
  394. package/dist/shared/provider-response-completion.d.ts +12 -0
  395. package/dist/shared/provider-response-completion.d.ts.map +1 -0
  396. package/dist/shared/redaction.d.ts.map +1 -1
  397. package/dist/shared/rpc-client.d.ts +23 -2
  398. package/dist/shared/rpc-client.d.ts.map +1 -1
  399. package/dist/shared/rpc-types.d.ts +19 -0
  400. package/dist/shared/rpc-types.d.ts.map +1 -1
  401. package/dist/shared/rpc-utils.d.ts +41 -0
  402. package/dist/shared/rpc-utils.d.ts.map +1 -1
  403. package/dist/shared/sqlite.d.ts +13 -2
  404. package/dist/shared/sqlite.d.ts.map +1 -1
  405. package/dist/shared/stale-plugin-build.d.ts +21 -0
  406. package/dist/shared/stale-plugin-build.d.ts.map +1 -0
  407. package/dist/shared/status-summary.d.ts +29 -0
  408. package/dist/shared/status-summary.d.ts.map +1 -1
  409. package/dist/shared/status-view-check.d.ts +124 -0
  410. package/dist/shared/status-view-check.d.ts.map +1 -0
  411. package/dist/shared/status-view.d.ts +38 -2
  412. package/dist/shared/status-view.d.ts.map +1 -1
  413. package/dist/shared/tag-owner-id.d.ts +19 -0
  414. package/dist/shared/tag-owner-id.d.ts.map +1 -0
  415. package/dist/shared/tag-transcript.d.ts +2 -1
  416. package/dist/shared/tag-transcript.d.ts.map +1 -1
  417. package/dist/shared/test-temp-dir.d.ts +8 -2
  418. package/dist/shared/test-temp-dir.d.ts.map +1 -1
  419. package/dist/shared/transcript.d.ts +2 -0
  420. package/dist/shared/transcript.d.ts.map +1 -1
  421. package/dist/shared/user-answer.d.ts +4 -0
  422. package/dist/shared/user-answer.d.ts.map +1 -0
  423. package/dist/shared/user-facing-codes.d.ts +41 -6
  424. package/dist/shared/user-facing-codes.d.ts.map +1 -1
  425. package/dist/shared/xml-unescape.d.ts +9 -0
  426. package/dist/shared/xml-unescape.d.ts.map +1 -0
  427. package/dist/task-config-v81k8jvk.js +17 -0
  428. package/dist/tools/ctx-expand/constants.d.ts +1 -1
  429. package/dist/tools/ctx-expand/constants.d.ts.map +1 -1
  430. package/dist/tools/ctx-expand/mode.d.ts +4 -0
  431. package/dist/tools/ctx-expand/mode.d.ts.map +1 -1
  432. package/dist/tools/ctx-expand/render.d.ts +5 -1
  433. package/dist/tools/ctx-expand/render.d.ts.map +1 -1
  434. package/dist/tools/ctx-expand/tools.d.ts +2 -0
  435. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  436. package/dist/tools/ctx-expand/types.d.ts +1 -0
  437. package/dist/tools/ctx-expand/types.d.ts.map +1 -1
  438. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  439. package/dist/tools/ctx-note/render.d.ts +2 -0
  440. package/dist/tools/ctx-note/render.d.ts.map +1 -1
  441. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  442. package/dist/tools/ctx-reduce/constants.d.ts +1 -1
  443. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
  444. package/dist/tools/ctx-search/constants.d.ts +1 -1
  445. package/dist/tools/ctx-search/constants.d.ts.map +1 -1
  446. package/dist/tools/light-descriptions.d.ts +3 -3
  447. package/dist/tools/light-descriptions.d.ts.map +1 -1
  448. package/dist/tools/parameter-descriptions.d.ts +14 -14
  449. package/dist/transform-postprocess-phase-414phndq.js +61 -0
  450. package/dist/tui/data/context-db.d.ts +34 -10
  451. package/dist/tui/data/context-db.d.ts.map +1 -1
  452. package/dist/tui/data/notification-socket.d.ts +6 -0
  453. package/dist/tui/data/notification-socket.d.ts.map +1 -1
  454. package/dist/tui/data/session-directory.d.ts +16 -0
  455. package/dist/tui/data/session-directory.d.ts.map +1 -0
  456. package/dist/tui-compiled/data/context-db.d.ts +34 -10
  457. package/dist/tui-compiled/data/context-db.d.ts.map +1 -1
  458. package/dist/tui-compiled/data/notification-socket.d.ts +6 -0
  459. package/dist/tui-compiled/data/notification-socket.d.ts.map +1 -1
  460. package/dist/tui-compiled/data/session-directory.d.ts +16 -0
  461. package/dist/tui-compiled/data/session-directory.d.ts.map +1 -0
  462. package/dist/v2/derive-budgets-v0krf3t7.js +18 -0
  463. package/dist/v2/embedding-worker.js +47 -0
  464. package/dist/v2/emscripten-module-0g8f45e6.js +602 -0
  465. package/dist/v2/emscripten-module-0pekdjxz.js +1532 -0
  466. package/dist/v2/emscripten-module-e67xwsp3.js +503 -0
  467. package/dist/v2/emscripten-module-pj1vyb44.js +4559 -0
  468. package/dist/v2/ffi-3cx1cxpk.js +78 -0
  469. package/dist/v2/ffi-7bqqe4cd.js +91 -0
  470. package/dist/v2/ffi-7e6gryj5.js +91 -0
  471. package/dist/v2/ffi-bpvkebwr.js +78 -0
  472. package/dist/v2/fold/boundary.d.ts.map +1 -1
  473. package/dist/v2/fork-inheritance.d.ts +101 -0
  474. package/dist/v2/fork-inheritance.d.ts.map +1 -0
  475. package/dist/v2/hidden-child-cleanup.d.ts +11 -0
  476. package/dist/v2/hidden-child-cleanup.d.ts.map +1 -0
  477. package/dist/v2/hidden-child-native.d.ts +29 -0
  478. package/dist/v2/hidden-child-native.d.ts.map +1 -0
  479. package/dist/v2/hidden-child-record.d.ts +135 -0
  480. package/dist/v2/hidden-child-record.d.ts.map +1 -0
  481. package/dist/v2/hidden-completion.d.ts +12 -97
  482. package/dist/v2/hidden-completion.d.ts.map +1 -1
  483. package/dist/v2/hooks/context.d.ts +20 -8
  484. package/dist/v2/hooks/context.d.ts.map +1 -1
  485. package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
  486. package/dist/v2/hooks/dream-trigger.d.ts +5 -0
  487. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  488. package/dist/v2/hooks/generate.d.ts +10 -0
  489. package/dist/v2/hooks/generate.d.ts.map +1 -0
  490. package/dist/v2/hooks/hidden-child.d.ts +33 -2
  491. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  492. package/dist/v2/hooks/payload.d.ts +3 -0
  493. package/dist/v2/hooks/payload.d.ts.map +1 -1
  494. package/dist/v2/hooks/session-api-gate.d.ts +4 -0
  495. package/dist/v2/hooks/session-api-gate.d.ts.map +1 -0
  496. package/dist/v2/hooks/storage-gate.d.ts +3 -1
  497. package/dist/v2/hooks/storage-gate.d.ts.map +1 -1
  498. package/dist/v2/hooks/store.d.ts +1 -1
  499. package/dist/v2/hooks/store.d.ts.map +1 -1
  500. package/dist/v2/hooks/tools.d.ts.map +1 -1
  501. package/dist/v2/hooks/types.d.ts +10 -0
  502. package/dist/v2/hooks/types.d.ts.map +1 -1
  503. package/dist/v2/hooks/update-check.d.ts.map +1 -1
  504. package/dist/v2/hooks/usage-persist.d.ts.map +1 -1
  505. package/dist/v2/hooks/usage-reading.d.ts +4 -0
  506. package/dist/v2/hooks/usage-reading.d.ts.map +1 -1
  507. package/dist/v2/index-6e4mwffh.js +5662 -0
  508. package/dist/v2/index-en1k8h8m.js +244 -0
  509. package/dist/{message-time-backfill-q374fxc5.js → v2/message-time-backfill-0n93vrd7.js} +19 -5
  510. package/dist/v2/migration-worker.js +52 -0
  511. package/dist/v2/model-resolution-xhfmyyvy.js +16 -0
  512. package/dist/v2/module-ES6BEMUI-3cet1pyp.js +12 -0
  513. package/dist/v2/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  514. package/dist/v2/prompt-context-5y5ms8f9.js +6 -0
  515. package/dist/{read-session-chunk-n072mcq4.js → v2/read-session-chunk-hjza38hr.js} +24 -7
  516. package/dist/v2/recomp-orchestrator-1aq7h44c.js +36 -0
  517. package/dist/v2/retrospective-raw-provider.d.ts +21 -0
  518. package/dist/v2/retrospective-raw-provider.d.ts.map +1 -0
  519. package/dist/v2/rpc-notifications-3hed126v.js +16 -0
  520. package/dist/v2/safe-notification-target-wtj0bbc2.js +9 -0
  521. package/dist/{send-session-notification-04hvd54c.js → v2/send-session-notification-mq9frrtm.js} +10 -5
  522. package/dist/v2/server-0jqw05sa.js +803 -0
  523. package/dist/v2/server-5317ykaf.js +40 -0
  524. package/dist/v2/server-a4m2b1yv.js +530 -0
  525. package/dist/v2/server-avwt563y.js +62 -0
  526. package/dist/v2/server-c4g2y1z8.js +28824 -0
  527. package/dist/v2/server-ckpc8pxy.js +662 -0
  528. package/dist/v2/server-e36nf2p1.js +7702 -0
  529. package/dist/v2/server-e44zzy84.js +10 -0
  530. package/dist/v2/server-fgmxwrgy.js +16 -0
  531. package/dist/v2/server-fmsr7v69.js +75 -0
  532. package/dist/v2/server-g20jdh0p.js +1273 -0
  533. package/dist/{index-dgg5y7er.js → v2/server-hfjfbg59.js} +849 -747
  534. package/dist/v2/server-n96ag4rk.js +633 -0
  535. package/dist/v2/server-qdjnb2z1.js +181 -0
  536. package/dist/v2/server-qpg6wf72.js +187 -0
  537. package/dist/v2/server-r7cmye3k.js +131 -0
  538. package/dist/v2/server-remp7e2g.js +214 -0
  539. package/dist/v2/server-rhdgxp1t.js +398 -0
  540. package/dist/v2/server-sfpzqvdz.js +137 -0
  541. package/dist/v2/server-syahy8j8.js +50 -0
  542. package/dist/v2/server-v5xgft5v.js +9116 -0
  543. package/dist/v2/server-w99cyt6a.js +361 -0
  544. package/dist/v2/server-x8a7jmkh.js +104 -0
  545. package/dist/v2/server-y8v6yerm.js +77 -0
  546. package/dist/v2/server-z19x7eqz.js +423 -0
  547. package/dist/v2/server.d.ts.map +1 -1
  548. package/dist/v2/server.js +8868 -107184
  549. package/dist/v2/store-reader.d.ts +52 -1
  550. package/dist/v2/store-reader.d.ts.map +1 -1
  551. package/dist/v2/task-config-tbndqyny.js +17 -0
  552. package/dist/v2/transformers-node-wasm.js +26768 -0
  553. package/dist/v2/transformers-web.js +25670 -0
  554. package/dist/v2/transformers.node-hj754h7s.js +29997 -0
  555. package/dist/v2/tui/index.d.ts +10 -1
  556. package/dist/v2/tui/index.d.ts.map +1 -1
  557. package/dist/v2/tui/sidebar-mount.d.ts +6 -0
  558. package/dist/v2/tui/sidebar-mount.d.ts.map +1 -1
  559. package/dist/v2/tui/status-dialog-mount.d.ts +7 -4
  560. package/dist/v2/tui/status-dialog-mount.d.ts.map +1 -1
  561. package/dist/v2/tui/types.d.ts +12 -0
  562. package/dist/v2/tui/types.d.ts.map +1 -1
  563. package/dist/v2/wrapup-orchestrator-tbyx78dz.js +425 -0
  564. package/dist/wrapup-orchestrator-h28bqsy6.js +26 -0
  565. package/package.json +8 -8
  566. package/src/agents/hidden-agent-registrations.ts +24 -16
  567. package/src/agents/magic-context-prompt.test.ts +41 -0
  568. package/src/agents/magic-context-prompt.ts +8 -5
  569. package/src/agents/permissions.test.ts +31 -49
  570. package/src/agents/permissions.ts +8 -28
  571. package/src/config/index.test.ts +60 -20
  572. package/src/config/index.ts +53 -1
  573. package/src/config/live-run-config.test.ts +5 -5
  574. package/src/config/live-snapshot.test.ts +4 -4
  575. package/src/config/migrate-config-location.test.ts +3 -10
  576. package/src/config/project-config-trust-boundary.test.ts +207 -0
  577. package/src/config/project-security.hostile-matrix.test.ts +4 -4
  578. package/src/config/project-security.ts +218 -1
  579. package/src/config/protected-tokens.test.ts +14 -9
  580. package/src/config/raw-loader.test.ts +31 -3
  581. package/src/config/raw-loader.ts +8 -3
  582. package/src/config/schema/magic-context.ts +20 -3
  583. package/src/config/variable.test.ts +3 -2
  584. package/src/features/magic-context/dreamer/cron.ts +30 -9
  585. package/src/features/magic-context/dreamer/task-registry.ts +7 -5
  586. package/src/shared/announcement.test.ts +2 -1
  587. package/src/shared/assistant-message-extractor.test.ts +27 -1
  588. package/src/shared/assistant-message-extractor.ts +27 -0
  589. package/src/shared/background-batch-drain.test.ts +38 -0
  590. package/src/shared/background-batch-drain.ts +29 -0
  591. package/src/shared/builtin-commands.ts +50 -0
  592. package/src/shared/console-diagnostics-fence.test.ts +145 -0
  593. package/src/shared/data-path.test.ts +6 -5
  594. package/src/shared/embedding-activity.test.ts +21 -0
  595. package/src/shared/embedding-activity.ts +36 -0
  596. package/src/shared/historian-tool-defaults.json +13 -0
  597. package/src/shared/historian-tool-expansions.ts +18 -0
  598. package/src/shared/historian-tool-template.ts +248 -0
  599. package/src/shared/historian-transient-error.test.ts +36 -0
  600. package/src/shared/historian-transient-error.ts +22 -0
  601. package/src/shared/jsonc-edit.ts +20 -1
  602. package/src/shared/logger.test.ts +3 -2
  603. package/src/shared/logger.ts +40 -1
  604. package/src/shared/model-suggestion-retry.test.ts +46 -0
  605. package/src/shared/model-suggestion-retry.ts +16 -1
  606. package/src/shared/models-dev-cache.test.ts +74 -2
  607. package/src/shared/models-dev-cache.ts +5 -1
  608. package/src/shared/off-thread-migration-clock.test.ts +55 -0
  609. package/src/shared/off-thread-migration-clock.ts +124 -0
  610. package/src/shared/opencode-db-path.test.ts +3 -2
  611. package/src/shared/plugin-package-version.ts +52 -0
  612. package/src/shared/project-directory-key.test.ts +111 -0
  613. package/src/shared/project-directory-key.ts +54 -0
  614. package/src/shared/prompt-async-transport.test.ts +249 -72
  615. package/src/shared/prompt-async-transport.ts +131 -24
  616. package/src/shared/prompt-surface-a1-golden.md +41 -25
  617. package/src/shared/prompt-surface-runtime.test.ts +3 -3
  618. package/src/shared/provider-response-completion.ts +23 -0
  619. package/src/shared/redaction.test.ts +51 -1
  620. package/src/shared/redaction.ts +33 -0
  621. package/src/shared/rpc-async-probes.test.ts +32 -2
  622. package/src/shared/rpc-client.test.ts +3 -2
  623. package/src/shared/rpc-client.ts +76 -18
  624. package/src/shared/rpc-types.ts +15 -0
  625. package/src/shared/rpc-utils.test.ts +191 -12
  626. package/src/shared/rpc-utils.ts +184 -26
  627. package/src/shared/sqlite-acquisition-routing.test.ts +46 -3
  628. package/src/shared/sqlite-pass-scope.test.ts +3 -2
  629. package/src/shared/sqlite-transaction-mode-guard.test.ts +4 -0
  630. package/src/shared/sqlite-writer-diagnostics.test.ts +134 -0
  631. package/src/shared/sqlite.ts +225 -41
  632. package/src/shared/stale-plugin-build.test.ts +129 -0
  633. package/src/shared/stale-plugin-build.ts +151 -0
  634. package/src/shared/status-summary.ts +40 -13
  635. package/src/shared/status-view-check.test.ts +253 -0
  636. package/src/shared/status-view-check.ts +536 -0
  637. package/src/shared/status-view.test.ts +6 -1
  638. package/src/shared/status-view.ts +176 -4
  639. package/src/shared/storage-busy.test.ts +3 -2
  640. package/src/shared/tag-owner-id.test.ts +33 -0
  641. package/src/shared/tag-owner-id.ts +29 -0
  642. package/src/shared/tag-transcript.ts +17 -3
  643. package/src/shared/test-temp-dir-policy.test.ts +33 -0
  644. package/src/shared/test-temp-dir.test.ts +27 -0
  645. package/src/shared/test-temp-dir.ts +36 -12
  646. package/src/shared/transcript.ts +3 -0
  647. package/src/shared/tui-config.test.ts +6 -5
  648. package/src/shared/tui-preferences.test.ts +3 -2
  649. package/src/shared/user-answer.test.ts +40 -0
  650. package/src/shared/user-answer.ts +17 -0
  651. package/src/shared/user-facing-codes.ts +52 -6
  652. package/src/shared/window-geometry.test.ts +3 -2
  653. package/src/shared/write-transaction-attribution.test.ts +11 -7
  654. package/src/shared/write-transaction-hold-clock.test.ts +160 -0
  655. package/src/shared/xml-unescape.ts +19 -0
  656. package/src/tui/data/context-db.test.ts +92 -4
  657. package/src/tui/data/context-db.ts +184 -18
  658. package/src/tui/data/notification-socket.test.ts +49 -2
  659. package/src/tui/data/notification-socket.ts +47 -9
  660. package/src/tui/data/session-directory.ts +19 -0
  661. package/src/tui/dialogs/status-dialog-render.test.ts +284 -0
  662. package/src/tui/dialogs/status-dialog.tsx +41 -38
  663. package/src/tui/index.tsx +30 -18
  664. package/src/tui/slots/sidebar-content.tsx +9 -2
  665. package/src/tui-compiled/data/context-db.ts +184 -18
  666. package/src/tui-compiled/data/notification-socket.ts +47 -9
  667. package/src/tui-compiled/data/session-directory.ts +19 -0
  668. package/src/tui-compiled/dialogs/status-dialog.tsx +38 -29
  669. package/src/tui-compiled/index.tsx +29 -16
  670. package/src/tui-compiled/slots/sidebar-content.tsx +3 -2
  671. package/src/v2/tui/host-contract.test.ts +9 -10
  672. package/src/v2/tui/index.ts +78 -23
  673. package/src/v2/tui/load-compiled-sidebar.d.mts +5 -1
  674. package/src/v2/tui/load-compiled-status-dialog.d.mts +3 -2
  675. package/src/v2/tui/session-directory.test.ts +53 -0
  676. package/src/v2/tui/sidebar-mount.ts +19 -1
  677. package/src/v2/tui/status-dialog-mount.ts +10 -7
  678. package/src/v2/tui/types.ts +10 -0
  679. package/dist/features/builtin-commands/commands.d.ts.map +0 -1
  680. package/dist/features/builtin-commands/types.d.ts +0 -3
  681. package/dist/features/builtin-commands/types.d.ts.map +0 -1
  682. package/dist/features/magic-context/context-authority.d.ts +0 -272
  683. package/dist/features/magic-context/context-authority.d.ts.map +0 -1
  684. package/dist/features/magic-context/memory/mirror-reembed.d.ts +0 -22
  685. package/dist/features/magic-context/memory/mirror-reembed.d.ts.map +0 -1
  686. package/dist/hooks/magic-context/historian-state-file.d.ts +0 -43
  687. package/dist/hooks/magic-context/historian-state-file.d.ts.map +0 -1
  688. package/dist/index-4an2p8qa.js +0 -1056
  689. package/dist/index-rn7gafjr.js +0 -8
  690. package/dist/index-v6t0tg85.js +0 -13
  691. package/dist/plugin/memory-id-translation.d.ts +0 -109
  692. package/dist/plugin/memory-id-translation.d.ts.map +0 -1
  693. package/dist/plugin/rust-note-backend.d.ts +0 -84
  694. package/dist/plugin/rust-note-backend.d.ts.map +0 -1
  695. package/dist/recomp-orchestrator-19tr6zya.js +0 -22
  696. package/dist/task-config-2bm68628.js +0 -9
  697. package/dist/transform-postprocess-phase-z2mfc5w1.js +0 -36
  698. package/dist/v2/host-service.d.ts +0 -66
  699. package/dist/v2/host-service.d.ts.map +0 -1
  700. package/dist/wrapup-orchestrator-sy4m56a7.js +0 -19
  701. /package/dist/{index-s70wtd8k.js → index-q6hef7fh.js} +0 -0
@@ -0,0 +1,36 @@
1
+ /** Track busy status only for sessions observed by this process; untracked sessions are not assumed busy. */
2
+ const busySessions = new Set<string>();
3
+
4
+ export function setEmbeddingSessionBusy(sessionId: string, busy: boolean): void {
5
+ if (busy) busySessions.add(sessionId);
6
+ else busySessions.delete(sessionId);
7
+ }
8
+
9
+ export function observeEmbeddingActivity(event: { type: string; properties?: unknown }): void {
10
+ const props = event.properties as
11
+ | { sessionID?: string; status?: { type?: string } }
12
+ | undefined;
13
+ if (!props || typeof props.sessionID !== "string") return;
14
+ if (
15
+ event.type === "session.idle" ||
16
+ event.type === "session.deleted" ||
17
+ (event.type === "session.status" && props.status?.type === "idle")
18
+ ) {
19
+ setEmbeddingSessionBusy(props.sessionID, false);
20
+ } else if (event.type === "session.status" && props.status?.type) {
21
+ setEmbeddingSessionBusy(props.sessionID, true);
22
+ }
23
+ }
24
+
25
+ export function isEmbeddingHostBusy(): boolean {
26
+ return busySessions.size > 0;
27
+ }
28
+
29
+ /**
30
+ * Forget every busy session (tests only). A test that starts an agent turn and
31
+ * never ends it would otherwise leave the whole process busy, and background
32
+ * embedding in later tests of the same process would stop at once.
33
+ */
34
+ export function resetEmbeddingActivityForTests(): void {
35
+ busySessions.clear();
36
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "ctx_note": "Note ${input.action} ${input.note_ids}: ${input.content} → ${output.truncate(160)}",
3
+ "ctx_memory": "Memory ${input.action} ${input.category} ${input.ids}: ${input.content} → ${output.truncate(160)}",
4
+ "todowrite": "Todos (${input.todos.count}): ${input.todos.each(\"${status}: ${content}\")}",
5
+ "question": "Asked user: ${input.questions[*].question.join(\" / \")} → ${output}",
6
+ "task": "Task ${input.subagent_type}: ${input.prompt} → ${output.truncate(200)}",
7
+ "ask": "Asked: ${input.question.truncate(250)} [options: ${input.options.join(\" / \")}] ${input.resolution} → ${output.truncate(300)}",
8
+ "peer_send": "PM to ${input.agent}${input.agent_id}: ${input.message.truncate(400)}",
9
+ "board": "Board ${input.verb}: ${input.ops.each(\"${op} ${item}${lane.title} ${state}${lane.status}${props.text} ${lane.items[*].text}\")}",
10
+ "room": "Room ${input.action} ${input.room_id}: ${input.text.truncate(400)}",
11
+ "work": "Work ${input.action} ${input.id}: ${input.prompt_file}${input.prompt.truncate(200)}${input.notes.truncate(200)} → ${output.truncate(160)}",
12
+ "knowhow": "Looked up how-to: ${input.query}${input.id}"
13
+ }
@@ -0,0 +1,18 @@
1
+ import defaults from "./historian-tool-defaults.json";
2
+ import { renderToolTemplate, type ToolExpansionMap } from "./historian-tool-template";
3
+
4
+ export { defaults as DEFAULT_TOOL_EXPANSIONS };
5
+ export function expandToolPart(part: unknown, overrides?: ToolExpansionMap): string | null {
6
+ if (!part || typeof part !== "object") return null;
7
+ const p = part as Record<string, unknown>;
8
+ if (p.type !== "tool" || typeof p.tool !== "string") return null;
9
+ const template =
10
+ overrides && Object.hasOwn(overrides, p.tool)
11
+ ? overrides[p.tool]
12
+ : Object.hasOwn(defaults, p.tool)
13
+ ? defaults[p.tool as keyof typeof defaults]
14
+ : undefined;
15
+ if (typeof template !== "string") return null;
16
+ const state = p.state as Record<string, unknown> | undefined;
17
+ return renderToolTemplate(template, state?.input, state?.output ?? state?.error);
18
+ }
@@ -0,0 +1,248 @@
1
+ /** A deliberately non-executable language for readable, bounded historian tool lines. */
2
+ export type ToolExpansionMap = Record<string, string | false>;
3
+ type Step = { field: string } | { index: number } | { project: string };
4
+ type Expression = {
5
+ steps: Step[];
6
+ each?: Template;
7
+ join?: string;
8
+ count?: boolean;
9
+ cap: number;
10
+ };
11
+ type Template = Array<string | Expression>;
12
+
13
+ class Parser {
14
+ pos = 0;
15
+ constructor(private source: string) {}
16
+ error(): never {
17
+ throw new Error(`Invalid tool expansion template at character ${this.pos + 1}`);
18
+ }
19
+ take(value: string): boolean {
20
+ if (!this.source.startsWith(value, this.pos)) return false;
21
+ this.pos += value.length;
22
+ return true;
23
+ }
24
+ field(): string {
25
+ const match = /^[A-Za-z_][A-Za-z0-9_-]*/.exec(this.source.slice(this.pos));
26
+ if (!match) return this.error();
27
+ this.pos += match[0].length;
28
+ return match[0];
29
+ }
30
+ quoted(): string {
31
+ const start = this.pos;
32
+ if (!this.take('"')) return this.error();
33
+ while (this.pos < this.source.length) {
34
+ if (this.take("\\")) {
35
+ this.pos++;
36
+ continue;
37
+ }
38
+ if (this.take('"')) {
39
+ try {
40
+ return JSON.parse(this.source.slice(start, this.pos));
41
+ } catch {
42
+ return this.error();
43
+ }
44
+ }
45
+ this.pos++;
46
+ }
47
+ return this.error();
48
+ }
49
+ integer(): number {
50
+ const match = /^\d+/.exec(this.source.slice(this.pos));
51
+ if (!match) return this.error();
52
+ this.pos += match[0].length;
53
+ const n = Number(match[0]);
54
+ if (!Number.isSafeInteger(n)) return this.error();
55
+ return n;
56
+ }
57
+ expression(relative: boolean): Expression {
58
+ const steps: Step[] = [];
59
+ if (!(relative && this.take("."))) {
60
+ const root = this.field();
61
+ if (!relative && root !== "input" && root !== "output") return this.error();
62
+ steps.push({ field: root });
63
+ }
64
+ while (true) {
65
+ if (this.take("[")) {
66
+ if (this.take("*].")) steps.push({ project: this.field() });
67
+ else {
68
+ const index = this.integer();
69
+ if (!this.take("]")) return this.error();
70
+ steps.push({ index });
71
+ }
72
+ } else if (
73
+ this.source[this.pos] === "." &&
74
+ !/^\.(each\(|join\(|count(?:\.|\})|truncate\()/.test(this.source.slice(this.pos))
75
+ ) {
76
+ this.pos++;
77
+ steps.push({ field: this.field() });
78
+ if (this.source[this.pos] === "(") return this.error();
79
+ } else break;
80
+ }
81
+ const expression: Expression = { steps, cap: 300 };
82
+ if (this.take(".each(")) {
83
+ if (relative) return this.error();
84
+ expression.each = parseTemplate(this.quoted(), true);
85
+ if (!this.take(")")) return this.error();
86
+ }
87
+ if (this.take(".join(")) {
88
+ expression.join = this.quoted();
89
+ if (!this.take(")")) return this.error();
90
+ }
91
+ if (this.take(".count")) {
92
+ if (expression.each || expression.join !== undefined) return this.error();
93
+ expression.count = true;
94
+ }
95
+ if (this.take(".truncate(")) {
96
+ expression.cap = this.integer();
97
+ if (!this.take(")")) return this.error();
98
+ }
99
+ if (!this.take("}")) return this.error();
100
+ return expression;
101
+ }
102
+ template(relative: boolean): Template {
103
+ const nodes: Template = [];
104
+ while (this.pos < this.source.length) {
105
+ const next = this.source.indexOf("${", this.pos);
106
+ if (next < 0) {
107
+ nodes.push(this.source.slice(this.pos));
108
+ break;
109
+ }
110
+ nodes.push(this.source.slice(this.pos, next));
111
+ this.pos = next + 2;
112
+ nodes.push(this.expression(relative));
113
+ }
114
+ return nodes;
115
+ }
116
+ }
117
+
118
+ function parseTemplate(source: string, relative = false): Template {
119
+ return new Parser(source).template(relative);
120
+ }
121
+
122
+ export function toolTemplateError(source: string): string | undefined {
123
+ try {
124
+ parseTemplate(source);
125
+ return undefined;
126
+ } catch (error) {
127
+ return (error as Error).message;
128
+ }
129
+ }
130
+
131
+ const templates = new Map<string, Template | null>();
132
+ function compiled(source: string): Template | null {
133
+ if (!templates.has(source)) {
134
+ // Validation belongs to config loading. Malformed data from an older host
135
+ // must never interrupt a historian run.
136
+ try {
137
+ templates.set(source, parseTemplate(source));
138
+ } catch {
139
+ templates.set(source, null);
140
+ }
141
+ }
142
+ return templates.get(source) ?? null;
143
+ }
144
+
145
+ function oneLine(value: string): string {
146
+ return value.replace(/[\r\n\u2028\u2029]+/g, " ");
147
+ }
148
+ function truncate(value: string, cap: number): string {
149
+ const chars = Array.from(oneLine(value));
150
+ return chars.length > cap ? `${chars.slice(0, cap).join("")}…` : chars.join("");
151
+ }
152
+ function scalar(value: unknown): string {
153
+ if (value === undefined) return "";
154
+ return typeof value === "string" ? value : compactJson(value);
155
+ }
156
+ // Sort object keys so the two engines do not depend on their JSON map insertion order.
157
+ function compactJson(value: unknown): string {
158
+ if (Array.isArray(value)) return `[${value.map((v) => compactJson(v)).join(",")}]`;
159
+ if (value !== null && typeof value === "object")
160
+ return `{${Object.keys(value)
161
+ .sort()
162
+ .map(
163
+ (key) =>
164
+ `${JSON.stringify(key)}:${compactJson((value as Record<string, unknown>)[key])}`,
165
+ )
166
+ .join(",")}}`;
167
+ return JSON.stringify(value) ?? "null";
168
+ }
169
+ function field(value: unknown, key: string): unknown {
170
+ return value !== null &&
171
+ typeof value === "object" &&
172
+ !Array.isArray(value) &&
173
+ Object.hasOwn(value, key)
174
+ ? (value as Record<string, unknown>)[key]
175
+ : undefined;
176
+ }
177
+ function render(nodes: Template, root: unknown): string {
178
+ return nodes
179
+ .map((node) => {
180
+ if (typeof node === "string") return node;
181
+ let value = root;
182
+ let list = false;
183
+ for (const step of node.steps) {
184
+ if ("field" in step)
185
+ value =
186
+ list && Array.isArray(value)
187
+ ? value.map((item) => field(item, step.field))
188
+ : field(value, step.field);
189
+ else if ("index" in step)
190
+ value = Array.isArray(value) ? value[step.index] : undefined;
191
+ else {
192
+ value = Array.isArray(value)
193
+ ? value.map((item) => field(item, step.project))
194
+ : undefined;
195
+ list = true;
196
+ }
197
+ }
198
+ if (node.count)
199
+ return truncate(Array.isArray(value) ? String(value.length) : "", node.cap);
200
+ if (node.each || list || node.join !== undefined) {
201
+ if (!Array.isArray(value)) return "";
202
+ const elements = value
203
+ .slice(0, 10)
204
+ .map((item) =>
205
+ truncate(node.each ? render(node.each, item) : scalar(item), 300),
206
+ );
207
+ if (value.length > 10) elements.push(`… +${value.length - 10} more`);
208
+ return truncate(elements.join(node.join ?? (node.each ? "; " : ", ")), node.cap);
209
+ }
210
+ return truncate(scalar(value), node.cap);
211
+ })
212
+ .join("");
213
+ }
214
+
215
+ export function renderToolTemplate(
216
+ source: string,
217
+ input: unknown,
218
+ output?: unknown,
219
+ ): string | null {
220
+ const nodes = compiled(source);
221
+ if (!nodes) return null;
222
+ const text =
223
+ typeof output === "string" ? output : output === undefined ? "" : compactJson(output);
224
+ let structured: unknown = output;
225
+ if (typeof output === "string") {
226
+ try {
227
+ const parsed = JSON.parse(output);
228
+ structured =
229
+ parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : undefined;
230
+ } catch {
231
+ structured = undefined;
232
+ }
233
+ }
234
+ // The bare output placeholder is the original result text, not reserialized JSON.
235
+ const root = { input, output: structured };
236
+ const bareOutputNodes = nodes.map((node) =>
237
+ typeof node !== "string" &&
238
+ node.steps.length === 1 &&
239
+ "field" in node.steps[0] &&
240
+ node.steps[0].field === "output" &&
241
+ !node.each &&
242
+ !node.count &&
243
+ node.join === undefined
244
+ ? truncate(text ?? "", node.cap)
245
+ : node,
246
+ );
247
+ return truncate(render(bareOutputNodes, root), 1000);
248
+ }
@@ -0,0 +1,36 @@
1
+ import { describe, expect, it } from "bun:test";
2
+
3
+ import { isTransientHistorianPromptError } from "./historian-transient-error";
4
+
5
+ describe("isTransientHistorianPromptError", () => {
6
+ it.each([
7
+ "429 rate limit from provider",
8
+ "rate_limit_error: slow down",
9
+ "503 Service Unavailable",
10
+ "502 Bad Gateway from upstream", // "bad gateway" is not "bad request"
11
+ "500 Internal Server Error",
12
+ "Overloaded",
13
+ "request timeout",
14
+ "read ECONNRESET",
15
+ "connect ETIMEDOUT",
16
+ "503 upstream author-profile service unavailable",
17
+ ])("retries %p", (message) => {
18
+ expect(isTransientHistorianPromptError(message)).toBe(true);
19
+ });
20
+
21
+ it.each([
22
+ "401 unauthorized",
23
+ "403 Forbidden",
24
+ "authentication_error: invalid x-api-key",
25
+ "OAuth token expired; 503",
26
+ "Authorization header missing (429)",
27
+ "400 Bad Request",
28
+ "status 400: malformed",
29
+ "invalid_request_error: prompt is too long: 250000 tokens > 200000 maximum",
30
+ "prompt is too long: 250000 tokens",
31
+ "request id 15003 failed",
32
+ "model not found",
33
+ ])("does not retry %p", (message) => {
34
+ expect(isTransientHistorianPromptError(message)).toBe(false);
35
+ });
36
+ });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Decide whether a failed historian prompt is worth retrying on the same model.
3
+ *
4
+ * Provider errors arrive as free text, so this is a keyword test, but every
5
+ * keyword must stand alone: "auth" must not match "author", and status 500
6
+ * must not match "250000" inside "prompt is too long: 250000 tokens". A
7
+ * misread here either retries a request that can never succeed (twice more,
8
+ * at full cost) or gives up on a provider blip.
9
+ *
10
+ * Shared by the OpenCode and Pi historian runners so both classify alike.
11
+ */
12
+ const NON_TRANSIENT_PATTERN =
13
+ /(?<![a-z])(?:invalid[ _]request|bad[ _]request|unauthori[sz]ed|forbidden|authentication|authenticate|authorization|o?auth)(?![a-z])|(?:^| )400(?!\d)/;
14
+
15
+ const TRANSIENT_PATTERN =
16
+ /(?<!\d)(?:429|500|502|503)(?!\d)|rate[ _]limit|timeout|econnreset|etimedout|overloaded/;
17
+
18
+ export function isTransientHistorianPromptError(message: string): boolean {
19
+ const normalized = message.toLowerCase();
20
+ if (NON_TRANSIENT_PATTERN.test(normalized)) return false;
21
+ return TRANSIENT_PATTERN.test(normalized);
22
+ }
@@ -256,7 +256,26 @@ export function setJsoncValue(text: string, path: JSONPath, value: unknown): str
256
256
  return text.slice(0, node.offset) + serialized + text.slice(node.offset + node.length);
257
257
  }
258
258
 
259
- return applyEdits(text, modify(text, path, value, {}));
259
+ return applyEdits(
260
+ text,
261
+ modify(text, path, value, { formattingOptions: documentFormatting(text) }),
262
+ );
263
+ }
264
+
265
+ /**
266
+ * The line ending and indentation a document already uses, so an inserted
267
+ * property is laid out like its siblings instead of being written compactly
268
+ * onto the previous line.
269
+ */
270
+ function documentFormatting(text: string): {
271
+ eol: string;
272
+ insertSpaces: boolean;
273
+ tabSize: number;
274
+ } {
275
+ const eol = text.includes("\r\n") ? "\r\n" : "\n";
276
+ const indent = /\n([ \t]+)\S/.exec(text)?.[1];
277
+ if (indent?.startsWith("\t")) return { eol, insertSpaces: false, tabSize: 1 };
278
+ return { eol, insertSpaces: true, tabSize: indent ? indent.length : 2 };
260
279
  }
261
280
 
262
281
  function removeObjectProperty(text: string, object: Node, key: string): string {
@@ -1,7 +1,8 @@
1
1
  import { afterEach, describe, expect, test } from "bun:test";
2
- import { mkdtempSync, rmSync } from "node:fs";
2
+ import { rmSync } from "node:fs";
3
3
  import * as os from "node:os";
4
4
  import * as path from "node:path";
5
+ import { createTestTempDirFromPath } from "./test-temp-dir";
5
6
 
6
7
  type LoggerScenarioResult = {
7
8
  exists: boolean;
@@ -186,7 +187,7 @@ async function runLoggerScenario<T>(
186
187
  | "bounded"
187
188
  | "oversized",
188
189
  ): Promise<T> {
189
- const root = mkdtempSync(path.join(os.tmpdir(), "magic-context-logger-test-"));
190
+ const root = createTestTempDirFromPath(path.join(os.tmpdir(), "magic-context-logger-test-"));
190
191
  scenarioRoots.push(root);
191
192
  const child = Bun.spawn({
192
193
  windowsHide: true,
@@ -2,6 +2,7 @@ import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
3
  import { getMagicContextLogPath } from "./data-path";
4
4
  import { sanitizeConfigValue, sanitizeDiagnosticText } from "./redaction";
5
+ import { stalePluginBuildDiagnostic } from "./stale-plugin-build";
5
6
 
6
7
  const isTestEnv = process.env.NODE_ENV === "test";
7
8
 
@@ -189,9 +190,43 @@ function scheduleFlush(): void {
189
190
  }, FLUSH_INTERVAL_MS);
190
191
  }
191
192
 
192
- export function log(message: string, data?: unknown): void {
193
+ // Set inside a worker thread so its lines reach the main thread's log file. The
194
+ // log path depends on which host (OpenCode or Pi) the main thread registered,
195
+ // and only the main thread's buffer and flush timer write that file.
196
+ let lineForwarder: ((line: string) => void) | null = null;
197
+
198
+ /**
199
+ * Hand every formatted log line to `forward` instead of this thread's buffer.
200
+ * Pass null to log locally again.
201
+ */
202
+ export function setLogLineForwarder(forward: ((line: string) => void) | null): void {
203
+ lineForwarder = forward;
204
+ }
205
+
206
+ /** Append a line formatted by `log` on another thread, keeping its timestamp. */
207
+ export function writeForwardedLogLine(line: string): void {
193
208
  if (isTestEnv) return;
194
209
  try {
210
+ buffer.push(line);
211
+ bufferedBytes += Buffer.byteLength(line);
212
+ boundBuffer();
213
+ if (buffer.length >= BUFFER_SIZE_LIMIT) flush();
214
+ else scheduleFlush();
215
+ } catch {
216
+ // Intentional: logging must never throw
217
+ }
218
+ }
219
+
220
+ export function log(message: string, data?: unknown): void {
221
+ try {
222
+ let diagnostic = stalePluginBuildDiagnostic(data);
223
+ if (diagnostic === undefined) diagnostic = stalePluginBuildDiagnostic(message);
224
+ if (diagnostic === null) return;
225
+ if (diagnostic !== undefined) {
226
+ message = diagnostic;
227
+ data = undefined;
228
+ }
229
+ if (isTestEnv) return;
195
230
  const timestamp = new Date().toISOString();
196
231
  const serialized =
197
232
  data === undefined
@@ -202,6 +237,10 @@ export function log(message: string, data?: unknown): void {
202
237
  )}`
203
238
  : ` ${JSON.stringify(sanitizeConfigValue(data))}`;
204
239
  const line = `[${timestamp}] ${sanitizeDiagnosticText(message)}${serialized}\n`;
240
+ if (lineForwarder) {
241
+ lineForwarder(line);
242
+ return;
243
+ }
205
244
  buffer.push(line);
206
245
  bufferedBytes += Buffer.byteLength(line);
207
246
  boundBuffer();
@@ -650,3 +650,49 @@ describe("host fetch TimeoutError is a timeout", () => {
650
650
  expect(abort).not.toHaveBeenCalled();
651
651
  });
652
652
  });
653
+
654
+ test("empty v1 and v2 replies report the provider finish reason", async () => {
655
+ for (const output of [
656
+ [{ info: { role: "assistant", finish: "stop" }, parts: [] }],
657
+ { text: null, tokenLog: { finish_reason: "stop" } },
658
+ ]) {
659
+ const client = createClient(mock(async () => ({})));
660
+ await expect(
661
+ promptSyncWithValidatedOutputRetry(client, createArgs(), {
662
+ fetchOutput: async () => output,
663
+ validateOutput: () => {
664
+ throw new Error("map-memories returned no output");
665
+ },
666
+ }),
667
+ ).rejects.toThrow("no output (finish=stop");
668
+ }
669
+ });
670
+
671
+ test("DeepSeek unsupported-model 400 preserves provider status and message rather than no output", async () => {
672
+ const message =
673
+ "The supported API model names are deepseek-flash, deepseek-v4-pro, but you passed deepseek-v4-flash";
674
+ const client = createClient(mock(async () => ({})));
675
+ let caught: unknown;
676
+ try {
677
+ await promptSyncWithValidatedOutputRetry(client, createArgs(), {
678
+ fetchOutput: async () => [
679
+ {
680
+ info: {
681
+ role: "assistant",
682
+ error: { name: "APIError", data: { statusCode: 400, message } },
683
+ },
684
+ parts: [],
685
+ },
686
+ ],
687
+ validateOutput: () => {
688
+ throw new Error("map-memories returned no output");
689
+ },
690
+ });
691
+ } catch (error) {
692
+ caught = error;
693
+ }
694
+ expect((caught as Error).message).toContain(message);
695
+ expect((caught as Error).message).toContain("status=400");
696
+ expect((caught as Error).message).not.toContain("no output");
697
+ expect(getPromptFailureDetail(caught)).toMatchObject({ failureClass: "provider_error" });
698
+ });
@@ -1,8 +1,11 @@
1
1
  import type { createOpencodeClient } from "@opencode-ai/sdk";
2
2
  import { DreamTokenBudgetExceeded } from "../features/magic-context/dreamer/token-budget";
3
3
  import { detectOverflow } from "../features/magic-context/overflow-detection";
4
+ import { HiddenCompletionRefusal } from "../hooks/magic-context/compartment-runner-types";
4
5
  import { HiddenAgentStepLimit } from "../v2/hooks/hidden-child";
5
6
  import {
7
+ describeAssistantError,
8
+ describeAssistantSettlement,
6
9
  extractLatestAssistantFailure,
7
10
  extractLatestAssistantText,
8
11
  } from "./assistant-message-extractor";
@@ -114,6 +117,7 @@ export interface ValidatedPromptRetryResult<TOutput, TValidated> {
114
117
  export type PromptFailureClass =
115
118
  | "provider_timeout"
116
119
  | "provider_error"
120
+ | "local_refusal"
117
121
  | "step_limit"
118
122
  | "token_budget"
119
123
  | "empty_completion"
@@ -130,6 +134,7 @@ export interface PromptFailureDetail {
130
134
  providerError: string | null;
131
135
  timeoutMs: number | null;
132
136
  childSessionId: string | null;
137
+ refusalReason?: string | null;
133
138
  }
134
139
 
135
140
  const promptFailureDetails = new WeakMap<object, PromptFailureDetail>();
@@ -354,6 +359,7 @@ async function abortChildRun(client: Client, sessionId: string): Promise<void> {
354
359
  function isNonRetryable(error: unknown, externalSignal?: AbortSignal): boolean {
355
360
  if (
356
361
  externalSignal?.aborted ||
362
+ (error instanceof HiddenCompletionRefusal && error.terminal) ||
357
363
  error instanceof HiddenAgentStepLimit ||
358
364
  error instanceof DreamTokenBudgetExceeded
359
365
  )
@@ -398,6 +404,7 @@ function classifyPromptFailure(
398
404
  externalSignal?: AbortSignal,
399
405
  ): PromptFailureClass {
400
406
  const message = extractMessage(error);
407
+ if (error instanceof HiddenCompletionRefusal) return "local_refusal";
401
408
  if (error instanceof HiddenAgentStepLimit) return "step_limit";
402
409
  if (error instanceof DreamTokenBudgetExceeded) return "token_budget";
403
410
  if (externalSignal?.aborted || message === "prompt aborted by external signal") {
@@ -440,6 +447,11 @@ function throwWithPromptFailure(
440
447
  providerError,
441
448
  timeoutMs: failureClass === "provider_timeout" ? timeoutMs : null,
442
449
  childSessionId: transport ? (transport.childSessionId ?? null) : args.path.id || null,
450
+ ...(last?.error instanceof HiddenCompletionRefusal
451
+ ? {
452
+ refusalReason: sanitizeDiagnosticText(last.error.message).slice(0, 500),
453
+ }
454
+ : {}),
443
455
  });
444
456
  throw error;
445
457
  }
@@ -659,7 +671,7 @@ async function attemptAndValidate<TOutput, TValidated>(
659
671
  const assistantFailure = extractLatestAssistantFailure(output);
660
672
  if (assistantFailure) {
661
673
  const error = new Error(
662
- `Host recorded assistant error: ${String(assistantFailure.error)}`,
674
+ `Host recorded assistant error: ${describeAssistantError(assistantFailure.error)}`,
663
675
  );
664
676
  Object.assign(error, {
665
677
  name: "DreamerProviderOutputFailureError",
@@ -671,6 +683,9 @@ async function attemptAndValidate<TOutput, TValidated>(
671
683
  const validated = await options.validateOutput(output, attempt);
672
684
  return { output, validated, attempt };
673
685
  } catch (error) {
686
+ if (error instanceof Error && /no (?:assistant )?output/i.test(error.message)) {
687
+ error.message += ` (${describeAssistantSettlement(output)})`;
688
+ }
674
689
  throw {
675
690
  error,
676
691
  failureClass: classifyPromptFailure(error, "validation", signal),