@cortexkit/opencode-magic-context 0.42.6 → 0.43.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/README.md +4 -5
  2. package/dist/agents/dreamer.d.ts +7 -9
  3. package/dist/agents/dreamer.d.ts.map +1 -1
  4. package/dist/agents/hidden-agent-registrations.d.ts.map +1 -1
  5. package/dist/agents/magic-context-prompt.d.ts.map +1 -1
  6. package/dist/{announcement-8mgn61fw.js → announcement-1a8bvswd.js} +2 -1
  7. package/dist/config/index.d.ts +1 -1
  8. package/dist/config/index.d.ts.map +1 -1
  9. package/dist/config/live-run-config.d.ts +12 -0
  10. package/dist/config/live-run-config.d.ts.map +1 -0
  11. package/dist/config/live-snapshot.d.ts +32 -0
  12. package/dist/config/live-snapshot.d.ts.map +1 -0
  13. package/dist/config/schema/magic-context.d.ts +12 -2
  14. package/dist/config/schema/magic-context.d.ts.map +1 -1
  15. package/dist/{conflict-warning-hook-aktepwpz.js → conflict-warning-hook-956fkedc.js} +6 -4
  16. package/dist/{derive-budgets-v1fkhjjr.js → derive-budgets-b8ybssh9.js} +7 -3
  17. package/dist/features/builtin-commands/commands.d.ts +0 -4
  18. package/dist/features/builtin-commands/commands.d.ts.map +1 -1
  19. package/dist/features/magic-context/compaction-marker.d.ts +6 -0
  20. package/dist/features/magic-context/compaction-marker.d.ts.map +1 -1
  21. package/dist/features/magic-context/compartment-chunk-embedding.d.ts +4 -1
  22. package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
  23. package/dist/features/magic-context/compartment-lease.d.ts +8 -0
  24. package/dist/features/magic-context/compartment-lease.d.ts.map +1 -1
  25. package/dist/features/magic-context/compartment-storage.d.ts +21 -0
  26. package/dist/features/magic-context/compartment-storage.d.ts.map +1 -1
  27. package/dist/features/magic-context/context-authority.d.ts +9 -2
  28. package/dist/features/magic-context/context-authority.d.ts.map +1 -1
  29. package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
  30. package/dist/features/magic-context/dreamer/docs-proposals.d.ts +23 -0
  31. package/dist/features/magic-context/dreamer/docs-proposals.d.ts.map +1 -0
  32. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts +5 -1
  33. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
  34. package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts +51 -0
  35. package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts.map +1 -0
  36. package/dist/features/magic-context/dreamer/manual-summary.d.ts +7 -0
  37. package/dist/features/magic-context/dreamer/manual-summary.d.ts.map +1 -0
  38. package/dist/features/magic-context/dreamer/map-memories.d.ts +3 -1
  39. package/dist/features/magic-context/dreamer/map-memories.d.ts.map +1 -1
  40. package/dist/features/magic-context/dreamer/promote-primers.d.ts +8 -1
  41. package/dist/features/magic-context/dreamer/promote-primers.d.ts.map +1 -1
  42. package/dist/features/magic-context/dreamer/refresh-primers.d.ts +3 -1
  43. package/dist/features/magic-context/dreamer/refresh-primers.d.ts.map +1 -1
  44. package/dist/features/magic-context/dreamer/retrospective-orphan-sweep.d.ts +5 -2
  45. package/dist/features/magic-context/dreamer/retrospective-orphan-sweep.d.ts.map +1 -1
  46. package/dist/features/magic-context/dreamer/retrospective-raw-provider.d.ts +22 -13
  47. package/dist/features/magic-context/dreamer/retrospective-raw-provider.d.ts.map +1 -1
  48. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts +9 -0
  49. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts.map +1 -1
  50. package/dist/features/magic-context/dreamer/task-config.d.ts.map +1 -1
  51. package/dist/features/magic-context/dreamer/task-executor.d.ts +3 -0
  52. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  53. package/dist/features/magic-context/dreamer/task-prompts.d.ts +7 -4
  54. package/dist/features/magic-context/dreamer/task-prompts.d.ts.map +1 -1
  55. package/dist/features/magic-context/dreamer/task-registry.d.ts +53 -2
  56. package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
  57. package/dist/features/magic-context/dreamer/task-scheduler.d.ts +3 -0
  58. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  59. package/dist/features/magic-context/dreamer/tick-failure.d.ts +38 -0
  60. package/dist/features/magic-context/dreamer/tick-failure.d.ts.map +1 -0
  61. package/dist/features/magic-context/dreamer/verify.d.ts +4 -1
  62. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  63. package/dist/features/magic-context/git-commits/search-git-commits.d.ts +2 -0
  64. package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
  65. package/dist/features/magic-context/memory/embedding-identity.d.ts +1 -0
  66. package/dist/features/magic-context/memory/embedding-identity.d.ts.map +1 -1
  67. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  68. package/dist/features/magic-context/memory/memory-diagnostics.d.ts +6 -0
  69. package/dist/features/magic-context/memory/memory-diagnostics.d.ts.map +1 -0
  70. package/dist/features/magic-context/memory/memory-selection.d.ts +12 -0
  71. package/dist/features/magic-context/memory/memory-selection.d.ts.map +1 -0
  72. package/dist/features/magic-context/memory/memory-visibility.d.ts +46 -0
  73. package/dist/features/magic-context/memory/memory-visibility.d.ts.map +1 -0
  74. package/dist/features/magic-context/memory/mirror-reembed.d.ts +22 -0
  75. package/dist/features/magic-context/memory/mirror-reembed.d.ts.map +1 -0
  76. package/dist/features/magic-context/memory/project-identity.d.ts +9 -0
  77. package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -1
  78. package/dist/features/magic-context/memory/storage-memory-fts.d.ts +6 -2
  79. package/dist/features/magic-context/memory/storage-memory-fts.d.ts.map +1 -1
  80. package/dist/features/magic-context/memory/storage-memory.d.ts.map +1 -1
  81. package/dist/features/magic-context/memory/transformers-remote-host.d.ts +6 -0
  82. package/dist/features/magic-context/memory/transformers-remote-host.d.ts.map +1 -0
  83. package/dist/features/magic-context/memory/transformers-web-entry.d.ts.map +1 -1
  84. package/dist/features/magic-context/memory/verification-paths.d.ts.map +1 -1
  85. package/dist/features/magic-context/message-fts-rowid-map.d.ts +3 -1
  86. package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -1
  87. package/dist/features/magic-context/message-index-async.d.ts +8 -3
  88. package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
  89. package/dist/features/magic-context/message-index.d.ts +7 -1
  90. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  91. package/dist/features/magic-context/message-time-backfill.d.ts +19 -0
  92. package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -0
  93. package/dist/features/magic-context/migrations.d.ts +10 -6
  94. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  95. package/dist/features/magic-context/mural/compress-cues.d.ts.map +1 -1
  96. package/dist/features/magic-context/mural/storage-mural.d.ts +5 -0
  97. package/dist/features/magic-context/mural/storage-mural.d.ts.map +1 -1
  98. package/dist/features/magic-context/opencode2-relabel.d.ts +132 -0
  99. package/dist/features/magic-context/opencode2-relabel.d.ts.map +1 -0
  100. package/dist/features/magic-context/overflow-detection.d.ts +3 -0
  101. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
  102. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  103. package/dist/features/magic-context/protection-window.d.ts +1 -1
  104. package/dist/features/magic-context/protection-window.d.ts.map +1 -1
  105. package/dist/features/magic-context/search.d.ts +6 -0
  106. package/dist/features/magic-context/search.d.ts.map +1 -1
  107. package/dist/features/magic-context/session-decision-calibration.d.ts +31 -0
  108. package/dist/features/magic-context/session-decision-calibration.d.ts.map +1 -0
  109. package/dist/features/magic-context/shadow-backfill-state.d.ts +1 -1
  110. package/dist/features/magic-context/shadow-backfill-state.d.ts.map +1 -1
  111. package/dist/features/magic-context/smart-notes/compiler.d.ts +5 -1
  112. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  113. package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
  114. package/dist/features/magic-context/storage-db.d.ts +1 -1
  115. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  116. package/dist/features/magic-context/storage-historian-runs.d.ts +4 -2
  117. package/dist/features/magic-context/storage-historian-runs.d.ts.map +1 -1
  118. package/dist/features/magic-context/storage-meta-persisted.d.ts +16 -2
  119. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  120. package/dist/features/magic-context/storage-meta-shared.d.ts +1 -1
  121. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  122. package/dist/features/magic-context/storage-meta.d.ts +1 -1
  123. package/dist/features/magic-context/storage-meta.d.ts.map +1 -1
  124. package/dist/features/magic-context/storage-notes.d.ts +1 -0
  125. package/dist/features/magic-context/storage-notes.d.ts.map +1 -1
  126. package/dist/features/magic-context/storage-replay-document.d.ts +2 -0
  127. package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
  128. package/dist/features/magic-context/storage-subagent-invocations.d.ts +1 -1
  129. package/dist/features/magic-context/storage-subagent-invocations.d.ts.map +1 -1
  130. package/dist/features/magic-context/storage-tags.d.ts +42 -4
  131. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  132. package/dist/features/magic-context/storage.d.ts +2 -2
  133. package/dist/features/magic-context/storage.d.ts.map +1 -1
  134. package/dist/features/magic-context/store-generation-rebase.d.ts +95 -0
  135. package/dist/features/magic-context/store-generation-rebase.d.ts.map +1 -0
  136. package/dist/features/magic-context/subagent-token-capture.d.ts +1 -0
  137. package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -1
  138. package/dist/features/magic-context/tagger.d.ts +2 -0
  139. package/dist/features/magic-context/tagger.d.ts.map +1 -1
  140. package/dist/features/magic-context/tool-definition-tokens.d.ts +1 -0
  141. package/dist/features/magic-context/tool-definition-tokens.d.ts.map +1 -1
  142. package/dist/features/magic-context/tool-owner-backfill.d.ts.map +1 -1
  143. package/dist/features/magic-context/user-memory/review-user-memories.d.ts +5 -1
  144. package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
  145. package/dist/hooks/auto-update-checker/checker.d.ts +1 -0
  146. package/dist/hooks/auto-update-checker/checker.d.ts.map +1 -1
  147. package/dist/hooks/magic-context/apply-operations.d.ts +10 -1
  148. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  149. package/dist/hooks/magic-context/cache-busting-signals.d.ts +19 -3
  150. package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -1
  151. package/dist/hooks/magic-context/command-handler.d.ts +5 -4
  152. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  153. package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
  154. package/dist/hooks/magic-context/compaction-off-transition.d.ts +1 -0
  155. package/dist/hooks/magic-context/compaction-off-transition.d.ts.map +1 -1
  156. package/dist/hooks/magic-context/compartment-prompt.d.ts +1 -1
  157. package/dist/hooks/magic-context/compartment-prompt.d.ts.map +1 -1
  158. package/dist/hooks/magic-context/compartment-render-epoch.d.ts +3 -1
  159. package/dist/hooks/magic-context/compartment-render-epoch.d.ts.map +1 -1
  160. package/dist/hooks/magic-context/compartment-runner-drop-queue.d.ts +1 -1
  161. package/dist/hooks/magic-context/compartment-runner-drop-queue.d.ts.map +1 -1
  162. package/dist/hooks/magic-context/compartment-runner-historian.d.ts +1 -0
  163. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  164. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +8 -1
  165. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  166. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  167. package/dist/hooks/magic-context/compartment-runner-types.d.ts +19 -11
  168. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  169. package/dist/hooks/magic-context/compartment-runner-validation.d.ts +4 -1
  170. package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -1
  171. package/dist/hooks/magic-context/compartment-runner.d.ts.map +1 -1
  172. package/dist/hooks/magic-context/compartment-trigger.d.ts +2 -1
  173. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  174. package/dist/hooks/magic-context/decay-render.d.ts +1 -0
  175. package/dist/hooks/magic-context/decay-render.d.ts.map +1 -1
  176. package/dist/hooks/magic-context/decision-calibration.d.ts +24 -0
  177. package/dist/hooks/magic-context/decision-calibration.d.ts.map +1 -0
  178. package/dist/hooks/magic-context/derive-budgets.d.ts +2 -0
  179. package/dist/hooks/magic-context/derive-budgets.d.ts.map +1 -1
  180. package/dist/hooks/magic-context/dropped-input-guard.d.ts +50 -4
  181. package/dist/hooks/magic-context/dropped-input-guard.d.ts.map +1 -1
  182. package/dist/hooks/magic-context/embed-history-runner.d.ts +30 -0
  183. package/dist/hooks/magic-context/embed-history-runner.d.ts.map +1 -0
  184. package/dist/hooks/magic-context/emergency-drop.d.ts +13 -8
  185. package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
  186. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  187. package/dist/hooks/magic-context/event-payloads.d.ts +2 -1
  188. package/dist/hooks/magic-context/event-payloads.d.ts.map +1 -1
  189. package/dist/hooks/magic-context/execute-status.d.ts +2 -1
  190. package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
  191. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +12 -4
  192. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  193. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
  194. package/dist/hooks/magic-context/historian-no-fire-cause.d.ts +5 -0
  195. package/dist/hooks/magic-context/historian-no-fire-cause.d.ts.map +1 -0
  196. package/dist/hooks/magic-context/historian-publish-stage-logger.d.ts +3 -0
  197. package/dist/hooks/magic-context/historian-publish-stage-logger.d.ts.map +1 -0
  198. package/dist/hooks/magic-context/hook-handlers.d.ts +0 -3
  199. package/dist/hooks/magic-context/hook-handlers.d.ts.map +1 -1
  200. package/dist/hooks/magic-context/hook.d.ts +4 -4
  201. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  202. package/dist/hooks/magic-context/host-served-rows.d.ts +58 -0
  203. package/dist/hooks/magic-context/host-served-rows.d.ts.map +1 -0
  204. package/dist/hooks/magic-context/inject-compartments.d.ts +38 -0
  205. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  206. package/dist/hooks/magic-context/legacy-compartments.d.ts +20 -0
  207. package/dist/hooks/magic-context/legacy-compartments.d.ts.map +1 -0
  208. package/dist/hooks/magic-context/live-session-state.d.ts +7 -7
  209. package/dist/hooks/magic-context/lkg-slot.d.ts +1 -0
  210. package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
  211. package/dist/hooks/magic-context/m0-token-breakdown.d.ts +6 -0
  212. package/dist/hooks/magic-context/m0-token-breakdown.d.ts.map +1 -1
  213. package/dist/hooks/magic-context/maintenance-authority.d.ts +0 -1
  214. package/dist/hooks/magic-context/maintenance-authority.d.ts.map +1 -1
  215. package/dist/hooks/magic-context/module-state-sync.d.ts +1 -1
  216. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  217. package/dist/hooks/magic-context/module-transport.d.ts +1 -1
  218. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  219. package/dist/hooks/magic-context/module-wire.d.ts +42 -0
  220. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  221. package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
  222. package/dist/hooks/magic-context/postprocess-read-cache.d.ts +8 -0
  223. package/dist/hooks/magic-context/postprocess-read-cache.d.ts.map +1 -0
  224. package/dist/hooks/magic-context/producer-window-guard.d.ts +16 -0
  225. package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -1
  226. package/dist/hooks/magic-context/producer-window-test-support.d.ts +14 -0
  227. package/dist/hooks/magic-context/producer-window-test-support.d.ts.map +1 -0
  228. package/dist/hooks/magic-context/protected-tail-boundary.d.ts +2 -0
  229. package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -1
  230. package/dist/hooks/magic-context/read-session-chunk.d.ts +45 -10
  231. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  232. package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -1
  233. package/dist/hooks/magic-context/read-session-raw.d.ts +4 -0
  234. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
  235. package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts +6 -0
  236. package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts.map +1 -1
  237. package/dist/hooks/magic-context/recomp-orchestrator.d.ts +17 -39
  238. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
  239. package/dist/hooks/magic-context/rust-mode-transform.d.ts +26 -3
  240. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  241. package/dist/hooks/magic-context/send-session-notification.d.ts +1 -0
  242. package/dist/hooks/magic-context/send-session-notification.d.ts.map +1 -1
  243. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
  244. package/dist/hooks/magic-context/system-prompt-hash.d.ts +6 -7
  245. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  246. package/dist/hooks/magic-context/tag-messages.d.ts +21 -1
  247. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  248. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts +63 -0
  249. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  250. package/dist/hooks/magic-context/tokenizer-calibration.d.ts +19 -12
  251. package/dist/hooks/magic-context/tokenizer-calibration.d.ts.map +1 -1
  252. package/dist/hooks/magic-context/tool-drop-target.d.ts +52 -1
  253. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  254. package/dist/hooks/magic-context/tool-sweep-policy.d.ts +50 -0
  255. package/dist/hooks/magic-context/tool-sweep-policy.d.ts.map +1 -0
  256. package/dist/hooks/magic-context/transform-compartment-phase.d.ts +20 -1
  257. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  258. package/dist/hooks/magic-context/transform-context-state.d.ts +9 -0
  259. package/dist/hooks/magic-context/transform-context-state.d.ts.map +1 -1
  260. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +5 -3
  261. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  262. package/dist/hooks/magic-context/transform.d.ts +37 -4
  263. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  264. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  265. package/dist/{index-f9gem5cr.js → index-0ccmyzbj.js} +90 -10
  266. package/dist/index-1gtwrdc4.js +393 -0
  267. package/dist/{index-ntbmt6rq.js → index-4b30nf6z.js} +1 -1
  268. package/dist/index-6w9p73jz.js +170 -0
  269. package/dist/{index-4ftb5hcq.js → index-6z9g64js.js} +7 -1
  270. package/dist/{index-djp6rwz6.js → index-7wpwr2e2.js} +28002 -30125
  271. package/dist/index-9r1cbh9e.js +16 -0
  272. package/dist/{safe-notification-target-fepvcbsj.js → index-febg06dy.js} +6 -7
  273. package/dist/index-j7cnyvq1.js +5409 -0
  274. package/dist/{index-s61hh7gv.js → index-kpmmr8s0.js} +95 -73
  275. package/dist/{index-a9ssj59b.js → index-v8qr6tt2.js} +56 -16
  276. package/dist/{index-qp20p2py.js → index-wgzyeyf5.js} +1 -1
  277. package/dist/index-y5145x8k.js +619 -0
  278. package/dist/{index-ngjmj6xx.js → index-yc81txp4.js} +38 -4
  279. package/dist/index.d.ts.map +1 -1
  280. package/dist/index.js +6274 -3180
  281. package/dist/message-time-backfill-0ccvyk9n.js +109 -0
  282. package/dist/plugin/dream-timer.d.ts +13 -0
  283. package/dist/plugin/dream-timer.d.ts.map +1 -1
  284. package/dist/plugin/hooks/create-session-hooks.d.ts +5 -2
  285. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  286. package/dist/plugin/memory-id-translation.d.ts +86 -0
  287. package/dist/plugin/memory-id-translation.d.ts.map +1 -1
  288. package/dist/plugin/messages-transform.d.ts.map +1 -1
  289. package/dist/plugin/rpc-handlers.d.ts +10 -0
  290. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  291. package/dist/plugin/rust-note-backend.d.ts +84 -0
  292. package/dist/plugin/rust-note-backend.d.ts.map +1 -0
  293. package/dist/plugin/tool-registry.d.ts +1 -0
  294. package/dist/plugin/tool-registry.d.ts.map +1 -1
  295. package/dist/read-session-chunk-z7fv0qjv.js +62 -0
  296. package/dist/recomp-orchestrator-r00aa5t3.js +21 -0
  297. package/dist/safe-notification-target-vrkjrbgb.js +10 -0
  298. package/dist/{send-session-notification-jbxknvar.js → send-session-notification-3warjyjp.js} +7 -3
  299. package/dist/shared/assistant-message-extractor.d.ts +6 -0
  300. package/dist/shared/assistant-message-extractor.d.ts.map +1 -1
  301. package/dist/shared/conflict-detector.d.ts +9 -4
  302. package/dist/shared/conflict-detector.d.ts.map +1 -1
  303. package/dist/shared/data-path.d.ts.map +1 -1
  304. package/dist/shared/hidden-variant-warnings.d.ts +5 -0
  305. package/dist/shared/hidden-variant-warnings.d.ts.map +1 -0
  306. package/dist/shared/host-limitations.d.ts +14 -0
  307. package/dist/shared/host-limitations.d.ts.map +1 -0
  308. package/dist/shared/keep-subagents.d.ts +1 -1
  309. package/dist/shared/keep-subagents.d.ts.map +1 -1
  310. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  311. package/dist/shared/models-dev-cache.d.ts +1 -0
  312. package/dist/shared/models-dev-cache.d.ts.map +1 -1
  313. package/dist/shared/opencode-config-dir.d.ts +52 -0
  314. package/dist/shared/opencode-config-dir.d.ts.map +1 -1
  315. package/dist/shared/opencode-db-path.d.ts +15 -0
  316. package/dist/shared/opencode-db-path.d.ts.map +1 -1
  317. package/dist/shared/prompt-surface-runtime.d.ts +5 -5
  318. package/dist/shared/rpc-server.d.ts +10 -0
  319. package/dist/shared/rpc-server.d.ts.map +1 -1
  320. package/dist/shared/rpc-types.d.ts +64 -5
  321. package/dist/shared/rpc-types.d.ts.map +1 -1
  322. package/dist/shared/status-detail-text.d.ts +1 -3
  323. package/dist/shared/status-detail-text.d.ts.map +1 -1
  324. package/dist/shared/status-summary.d.ts +7 -0
  325. package/dist/shared/status-summary.d.ts.map +1 -1
  326. package/dist/shared/status-view.d.ts +229 -0
  327. package/dist/shared/status-view.d.ts.map +1 -0
  328. package/dist/shared/tag-transcript.d.ts.map +1 -1
  329. package/dist/shared/tail-hygiene-status.d.ts +8 -0
  330. package/dist/shared/tail-hygiene-status.d.ts.map +1 -1
  331. package/dist/shared/test-temp-dir.d.ts +1 -1
  332. package/dist/shared/test-temp-dir.d.ts.map +1 -1
  333. package/dist/shared/user-facing-codes.d.ts +32 -7
  334. package/dist/shared/user-facing-codes.d.ts.map +1 -1
  335. package/dist/shared/window-geometry.d.ts +3 -0
  336. package/dist/shared/window-geometry.d.ts.map +1 -1
  337. package/dist/{task-config-cv8k9y8r.js → task-config-mgf5nsh3.js} +1 -1
  338. package/dist/tools/ctx-expand/constants.d.ts +1 -1
  339. package/dist/tools/ctx-expand/constants.d.ts.map +1 -1
  340. package/dist/tools/ctx-expand/render.d.ts.map +1 -1
  341. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  342. package/dist/tools/ctx-memory/constants.d.ts +3 -1
  343. package/dist/tools/ctx-memory/constants.d.ts.map +1 -1
  344. package/dist/tools/ctx-memory/tools.d.ts +1 -0
  345. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  346. package/dist/tools/ctx-memory/types.d.ts +2 -2
  347. package/dist/tools/ctx-note/constants.d.ts +1 -1
  348. package/dist/tools/ctx-note/constants.d.ts.map +1 -1
  349. package/dist/tools/ctx-note/render.d.ts +88 -0
  350. package/dist/tools/ctx-note/render.d.ts.map +1 -0
  351. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  352. package/dist/tools/ctx-reduce/constants.d.ts +1 -1
  353. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
  354. package/dist/tools/ctx-search/constants.d.ts +1 -1
  355. package/dist/tools/ctx-search/constants.d.ts.map +1 -1
  356. package/dist/tools/ctx-search/date-range.d.ts +9 -0
  357. package/dist/tools/ctx-search/date-range.d.ts.map +1 -0
  358. package/dist/tools/ctx-search/tools.d.ts.map +1 -1
  359. package/dist/tools/ctx-search/types.d.ts +2 -0
  360. package/dist/tools/ctx-search/types.d.ts.map +1 -1
  361. package/dist/tools/light-descriptions.d.ts +5 -5
  362. package/dist/tools/light-descriptions.d.ts.map +1 -1
  363. package/dist/tools/parameter-descriptions.d.ts +75 -0
  364. package/dist/tools/parameter-descriptions.d.ts.map +1 -0
  365. package/dist/transformers-node-wasm.js +1918 -826
  366. package/dist/transformers-web.js +1736 -636
  367. package/dist/{transformers.node-dpmf3wpx.js → transformers.node-3zqr6k1w.js} +4087 -2898
  368. package/dist/tui/data/context-db.d.ts +19 -7
  369. package/dist/tui/data/context-db.d.ts.map +1 -1
  370. package/dist/tui-compiled/data/context-db.d.ts +19 -7
  371. package/dist/tui-compiled/data/context-db.d.ts.map +1 -1
  372. package/dist/v2/fold/host-media.d.ts +36 -0
  373. package/dist/v2/fold/host-media.d.ts.map +1 -0
  374. package/dist/v2/fold/restore.d.ts +21 -1
  375. package/dist/v2/fold/restore.d.ts.map +1 -1
  376. package/dist/v2/hidden-completion.d.ts +45 -1
  377. package/dist/v2/hidden-completion.d.ts.map +1 -1
  378. package/dist/v2/hooks/commands.d.ts +29 -0
  379. package/dist/v2/hooks/commands.d.ts.map +1 -0
  380. package/dist/v2/hooks/context.d.ts +46 -2
  381. package/dist/v2/hooks/context.d.ts.map +1 -1
  382. package/dist/v2/hooks/deleted-session-tombstones.d.ts +10 -0
  383. package/dist/v2/hooks/deleted-session-tombstones.d.ts.map +1 -0
  384. package/dist/v2/hooks/dream-manual.d.ts +43 -0
  385. package/dist/v2/hooks/dream-manual.d.ts.map +1 -0
  386. package/dist/v2/hooks/dream-trigger.d.ts +7 -0
  387. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  388. package/dist/v2/hooks/hidden-child.d.ts +7 -0
  389. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  390. package/dist/v2/hooks/model-limit-cache.d.ts +19 -0
  391. package/dist/v2/hooks/model-limit-cache.d.ts.map +1 -0
  392. package/dist/v2/hooks/payload.d.ts.map +1 -1
  393. package/dist/v2/hooks/provider-admission.d.ts +22 -0
  394. package/dist/v2/hooks/provider-admission.d.ts.map +1 -0
  395. package/dist/v2/hooks/rpc-live-state.d.ts +9 -0
  396. package/dist/v2/hooks/rpc-live-state.d.ts.map +1 -0
  397. package/dist/v2/hooks/store.d.ts +38 -2
  398. package/dist/v2/hooks/store.d.ts.map +1 -1
  399. package/dist/v2/hooks/tools.d.ts +8 -0
  400. package/dist/v2/hooks/tools.d.ts.map +1 -0
  401. package/dist/v2/hooks/types.d.ts +59 -0
  402. package/dist/v2/hooks/types.d.ts.map +1 -1
  403. package/dist/v2/hooks/usage-reading.d.ts +42 -0
  404. package/dist/v2/hooks/usage-reading.d.ts.map +1 -0
  405. package/dist/v2/host-service.d.ts +65 -0
  406. package/dist/v2/host-service.d.ts.map +1 -0
  407. package/dist/v2/server.js +142236 -112052
  408. package/dist/v2/store-reader.d.ts +67 -1
  409. package/dist/v2/store-reader.d.ts.map +1 -1
  410. package/dist/v2/tui/events.d.ts +7 -0
  411. package/dist/v2/tui/events.d.ts.map +1 -0
  412. package/dist/v2/tui/index.d.ts +23 -0
  413. package/dist/v2/tui/index.d.ts.map +1 -1
  414. package/dist/v2/tui/sidebar-mount.d.ts +40 -0
  415. package/dist/v2/tui/sidebar-mount.d.ts.map +1 -0
  416. package/dist/v2/tui/status-dialog-mount.d.ts +29 -0
  417. package/dist/v2/tui/status-dialog-mount.d.ts.map +1 -0
  418. package/dist/v2/tui/types.d.ts +74 -6
  419. package/dist/v2/tui/types.d.ts.map +1 -1
  420. package/dist/wrapup-orchestrator-y0bs7t5a.js +18 -0
  421. package/package.json +9 -7
  422. package/src/agents/dreamer.ts +7 -16
  423. package/src/agents/hidden-agent-registrations.ts +10 -22
  424. package/src/agents/magic-context-prompt.test.ts +29 -39
  425. package/src/agents/magic-context-prompt.ts +99 -122
  426. package/src/agents/permissions.test.ts +17 -21
  427. package/src/config/index.ts +8 -3
  428. package/src/config/live-run-config.test.ts +237 -0
  429. package/src/config/live-run-config.ts +80 -0
  430. package/src/config/live-schema-drift.test.ts +67 -0
  431. package/src/config/live-snapshot.test.ts +85 -0
  432. package/src/config/live-snapshot.ts +191 -0
  433. package/src/config/raw-loader.test.ts +1 -0
  434. package/src/config/schema/magic-context.test.ts +13 -5
  435. package/src/config/schema/magic-context.ts +101 -10
  436. package/src/features/magic-context/dreamer/task-registry.ts +137 -13
  437. package/src/shared/assistant-message-extractor.test.ts +21 -0
  438. package/src/shared/assistant-message-extractor.ts +43 -8
  439. package/src/shared/child-session-teardown.test.ts +38 -3
  440. package/src/shared/child-session-teardown.ts +3 -3
  441. package/src/shared/conflict-detector.test.ts +224 -7
  442. package/src/shared/conflict-detector.ts +161 -89
  443. package/src/shared/data-path.ts +6 -6
  444. package/src/shared/hidden-variant-warnings.ts +21 -0
  445. package/src/shared/host-limitations.ts +43 -0
  446. package/src/shared/keep-subagents.ts +6 -6
  447. package/src/shared/model-suggestion-retry.test.ts +86 -0
  448. package/src/shared/model-suggestion-retry.ts +29 -0
  449. package/src/shared/models-dev-cache.ts +5 -0
  450. package/src/shared/opencode-config-dir.ts +80 -7
  451. package/src/shared/opencode-db-path.test.ts +78 -0
  452. package/src/shared/opencode-db-path.ts +49 -2
  453. package/src/shared/opencode-host-generation.test.ts +29 -0
  454. package/src/shared/prompt-surface-a1-golden.md +142 -211
  455. package/src/shared/rpc-server.ts +18 -0
  456. package/src/shared/rpc-types.ts +63 -4
  457. package/src/shared/status-detail-text.test.ts +52 -18
  458. package/src/shared/status-detail-text.ts +1 -90
  459. package/src/shared/status-summary.ts +37 -2
  460. package/src/shared/status-view.test.ts +441 -0
  461. package/src/shared/status-view.ts +707 -0
  462. package/src/shared/tag-transcript.ts +115 -16
  463. package/src/shared/tail-hygiene-status.ts +9 -1
  464. package/src/shared/test-temp-dir.ts +3 -0
  465. package/src/shared/user-facing-codes.test.ts +3 -4
  466. package/src/shared/user-facing-codes.ts +33 -8
  467. package/src/shared/window-geometry.test.ts +23 -5
  468. package/src/shared/window-geometry.ts +13 -3
  469. package/src/tui/data/context-db.ts +50 -15
  470. package/src/tui/dialogs/status-dialog-colors.test.ts +58 -0
  471. package/src/tui/dialogs/status-dialog.tsx +288 -0
  472. package/src/tui/index.tsx +7 -464
  473. package/src/tui/slots/sidebar-content.tsx +21 -5
  474. package/src/tui-compiled/data/context-db.ts +50 -15
  475. package/src/tui-compiled/dialogs/status-dialog.tsx +552 -0
  476. package/src/tui-compiled/index.tsx +43 -1025
  477. package/src/tui-compiled/slots/sidebar-content.tsx +173 -152
  478. package/src/v2/tui/__fixtures__/ga-host-theme.json +160 -0
  479. package/src/v2/tui/events.ts +23 -0
  480. package/src/v2/tui/host-contract.test.ts +57 -8
  481. package/src/v2/tui/index.ts +315 -59
  482. package/src/v2/tui/load-compiled-sidebar.d.mts +59 -0
  483. package/src/v2/tui/load-compiled-sidebar.mjs +24 -0
  484. package/src/v2/tui/load-compiled-status-dialog.d.mts +17 -0
  485. package/src/v2/tui/load-compiled-status-dialog.mjs +16 -0
  486. package/src/v2/tui/sidebar-fallback.test.ts +100 -0
  487. package/src/v2/tui/sidebar-mount.ts +164 -0
  488. package/src/v2/tui/sidebar-text.test.ts +70 -0
  489. package/src/v2/tui/status-dialog-fallback.test.ts +97 -0
  490. package/src/v2/tui/status-dialog-mount.ts +76 -0
  491. package/src/v2/tui/theme-mapping.test.ts +57 -0
  492. package/src/v2/tui/types.ts +69 -4
  493. package/tui.js +1 -0
  494. package/dist/features/magic-context/memory/memory-migration.d.ts +0 -129
  495. package/dist/features/magic-context/memory/memory-migration.d.ts.map +0 -1
  496. package/dist/hooks/magic-context/upgrade-reminder.d.ts +0 -76
  497. package/dist/hooks/magic-context/upgrade-reminder.d.ts.map +0 -1
  498. package/dist/index-4wwr6cz0.js +0 -112
  499. package/dist/index-avwt563y.js +0 -62
  500. package/dist/index-znraa0kv.js +0 -637
  501. package/dist/recomp-orchestrator-0xx1364v.js +0 -19
  502. package/dist/storage-meta-session-z818pn1e.js +0 -20
