@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
@@ -4,7 +4,7 @@ import { tmpdir } from "node:os";
4
4
  import { resolve } from "node:path";
5
5
  import { Host } from "@opencode/plugin/host";
6
6
  import { setupWithJsx } from "./index";
7
- import type { V2SidebarState, V2TuiContext } from "./types";
7
+ import type { V2SidebarState, V2SlotClaim, V2TuiContext } from "./types";
8
8
 
9
9
  const temporary: string[] = [];
10
10
  afterEach(() => {
@@ -13,7 +13,7 @@ afterEach(() => {
13
13
  });
14
14
 
15
15
  function v2Context() {
16
- const claims: Array<{ render: (input: { sessionID: string }) => unknown }> = [];
16
+ const claims: V2SlotClaim[] = [];
17
17
  const layers: Array<ReturnType<Parameters<V2TuiContext["keymap"]["layer"]>[0]>> = [];
18
18
  const cleanups: Array<() => void> = [];
19
19
  const state: V2SidebarState = { snapshots: {} };
@@ -125,31 +125,80 @@ test("GA 2.0.5 resolves ./tui and executes the union setup contract", async () =
125
125
  expect(typeof loaded.default.setup).toBe("function");
126
126
  const fixture = v2Context();
127
127
  const cleanup = await setupWithJsx(fixture.context, (type, props) => ({ type, props }));
128
- expect(fixture.claims).toHaveLength(1);
129
- expect(fixture.claims[0]!.render({ sessionID: "ses-v2-tui" })).toEqual({
128
+ expect(fixture.claims.map((claim) => claim.append)).toEqual(["sidebar.content"]);
129
+ const sidebarClaim = fixture.claims[0]!;
130
+ if (sidebarClaim.append !== "sidebar.content") throw new Error("expected the sidebar claim");
131
+ expect(sidebarClaim.render({ sessionID: "ses-v2-tui" })).toEqual({
130
132
  type: "text",
131
133
  props: { children: expect.stringContaining("Magic Context") },
132
134
  });
133
135
  expect(fixture.layers[0]!.commands.map((command) => command.slash.name)).toEqual([
134
136
  "ctx-status",
135
137
  "ctx-recomp",
138
+ "ctx-dream",
139
+ "ctx-flush",
140
+ "ctx-embed",
141
+ "ctx-wrapup",
136
142
  ]);
137
143
  cleanup();
138
144
  });
139
145
 
140
- test("GA 2.0.5 records its unbound keymap.layer gap without losing the sidebar", async () => {
146
+ test("GA 2.0.5 registers the keymap layer from the app slot when setup runs outside the provider", async () => {
141
147
  const fixture = v2Context();
148
+ let providerAvailable = false;
142
149
  Object.assign(fixture.context.keymap, {
143
- layer: () => {
144
- throw new Error("Keymap.Provider is missing");
150
+ layer: (input: () => unknown) => {
151
+ if (!providerAvailable) throw new Error("Keymap.Provider is missing");
152
+ fixture.layers.push(input() as never);
145
153
  },
146
154
  });
147
155
  const cleanup = await setupWithJsx(fixture.context, (type, props) => ({ type, props }));
148
- expect(fixture.claims).toHaveLength(1);
156
+ expect(fixture.claims.map((claim) => claim.append)).toEqual(["sidebar.content", "app"]);
149
157
  expect(fixture.layers).toHaveLength(0);
158
+
159
+ // The app slot render executes inside the component tree, where the provider resolves.
160
+ providerAvailable = true;
161
+ const appClaim = fixture.claims.find((claim) => claim.append === "app");
162
+ if (appClaim?.append !== "app") throw new Error("expected the app slot claim");
163
+ appClaim.render({});
164
+ expect(
165
+ fixture.layers.map((layer) => layer.commands.map((command) => command.slash.name)),
166
+ ).toEqual([["ctx-status", "ctx-recomp", "ctx-dream", "ctx-flush", "ctx-embed", "ctx-wrapup"]]);
167
+ // Repeated renders must not stack duplicate layers.
168
+ appClaim.render({});
169
+ expect(fixture.layers).toHaveLength(1);
150
170
  cleanup();
151
171
  });
152
172
 
173
+ test("GA 2.0.5 keeps the sidebar when the app-slot keymap registration also fails", async () => {
174
+ const fixture = v2Context();
175
+ Object.assign(fixture.context.keymap, {
176
+ layer: () => {
177
+ throw new Error("Keymap.Provider is missing");
178
+ },
179
+ });
180
+ const warnings: string[] = [];
181
+ const originalWarn = console.warn;
182
+ console.warn = (...args: unknown[]) => {
183
+ warnings.push(args.map(String).join(" "));
184
+ };
185
+ try {
186
+ const cleanup = await setupWithJsx(fixture.context, (type, props) => ({ type, props }));
187
+ expect(fixture.claims.map((claim) => claim.append)).toEqual(["sidebar.content", "app"]);
188
+ const appClaim = fixture.claims.find((claim) => claim.append === "app");
189
+ if (appClaim?.append !== "app") throw new Error("expected the app slot claim");
190
+ appClaim.render({});
191
+ appClaim.render({});
192
+ expect(fixture.layers).toHaveLength(0);
193
+ expect(
194
+ warnings.filter((line) => line.includes("keymap.layer is unavailable")),
195
+ ).toHaveLength(1);
196
+ cleanup();
197
+ } finally {
198
+ console.warn = originalWarn;
199
+ }
200
+ });
201
+
153
202
  test("OpenCode 1.18.30 TUI loader projection executes unchanged sidebar registration", async () => {
154
203
  // v1.18.30 packages/opencode/src/plugin/shared.ts:272-304 reads only id,
155
204
  // server and tui, rejects a simultaneous server+tui pair, and returns the
@@ -1,19 +1,30 @@
1
1
  import { jsx } from "@opentui/solid/jsx-runtime";
2
+ import { COMPACTION_ENABLED_PATH } from "../../config/agent-disable";
3
+ import { flushLogger, log } from "../../shared/logger";
2
4
  import type { SidebarSnapshot, StatusDetail } from "../../shared/rpc-types";
5
+ import { compactionOffSidebarRows, nativeCompactionContextLabel } from "../../tui/compaction-off";
3
6
  import {
7
+ type CommandRpcResult,
4
8
  closeRpc,
5
9
  getCompartmentCount,
6
10
  initRpcClient,
7
11
  loadSidebarSnapshot,
8
12
  loadStatusDetail,
13
+ requestDream,
14
+ requestEmbed,
15
+ requestFlush,
9
16
  requestRecomp,
17
+ requestWrapup,
10
18
  } from "../../tui/data/context-db";
11
19
  import {
12
20
  type SocketNotification,
13
21
  startNotificationSocket,
14
22
  stopNotificationSocket,
15
23
  } from "../../tui/data/notification-socket";
16
- import type { V2SidebarState, V2TuiContext } from "./types";
24
+ import { eventSessionID } from "./events";
25
+ import { mountV1Sidebar, type V1SidebarMount } from "./sidebar-mount";
26
+ import { mountV1StatusDialog, type V1StatusDialogMount } from "./status-dialog-mount";
27
+ import type { V2KeymapLayer, V2SidebarState, V2TuiContext } from "./types";
17
28
 
18
29
  const SIDEBAR_REFRESH_MS = 1_000;
19
30
  const inflight = new Set<string>();
@@ -25,8 +36,30 @@ function compactTokens(value: number): string {
25
36
  return String(value);
26
37
  }
27
38
 
28
- function sidebarText(snapshot: SidebarSnapshot | undefined): string {
39
+ /**
40
+ * Plain-text projection of the sidebar snapshot, used only when the real v1
41
+ * component cannot be loaded because the host registers no OpenTUI runtime
42
+ * modules (`opentui:runtime-module:*`). That arm is reachable on a host that
43
+ * boots the TUI without OpenTUI's runtime-plugin support installed — for
44
+ * example a future or cut-down OpenCode 2 TUI, or any embedding of this setup
45
+ * outside the packaged host. GA 2.0.5 and 2.0.11 both register the modules, so
46
+ * on those hosts the v1 component is what paints.
47
+ *
48
+ * Exported for test access; mirrors the v1 sidebar's compaction-off rows.
49
+ */
50
+ export function sidebarText(snapshot: SidebarSnapshot | undefined): string {
29
51
  if (!snapshot) return "Magic Context · loading…";
52
+ if (snapshot.compaction_enabled === false) {
53
+ return [
54
+ "Magic Context",
55
+ nativeCompactionContextLabel(snapshot),
56
+ ...compactionOffSidebarRows(snapshot).map((row) => `${row.label} ${row.value}`),
57
+ ...(snapshot.readySmartNoteCount > 0
58
+ ? [`Smart Notes ${snapshot.readySmartNoteCount} ready`]
59
+ : []),
60
+ ...(snapshot.lastTransformError ? [`Warning: ${snapshot.lastTransformError}`] : []),
61
+ ].join("\n");
62
+ }
30
63
  const pressure =
31
64
  snapshot.contextLimit > 0
32
65
  ? `${snapshot.usagePercentage.toFixed(1)}% · ${compactTokens(snapshot.inputTokens)}/${compactTokens(snapshot.contextLimit)}`
@@ -41,18 +74,42 @@ function sidebarText(snapshot: SidebarSnapshot | undefined): string {
41
74
  ].join("\n");
42
75
  }
43
76
 
44
- function statusText(detail: StatusDetail): string {
77
+ /**
78
+ * Plain-text projection of the status snapshot, used only when the real v1
79
+ * dialog component cannot be mounted — a host that publishes no component
80
+ * dialog surface, or one that registers no OpenTUI runtime modules
81
+ * (`opentui:runtime-module:*`). GA 2.0.5 and 2.0.11 do both, so on those hosts
82
+ * the v1 dialog is what paints.
83
+ *
84
+ * Exported for test access.
85
+ */
86
+ export function statusText(detail: StatusDetail): string {
45
87
  const context =
46
88
  detail.contextLimit > 0
47
89
  ? `${detail.usagePercentage.toFixed(1)}% (${compactTokens(detail.inputTokens)}/${compactTokens(detail.contextLimit)} tokens)`
48
90
  : `${compactTokens(detail.inputTokens)} tokens`;
49
91
  return [
92
+ ...(detail.compaction_enabled === false
93
+ ? [
94
+ `Compaction: disabled (${COMPACTION_ENABLED_PATH}: false) — native compaction owns the context window.`,
95
+ ]
96
+ : []),
50
97
  `Context: ${context}`,
51
98
  `Historian: ${detail.historianRunning ? "running" : "idle"}`,
52
99
  `Compartments: ${detail.compartmentCount}`,
53
100
  `Memories: ${detail.memoryBlockCount} injected / ${detail.memoryCount} stored`,
54
101
  `Pending reductions: ${detail.pendingOpsCount}`,
55
102
  `Harness: opencode2`,
103
+ ...(detail.configGeneration === undefined
104
+ ? []
105
+ : [
106
+ `Config generation: ${detail.configGeneration} (adopted ${detail.configAdoptedAt ? new Date(detail.configAdoptedAt).toLocaleString() : "unknown"})`,
107
+ ]),
108
+ ...(detail.configReloadFailure
109
+ ? [
110
+ `Config reload failed ${detail.configReloadFailure.path}: ${detail.configReloadFailure.message}`,
111
+ ]
112
+ : []),
56
113
  ...(detail.lastTransformError ? [`Warning: ${detail.lastTransformError}`] : []),
57
114
  ].join("\n");
58
115
  }
@@ -62,25 +119,6 @@ function currentSessionID(context: V2TuiContext): string | null {
62
119
  return route.type === "session" && route.sessionID ? route.sessionID : null;
63
120
  }
64
121
 
65
- function eventSessionID(event: unknown): string | undefined {
66
- if (typeof event !== "object" || event === null) return undefined;
67
- const record = event as Record<string, unknown>;
68
- const data =
69
- typeof record.data === "object" && record.data !== null
70
- ? (record.data as Record<string, unknown>)
71
- : record;
72
- for (const key of ["sessionID", "sessionId", "id"]) {
73
- if (typeof data[key] === "string") return data[key];
74
- }
75
- const info = data.info;
76
- if (typeof info === "object" && info !== null) {
77
- const nested = info as Record<string, unknown>;
78
- if (typeof nested.sessionID === "string") return nested.sessionID;
79
- if (typeof nested.id === "string") return nested.id;
80
- }
81
- return undefined;
82
- }
83
-
84
122
  type JsxFactory = (type: string, props: Record<string, unknown>) => unknown;
85
123
 
86
124
  export async function setupWithJsx(context: V2TuiContext, jsx: JsxFactory): Promise<() => void> {
@@ -108,7 +146,7 @@ export async function setupWithJsx(context: V2TuiContext, jsx: JsxFactory): Prom
108
146
  }
109
147
  };
110
148
 
111
- const showStatus = async (diagnostics = false, target = currentSessionID(context)) => {
149
+ const showStatus = async (target = currentSessionID(context)) => {
112
150
  if (!target) {
113
151
  context.ui.toast.show({ message: "No active session", variant: "warning" });
114
152
  return false;
@@ -122,8 +160,21 @@ export async function setupWithJsx(context: V2TuiContext, jsx: JsxFactory): Prom
122
160
  });
123
161
  return false;
124
162
  }
163
+ const mounted = statusDialog;
164
+ if (mounted) {
165
+ try {
166
+ mounted.show(result.detail);
167
+ return true;
168
+ } catch (error) {
169
+ // A component that throws while opening would leave the host
170
+ // with a dead dialog surface. Degrade to the text dialog for the
171
+ // rest of this TUI session and say so once.
172
+ statusDialog = null;
173
+ console.warn("[magic-context] v2 status dialog failed; using text", error);
174
+ }
175
+ }
125
176
  await context.ui.dialog.alert({
126
- title: diagnostics ? "Magic Context diagnostics" : "Magic Context status",
177
+ title: "Magic Context status",
127
178
  message: statusText(result.detail),
128
179
  });
129
180
  return true;
@@ -162,49 +213,249 @@ export async function setupWithJsx(context: V2TuiContext, jsx: JsxFactory): Prom
162
213
  return requested;
163
214
  };
164
215
 
216
+ const showDream = async (task?: string) => {
217
+ const target = currentSessionID(context);
218
+ if (!target) {
219
+ context.ui.toast.show({ message: "No active session", variant: "warning" });
220
+ return false;
221
+ }
222
+ const started = await requestDream(target, task);
223
+ context.ui.toast.show({
224
+ message: started
225
+ ? "Dream run started; the summary appears when it finishes"
226
+ : "Dream request failed",
227
+ variant: started ? "info" : "error",
228
+ });
229
+ return started;
230
+ };
231
+
232
+ // One sidebar: the OpenCode 1 component, mounted on the v2 slot through the
233
+ // host's own OpenTUI runtime. `mountV1Sidebar` returns null only when the
234
+ // host registers no runtime modules to load it through, which is the single
235
+ // case the plain-text projection covers.
236
+ let mountedSidebar: V1SidebarMount | null = await mountV1Sidebar(context, directory);
237
+ // One status view: the OpenCode 1 dialog component, mounted on the v2 dialog
238
+ // surface through the host's own OpenTUI runtime. `mountV1StatusDialog`
239
+ // returns null only for a host that cannot render a component dialog, which
240
+ // is the single case the plain-text projection covers.
241
+ let statusDialog: V1StatusDialogMount | null = await mountV1StatusDialog(context);
165
242
  const unregisterSlot = context.ui.slot({
166
243
  append: "sidebar.content",
167
- render: ({ sessionID }) => {
168
- void refresh(sessionID);
169
- return jsx("text", { children: sidebarText(sidebar.snapshots[sessionID]) });
244
+ render: (input) => {
245
+ const mounted = mountedSidebar;
246
+ if (mounted) {
247
+ try {
248
+ return mounted.render(input);
249
+ } catch (error) {
250
+ // A component that throws mid-paint would take the host's
251
+ // sidebar down with it. Degrade to the text projection for
252
+ // the rest of this TUI session and say so once.
253
+ mountedSidebar = null;
254
+ mounted.dispose();
255
+ console.warn("[magic-context] v2 sidebar component failed; using text", error);
256
+ }
257
+ }
258
+ void refresh(input.sessionID);
259
+ return jsx("text", { children: sidebarText(sidebar.snapshots[input.sessionID]) });
170
260
  },
171
261
  });
172
262
 
173
- try {
174
- context.keymap.layer(() => ({
175
- mode: "global",
176
- commands: [
177
- {
178
- id: "magic-context.status",
179
- title: "Magic Context: Status",
180
- group: "Magic Context",
181
- palette: true,
182
- slash: { name: "ctx-status", arguments: true },
183
- run: async (input) => {
184
- await showStatus(input?.trim().toLowerCase() === "diagnostics");
185
- },
263
+ // Every /ctx-* command this host can reach goes through the keymap layer:
264
+ // OpenCode 2 has no `command.execute.before` hook, so the server-side command
265
+ // handler the OpenCode 1 plugin uses never runs here. Each `run` calls the
266
+ // RPC handler that does the same server-side work and reports back through a
267
+ // dialog or toast, because this host has no ignored-message chat carrier.
268
+ const runCommandRpc = async (
269
+ title: string,
270
+ call: (sessionID: string) => Promise<CommandRpcResult>,
271
+ pending?: string,
272
+ ): Promise<boolean> => {
273
+ const target = currentSessionID(context);
274
+ if (!target) {
275
+ context.ui.toast.show({ message: "No active session", variant: "warning" });
276
+ return false;
277
+ }
278
+ const result = await call(target);
279
+ if (!result.ok) {
280
+ context.ui.toast.show({
281
+ message: result.error ?? `${title} request failed`,
282
+ variant: "error",
283
+ });
284
+ return false;
285
+ }
286
+ // A started background run has no text yet; its outcome arrives later as a
287
+ // show-result-dialog notification.
288
+ if (result.started) {
289
+ context.ui.toast.show({ message: pending ?? `${title} started`, variant: "info" });
290
+ return true;
291
+ }
292
+ if (currentSessionID(context) !== target) return false;
293
+ await context.ui.dialog.alert({ title, message: result.message ?? "" });
294
+ return true;
295
+ };
296
+
297
+ // OpenCode 2 runs plugin setup() outside the TUI component tree, where
298
+ // context.keymap.layer() throws "Keymap.Provider is missing" (the provider is
299
+ // a Solid context). Try the direct call first (hosts that do run setup
300
+ // in-tree), then fall back to the app slot: its render executes inside the
301
+ // component tree, the same place the host's own built-in plugins register
302
+ // their layers.
303
+ const buildKeymapLayer = (): V2KeymapLayer => ({
304
+ mode: "global",
305
+ commands: [
306
+ {
307
+ id: "magic-context.status",
308
+ title: "Magic Context: Status",
309
+ group: "Magic Context",
310
+ palette: true,
311
+ slash: { name: "ctx-status" },
312
+ run: async () => {
313
+ await showStatus();
314
+ },
315
+ },
316
+ {
317
+ id: "magic-context.recomp",
318
+ title: "Magic Context: Recomp",
319
+ group: "Magic Context",
320
+ palette: true,
321
+ slash: { name: "ctx-recomp" },
322
+ run: async () => {
323
+ await showRecomp();
186
324
  },
187
- {
188
- id: "magic-context.recomp",
189
- title: "Magic Context: Recomp",
190
- group: "Magic Context",
191
- palette: true,
192
- slash: { name: "ctx-recomp" },
193
- run: async () => {
194
- await showRecomp();
195
- },
325
+ },
326
+ {
327
+ id: "magic-context.dream",
328
+ title: "Magic Context: Dream",
329
+ group: "Magic Context",
330
+ palette: true,
331
+ slash: { name: "ctx-dream", arguments: true },
332
+ run: async (input) => {
333
+ await showDream(input?.trim() || undefined);
196
334
  },
197
- ],
198
- }));
199
- } catch (error) {
200
- if (!(error instanceof Error) || error.message !== "Keymap.Provider is missing")
201
- throw error;
202
- console.warn(
203
- "[magic-context] OpenCode 2.0.5 keymap.layer is unavailable during plugin setup; /ctx-status and /ctx-recomp were not registered",
204
- );
335
+ },
336
+ {
337
+ id: "magic-context.flush",
338
+ title: "Magic Context: Flush",
339
+ group: "Magic Context",
340
+ palette: true,
341
+ slash: { name: "ctx-flush" },
342
+ run: async () => {
343
+ const flushed = await runCommandRpc("Flush", requestFlush);
344
+ if (flushed) void refresh(currentSessionID(context) ?? "", true);
345
+ },
346
+ },
347
+ {
348
+ id: "magic-context.embed",
349
+ title: "Magic Context: Embed",
350
+ group: "Magic Context",
351
+ palette: true,
352
+ slash: { name: "ctx-embed", arguments: true },
353
+ run: async (input) => {
354
+ const argument = input?.trim().toLowerCase() ?? "";
355
+ if (argument !== "" && argument !== "start" && argument !== "pause") {
356
+ context.ui.toast.show({
357
+ message:
358
+ "Usage: /ctx-embed (status), /ctx-embed start, or /ctx-embed pause",
359
+ variant: "warning",
360
+ });
361
+ return;
362
+ }
363
+ const action = argument === "" ? "status" : argument;
364
+ await runCommandRpc(
365
+ "Embed",
366
+ (sessionID) => requestEmbed(sessionID, action, directory),
367
+ "Embedding started; the summary appears when it finishes",
368
+ );
369
+ },
370
+ },
371
+ {
372
+ id: "magic-context.wrapup",
373
+ title: "Magic Context: Wrapup",
374
+ group: "Magic Context",
375
+ palette: true,
376
+ slash: { name: "ctx-wrapup", arguments: true },
377
+ run: async (input) => {
378
+ const argument = input?.trim() ?? "";
379
+ if (argument !== "" && !/^\d+$/.test(argument)) {
380
+ context.ui.toast.show({
381
+ message:
382
+ "Usage: /ctx-wrapup [messages_to_keep] where messages_to_keep is a positive integer",
383
+ variant: "warning",
384
+ });
385
+ return;
386
+ }
387
+ const messagesToKeep = argument === "" ? 20 : Number.parseInt(argument, 10);
388
+ if (messagesToKeep <= 0) {
389
+ context.ui.toast.show({
390
+ message: "messages_to_keep must be a positive integer",
391
+ variant: "warning",
392
+ });
393
+ return;
394
+ }
395
+ await runCommandRpc(
396
+ "Wrapup",
397
+ (sessionID) => requestWrapup(sessionID, messagesToKeep),
398
+ "Wrapup started; the summary appears when it finishes",
399
+ );
400
+ },
401
+ },
402
+ ],
403
+ });
404
+ let keymapLayerRegistered = false;
405
+ let keymapGapLogged = false;
406
+ const registerKeymapLayer = (): boolean => {
407
+ if (keymapLayerRegistered) return true;
408
+ try {
409
+ context.keymap.layer(buildKeymapLayer);
410
+ keymapLayerRegistered = true;
411
+ // The accepted layer is the only place that knows which slash commands
412
+ // this host actually got, so report them from it. Anything missing here
413
+ // is missing from the host's command palette too. It goes to the
414
+ // diagnostic log as well as the console because a TUI host owns the
415
+ // screen and drops plugin console output.
416
+ const registered = `registered slash commands: ${buildKeymapLayer()
417
+ .commands.map((command) => command.slash.name)
418
+ .join(" ")}`;
419
+ log(`[magic-context] ${registered}`);
420
+ // Startup lines are worth an immediate write: a TUI that exits or is
421
+ // killed before the next buffer flush would otherwise leave no record
422
+ // of which commands this host received.
423
+ flushLogger();
424
+ console.info(`[magic-context] ${registered}`);
425
+ return true;
426
+ } catch (error) {
427
+ if (!(error instanceof Error) || error.message !== "Keymap.Provider is missing")
428
+ throw error;
429
+ return false;
430
+ }
431
+ };
432
+ let unregisterKeymapSlot: (() => void) | undefined;
433
+ if (!registerKeymapLayer()) {
434
+ unregisterKeymapSlot = context.ui.slot({
435
+ append: "app",
436
+ render: () => {
437
+ let registered = false;
438
+ try {
439
+ registered = registerKeymapLayer();
440
+ } catch (error) {
441
+ console.warn("[magic-context] keymap.layer registration failed", error);
442
+ }
443
+ if (!registered && !keymapGapLogged) {
444
+ keymapGapLogged = true;
445
+ console.warn(
446
+ "[magic-context] OpenCode 2 keymap.layer is unavailable; /ctx-status, /ctx-recomp, /ctx-dream, /ctx-flush, /ctx-embed and /ctx-wrapup were not registered",
447
+ );
448
+ }
449
+ return null;
450
+ },
451
+ });
205
452
  }
206
453
 
454
+ // Only the text projection needs the sidebar snapshot store; the mounted
455
+ // component keeps its own snapshot and subscribes to the same event stream
456
+ // itself.
207
457
  const stopListening = context.data.listen(({ details }) => {
458
+ if (mountedSidebar) return;
208
459
  const sessionID = eventSessionID(details);
209
460
  if (sessionID) void refresh(sessionID, true);
210
461
  });
@@ -230,11 +481,12 @@ export async function setupWithJsx(context: V2TuiContext, jsx: JsxFactory): Prom
230
481
  }
231
482
  if (notification.type !== "action") return false;
232
483
  if (notification.payload.action === "show-status-dialog") {
233
- return showStatus(notification.payload.diagnostics === true, target);
484
+ return showStatus(target);
234
485
  }
235
486
  if (notification.payload.action === "show-recomp-dialog") return showRecomp(target);
236
487
  if (notification.payload.action === "refresh-sidebar" && target) {
237
- await refresh(target, true);
488
+ if (mountedSidebar) mountedSidebar.refresh();
489
+ else await refresh(target, true);
238
490
  return true;
239
491
  }
240
492
  if (notification.payload.action === "show-result-dialog") {
@@ -255,6 +507,10 @@ export async function setupWithJsx(context: V2TuiContext, jsx: JsxFactory): Prom
255
507
 
256
508
  return () => {
257
509
  unregisterSlot();
510
+ mountedSidebar?.dispose();
511
+ mountedSidebar = null;
512
+ statusDialog = null;
513
+ unregisterKeymapSlot?.();
258
514
  stopListening();
259
515
  stopNotificationSocket();
260
516
  closeRpc();
@@ -0,0 +1,59 @@
1
+ /** Typed view of load-compiled-sidebar.mjs; see that file for why it is untyped JS. */
2
+
3
+ /** The colour table the OpenCode 1 sidebar reads (OpenTUI RGBA or a hex string). */
4
+ export type V1ThemeColor = { r: number; g: number; b: number; a?: number } | string;
5
+
6
+ export type V1Theme = Record<
7
+ | "text"
8
+ | "textMuted"
9
+ | "accent"
10
+ | "background"
11
+ | "borderActive"
12
+ | "error"
13
+ | "warning"
14
+ | "success",
15
+ V1ThemeColor
16
+ >;
17
+
18
+ /**
19
+ * The v1 event object as the sidebar component reads it. It only ever pulls a
20
+ * session id out of these three fields.
21
+ */
22
+ export interface V1Event {
23
+ readonly properties: {
24
+ readonly sessionID: string;
25
+ readonly info: { readonly id: string; readonly sessionID: string };
26
+ };
27
+ }
28
+
29
+ /** The slice of OpenCode 1's `TuiPluginApi` the sidebar component actually uses. */
30
+ export interface V1SidebarApi {
31
+ readonly state: { readonly path: { readonly directory: string } };
32
+ readonly renderer: { requestRender(): void };
33
+ readonly event: { on(type: string, handler: (event: V1Event) => void): () => void };
34
+ }
35
+
36
+ export interface V1SidebarSlot {
37
+ dispose(): void;
38
+ slots: {
39
+ sidebar_content(
40
+ context: { readonly theme: { readonly current: V1Theme } },
41
+ value: { readonly session_id: string },
42
+ ): unknown;
43
+ };
44
+ }
45
+
46
+ export interface CompiledSidebarComponent {
47
+ createSidebarContentSlot(api: V1SidebarApi): V1SidebarSlot;
48
+ refreshSidebarSnapshot(): void;
49
+ }
50
+
51
+ export interface CompiledSidebarData {
52
+ initRpcClient(directory: string): void;
53
+ closeRpc(): void;
54
+ }
55
+
56
+ export declare function loadCompiledSidebar(): Promise<{
57
+ component: CompiledSidebarComponent;
58
+ data: CompiledSidebarData;
59
+ }>;
@@ -0,0 +1,24 @@
1
+ // Loads the precompiled OpenCode 1 sidebar for the OpenCode 2 slot mount.
2
+ //
3
+ // This lives in a .mjs file on purpose. `src/tui-compiled/slots/sidebar-content.tsx`
4
+ // is Solid-transform output that the package never typechecks or compiles — it
5
+ // is shipped verbatim and executed by the host — and a TypeScript file importing
6
+ // a .tsx path forces `--jsx` on the whole program, which would pull that
7
+ // generated file into the type graph. Keeping the import here is the same
8
+ // arrangement `src/tui/entry.mjs` already uses for the v1 entry; the typed view
9
+ // of this module is the sibling load-compiled-sidebar.d.mts.
10
+ //
11
+ // Explicit extensions match entry.mjs: the host resolves these paths directly,
12
+ // with no bundler step to fill an extension in.
13
+
14
+ /**
15
+ * Imports the compiled sidebar component and the RPC data-layer copy that
16
+ * compiled tree carries. Rejects when the host registers no
17
+ * `opentui:runtime-module:*` virtual modules to resolve the component's runtime
18
+ * imports through; the caller answers that case with the text projection.
19
+ */
20
+ export async function loadCompiledSidebar() {
21
+ const component = await import("../../tui-compiled/slots/sidebar-content.tsx");
22
+ const data = await import("../../tui-compiled/data/context-db.ts");
23
+ return { component, data };
24
+ }