@@ -0,0 +1,43 @@
1
+ import { USER_FACING_FAILURES, type UserFacingFailureKey } from "./user-facing-codes";
2
+
3
+ /**
4
+ * Named things the host Magic Context is running in cannot do.
5
+ *
6
+ * A limitation is not a failed operation: it is a capability the current host
7
+ * lacks for as long as this process lives, so every status surface keeps
8
+ * printing it instead of showing it once and forgetting. Each one is an
9
+ * existing MC-* user-facing code, so the status dialog, the plain-text status
10
+ * summary and the sidebar all print the same sentence for it.
11
+ *
12
+ * Process-global on purpose. The surfaces that show these (the RPC status and
13
+ * sidebar handlers) are built without a reference to the adapter that
14
+ * discovered the limitation, and a limitation of the host is true for every
15
+ * session in the process rather than for one of them.
16
+ */
17
+ const declared = new Set<UserFacingFailureKey>();
18
+
19
+ /**
20
+ * Record a limitation of this host. Returns true only the first time a given
21
+ * limitation is declared, which is what callers use to log their explanation
22
+ * once instead of on every pass.
23
+ */
24
+ export function declareHostLimitation(key: UserFacingFailureKey): boolean {
25
+ if (declared.has(key)) return false;
26
+ declared.add(key);
27
+ return true;
28
+ }
29
+
30
+ /** Limitations declared so far, in the order they were first declared. */
31
+ export function activeHostLimitations(): UserFacingFailureKey[] {
32
+ return [...declared];
33
+ }
34
+
35
+ /** The MC-* codes for the declared limitations, for logs and reports. */
36
+ export function activeHostLimitationCodes(): string[] {
37
+ return activeHostLimitations().map((key) => USER_FACING_FAILURES[key].code);
38
+ }
39
+
40
+ /** Test helper: forget every declared limitation so suites do not leak them. */
41
+ export function __resetHostLimitations(): void {
42
+ declared.clear();
43
+ }
@@ -1,11 +1,11 @@
1
1
  /**
2
- * Debug / data-collection switch for settled ordinary child sessions
3
- * (historian and memory migration). Privacy-sensitive Dreamer and
4
- * smart-note children are still deleted after their prompts settle.
2
+ * Debug / data-collection switch for every settled Magic Context child session,
3
+ * including historian, Dreamer, smart-note, user-memory, and migration work.
5
4
  *
6
5
  * Unsettled children are never deleted inline because OpenCode's server loop may
7
- * still be writing after a client timeout or abort. They remain for the
8
- * age-gated sweep; privacy-sensitive rows are swept even when this switch is on.
6
+ * still be writing after a client timeout or abort. They remain archived for the
7
+ * age-gated sweep; archived privacy-sensitive rows are swept even when this
8
+ * switch is on.
9
9
  *
10
10
  * Process-global, set once at boot from config (mirrors `harness.ts`). A config
11
11
  * change requires a restart to take effect.
@@ -17,7 +17,7 @@ export function setKeepSubagents(value: boolean): void {
17
17
  keepSubagents = value === true;
18
18
  }
19
19
 
20
- /** True when settled ordinary child sessions should be retained. */
20
+ /** True when every settled Magic Context child session should be retained. */
21
21
  export function shouldKeepSubagents(): boolean {
22
22
  return keepSubagents;
23
23
  }
@@ -225,6 +225,49 @@ describe("promptSyncWithModelSuggestionRetry", () => {
225
225
  expect((abort.mock.calls[0]?.[0] as { path: { id: string } }).path.id).toBe("ses-test");
226
226
  });
227
227
 
228
+ test("timeout with a resolving transport still aborts the child", async () => {
229
+ const abort = mock(async () => ({}));
230
+ const client = createClient(
231
+ mock(async () => ({})),
232
+ abort,
233
+ );
234
+ const transport = Object.assign(
235
+ ({ signal }: { signal?: AbortSignal }) =>
236
+ new Promise<void>((resolve) => signal?.addEventListener("abort", () => resolve())),
237
+ { childSessionId: "child-test" },
238
+ );
239
+ await expect(
240
+ promptSyncWithModelSuggestionRetry(client, createArgs(), {
241
+ timeoutMs: 10,
242
+ transport,
243
+ }),
244
+ ).rejects.toThrow("prompt timed out after 10ms");
245
+ expect(abort).toHaveBeenCalledTimes(1);
246
+ expect((abort.mock.calls[0]?.[0] as { path: { id: string } }).path.id).toBe("child-test");
247
+ });
248
+
249
+ test("external abort with a resolving transport still aborts the child", async () => {
250
+ const controller = new AbortController();
251
+ const abort = mock(async () => ({}));
252
+ const client = createClient(
253
+ mock(async () => ({})),
254
+ abort,
255
+ );
256
+ const transport = Object.assign(
257
+ ({ signal }: { signal?: AbortSignal }) =>
258
+ new Promise<void>((resolve) => signal?.addEventListener("abort", () => resolve())),
259
+ { childSessionId: "child-test" },
260
+ );
261
+ setTimeout(() => controller.abort(), 10);
262
+ await expect(
263
+ promptSyncWithModelSuggestionRetry(client, createArgs(), {
264
+ signal: controller.signal,
265
+ transport,
266
+ }),
267
+ ).rejects.toThrow("prompt aborted by external signal");
268
+ expect(abort).toHaveBeenCalledTimes(1);
269
+ });
270
+
228
271
  // External abort (e.g. dreamer lease loss) mid-flight must also stop the
229
272
  // server-side loop, not just our fetch.
230
273
  test("external abort fires session.abort on the child session", async () => {
@@ -350,6 +393,49 @@ describe("promptSyncWithModelSuggestionRetry", () => {
350
393
  });
351
394
 
352
395
  describe("promptSyncWithValidatedOutputRetry", () => {
396
+ test("surfaces a host-recorded assistant refusal even when the row has no text", async () => {
397
+ const client = createClient(mock(async () => ({})));
398
+ const refusal =
399
+ "UnknownError: custody accounts exhausted: provider=synthetic accounts=main:cooldown";
400
+
401
+ await expect(
402
+ promptSyncWithValidatedOutputRetry(client, createArgs(), {
403
+ fetchOutput: async () => [
404
+ {
405
+ info: {
406
+ role: "assistant",
407
+ time: { created: 1 },
408
+ finish: "stop",
409
+ tokens: { output: 0 },
410
+ },
411
+ parts: [],
412
+ },
413
+ {
414
+ info: { role: "assistant", time: { created: 2 }, error: refusal },
415
+ parts: [],
416
+ },
417
+ ],
418
+ validateOutput: () => {
419
+ throw new Error("empty_completion");
420
+ },
421
+ }),
422
+ ).rejects.toMatchObject({
423
+ message: `Host recorded assistant error: ${refusal}`,
424
+ transient: true,
425
+ });
426
+ });
427
+
428
+ test("keeps a real empty completion without an assistant error on the normal validation path", async () => {
429
+ const client = createClient(mock(async () => ({})));
430
+ await expect(
431
+ promptSyncWithValidatedOutputRetry(client, createArgs(), {
432
+ fetchOutput: async () => [{ info: { role: "assistant" }, parts: [] }],
433
+ validateOutput: () => {
434
+ throw new Error("empty_completion");
435
+ },
436
+ }),
437
+ ).rejects.toThrow("empty_completion");
438
+ });
353
439
  test("valid first model returns without trying fallbacks", async () => {
354
440
  const prompt = mock(async () => ({}));
355
441
  const messages = mock(async () => "primary-output");
@@ -1,6 +1,10 @@
1
1
  import type { createOpencodeClient } from "@opencode-ai/sdk";
2
2
 
3
3
  import { detectOverflow } from "../features/magic-context/overflow-detection";
4
+ import {
5
+ extractLatestAssistantFailure,
6
+ extractLatestAssistantText,
7
+ } from "./assistant-message-extractor";
4
8
  import { log } from "./logger";
5
9
  import type { ModelInput } from "./model-resolution";
6
10
  import { sanitizeDiagnosticText } from "./redaction";
@@ -254,6 +258,18 @@ async function promptWithTimeout(
254
258
  clearTimeout(timeout);
255
259
  signal?.removeEventListener("abort", onExternalAbort);
256
260
  }
261
+ // Some transports resolve with an error result when their fetch is aborted.
262
+ // A resolved fetch does not mean the server-side child run has stopped.
263
+ if (signal?.aborted || controller.signal.aborted) {
264
+ if (!transport || transport.childSessionId) {
265
+ await abortChildRun(client, transport?.childSessionId ?? args.path.id);
266
+ }
267
+ throw new Error(
268
+ signal?.aborted
269
+ ? "prompt aborted by external signal"
270
+ : `prompt timed out after ${timeoutMs}ms`,
271
+ );
272
+ }
257
273
  }
258
274
 
259
275
  /**
@@ -587,6 +603,19 @@ async function attemptAndValidate<TOutput, TValidated>(
587
603
  }
588
604
 
589
605
  try {
606
+ if (!extractLatestAssistantText(output)) {
607
+ const assistantFailure = extractLatestAssistantFailure(output);
608
+ if (assistantFailure) {
609
+ const error = new Error(
610
+ `Host recorded assistant error: ${String(assistantFailure.error)}`,
611
+ );
612
+ Object.assign(error, {
613
+ name: "DreamerProviderOutputFailureError",
614
+ transient: true,
615
+ });
616
+ throw error;
617
+ }
618
+ }
590
619
  const validated = await options.validateOutput(output, attempt);
591
620
  return { output, validated, attempt };
592
621
  } catch (error) {
@@ -601,6 +601,11 @@ export function modelSupportsVision(providerID: string, modelID: string): boolea
601
601
  : false;
602
602
  }
603
603
 
604
+ export function getSdkOutputLimit(providerID: string, modelID: string): number | undefined {
605
+ loadPersistedApiCacheOnce();
606
+ return lookupMetadataWithTagFallback(apiCache, providerID, modelID)?.outputLimit;
607
+ }
608
+
604
609
  export function getSdkInputLimit(providerID: string, modelID: string): number | undefined {
605
610
  loadPersistedApiCacheOnce();
606
611
  if (!apiCache) return undefined;
@@ -9,19 +9,64 @@ export type {
9
9
  OpenCodeConfigPaths,
10
10
  } from "./opencode-config-dir-types";
11
11
 
12
- function getCliConfigDir(): string {
13
- const envConfigDir = process.env.OPENCODE_CONFIG_DIR?.trim();
14
- if (envConfigDir) {
15
- return resolve(envConfigDir);
16
- }
12
+ /**
13
+ * The user's home directory, preferring `$HOME` over the cached value.
14
+ *
15
+ * `os.homedir()` reads `$HOME` once when the process starts and never again,
16
+ * so a test (or a wrapper) that sets `HOME` afterwards would otherwise be
17
+ * silently ignored and we would read the developer's real config. `$HOME` is
18
+ * normally unset on Windows, where the cached value is the right answer.
19
+ */
20
+ function resolveHomeDir(): string {
21
+ return process.env.HOME?.trim() || homedir();
22
+ }
17
23
 
24
+ /**
25
+ * OpenCode's GLOBAL config directory: `$XDG_CONFIG_HOME/opencode`, falling
26
+ * back to `~/.config/opencode` (on every platform, Windows included — OpenCode
27
+ * does not use %APPDATA%).
28
+ *
29
+ * This helper names the loader's XDG layer, not every OpenCode surface called
30
+ * "config". In 1.18.30, `Global.Path.config` is the pure-XDG path
31
+ * (`packages/core/src/global.ts:13`) and the loader merges it once at
32
+ * `packages/opencode/src/config/config.ts:412-413`. Its later directories loop
33
+ * accepts only `.opencode` paths or the exact `OPENCODE_CONFIG_DIR` value
34
+ * (`config.ts:437-441`), so the XDG layer is skipped there and the env path is
35
+ * merged last. The detector mirrors that loader order via
36
+ * {@link getOpenCodeConfigDirs}.
37
+ *
38
+ * Service consumers see a different value: `Global.make()` injects
39
+ * `Flag.OPENCODE_CONFIG_DIR ?? Path.config` as `config`
40
+ * (`packages/core/src/global.ts:64`), so setting the env var replaces the
41
+ * service's value even though the loader still merges the XDG layer.
42
+ */
43
+ export function getOpenCodeGlobalConfigDir(): string {
18
44
  if (process.platform === "win32") {
19
- return join(homedir(), ".config", "opencode");
45
+ return join(resolveHomeDir(), ".config", "opencode");
20
46
  }
21
47
 
22
- return join(process.env.XDG_CONFIG_HOME || join(homedir(), ".config"), "opencode");
48
+ return join(process.env.XDG_CONFIG_HOME || join(resolveHomeDir(), ".config"), "opencode");
49
+ }
50
+
51
+ function getEnvConfigDir(): string | undefined {
52
+ const envConfigDir = process.env.OPENCODE_CONFIG_DIR?.trim();
53
+ return envConfigDir ? resolve(envConfigDir) : undefined;
54
+ }
55
+
56
+ function getCliConfigDir(): string {
57
+ return getEnvConfigDir() ?? getOpenCodeGlobalConfigDir();
23
58
  }
24
59
 
60
+ /**
61
+ * The single directory Magic Context WRITES its OpenCode-side config into.
62
+ *
63
+ * `OPENCODE_CONFIG_DIR` wins here on purpose: among the directories OpenCode
64
+ * reads it has the highest precedence, so a setting written there is the one
65
+ * that takes effect. Do NOT use this to decide what OpenCode RESOLVED — for
66
+ * that you must read every directory in {@link getOpenCodeConfigDirs}, because
67
+ * a value the user set in the global directory is still live when
68
+ * `OPENCODE_CONFIG_DIR` points somewhere that does not override it.
69
+ */
25
70
  export function getOpenCodeConfigDir(_options: OpenCodeConfigDirOptions): string {
26
71
  return getCliConfigDir();
27
72
  }
@@ -36,3 +81,31 @@ export function getOpenCodeConfigPaths(options: OpenCodeConfigDirOptions): OpenC
36
81
  omoConfig: join(configDir, "magic-context.jsonc"),
37
82
  };
38
83
  }
84
+
85
+ /**
86
+ * Every user-tier directory OpenCode reads config from, ordered from LOWEST to
87
+ * HIGHEST precedence — later entries override earlier ones, which is the order
88
+ * OpenCode merges them in.
89
+ *
90
+ * Verified against the opencode 1.18.30 binary (`ConfigPaths.directories` plus
91
+ * the global loader in `Config.loadInstanceState`) and confirmed on a live host
92
+ * with `opencode debug config`:
93
+ *
94
+ * 1. `$XDG_CONFIG_HOME/opencode` — always read, whatever the environment says
95
+ * 2. `~/.opencode` — always scanned, even outside a project
96
+ * 3. `$OPENCODE_CONFIG_DIR` — appended last, so it wins ties
97
+ *
98
+ * The important part is that entry 3 is an ADDITION, not a replacement. A
99
+ * launcher that exports `OPENCODE_CONFIG_DIR` to a directory holding only
100
+ * plugin scaffolding does not stop OpenCode from reading the user's real
101
+ * config in entry 1 — so neither may we.
102
+ *
103
+ * Project-level directories are deliberately not included: they depend on the
104
+ * working directory and are resolved by the caller that knows it.
105
+ */
106
+ export function getOpenCodeConfigDirs(): string[] {
107
+ const dirs = [getOpenCodeGlobalConfigDir(), join(resolveHomeDir(), ".opencode")];
108
+ const envDir = getEnvConfigDir();
109
+ if (envDir) dirs.push(envDir);
110
+ return [...new Set(dirs)];
111
+ }
@@ -10,6 +10,7 @@ import {
10
10
  formatOpenCodeDbDoctorLine,
11
11
  formatOpenCodeDbMissingBanner,
12
12
  formatOpenCodeDbMissingStatusLine,
13
+ hasV1MessageTables,
13
14
  openCodeDbPathExists,
14
15
  resetOpenCodeDbPathStateForTesting,
15
16
  resolveOpenCodeDbPath,
@@ -253,6 +254,83 @@ describe("resolveOpenCodeDbPath", () => {
253
254
  }
254
255
  });
255
256
 
257
+ it("reports v1 message capability on a migrated store accepted by both readers", () => {
258
+ const { openCodeDir } = useDataHome();
259
+ const migratedPath = join(openCodeDir, "migrated-v2.db");
260
+ const migrated = new Database(migratedPath);
261
+ try {
262
+ // Captured from an OpenCode 2.0.7 store that the v2 host migrated from a 1.18.x
263
+ // store: it keeps the v1 `message`/`part` tables beside its own schema, so it
264
+ // carries BOTH generations. `session_v2` is written only by an OpenCode 2 host
265
+ // (the 1.18.31 binary never references it). Keep this table list as observed.
266
+ for (const table of [
267
+ "account",
268
+ "account_state",
269
+ "control_account",
270
+ "credential",
271
+ "event",
272
+ "event_sequence",
273
+ "instruction_blob",
274
+ "instruction_entry",
275
+ "instruction_state",
276
+ "kv",
277
+ "message",
278
+ "migration",
279
+ "part",
280
+ "permission",
281
+ "project",
282
+ "project_directory",
283
+ "session",
284
+ "session_inbox",
285
+ "session_message",
286
+ "session_pending",
287
+ "session_share",
288
+ "session_v2",
289
+ "todo",
290
+ "workspace",
291
+ "worktree",
292
+ ]) {
293
+ migrated.exec(`CREATE TABLE ${table}(id TEXT)`);
294
+ }
295
+ expect(hasV1MessageTables(migrated)).toBe(true);
296
+ expect(() => assertOpenCodeStoreGeneration(migrated, "v2", migratedPath)).not.toThrow();
297
+ expect(() => assertOpenCodeStoreGeneration(migrated, "v1", migratedPath)).not.toThrow();
298
+ } finally {
299
+ migrated.close();
300
+ }
301
+ });
302
+
303
+ it("reads a fresh OpenCode 2 store as v2 only", () => {
304
+ const { openCodeDir } = useDataHome();
305
+ const freshV2Path = join(openCodeDir, "fresh-v2.db");
306
+ const freshV2 = new Database(freshV2Path);
307
+ try {
308
+ // Captured from a new OpenCode 2.0.7 data directory: no v1 message tables.
309
+ for (const table of [
310
+ "account",
311
+ "event",
312
+ "migration",
313
+ "permission",
314
+ "project",
315
+ "session_inbox",
316
+ "session_message",
317
+ "session_pending",
318
+ "session_v2",
319
+ "workspace",
320
+ ]) {
321
+ freshV2.exec(`CREATE TABLE ${table}(id TEXT)`);
322
+ }
323
+ expect(hasV1MessageTables(freshV2)).toBe(false);
324
+ expect(detectOpenCodeStoreGeneration(freshV2)).toBe("v2");
325
+ expect(() => assertOpenCodeStoreGeneration(freshV2, "v2", freshV2Path)).not.toThrow();
326
+ expect(() => assertOpenCodeStoreGeneration(freshV2, "v1", freshV2Path)).toThrow(
327
+ "expected v1, found v2",
328
+ );
329
+ } finally {
330
+ freshV2.close();
331
+ }
332
+ });
333
+
256
334
  it("treats a store with no schema yet as empty rather than as a conflicting host", () => {
257
335
  const { openCodeDir } = useDataHome();
258
336
  const freshPath = join(openCodeDir, "fresh.db");
@@ -12,10 +12,25 @@ export interface ResolveOpenCodeDbPathOptions {
12
12
  env?: NodeJS.ProcessEnv;
13
13
  }
14
14
 
15
+ /**
16
+ * Decide the host generation from the version the executable reports, never
17
+ * from its name (the public installer places OpenCode 2 at
18
+ * `~/.opencode/bin/opencode` with a tiny `opencode2` shim beside it). The raw
19
+ * `--version` stdout carries a program-name prefix ("opencode v2.0.12"), so the
20
+ * major is the first digit run, not `parseInt` of the whole string.
21
+ *
22
+ * OpenCode 2's pre-GA betas were published under the old scope as
23
+ * `@opencode-ai/*@0.0.0-beta-<n>` (verified: `0.0.0-beta-19234` ships the V2
24
+ * `host`/`promise`/`effect` contract and the `compaction` hook); at GA the line
25
+ * moved to `@opencode/*@2.0.x`. A major of 0 therefore does not mean 1.x: the
26
+ * beta and dev pre-release shapes are OpenCode 2.
27
+ */
15
28
  export function openCodeHostGenerationFromVersion(
16
29
  version: string | null | undefined,
17
30
  ): OpenCodeHostGeneration {
18
- const major = Number.parseInt(version?.match(/\d+/)?.[0] ?? "", 10);
31
+ const text = version ?? "";
32
+ if (/(?:^|\s|v)0\.0\.0-(?:beta|dev)-/.test(text)) return "v2";
33
+ const major = Number.parseInt(text.match(/\d+/)?.[0] ?? "", 10);
19
34
  return Number.isFinite(major) && major >= 2 ? "v2" : "v1";
20
35
  }
21
36
 
@@ -214,12 +229,21 @@ function schemaTableNames(
214
229
  ): Set<string> {
215
230
  const rows = db
216
231
  .prepare(
217
- `SELECT name FROM ${schema}.sqlite_master WHERE type = 'table' AND name IN ('message', 'part', 'session', 'project', 'session_message')`,
232
+ `SELECT name FROM ${schema}.sqlite_master WHERE type = 'table' AND name IN ('message', 'part', 'session', 'project', 'session_message', 'session_v2')`,
218
233
  )
219
234
  .all() as Array<{ name?: unknown }>;
220
235
  return new Set(rows.flatMap((row) => (typeof row.name === "string" ? [row.name] : [])));
221
236
  }
222
237
 
238
+ /** Whether the schema has the legacy message tables required by v1-only readers. */
239
+ export function hasV1MessageTables(
240
+ db: OpenCodeStoreSchemaDatabase,
241
+ schema: "main" | "oc_backfill" = "main",
242
+ ): boolean {
243
+ const tables = schemaTableNames(db, schema);
244
+ return tables.has("message") && tables.has("part");
245
+ }
246
+
223
247
  /**
224
248
  * Detect the persisted host schema.
225
249
  *
@@ -240,6 +264,28 @@ export function detectOpenCodeStoreGeneration(
240
264
  return "unknown";
241
265
  }
242
266
 
267
+ /**
268
+ * A store the OpenCode 2 host migrated from a v1 store keeps the v1 `message`/`part` tables
269
+ * beside its own schema, so it carries BOTH generations and `detectOpenCodeStoreGeneration`
270
+ * (which must keep calling a 1.18.x store v1) reports v1. `session_v2` is written only by an
271
+ * OpenCode 2 host (1.18.x never creates it), so a store with it and `session_message` is
272
+ * readable by v2 readers regardless of any v1 tables it also kept.
273
+ */
274
+ function hasMigratedV2Schema(tables: Set<string>): boolean {
275
+ return tables.has("session_message") && tables.has("session_v2");
276
+ }
277
+
278
+ /** A native OpenCode 2 store, or a v1 store an OpenCode 2 host has migrated. */
279
+ function isOpenCodeV2Store(
280
+ db: OpenCodeStoreSchemaDatabase,
281
+ schema: "main" | "oc_backfill" = "main",
282
+ ): boolean {
283
+ return (
284
+ detectOpenCodeStoreGeneration(db, schema) === "v2" ||
285
+ hasMigratedV2Schema(schemaTableNames(db, schema))
286
+ );
287
+ }
288
+
243
289
  /** Refuse before a generation-specific query can read the other host's schema. */
244
290
  export function assertOpenCodeStoreGeneration(
245
291
  db: OpenCodeStoreSchemaDatabase,
@@ -249,6 +295,7 @@ export function assertOpenCodeStoreGeneration(
249
295
  ): void {
250
296
  const actual = detectOpenCodeStoreGeneration(db, schema);
251
297
  if (actual === expected) return;
298
+ if (expected === "v2" && isOpenCodeV2Store(db, schema)) return;
252
299
  // A store with none of these tables has no schema YET — a host that has not written its
253
300
  // first row, or a fresh data directory. That is "nothing to read", not a conflicting host,
254
301
  // and readers have always treated it as empty. Refusing here made every reader throw before
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { openCodeHostGenerationFromVersion } from "./opencode-db-path";
3
+
4
+ // The generation is decided from the version the executable reports, never
5
+ // from its name: the public installer puts OpenCode 2 at ~/.opencode/bin/opencode
6
+ // with a tiny `opencode2` shim beside it, so the name says nothing. The raw
7
+ // `--version` stdout carries a program-name prefix ("opencode v2.0.12"); a
8
+ // parser that feeds that to Number.parseInt reads NaN and demotes every
9
+ // standalone 2.x install to 1.x (AFT hit this on a clean VM, 2026-09-21).
10
+ // OpenCode 2's pre-GA betas were `@opencode-ai/*@0.0.0-beta-<n>` — the V2 line
11
+ // wearing the old scope's version string — so a major of 0 is v2, not v1.
12
+ describe("OpenCode host generation from --version output", () => {
13
+ it.each([
14
+ ["opencode v2.0.12", "v2"],
15
+ ["v2.0.12", "v2"],
16
+ ["2.0.12", "v2"],
17
+ ["opencode v2.0.12\n", "v2"],
18
+ ["opencode 1.18.31", "v1"],
19
+ ["1.18.31", "v1"],
20
+ ["0.0.0-beta-19234", "v2"],
21
+ ["opencode v0.0.0-beta-19234", "v2"],
22
+ ["0.0.0-dev-42", "v2"],
23
+ ["0.9.3", "v1"],
24
+ [null, "v1"],
25
+ ["", "v1"],
26
+ ])("%p → %s", (raw, expected) => {
27
+ expect(openCodeHostGenerationFromVersion(raw)).toBe(expected);
28
+ });
29
+ });