@cortexkit/opencode-magic-context 0.44.3 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (701) hide show
  1. package/dist/agents/hidden-agent-registrations.d.ts +3 -2
  2. package/dist/agents/hidden-agent-registrations.d.ts.map +1 -1
  3. package/dist/agents/magic-context-prompt.d.ts +1 -0
  4. package/dist/agents/magic-context-prompt.d.ts.map +1 -1
  5. package/dist/agents/permissions.d.ts +8 -28
  6. package/dist/agents/permissions.d.ts.map +1 -1
  7. package/dist/{announcement-n8hs7kjw.js → announcement-f75t58v9.js} +4 -2
  8. package/dist/config/index.d.ts.map +1 -1
  9. package/dist/config/project-security.d.ts +48 -0
  10. package/dist/config/project-security.d.ts.map +1 -1
  11. package/dist/config/raw-loader.d.ts.map +1 -1
  12. package/dist/config/schema/magic-context.d.ts +10 -7
  13. package/dist/config/schema/magic-context.d.ts.map +1 -1
  14. package/dist/{conflict-warning-hook-hmpzxep6.js → conflict-warning-hook-5yrz2r24.js} +10 -6
  15. package/dist/{derive-budgets-vjmvh6pz.js → derive-budgets-a63zsm5c.js} +4 -4
  16. package/dist/embedding-worker.js +49 -0
  17. package/dist/emscripten-module-0g8f45e6.js +602 -0
  18. package/dist/emscripten-module-0pekdjxz.js +1532 -0
  19. package/dist/emscripten-module-e67xwsp3.js +503 -0
  20. package/dist/emscripten-module-pj1vyb44.js +4559 -0
  21. package/dist/features/magic-context/compartment-chunk-embedding.d.ts +23 -3
  22. package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
  23. package/dist/features/magic-context/compartment-embedding.d.ts.map +1 -1
  24. package/dist/features/magic-context/compartment-storage.d.ts +14 -3
  25. package/dist/features/magic-context/compartment-storage.d.ts.map +1 -1
  26. package/dist/features/magic-context/context-store-uuid.d.ts +7 -0
  27. package/dist/features/magic-context/context-store-uuid.d.ts.map +1 -0
  28. package/dist/features/magic-context/dreamer/classify.d.ts +1 -3
  29. package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
  30. package/dist/features/magic-context/dreamer/cron.d.ts +5 -4
  31. package/dist/features/magic-context/dreamer/cron.d.ts.map +1 -1
  32. package/dist/features/magic-context/dreamer/docs-proposals.d.ts.map +1 -1
  33. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
  34. package/dist/features/magic-context/dreamer/expire-memories.d.ts.map +1 -1
  35. package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts +24 -0
  36. package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts.map +1 -0
  37. package/dist/features/magic-context/dreamer/manual-summary.d.ts.map +1 -1
  38. package/dist/features/magic-context/dreamer/map-memories.d.ts +5 -5
  39. package/dist/features/magic-context/dreamer/map-memories.d.ts.map +1 -1
  40. package/dist/features/magic-context/dreamer/module-apply.d.ts +4 -25
  41. package/dist/features/magic-context/dreamer/module-apply.d.ts.map +1 -1
  42. package/dist/features/magic-context/dreamer/retrospective-learnings.d.ts.map +1 -1
  43. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts +5 -1
  44. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
  45. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts +12 -5
  46. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts.map +1 -1
  47. package/dist/features/magic-context/dreamer/task-executor.d.ts +6 -0
  48. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  49. package/dist/features/magic-context/dreamer/task-gates.d.ts +34 -0
  50. package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
  51. package/dist/features/magic-context/dreamer/task-prompts.d.ts +1 -1
  52. package/dist/features/magic-context/dreamer/task-prompts.d.ts.map +1 -1
  53. package/dist/features/magic-context/dreamer/task-registry.d.ts +7 -5
  54. package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
  55. package/dist/features/magic-context/dreamer/task-scheduler.d.ts +10 -3
  56. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  57. package/dist/features/magic-context/dreamer/token-budget.d.ts +3 -0
  58. package/dist/features/magic-context/dreamer/token-budget.d.ts.map +1 -1
  59. package/dist/features/magic-context/dreamer/verify.d.ts +2 -2
  60. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  61. package/dist/features/magic-context/git-commits/git-log-reader.d.ts +11 -2
  62. package/dist/features/magic-context/git-commits/git-log-reader.d.ts.map +1 -1
  63. package/dist/features/magic-context/git-commits/indexer.d.ts.map +1 -1
  64. package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
  65. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts +2 -0
  66. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts.map +1 -1
  67. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts +6 -0
  68. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts.map +1 -0
  69. package/dist/features/magic-context/lkg-prefix-chunks.d.ts +53 -0
  70. package/dist/features/magic-context/lkg-prefix-chunks.d.ts.map +1 -0
  71. package/dist/features/magic-context/memory/embedding-backfill.d.ts.map +1 -1
  72. package/dist/features/magic-context/memory/embedding-local.d.ts +8 -0
  73. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  74. package/dist/features/magic-context/memory/embedding-openai.d.ts +1 -0
  75. package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
  76. package/dist/features/magic-context/memory/embedding-worker-client.d.ts +27 -0
  77. package/dist/features/magic-context/memory/embedding-worker-client.d.ts.map +1 -0
  78. package/dist/features/magic-context/memory/embedding-worker.d.ts +2 -0
  79. package/dist/features/magic-context/memory/embedding-worker.d.ts.map +1 -0
  80. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts +2 -0
  81. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts.map +1 -0
  82. package/dist/features/magic-context/memory/memory-selection.d.ts.map +1 -1
  83. package/dist/features/magic-context/memory/project-identity-cache.d.ts +4 -3
  84. package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
  85. package/dist/features/magic-context/memory/project-identity.d.ts +5 -4
  86. package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -1
  87. package/dist/features/magic-context/memory/storage-memory-fts.d.ts.map +1 -1
  88. package/dist/features/magic-context/memory/visibility.d.ts +1 -1
  89. package/dist/features/magic-context/memory/visibility.d.ts.map +1 -1
  90. package/dist/features/magic-context/message-fts-rowid-map.d.ts +14 -1
  91. package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -1
  92. package/dist/features/magic-context/message-fts-session-filter.d.ts +14 -0
  93. package/dist/features/magic-context/message-fts-session-filter.d.ts.map +1 -0
  94. package/dist/features/magic-context/message-index.d.ts +1 -7
  95. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  96. package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -1
  97. package/dist/features/magic-context/migration-v94-write-split.d.ts +62 -0
  98. package/dist/features/magic-context/migration-v94-write-split.d.ts.map +1 -0
  99. package/dist/features/magic-context/migration-worker-client.d.ts +23 -0
  100. package/dist/features/magic-context/migration-worker-client.d.ts.map +1 -0
  101. package/dist/features/magic-context/migration-worker-protocol.d.ts +30 -0
  102. package/dist/features/magic-context/migration-worker-protocol.d.ts.map +1 -0
  103. package/dist/features/magic-context/migration-worker.d.ts +2 -0
  104. package/dist/features/magic-context/migration-worker.d.ts.map +1 -0
  105. package/dist/features/magic-context/migrations.d.ts +7 -0
  106. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  107. package/dist/features/magic-context/mural/render-mural.d.ts +24 -2
  108. package/dist/features/magic-context/mural/render-mural.d.ts.map +1 -1
  109. package/dist/features/magic-context/mural/render-trigger.d.ts +1 -1
  110. package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
  111. package/dist/features/magic-context/overflow-detection.d.ts +18 -7
  112. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
  113. package/dist/features/magic-context/project-embedding-registry.d.ts +2 -0
  114. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  115. package/dist/features/magic-context/range-parser.d.ts +2 -3
  116. package/dist/features/magic-context/range-parser.d.ts.map +1 -1
  117. package/dist/features/magic-context/resolve-subagent-fallback.d.ts +2 -0
  118. package/dist/features/magic-context/resolve-subagent-fallback.d.ts.map +1 -1
  119. package/dist/features/magic-context/scheduler.d.ts +2 -0
  120. package/dist/features/magic-context/scheduler.d.ts.map +1 -1
  121. package/dist/features/magic-context/search.d.ts +7 -0
  122. package/dist/features/magic-context/search.d.ts.map +1 -1
  123. package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -1
  124. package/dist/features/magic-context/session-project-storage.d.ts +10 -1
  125. package/dist/features/magic-context/session-project-storage.d.ts.map +1 -1
  126. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts +1 -1
  127. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts.map +1 -1
  128. package/dist/features/magic-context/smart-notes/compiler.d.ts +4 -0
  129. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  130. package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
  131. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts +2 -0
  132. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts.map +1 -1
  133. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts +10 -8
  134. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts.map +1 -1
  135. package/dist/features/magic-context/smart-notes/storage.d.ts +2 -2
  136. package/dist/features/magic-context/smart-notes/storage.d.ts.map +1 -1
  137. package/dist/features/magic-context/smart-notes/types.d.ts +7 -2
  138. package/dist/features/magic-context/smart-notes/types.d.ts.map +1 -1
  139. package/dist/features/magic-context/storage-caveman-rules.d.ts +21 -0
  140. package/dist/features/magic-context/storage-caveman-rules.d.ts.map +1 -0
  141. package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
  142. package/dist/features/magic-context/storage-compartment-history-version.d.ts +4 -0
  143. package/dist/features/magic-context/storage-compartment-history-version.d.ts.map +1 -0
  144. package/dist/features/magic-context/storage-db.d.ts +68 -3
  145. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  146. package/dist/features/magic-context/storage-identity-merge.d.ts +6 -0
  147. package/dist/features/magic-context/storage-identity-merge.d.ts.map +1 -1
  148. package/dist/features/magic-context/storage-meta-persisted.d.ts +15 -0
  149. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  150. package/dist/features/magic-context/storage-meta-session.d.ts +1 -1
  151. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  152. package/dist/features/magic-context/storage-meta-shared.d.ts +1 -1
  153. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  154. package/dist/features/magic-context/storage-notes.d.ts +2 -2
  155. package/dist/features/magic-context/storage-notes.d.ts.map +1 -1
  156. package/dist/features/magic-context/storage-reasoning-removal.d.ts +30 -0
  157. package/dist/features/magic-context/storage-reasoning-removal.d.ts.map +1 -0
  158. package/dist/features/magic-context/storage-replay-document.d.ts +42 -5
  159. package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
  160. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  161. package/dist/features/magic-context/storage-tags.d.ts +7 -1
  162. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  163. package/dist/features/magic-context/storage.d.ts +1 -1
  164. package/dist/features/magic-context/storage.d.ts.map +1 -1
  165. package/dist/features/magic-context/store-generation-rebase.d.ts.map +1 -1
  166. package/dist/features/magic-context/tag-input.d.ts +4 -0
  167. package/dist/features/magic-context/tag-input.d.ts.map +1 -0
  168. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  169. package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
  170. package/dist/features/magic-context/user-memory/storage-user-memory.d.ts.map +1 -1
  171. package/dist/features/magic-context/v22-deferred-backfill.d.ts.map +1 -1
  172. package/dist/ffi-3cx1cxpk.js +78 -0
  173. package/dist/ffi-7bqqe4cd.js +91 -0
  174. package/dist/ffi-7e6gryj5.js +91 -0
  175. package/dist/ffi-bpvkebwr.js +78 -0
  176. package/dist/hooks/magic-context/apply-operations.d.ts +9 -1
  177. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  178. package/dist/hooks/magic-context/auto-search-deadline.d.ts +10 -0
  179. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -0
  180. package/dist/hooks/magic-context/auto-search-hint.d.ts +3 -0
  181. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
  182. package/dist/hooks/magic-context/auto-search-runner.d.ts +3 -0
  183. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  184. package/dist/hooks/magic-context/caveman-cleanup.d.ts +8 -1
  185. package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -1
  186. package/dist/hooks/magic-context/caveman.d.ts +56 -1
  187. package/dist/hooks/magic-context/caveman.d.ts.map +1 -1
  188. package/dist/hooks/magic-context/child-session-spawn.d.ts +2 -0
  189. package/dist/hooks/magic-context/child-session-spawn.d.ts.map +1 -1
  190. package/dist/hooks/magic-context/command-handler.d.ts +1 -1
  191. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  192. package/dist/hooks/magic-context/compaction-marker-manager.d.ts +1 -1
  193. package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
  194. package/dist/hooks/magic-context/compartment-parser.d.ts +3 -3
  195. package/dist/hooks/magic-context/compartment-parser.d.ts.map +1 -1
  196. package/dist/hooks/magic-context/compartment-render-epoch.d.ts +12 -1
  197. package/dist/hooks/magic-context/compartment-render-epoch.d.ts.map +1 -1
  198. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  199. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +0 -1
  200. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  201. package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -1
  202. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  203. package/dist/hooks/magic-context/compartment-runner-types.d.ts +3 -0
  204. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  205. package/dist/hooks/magic-context/compartment-runner-validation.d.ts +6 -0
  206. package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -1
  207. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  208. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +35 -0
  209. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -0
  210. package/dist/hooks/magic-context/derive-budgets.d.ts.map +1 -1
  211. package/dist/hooks/magic-context/drop-stale-reduce-calls.d.ts.map +1 -1
  212. package/dist/hooks/magic-context/dropped-input-guard.d.ts.map +1 -1
  213. package/dist/hooks/magic-context/embed-history-runner.d.ts.map +1 -1
  214. package/dist/hooks/magic-context/emergency-drop.d.ts +15 -0
  215. package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
  216. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  217. package/dist/hooks/magic-context/event-resolvers.d.ts +7 -0
  218. package/dist/hooks/magic-context/event-resolvers.d.ts.map +1 -1
  219. package/dist/hooks/magic-context/execute-status.d.ts +1 -0
  220. package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
  221. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +17 -0
  222. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  223. package/dist/hooks/magic-context/heuristic-cleanup.d.ts +2 -0
  224. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
  225. package/dist/hooks/magic-context/historian-host-runner.d.ts +5 -0
  226. package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
  227. package/dist/hooks/magic-context/historian-prompt-fit.d.ts +116 -0
  228. package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -0
  229. package/dist/hooks/magic-context/historian-prompt.generated.d.ts +1 -1
  230. package/dist/hooks/magic-context/historian-prompt.generated.d.ts.map +1 -1
  231. package/dist/hooks/magic-context/history-boundary-repair.d.ts +44 -0
  232. package/dist/hooks/magic-context/history-boundary-repair.d.ts.map +1 -0
  233. package/dist/hooks/magic-context/hook.d.ts +4 -0
  234. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  235. package/dist/hooks/magic-context/inject-compartments.d.ts +13 -0
  236. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  237. package/dist/hooks/magic-context/lkg-persist.d.ts +12 -0
  238. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  239. package/dist/hooks/magic-context/lkg-replay-fit.d.ts +104 -0
  240. package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -0
  241. package/dist/hooks/magic-context/lkg-replay.d.ts +64 -0
  242. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  243. package/dist/hooks/magic-context/module-client.d.ts.map +1 -1
  244. package/dist/hooks/magic-context/module-state-sync-timing.d.ts +1 -1
  245. package/dist/hooks/magic-context/module-state-sync-timing.d.ts.map +1 -1
  246. package/dist/hooks/magic-context/module-state-sync.d.ts +6 -68
  247. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  248. package/dist/hooks/magic-context/module-tool-backends.d.ts +1 -34
  249. package/dist/hooks/magic-context/module-tool-backends.d.ts.map +1 -1
  250. package/dist/hooks/magic-context/module-transport.d.ts +1 -55
  251. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  252. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  253. package/dist/hooks/magic-context/note-nudger.d.ts +2 -0
  254. package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
  255. package/dist/hooks/magic-context/pass-outcome.d.ts +59 -2
  256. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
  257. package/dist/hooks/magic-context/producer-window-guard.d.ts +6 -0
  258. package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -1
  259. package/dist/hooks/magic-context/read-session-chunk.d.ts +17 -4
  260. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  261. package/dist/hooks/magic-context/read-session-formatting.d.ts +11 -0
  262. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  263. package/dist/hooks/magic-context/read-session-raw.d.ts +2 -2
  264. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
  265. package/dist/hooks/magic-context/reasoning-removal.d.ts +60 -0
  266. package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -0
  267. package/dist/hooks/magic-context/recomp-orchestrator.d.ts +1 -0
  268. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
  269. package/dist/hooks/magic-context/reference-retrieval.d.ts +1 -1
  270. package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -1
  271. package/dist/hooks/magic-context/reply-pages.d.ts +3 -0
  272. package/dist/hooks/magic-context/reply-pages.d.ts.map +1 -0
  273. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts +62 -0
  274. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts.map +1 -0
  275. package/dist/hooks/magic-context/rust-mode-transform.d.ts +17 -85
  276. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  277. package/dist/hooks/magic-context/send-session-notification.d.ts.map +1 -1
  278. package/dist/hooks/magic-context/sentinel.d.ts +35 -0
  279. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
  280. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +28 -0
  281. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -0
  282. package/dist/hooks/magic-context/single-store-refusal.d.ts +14 -0
  283. package/dist/hooks/magic-context/single-store-refusal.d.ts.map +1 -0
  284. package/dist/hooks/magic-context/storage-busy-refusal.d.ts +7 -0
  285. package/dist/hooks/magic-context/storage-busy-refusal.d.ts.map +1 -1
  286. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  287. package/dist/hooks/magic-context/stripped-command.d.ts +1 -1
  288. package/dist/hooks/magic-context/stripped-command.d.ts.map +1 -1
  289. package/dist/hooks/magic-context/system-injection-stripper.d.ts +7 -0
  290. package/dist/hooks/magic-context/system-injection-stripper.d.ts.map +1 -1
  291. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  292. package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -1
  293. package/dist/hooks/magic-context/tag-id-fallback.d.ts.map +1 -1
  294. package/dist/hooks/magic-context/tag-messages.d.ts +18 -1
  295. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  296. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  297. package/dist/hooks/magic-context/tokenizer-calibration.d.ts +1 -1
  298. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  299. package/dist/hooks/magic-context/transform-compartment-phase.d.ts +1 -0
  300. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  301. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +38 -4
  302. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  303. package/dist/hooks/magic-context/transform.d.ts +12 -39
  304. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  305. package/dist/hooks/magic-context/unmanaged-over-window.d.ts +36 -0
  306. package/dist/hooks/magic-context/unmanaged-over-window.d.ts.map +1 -0
  307. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts +15 -0
  308. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts.map +1 -0
  309. package/dist/hooks/magic-context/user-profile-render.d.ts +3 -0
  310. package/dist/hooks/magic-context/user-profile-render.d.ts.map +1 -0
  311. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  312. package/dist/{index-yhm60r53.js → index-16ny736w.js} +13622 -28584
  313. package/dist/{index-q5p1aqvv.js → index-2aq21j41.js} +1208 -429
  314. package/dist/{index-32b096cc.js → index-2ntg5sd4.js} +6 -2
  315. package/dist/index-4krbw8z9.js +6034 -0
  316. package/dist/{index-33q7s9y2.js → index-75zjgwga.js} +61 -85
  317. package/dist/{index-nf9sk8sh.js → index-8fgkmxmy.js} +28 -10
  318. package/dist/index-a4m2b1yv.js +530 -0
  319. package/dist/index-anq4nn6f.js +131 -0
  320. package/dist/index-avwt563y.js +62 -0
  321. package/dist/index-bmzf7zxv.js +445 -0
  322. package/dist/index-e44zzy84.js +10 -0
  323. package/dist/index-en1k8h8m.js +244 -0
  324. package/dist/{index-638hf49n.js → index-f85teqck.js} +15 -6
  325. package/dist/index-fr2z4qy8.js +7810 -0
  326. package/dist/{index-kwe03yde.js → index-fzbvakh0.js} +1 -1
  327. package/dist/{module-asyncify-2EFITU5U-rkqjhjxd.js → index-g20jdh0p.js} +114 -105
  328. package/dist/index-gd5qx1j9.js +398 -0
  329. package/dist/{index-3bygzk2d.js → index-hybnrwq0.js} +169 -4
  330. package/dist/{index-jqcbs2k1.js → index-mc22ayvf.js} +24 -5
  331. package/dist/{index-y5145x8k.js → index-n96ag4rk.js} +15 -1
  332. package/dist/index-q7yesyk9.js +9118 -0
  333. package/dist/index-remp7e2g.js +214 -0
  334. package/dist/{index-7k55qm8a.js → index-sfpzqvdz.js} +8 -8
  335. package/dist/{index-9y5p0d50.js → index-vvtfyw1z.js} +13 -76
  336. package/dist/index-w9jwmntv.js +202 -0
  337. package/dist/{index-kr5qehbd.js → index-x23gah8c.js} +1 -1
  338. package/dist/{index-jdxxq8cz.js → index-x8a7jmkh.js} +6 -1
  339. package/dist/{index-rdsaxnf2.js → index-xgt9k6c6.js} +23 -12
  340. package/dist/index-y8v6yerm.js +77 -0
  341. package/dist/index.d.ts.map +1 -1
  342. package/dist/index.js +7560 -8084
  343. package/dist/message-time-backfill-an311pmk.js +124 -0
  344. package/dist/migration-worker.js +53 -0
  345. package/dist/{model-resolution-dxatzjde.js → model-resolution-xhfmyyvy.js} +5 -1
  346. package/dist/module-ES6BEMUI-3cet1pyp.js +12 -0
  347. package/dist/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  348. package/dist/plugin/boot-deadline.d.ts.map +1 -1
  349. package/dist/plugin/conflict-warning-hook.d.ts.map +1 -1
  350. package/dist/plugin/dream-timer-module-client.d.ts +1 -11
  351. package/dist/plugin/dream-timer-module-client.d.ts.map +1 -1
  352. package/dist/plugin/dream-timer.d.ts.map +1 -1
  353. package/dist/plugin/hooks/create-session-hooks.d.ts +8 -0
  354. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  355. package/dist/plugin/messages-transform.d.ts +20 -13
  356. package/dist/plugin/messages-transform.d.ts.map +1 -1
  357. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  358. package/dist/plugin/stale-build-notice.d.ts +16 -0
  359. package/dist/plugin/stale-build-notice.d.ts.map +1 -0
  360. package/dist/read-session-chunk-8rxs0tc9.js +84 -0
  361. package/dist/recomp-orchestrator-nzamtw29.js +39 -0
  362. package/dist/{rpc-notifications-4amf6mf4.js → rpc-notifications-3hed126v.js} +3 -1
  363. package/dist/{safe-notification-target-50gm9c58.js → safe-notification-target-43r8jsxw.js} +3 -3
  364. package/dist/send-session-notification-nqpv7cne.js +28 -0
  365. package/dist/shared/assistant-message-extractor.d.ts +4 -0
  366. package/dist/shared/assistant-message-extractor.d.ts.map +1 -1
  367. package/dist/shared/background-batch-drain.d.ts +8 -0
  368. package/dist/shared/background-batch-drain.d.ts.map +1 -0
  369. package/dist/{features/builtin-commands/commands.d.ts → shared/builtin-commands.d.ts} +1 -1
  370. package/dist/shared/builtin-commands.d.ts.map +1 -0
  371. package/dist/shared/embedding-activity.d.ts +13 -0
  372. package/dist/shared/embedding-activity.d.ts.map +1 -0
  373. package/dist/shared/historian-tool-expansions.d.ts +5 -0
  374. package/dist/shared/historian-tool-expansions.d.ts.map +1 -0
  375. package/dist/shared/historian-tool-template.d.ts +5 -0
  376. package/dist/shared/historian-tool-template.d.ts.map +1 -0
  377. package/dist/shared/historian-transient-error.d.ts +2 -0
  378. package/dist/shared/historian-transient-error.d.ts.map +1 -0
  379. package/dist/shared/jsonc-edit.d.ts.map +1 -1
  380. package/dist/shared/logger.d.ts +7 -0
  381. package/dist/shared/logger.d.ts.map +1 -1
  382. package/dist/shared/model-suggestion-retry.d.ts +2 -1
  383. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  384. package/dist/shared/models-dev-cache.d.ts.map +1 -1
  385. package/dist/shared/off-thread-migration-clock.d.ts +38 -0
  386. package/dist/shared/off-thread-migration-clock.d.ts.map +1 -0
  387. package/dist/shared/plugin-package-version.d.ts +14 -0
  388. package/dist/shared/plugin-package-version.d.ts.map +1 -0
  389. package/dist/shared/project-directory-key.d.ts +26 -0
  390. package/dist/shared/project-directory-key.d.ts.map +1 -0
  391. package/dist/shared/prompt-async-transport.d.ts +4 -0
  392. package/dist/shared/prompt-async-transport.d.ts.map +1 -1
  393. package/dist/shared/prompt-surface-runtime.d.ts +3 -3
  394. package/dist/shared/provider-response-completion.d.ts +12 -0
  395. package/dist/shared/provider-response-completion.d.ts.map +1 -0
  396. package/dist/shared/redaction.d.ts.map +1 -1
  397. package/dist/shared/rpc-client.d.ts +23 -2
  398. package/dist/shared/rpc-client.d.ts.map +1 -1
  399. package/dist/shared/rpc-types.d.ts +19 -0
  400. package/dist/shared/rpc-types.d.ts.map +1 -1
  401. package/dist/shared/rpc-utils.d.ts +41 -0
  402. package/dist/shared/rpc-utils.d.ts.map +1 -1
  403. package/dist/shared/sqlite.d.ts +13 -2
  404. package/dist/shared/sqlite.d.ts.map +1 -1
  405. package/dist/shared/stale-plugin-build.d.ts +21 -0
  406. package/dist/shared/stale-plugin-build.d.ts.map +1 -0
  407. package/dist/shared/status-summary.d.ts +29 -0
  408. package/dist/shared/status-summary.d.ts.map +1 -1
  409. package/dist/shared/status-view-check.d.ts +124 -0
  410. package/dist/shared/status-view-check.d.ts.map +1 -0
  411. package/dist/shared/status-view.d.ts +38 -2
  412. package/dist/shared/status-view.d.ts.map +1 -1
  413. package/dist/shared/tag-owner-id.d.ts +19 -0
  414. package/dist/shared/tag-owner-id.d.ts.map +1 -0
  415. package/dist/shared/tag-transcript.d.ts +2 -1
  416. package/dist/shared/tag-transcript.d.ts.map +1 -1
  417. package/dist/shared/test-temp-dir.d.ts +8 -2
  418. package/dist/shared/test-temp-dir.d.ts.map +1 -1
  419. package/dist/shared/transcript.d.ts +2 -0
  420. package/dist/shared/transcript.d.ts.map +1 -1
  421. package/dist/shared/user-answer.d.ts +4 -0
  422. package/dist/shared/user-answer.d.ts.map +1 -0
  423. package/dist/shared/user-facing-codes.d.ts +41 -6
  424. package/dist/shared/user-facing-codes.d.ts.map +1 -1
  425. package/dist/shared/xml-unescape.d.ts +9 -0
  426. package/dist/shared/xml-unescape.d.ts.map +1 -0
  427. package/dist/task-config-v81k8jvk.js +17 -0
  428. package/dist/tools/ctx-expand/constants.d.ts +1 -1
  429. package/dist/tools/ctx-expand/constants.d.ts.map +1 -1
  430. package/dist/tools/ctx-expand/mode.d.ts +4 -0
  431. package/dist/tools/ctx-expand/mode.d.ts.map +1 -1
  432. package/dist/tools/ctx-expand/render.d.ts +5 -1
  433. package/dist/tools/ctx-expand/render.d.ts.map +1 -1
  434. package/dist/tools/ctx-expand/tools.d.ts +2 -0
  435. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  436. package/dist/tools/ctx-expand/types.d.ts +1 -0
  437. package/dist/tools/ctx-expand/types.d.ts.map +1 -1
  438. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  439. package/dist/tools/ctx-note/render.d.ts +2 -0
  440. package/dist/tools/ctx-note/render.d.ts.map +1 -1
  441. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  442. package/dist/tools/ctx-reduce/constants.d.ts +1 -1
  443. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
  444. package/dist/tools/ctx-search/constants.d.ts +1 -1
  445. package/dist/tools/ctx-search/constants.d.ts.map +1 -1
  446. package/dist/tools/light-descriptions.d.ts +3 -3
  447. package/dist/tools/light-descriptions.d.ts.map +1 -1
  448. package/dist/tools/parameter-descriptions.d.ts +14 -14
  449. package/dist/transform-postprocess-phase-414phndq.js +61 -0
  450. package/dist/tui/data/context-db.d.ts +34 -10
  451. package/dist/tui/data/context-db.d.ts.map +1 -1
  452. package/dist/tui/data/notification-socket.d.ts +6 -0
  453. package/dist/tui/data/notification-socket.d.ts.map +1 -1
  454. package/dist/tui/data/session-directory.d.ts +16 -0
  455. package/dist/tui/data/session-directory.d.ts.map +1 -0
  456. package/dist/tui-compiled/data/context-db.d.ts +34 -10
  457. package/dist/tui-compiled/data/context-db.d.ts.map +1 -1
  458. package/dist/tui-compiled/data/notification-socket.d.ts +6 -0
  459. package/dist/tui-compiled/data/notification-socket.d.ts.map +1 -1
  460. package/dist/tui-compiled/data/session-directory.d.ts +16 -0
  461. package/dist/tui-compiled/data/session-directory.d.ts.map +1 -0
  462. package/dist/v2/derive-budgets-v0krf3t7.js +18 -0
  463. package/dist/v2/embedding-worker.js +47 -0
  464. package/dist/v2/emscripten-module-0g8f45e6.js +602 -0
  465. package/dist/v2/emscripten-module-0pekdjxz.js +1532 -0
  466. package/dist/v2/emscripten-module-e67xwsp3.js +503 -0
  467. package/dist/v2/emscripten-module-pj1vyb44.js +4559 -0
  468. package/dist/v2/ffi-3cx1cxpk.js +78 -0
  469. package/dist/v2/ffi-7bqqe4cd.js +91 -0
  470. package/dist/v2/ffi-7e6gryj5.js +91 -0
  471. package/dist/v2/ffi-bpvkebwr.js +78 -0
  472. package/dist/v2/fold/boundary.d.ts.map +1 -1
  473. package/dist/v2/fork-inheritance.d.ts +101 -0
  474. package/dist/v2/fork-inheritance.d.ts.map +1 -0
  475. package/dist/v2/hidden-child-cleanup.d.ts +11 -0
  476. package/dist/v2/hidden-child-cleanup.d.ts.map +1 -0
  477. package/dist/v2/hidden-child-native.d.ts +29 -0
  478. package/dist/v2/hidden-child-native.d.ts.map +1 -0
  479. package/dist/v2/hidden-child-record.d.ts +135 -0
  480. package/dist/v2/hidden-child-record.d.ts.map +1 -0
  481. package/dist/v2/hidden-completion.d.ts +12 -97
  482. package/dist/v2/hidden-completion.d.ts.map +1 -1
  483. package/dist/v2/hooks/context.d.ts +20 -8
  484. package/dist/v2/hooks/context.d.ts.map +1 -1
  485. package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
  486. package/dist/v2/hooks/dream-trigger.d.ts +5 -0
  487. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  488. package/dist/v2/hooks/generate.d.ts +10 -0
  489. package/dist/v2/hooks/generate.d.ts.map +1 -0
  490. package/dist/v2/hooks/hidden-child.d.ts +33 -2
  491. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  492. package/dist/v2/hooks/payload.d.ts +3 -0
  493. package/dist/v2/hooks/payload.d.ts.map +1 -1
  494. package/dist/v2/hooks/session-api-gate.d.ts +4 -0
  495. package/dist/v2/hooks/session-api-gate.d.ts.map +1 -0
  496. package/dist/v2/hooks/storage-gate.d.ts +3 -1
  497. package/dist/v2/hooks/storage-gate.d.ts.map +1 -1
  498. package/dist/v2/hooks/store.d.ts +1 -1
  499. package/dist/v2/hooks/store.d.ts.map +1 -1
  500. package/dist/v2/hooks/tools.d.ts.map +1 -1
  501. package/dist/v2/hooks/types.d.ts +10 -0
  502. package/dist/v2/hooks/types.d.ts.map +1 -1
  503. package/dist/v2/hooks/update-check.d.ts.map +1 -1
  504. package/dist/v2/hooks/usage-persist.d.ts.map +1 -1
  505. package/dist/v2/hooks/usage-reading.d.ts +4 -0
  506. package/dist/v2/hooks/usage-reading.d.ts.map +1 -1
  507. package/dist/v2/index-6e4mwffh.js +5662 -0
  508. package/dist/v2/index-en1k8h8m.js +244 -0
  509. package/dist/{message-time-backfill-q374fxc5.js → v2/message-time-backfill-0n93vrd7.js} +19 -5
  510. package/dist/v2/migration-worker.js +52 -0
  511. package/dist/v2/model-resolution-xhfmyyvy.js +16 -0
  512. package/dist/v2/module-ES6BEMUI-3cet1pyp.js +12 -0
  513. package/dist/v2/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  514. package/dist/v2/prompt-context-5y5ms8f9.js +6 -0
  515. package/dist/{read-session-chunk-n072mcq4.js → v2/read-session-chunk-hjza38hr.js} +24 -7
  516. package/dist/v2/recomp-orchestrator-1aq7h44c.js +36 -0
  517. package/dist/v2/retrospective-raw-provider.d.ts +21 -0
  518. package/dist/v2/retrospective-raw-provider.d.ts.map +1 -0
  519. package/dist/v2/rpc-notifications-3hed126v.js +16 -0
  520. package/dist/v2/safe-notification-target-wtj0bbc2.js +9 -0
  521. package/dist/{send-session-notification-04hvd54c.js → v2/send-session-notification-mq9frrtm.js} +10 -5
  522. package/dist/v2/server-0jqw05sa.js +803 -0
  523. package/dist/v2/server-5317ykaf.js +40 -0
  524. package/dist/v2/server-a4m2b1yv.js +530 -0
  525. package/dist/v2/server-avwt563y.js +62 -0
  526. package/dist/v2/server-c4g2y1z8.js +28824 -0
  527. package/dist/v2/server-ckpc8pxy.js +662 -0
  528. package/dist/v2/server-e36nf2p1.js +7702 -0
  529. package/dist/v2/server-e44zzy84.js +10 -0
  530. package/dist/v2/server-fgmxwrgy.js +16 -0
  531. package/dist/v2/server-fmsr7v69.js +75 -0
  532. package/dist/v2/server-g20jdh0p.js +1273 -0
  533. package/dist/{index-dgg5y7er.js → v2/server-hfjfbg59.js} +849 -747
  534. package/dist/v2/server-n96ag4rk.js +633 -0
  535. package/dist/v2/server-qdjnb2z1.js +181 -0
  536. package/dist/v2/server-qpg6wf72.js +187 -0
  537. package/dist/v2/server-r7cmye3k.js +131 -0
  538. package/dist/v2/server-remp7e2g.js +214 -0
  539. package/dist/v2/server-rhdgxp1t.js +398 -0
  540. package/dist/v2/server-sfpzqvdz.js +137 -0
  541. package/dist/v2/server-syahy8j8.js +50 -0
  542. package/dist/v2/server-v5xgft5v.js +9116 -0
  543. package/dist/v2/server-w99cyt6a.js +361 -0
  544. package/dist/v2/server-x8a7jmkh.js +104 -0
  545. package/dist/v2/server-y8v6yerm.js +77 -0
  546. package/dist/v2/server-z19x7eqz.js +423 -0
  547. package/dist/v2/server.d.ts.map +1 -1
  548. package/dist/v2/server.js +8868 -107184
  549. package/dist/v2/store-reader.d.ts +52 -1
  550. package/dist/v2/store-reader.d.ts.map +1 -1
  551. package/dist/v2/task-config-tbndqyny.js +17 -0
  552. package/dist/v2/transformers-node-wasm.js +26768 -0
  553. package/dist/v2/transformers-web.js +25670 -0
  554. package/dist/v2/transformers.node-hj754h7s.js +29997 -0
  555. package/dist/v2/tui/index.d.ts +10 -1
  556. package/dist/v2/tui/index.d.ts.map +1 -1
  557. package/dist/v2/tui/sidebar-mount.d.ts +6 -0
  558. package/dist/v2/tui/sidebar-mount.d.ts.map +1 -1
  559. package/dist/v2/tui/status-dialog-mount.d.ts +7 -4
  560. package/dist/v2/tui/status-dialog-mount.d.ts.map +1 -1
  561. package/dist/v2/tui/types.d.ts +12 -0
  562. package/dist/v2/tui/types.d.ts.map +1 -1
  563. package/dist/v2/wrapup-orchestrator-tbyx78dz.js +425 -0
  564. package/dist/wrapup-orchestrator-h28bqsy6.js +26 -0
  565. package/package.json +8 -8
  566. package/src/agents/hidden-agent-registrations.ts +24 -16
  567. package/src/agents/magic-context-prompt.test.ts +41 -0
  568. package/src/agents/magic-context-prompt.ts +8 -5
  569. package/src/agents/permissions.test.ts +31 -49
  570. package/src/agents/permissions.ts +8 -28
  571. package/src/config/index.test.ts +60 -20
  572. package/src/config/index.ts +53 -1
  573. package/src/config/live-run-config.test.ts +5 -5
  574. package/src/config/live-snapshot.test.ts +4 -4
  575. package/src/config/migrate-config-location.test.ts +3 -10
  576. package/src/config/project-config-trust-boundary.test.ts +207 -0
  577. package/src/config/project-security.hostile-matrix.test.ts +4 -4
  578. package/src/config/project-security.ts +218 -1
  579. package/src/config/protected-tokens.test.ts +14 -9
  580. package/src/config/raw-loader.test.ts +31 -3
  581. package/src/config/raw-loader.ts +8 -3
  582. package/src/config/schema/magic-context.ts +20 -3
  583. package/src/config/variable.test.ts +3 -2
  584. package/src/features/magic-context/dreamer/cron.ts +30 -9
  585. package/src/features/magic-context/dreamer/task-registry.ts +7 -5
  586. package/src/shared/announcement.test.ts +2 -1
  587. package/src/shared/assistant-message-extractor.test.ts +27 -1
  588. package/src/shared/assistant-message-extractor.ts +27 -0
  589. package/src/shared/background-batch-drain.test.ts +38 -0
  590. package/src/shared/background-batch-drain.ts +29 -0
  591. package/src/shared/builtin-commands.ts +50 -0
  592. package/src/shared/console-diagnostics-fence.test.ts +145 -0
  593. package/src/shared/data-path.test.ts +6 -5
  594. package/src/shared/embedding-activity.test.ts +21 -0
  595. package/src/shared/embedding-activity.ts +36 -0
  596. package/src/shared/historian-tool-defaults.json +13 -0
  597. package/src/shared/historian-tool-expansions.ts +18 -0
  598. package/src/shared/historian-tool-template.ts +248 -0
  599. package/src/shared/historian-transient-error.test.ts +36 -0
  600. package/src/shared/historian-transient-error.ts +22 -0
  601. package/src/shared/jsonc-edit.ts +20 -1
  602. package/src/shared/logger.test.ts +3 -2
  603. package/src/shared/logger.ts +40 -1
  604. package/src/shared/model-suggestion-retry.test.ts +46 -0
  605. package/src/shared/model-suggestion-retry.ts +16 -1
  606. package/src/shared/models-dev-cache.test.ts +74 -2
  607. package/src/shared/models-dev-cache.ts +5 -1
  608. package/src/shared/off-thread-migration-clock.test.ts +55 -0
  609. package/src/shared/off-thread-migration-clock.ts +124 -0
  610. package/src/shared/opencode-db-path.test.ts +3 -2
  611. package/src/shared/plugin-package-version.ts +52 -0
  612. package/src/shared/project-directory-key.test.ts +111 -0
  613. package/src/shared/project-directory-key.ts +54 -0
  614. package/src/shared/prompt-async-transport.test.ts +249 -72
  615. package/src/shared/prompt-async-transport.ts +131 -24
  616. package/src/shared/prompt-surface-a1-golden.md +41 -25
  617. package/src/shared/prompt-surface-runtime.test.ts +3 -3
  618. package/src/shared/provider-response-completion.ts +23 -0
  619. package/src/shared/redaction.test.ts +51 -1
  620. package/src/shared/redaction.ts +33 -0
  621. package/src/shared/rpc-async-probes.test.ts +32 -2
  622. package/src/shared/rpc-client.test.ts +3 -2
  623. package/src/shared/rpc-client.ts +76 -18
  624. package/src/shared/rpc-types.ts +15 -0
  625. package/src/shared/rpc-utils.test.ts +191 -12
  626. package/src/shared/rpc-utils.ts +184 -26
  627. package/src/shared/sqlite-acquisition-routing.test.ts +46 -3
  628. package/src/shared/sqlite-pass-scope.test.ts +3 -2
  629. package/src/shared/sqlite-transaction-mode-guard.test.ts +4 -0
  630. package/src/shared/sqlite-writer-diagnostics.test.ts +134 -0
  631. package/src/shared/sqlite.ts +225 -41
  632. package/src/shared/stale-plugin-build.test.ts +129 -0
  633. package/src/shared/stale-plugin-build.ts +151 -0
  634. package/src/shared/status-summary.ts +40 -13
  635. package/src/shared/status-view-check.test.ts +253 -0
  636. package/src/shared/status-view-check.ts +536 -0
  637. package/src/shared/status-view.test.ts +6 -1
  638. package/src/shared/status-view.ts +176 -4
  639. package/src/shared/storage-busy.test.ts +3 -2
  640. package/src/shared/tag-owner-id.test.ts +33 -0
  641. package/src/shared/tag-owner-id.ts +29 -0
  642. package/src/shared/tag-transcript.ts +17 -3
  643. package/src/shared/test-temp-dir-policy.test.ts +33 -0
  644. package/src/shared/test-temp-dir.test.ts +27 -0
  645. package/src/shared/test-temp-dir.ts +36 -12
  646. package/src/shared/transcript.ts +3 -0
  647. package/src/shared/tui-config.test.ts +6 -5
  648. package/src/shared/tui-preferences.test.ts +3 -2
  649. package/src/shared/user-answer.test.ts +40 -0
  650. package/src/shared/user-answer.ts +17 -0
  651. package/src/shared/user-facing-codes.ts +52 -6
  652. package/src/shared/window-geometry.test.ts +3 -2
  653. package/src/shared/write-transaction-attribution.test.ts +11 -7
  654. package/src/shared/write-transaction-hold-clock.test.ts +160 -0
  655. package/src/shared/xml-unescape.ts +19 -0
  656. package/src/tui/data/context-db.test.ts +92 -4
  657. package/src/tui/data/context-db.ts +184 -18
  658. package/src/tui/data/notification-socket.test.ts +49 -2
  659. package/src/tui/data/notification-socket.ts +47 -9
  660. package/src/tui/data/session-directory.ts +19 -0
  661. package/src/tui/dialogs/status-dialog-render.test.ts +284 -0
  662. package/src/tui/dialogs/status-dialog.tsx +41 -38
  663. package/src/tui/index.tsx +30 -18
  664. package/src/tui/slots/sidebar-content.tsx +9 -2
  665. package/src/tui-compiled/data/context-db.ts +184 -18
  666. package/src/tui-compiled/data/notification-socket.ts +47 -9
  667. package/src/tui-compiled/data/session-directory.ts +19 -0
  668. package/src/tui-compiled/dialogs/status-dialog.tsx +38 -29
  669. package/src/tui-compiled/index.tsx +29 -16
  670. package/src/tui-compiled/slots/sidebar-content.tsx +3 -2
  671. package/src/v2/tui/host-contract.test.ts +9 -10
  672. package/src/v2/tui/index.ts +78 -23
  673. package/src/v2/tui/load-compiled-sidebar.d.mts +5 -1
  674. package/src/v2/tui/load-compiled-status-dialog.d.mts +3 -2
  675. package/src/v2/tui/session-directory.test.ts +53 -0
  676. package/src/v2/tui/sidebar-mount.ts +19 -1
  677. package/src/v2/tui/status-dialog-mount.ts +10 -7
  678. package/src/v2/tui/types.ts +10 -0
  679. package/dist/features/builtin-commands/commands.d.ts.map +0 -1
  680. package/dist/features/builtin-commands/types.d.ts +0 -3
  681. package/dist/features/builtin-commands/types.d.ts.map +0 -1
  682. package/dist/features/magic-context/context-authority.d.ts +0 -272
  683. package/dist/features/magic-context/context-authority.d.ts.map +0 -1
  684. package/dist/features/magic-context/memory/mirror-reembed.d.ts +0 -22
  685. package/dist/features/magic-context/memory/mirror-reembed.d.ts.map +0 -1
  686. package/dist/hooks/magic-context/historian-state-file.d.ts +0 -43
  687. package/dist/hooks/magic-context/historian-state-file.d.ts.map +0 -1
  688. package/dist/index-4an2p8qa.js +0 -1056
  689. package/dist/index-rn7gafjr.js +0 -8
  690. package/dist/index-v6t0tg85.js +0 -13
  691. package/dist/plugin/memory-id-translation.d.ts +0 -109
  692. package/dist/plugin/memory-id-translation.d.ts.map +0 -1
  693. package/dist/plugin/rust-note-backend.d.ts +0 -84
  694. package/dist/plugin/rust-note-backend.d.ts.map +0 -1
  695. package/dist/recomp-orchestrator-19tr6zya.js +0 -22
  696. package/dist/task-config-2bm68628.js +0 -9
  697. package/dist/transform-postprocess-phase-z2mfc5w1.js +0 -36
  698. package/dist/v2/host-service.d.ts +0 -66
  699. package/dist/v2/host-service.d.ts.map +0 -1
  700. package/dist/wrapup-orchestrator-sy4m56a7.js +0 -19
  701. /package/dist/{index-s70wtd8k.js → index-q6hef7fh.js} +0 -0
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Renders the shipped, compiled `/ctx-status` dialog for every status payload
3
+ * the dialog can receive, and checks that each one draws and none throws.
4
+ *
5
+ * Previously the dialog read the RPC reply unchecked: a reply without
6
+ * `usagePercentage` (the server's `{ disabled: true }` answer for a home
7
+ * directory or a paused project identity) threw inside the view memo, and
8
+ * OpenCode's crash screen then reported the follow-on
9
+ * "undefined is not an object (evaluating 'view().headline')".
10
+ *
11
+ * It also checks that the dialog stays inside the surface the host gives it.
12
+ * The dialog sized its section grid from the terminal width instead of its own
13
+ * laid-out width (it listened for an event plain boxes never emit), so inside
14
+ * OpenCode's 60-column dialog the two fixed-width section columns ran past the
15
+ * dialog's right edge (issue 605).
16
+ *
17
+ * The rendering happens in `scripts/render-compiled-status-dialog.ts`, a child
18
+ * process, because it has to register OpenCode's runtime module registry and
19
+ * that registration cannot be undone inside this test process. The child runs
20
+ * with the `browser` condition so `solid-js` is the reactive build OpenCode
21
+ * runs; the server build Bun picks by default never re-renders after layout.
22
+ */
23
+ import { beforeAll, describe, expect, test } from "bun:test";
24
+ import { join } from "node:path";
25
+ import { checkStatusDetailPayload, statusRpcFailure } from "../../shared/status-view-check";
26
+ import type { StatusDetailResult } from "../data/context-db";
27
+
28
+ const UI = "0.44.5";
29
+
30
+ const COMPLETE = {
31
+ sessionId: "ses_complete",
32
+ pluginVersion: UI,
33
+ usagePercentage: 12.5,
34
+ inputTokens: 25_000,
35
+ contextLimit: 200_000,
36
+ executeThreshold: 65,
37
+ systemPromptTokens: 5_000,
38
+ docsTokens: 0,
39
+ compartmentTokens: 0,
40
+ compartmentCount: 0,
41
+ factTokens: 0,
42
+ memoryTokens: 0,
43
+ memoryBlockCount: 0,
44
+ profileTokens: 0,
45
+ conversationTokens: 20_000,
46
+ toolCallTokens: 0,
47
+ toolDefinitionTokens: 0,
48
+ activeTags: 0,
49
+ droppedTags: 0,
50
+ totalTags: 0,
51
+ activeBytes: 0,
52
+ lastNudgeTokens: 0,
53
+ pendingOpsCount: 0,
54
+ protectedTagCount: 0,
55
+ isSubagent: false,
56
+ cacheTtl: "5m",
57
+ lastResponseTime: 0,
58
+ cacheRemainingMs: 0,
59
+ cacheExpired: false,
60
+ historyBlockTokens: 0,
61
+ compressionBudget: null,
62
+ compressionUsage: null,
63
+ memoryCount: 0,
64
+ };
65
+ const { pluginVersion: _omitted, ...OLDER_SERVER } = COMPLETE;
66
+
67
+ const CASES: Array<{ name: string; status: StatusDetailResult; expected: string[] }> = [
68
+ {
69
+ name: "a complete snapshot",
70
+ status: checkStatusDetailPayload(COMPLETE, UI),
71
+ expected: ["Magic Context Status", "12.5% / 65%"],
72
+ },
73
+ {
74
+ name: "an RPC transport failure",
75
+ status: statusRpcFailure("connect ECONNREFUSED"),
76
+ expected: ["Status unavailable", "server did not answer"],
77
+ },
78
+ {
79
+ name: "an error envelope",
80
+ status: checkStatusDetailPayload({ error: "unavailable" }, UI),
81
+ expected: ["Status unavailable", "server did not answer"],
82
+ },
83
+ {
84
+ name: "the home-directory reply",
85
+ status: checkStatusDetailPayload({ sessionId: "s", disabled: true }, UI),
86
+ expected: ["Status unavailable", "home directory"],
87
+ },
88
+ {
89
+ name: "the paused-identity reply",
90
+ status: checkStatusDetailPayload({ sessionId: "s", disabled: true, paused: true }, UI),
91
+ expected: ["Status unavailable", "memory paused"],
92
+ },
93
+ {
94
+ name: "an empty reply",
95
+ status: checkStatusDetailPayload({}, UI),
96
+ expected: ["Status unavailable", "incomplete status data"],
97
+ },
98
+ {
99
+ name: "an older server's snapshot",
100
+ status: checkStatusDetailPayload(OLDER_SERVER, UI),
101
+ expected: ["12.5% / 65%", "An older Magic Context server"],
102
+ },
103
+ ];
104
+
105
+ /**
106
+ * Layout cases: the dialog inside a host surface of `dialogWidth` columns on a
107
+ * terminal of `terminalWidth` columns. OpenCode's dialog is 60 columns unless a
108
+ * dialog asks to be wider, and never wider than the terminal minus 2; 88 is its
109
+ * "large" size. The child process's stdout is a pipe, so the dialog sees no
110
+ * terminal width at all, the same fallback it takes on a very wide terminal.
111
+ */
112
+ type LayoutCase = {
113
+ name: string;
114
+ status: StatusDetailResult;
115
+ terminalWidth: number;
116
+ dialogWidth: number;
117
+ expected: string[];
118
+ /**
119
+ * Label/value pairs that must each be drawn whole on one line, the label
120
+ * followed by its complete value. A value cut off at a column edge fails.
121
+ */
122
+ rows?: Array<[label: string, value: string]>;
123
+ };
124
+
125
+ /** Rows of the complete snapshot drawn from both section columns. */
126
+ const COMPLETE_ROWS: Array<[string, string]> = [
127
+ ["Active", "0 (~0 B)"],
128
+ ["Execute threshold", "65%"],
129
+ ["Last reduce anchor", "0 tok"],
130
+ ["Subagent", "no"],
131
+ ["History block", "~0 tok"],
132
+ ["Auto-execute", "at TTL or ≥65%"],
133
+ ];
134
+
135
+ const LONG_MODEL_KEY =
136
+ "openrouter/anthropic/claude-sonnet-4.5-20250929-thinking-extended-context-preview";
137
+ const LONG_VALUE_STATUS = checkStatusDetailPayload(
138
+ { ...COMPLETE, cacheTtlSource: "config", cacheTtlModelKey: LONG_MODEL_KEY },
139
+ UI,
140
+ );
141
+
142
+ const LAYOUT_CASES: LayoutCase[] = [
143
+ ...[80, 100, 120].map((terminalWidth) => ({
144
+ name: `a complete snapshot in the default 60-column dialog, terminal ${terminalWidth} columns wide`,
145
+ status: checkStatusDetailPayload(COMPLETE, UI),
146
+ terminalWidth,
147
+ dialogWidth: 60,
148
+ expected: ["Magic Context Status", "Execute threshold", "History block", "Esc to close"],
149
+ rows: COMPLETE_ROWS,
150
+ })),
151
+ ...[100, 120].map((terminalWidth) => ({
152
+ name: `a complete snapshot in an 88-column dialog, terminal ${terminalWidth} columns wide`,
153
+ status: checkStatusDetailPayload(COMPLETE, UI),
154
+ terminalWidth,
155
+ dialogWidth: 88,
156
+ expected: ["Magic Context Status", "Execute threshold", "History block", "Esc to close"],
157
+ rows: COMPLETE_ROWS,
158
+ })),
159
+ {
160
+ // The value is longer than the dialog: it has to wrap inside the value
161
+ // column, and its end still has to be drawn.
162
+ name: "a long cache TTL model key in the default 60-column dialog, terminal 80 columns wide",
163
+ status: LONG_VALUE_STATUS,
164
+ terminalWidth: 80,
165
+ dialogWidth: 60,
166
+ expected: ["Configured", "context-preview)", "Execute threshold", "Esc to close"],
167
+ rows: COMPLETE_ROWS,
168
+ },
169
+ ];
170
+
171
+ /**
172
+ * The same dialog when its width update never lands: the first frame, drawn
173
+ * before the dialog has measured itself, or a render (like a bare component
174
+ * render on Bun's non-reactive `solid-js` build) where nothing re-runs after
175
+ * layout. The section grid is then chosen against the terminal-width fallback,
176
+ * and the columns still have to stay inside the dialog.
177
+ */
178
+ const STALE_WIDTH_CASES: LayoutCase[] = [
179
+ {
180
+ name: "a complete snapshot laid out before the dialog measured itself",
181
+ status: checkStatusDetailPayload(COMPLETE, UI),
182
+ terminalWidth: 80,
183
+ dialogWidth: 60,
184
+ expected: ["Magic Context Status", "Tags", "Esc to close"],
185
+ },
186
+ {
187
+ name: "a long cache TTL model key laid out before the dialog measured itself",
188
+ status: LONG_VALUE_STATUS,
189
+ terminalWidth: 80,
190
+ dialogWidth: 60,
191
+ expected: ["Magic Context Status", "Configured", "Esc to close"],
192
+ },
193
+ ];
194
+
195
+ /**
196
+ * Lines of `frame` that draw anything at or past `rightEdge`, the first column
197
+ * of the dialog's right padding. The dialog surface starts at column 0, so a
198
+ * line that stays inside the dialog is blank from that column on.
199
+ */
200
+ function linesPastEdge(frame: string, rightEdge: number): string[] {
201
+ return frame.split("\n").filter((line) => line.slice(rightEdge).trim() !== "");
202
+ }
203
+
204
+ function escapeRegExp(text: string): string {
205
+ return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
206
+ }
207
+
208
+ /** Pairs from `rows` that no line of `frame` draws as `label value` whole. */
209
+ function rowsNotDrawnWhole(frame: string, rows: Array<[string, string]>): string[] {
210
+ const lines = frame.split("\n");
211
+ return rows
212
+ .filter(([label, value]) => {
213
+ const pattern = new RegExp(`${escapeRegExp(label)} +${escapeRegExp(value)}(\\s|$)`);
214
+ return !lines.some((line) => pattern.test(line));
215
+ })
216
+ .map(([label, value]) => `${label}: ${value}`);
217
+ }
218
+
219
+ type RenderResult = { frame?: string; error?: string };
220
+
221
+ /** Runs the render script on `input`, with extra Bun flags before the script. */
222
+ function renderInChild(input: unknown[], bunFlags: string[]): RenderResult[] {
223
+ const script = join(import.meta.dir, "../../../scripts/render-compiled-status-dialog.ts");
224
+ const child = Bun.spawnSync(["bun", ...bunFlags, script], {
225
+ stdin: new TextEncoder().encode(JSON.stringify(input)),
226
+ stdout: "pipe",
227
+ stderr: "pipe",
228
+ windowsHide: true,
229
+ });
230
+ if (child.exitCode !== 0) {
231
+ throw new Error(`render script failed: ${child.stderr.toString()}`);
232
+ }
233
+ return JSON.parse(child.stdout.toString());
234
+ }
235
+
236
+ const layoutInput = (cases: LayoutCase[]) =>
237
+ cases.map(({ status, terminalWidth, dialogWidth }) => ({ status, terminalWidth, dialogWidth }));
238
+
239
+ let results: RenderResult[] = [];
240
+ let staleResults: RenderResult[] = [];
241
+
242
+ beforeAll(() => {
243
+ results = renderInChild(
244
+ [...CASES.map((entry) => ({ status: entry.status })), ...layoutInput(LAYOUT_CASES)],
245
+ ["--conditions=browser"],
246
+ );
247
+ // No `browser` condition: Bun's server build of solid-js, where the dialog
248
+ // keeps the layout it chose before it knew its own width.
249
+ staleResults = renderInChild(layoutInput(STALE_WIDTH_CASES), []);
250
+ }, 60_000);
251
+
252
+ describe("compiled /ctx-status dialog", () => {
253
+ for (const [index, entry] of CASES.entries()) {
254
+ test(`draws ${entry.name} without throwing`, () => {
255
+ const result = results[index];
256
+ expect(result?.error).toBeUndefined();
257
+ for (const text of entry.expected) expect(result?.frame).toContain(text);
258
+ });
259
+ }
260
+ });
261
+
262
+ function expectInsideDialog(entry: LayoutCase, result: RenderResult | undefined): void {
263
+ expect(result?.error).toBeUndefined();
264
+ const frame = result?.frame ?? "";
265
+ for (const text of entry.expected) expect(frame).toContain(text);
266
+ // The dialog's own right padding is 2 columns, so its content ends 2
267
+ // columns before the surface's edge.
268
+ const surfaceWidth = Math.min(entry.dialogWidth, entry.terminalWidth - 2);
269
+ expect(linesPastEdge(frame, surfaceWidth - 2)).toEqual([]);
270
+ if (entry.rows) expect(rowsNotDrawnWhole(frame, entry.rows)).toEqual([]);
271
+ }
272
+
273
+ describe("compiled /ctx-status dialog layout", () => {
274
+ for (const [index, entry] of LAYOUT_CASES.entries()) {
275
+ test(`keeps ${entry.name} inside the dialog`, () => {
276
+ expectInsideDialog(entry, results[CASES.length + index]);
277
+ });
278
+ }
279
+ for (const [index, entry] of STALE_WIDTH_CASES.entries()) {
280
+ test(`keeps ${entry.name} inside the dialog`, () => {
281
+ expectInsideDialog(entry, staleResults[index]);
282
+ });
283
+ }
284
+ });
@@ -12,18 +12,16 @@
12
12
  import { createMemo, createSignal, onCleanup } from "solid-js"
13
13
  import type { TuiPluginApi, TuiThemeCurrent } from "@opencode-ai/plugin/tui"
14
14
  import packageJson from "../../../package.json"
15
- import { statusSummaryFromDetail } from "../../shared/status-summary"
16
15
  import {
17
- buildStatusView,
16
+ buildStatusViewFor,
18
17
  distributeBarWidths,
19
18
  statusColumnsFor,
20
19
  type StatusRow,
21
20
  type StatusSection,
22
21
  type StatusTone,
23
- type StatusViewSource,
24
22
  } from "../../shared/status-view"
25
23
  import { RUST_MODE_HOST_PATHS_LINE } from "../../shared/rust-mode-status"
26
- import type { StatusDetail } from "../data/context-db"
24
+ import type { StatusDetailResult } from "../data/context-db"
27
25
 
28
26
  const R = (props: { t: TuiThemeCurrent; l: string; v: string; fg?: string }) => (
29
27
  <box width="100%" flexDirection="row" justifyContent="space-between">
@@ -48,10 +46,13 @@ function toneColor(theme: TuiThemeCurrent, tone: StatusTone): string {
48
46
 
49
47
  /**
50
48
  * Width the dialog is actually laid out at, which is NOT the terminal width:
51
- * each host sizes its own dialog surface (OpenCode 2's widest is 88 columns on
52
- * a 200-column terminal), and that is the width the sections have to fit into.
53
- * Renderables carry their laid-out width and emit "resized" when it changes, so
54
- * the component reads it from its own root box.
49
+ * each host sizes its own dialog surface (OpenCode 1's default is 60 columns,
50
+ * OpenCode 2's widest is 88 columns on a 200-column terminal), and that is the
51
+ * width the sections have to fit into. Renderables carry their laid-out width
52
+ * and emit "resize" when a layout pass changes it, so the component reads it
53
+ * from its own root box. ("resized", with a d, is emitted only by the
54
+ * renderer's root; a box never sends it, and listening for it left the dialog
55
+ * sizing its sections from the terminal width forever.)
55
56
  *
56
57
  * Until the first layout there is no width to read; the terminal width is the
57
58
  * fallback, and an unknown terminal keeps the wide layout the dialog has always
@@ -83,35 +84,27 @@ const StatusSectionView = (props: { t: TuiThemeCurrent; section: StatusSection }
83
84
  </box>
84
85
  )
85
86
 
86
- export const StatusDialog = (props: { api: TuiPluginApi; s: StatusDetail }) => {
87
+ /**
88
+ * `status` is the checked result of the status RPC (`loadStatusDetail`), never
89
+ * the raw reply: a reply the view cannot draw arrives as the reason it cannot,
90
+ * and the shared model turns that into a "status unavailable" view. An
91
+ * unchecked reply used to reach the view model directly, where a missing field
92
+ * threw inside this component's first render and crashed the whole TUI.
93
+ */
94
+ export const StatusDialog = (props: { api: TuiPluginApi; status: StatusDetailResult }) => {
87
95
  const theme = createMemo(() => (props.api as any).theme.current)
88
96
  const t = () => theme()
89
- const s = () => props.s
90
- const compactionOff = () => s().compaction_enabled === false
91
-
92
- // Prefer the RPC-provided model context limit (what the sidebar shows) so the
93
- // two surfaces never disagree. Fall back to deriving from usage% only when the
94
- // RPC limit is absent (0) — and that derivation is itself undefined at 0%, so
95
- // it stays "?" rather than showing a number inconsistent with the sidebar.
96
- const contextLimit = () =>
97
- s().contextLimit > 0
98
- ? s().contextLimit
99
- : s().usagePercentage > 0
100
- ? Math.round(s().inputTokens / (s().usagePercentage / 100))
101
- : 0
97
+ const ready = () => (props.status.state === "ready" ? props.status : null)
98
+ const compactionOff = () => ready()?.source.compaction_enabled === false
99
+ const recompProgress = () => ready()?.extras.recompProgress ?? null
100
+ const hostBackendsModuleSide = () => ready()?.extras.hostBackendsModuleSide === true
102
101
 
103
102
  // Which rows exist, what they are called and which colour they carry is
104
103
  // decided by the shared model, so this dialog and Pi's overlay cannot drift
105
- // apart. This component only draws what the model returns.
104
+ // apart. This component only draws what the model returns, and the model
105
+ // never throws: a result it cannot draw becomes the unavailable view.
106
106
  const view = createMemo(() =>
107
- buildStatusView(
108
- {
109
- ...(s() as unknown as StatusViewSource),
110
- contextLimit: contextLimit(),
111
- warnings: statusSummaryFromDetail(s()).warnings,
112
- },
113
- { version: packageJson.version },
114
- ),
107
+ buildStatusViewFor(props.status, { version: packageJson.version }),
115
108
  )
116
109
  // The dialog's own laid-out width, which is what the sections have to fit
117
110
  // into; the terminal width is only the pre-layout fallback.
@@ -122,8 +115,8 @@ export const StatusDialog = (props: { api: TuiPluginApi; s: StatusDetail }) => {
122
115
  if (Number.isFinite(width) && width > 0) setDialogWidth(width)
123
116
  }
124
117
  read()
125
- element?.on?.("resized", read)
126
- onCleanup(() => element?.off?.("resized", read))
118
+ element?.on?.("resize", read)
119
+ onCleanup(() => element?.off?.("resize", read))
127
120
  }
128
121
  // paddingLeft + paddingRight below; what the sections get is what is left.
129
122
  const contentWidth = () => (dialogWidth() > 0 ? dialogWidth() - 4 : terminalColumns())
@@ -206,8 +199,8 @@ export const StatusDialog = (props: { api: TuiPluginApi; s: StatusDetail }) => {
206
199
  running or just finished — dogfood 2026-05-30). This is live run
207
200
  state rather than status content, so it stays out of the shared
208
201
  section model. */}
209
- {!compactionOff() && s().recompProgress && (() => {
210
- const p = s().recompProgress!
202
+ {!compactionOff() && recompProgress() && (() => {
203
+ const p = recompProgress()!
211
204
  // Label follows the flow that started the run, so a plain
212
205
  // /ctx-recomp never reads as an "Upgrade" (dogfood 2026-06-04).
213
206
  const verb = p.kind === "upgrade" ? "Upgrade" : p.kind === "embed" ? "Embed" : "Recomp"
@@ -242,21 +235,31 @@ export const StatusDialog = (props: { api: TuiPluginApi; s: StatusDetail }) => {
242
235
  )
243
236
  })()}
244
237
 
245
- {s().hostBackendsModuleSide && (
238
+ {hostBackendsModuleSide() && (
246
239
  <box marginTop={1} width="100%" flexDirection="column">
247
240
  <text fg={t().text}><b>Rust Mode</b></text>
248
241
  <text fg={t().textMuted}>{RUST_MODE_HOST_PATHS_LINE}</text>
249
242
  </box>
250
243
  )}
251
244
 
245
+ {/* Each column asks for the width its sections need, but may
246
+ shrink: until the dialog has measured itself the grid is chosen
247
+ against the terminal width, and a column that could not shrink
248
+ would then run past the dialog's right edge. Shrinking wraps a
249
+ value inside its column instead, and anything still wider
250
+ than a squeezed column (a fixed-width label) is clipped at the
251
+ column's edge rather than drawn past the dialog. The request is
252
+ a flexBasis, not a width: OpenTUI turns flexShrink back to 0
253
+ whenever a box gets a numeric width, so a fixed-width column
254
+ never shrinks. */}
252
255
  {columns().twoColumn ? (
253
256
  <box flexDirection="row" width="100%" gap={4}>
254
- <box flexDirection="column" width={columns().leftWidth} flexShrink={0}>
257
+ <box flexDirection="column" flexBasis={columns().leftWidth} flexGrow={0} flexShrink={1} minWidth={0} overflow="hidden">
255
258
  {columnSections(0).map((section) => (
256
259
  <StatusSectionView t={t()} section={section} />
257
260
  ))}
258
261
  </box>
259
- <box flexDirection="column" width={columns().rightWidth} flexShrink={0}>
262
+ <box flexDirection="column" flexBasis={columns().rightWidth} flexGrow={0} flexShrink={1} minWidth={0} overflow="hidden">
260
263
  {columnSections(1).map((section) => (
261
264
  <StatusSectionView t={t()} section={section} />
262
265
  ))}
package/src/tui/index.tsx CHANGED
@@ -3,13 +3,13 @@
3
3
  import { createMemo } from "solid-js"
4
4
  import type { TuiPlugin, TuiPluginApi } from "@opencode-ai/plugin/tui"
5
5
  import { StatusDialog } from "./dialogs/status-dialog"
6
- import { renderUserFacingFailure, userFacingFailureCode } from '../shared/user-facing-codes';
7
6
  import {
8
7
  createSidebarContentSlot,
9
8
  kickRecompProgressRefresh,
10
9
  refreshSidebarSnapshot,
11
10
  } from "./slots/sidebar-content"
12
- import { closeRpc, getAnnouncement, getCompartmentCount, getRpcGeneration, initRpcClient, loadEmbedDetail, loadStatusDetail, loadToastDurationMs, markAnnounced, requestRecomp, type EmbedDetail, type StatusDetail } from "./data/context-db"
11
+ import { closeRpc, getAnnouncement, getCompartmentCount, getRpcGeneration, initRpcClient, loadEmbedDetail, loadStatusDetail, loadToastDurationMs, markAnnounced, requestRecomp, type EmbedDetail } from "./data/context-db"
12
+ import { directoryForSession } from "./data/session-directory"
13
13
  import { startNotificationSocket, stopNotificationSocket, type SocketNotification } from "./data/notification-socket"
14
14
  import { isCompactionEnabled } from "../config/agent-disable"
15
15
  import { loadPluginConfig } from "../config"
@@ -125,6 +125,20 @@ function getSessionId(api: TuiPluginApi): string | null {
125
125
  return null
126
126
  }
127
127
 
128
+ /**
129
+ * The directory whose Magic Context server owns this session, which is not
130
+ * necessarily the directory the TUI started in (see `directoryForSession`).
131
+ */
132
+ function sessionDirectory(api: TuiPluginApi, sessionId: string): string {
133
+ let reported: unknown
134
+ try {
135
+ reported = api.state.session.get(sessionId)?.directory
136
+ } catch {
137
+ // Session state not available yet: fall back to the startup directory.
138
+ }
139
+ return directoryForSession(reported, api.state.path.directory ?? "")
140
+ }
141
+
128
142
  function getModelKeyFromMessages(api: TuiPluginApi, sessionId: string): string | undefined {
129
143
  try {
130
144
  const msgs = api.state.session.messages(sessionId)
@@ -156,7 +170,7 @@ async function showRecompDialog(api: TuiPluginApi, targetSessionId = getSessionI
156
170
  return false
157
171
  }
158
172
 
159
- const countResult = await getCompartmentCount(sessionId, api.state.path.directory ?? "")
173
+ const countResult = await getCompartmentCount(sessionId, sessionDirectory(api, sessionId))
160
174
  // Ack only after the dialog is actually shown for the same active session;
161
175
  // route switches while the RPC detail load is in flight must leave it pending.
162
176
  if (getSessionId(api) !== sessionId) return false
@@ -180,7 +194,7 @@ async function showRecompDialog(api: TuiPluginApi, targetSessionId = getSessionI
180
194
  "Proceed?",
181
195
  ].join("\n")}
182
196
  onConfirm={async () => {
183
- const requested = await requestRecomp(sessionId)
197
+ const requested = await requestRecomp(sessionId, sessionDirectory(api, sessionId))
184
198
  if (!requested) {
185
199
  showToast(api, { message: "Recomp request failed", variant: "error" })
186
200
  return
@@ -206,22 +220,15 @@ async function showStatusDialog(
206
220
  return false
207
221
  }
208
222
 
209
- const directory = api.state.path.directory ?? ""
223
+ const directory = sessionDirectory(api, sessionId)
210
224
  const modelKey = getModelKeyFromMessages(api, sessionId)
211
225
  const result = await loadStatusDetail(sessionId, directory, modelKey)
212
226
  if (getSessionId(api) !== sessionId) return false
213
- if (!result.ok) {
214
- console.error(
215
- `[magic-context] status unavailable code=${userFacingFailureCode("status_unavailable")}: ${result.error}`,
216
- )
217
- showToast(api, {
218
- message: renderUserFacingFailure("status_unavailable"),
219
- variant: "warning",
220
- })
221
- return false
222
- }
223
-
224
- api.ui.dialog.replace(() => <StatusDialog api={api} s={result.detail} />)
227
+ // A result without a usable snapshot still opens the dialog: it shows the
228
+ // "status unavailable" view naming the reason (RPC error, a directory the
229
+ // server keeps no state for, missing fields, a server/UI version
230
+ // difference) instead of a toast that disappears.
231
+ api.ui.dialog.replace(() => <StatusDialog api={api} status={result} />)
225
232
  return true
226
233
  }
227
234
 
@@ -247,7 +254,7 @@ async function showEmbedDialog(api: TuiPluginApi, targetSessionId = getSessionId
247
254
  api.ui.toast({ message: "No active session", variant: "warning" })
248
255
  return false
249
256
  }
250
- const directory = api.state.path.directory ?? ""
257
+ const directory = sessionDirectory(api, sessionId)
251
258
  const detail = await loadEmbedDetail(sessionId, directory)
252
259
  if (getSessionId(api) !== sessionId) return false
253
260
  api.ui.dialog.replace(() => <EmbedDialog api={api} detail={detail} />)
@@ -747,6 +754,11 @@ const tui: TuiPlugin = async (api, _options, meta) => {
747
754
 
748
755
  startNotificationSocket({
749
756
  getSessionId: () => getSessionId(api),
757
+ // Follow the shown session's own server, whose commands push its dialogs.
758
+ getSessionDirectory: () => {
759
+ const sessionId = getSessionId(api)
760
+ return sessionId ? sessionDirectory(api, sessionId) : null
761
+ },
750
762
  onNotification: handleNotification,
751
763
  })
752
764
 
@@ -4,6 +4,7 @@ import type { TuiSlotPlugin, TuiPluginApi, TuiThemeCurrent } from "@opencode-ai/
4
4
  import packageJson from "../../../package.json"
5
5
  import { badgeTextColor } from '../badge-contrast';
6
6
  import { loadSidebarSnapshot, type SidebarSnapshot } from "../data/context-db"
7
+ import { directoryForSession } from "../data/session-directory"
7
8
  import { formatThresholdPercent } from "../../shared/format-threshold"
8
9
  import { renderUserFacingFailure } from "../../shared/user-facing-codes"
9
10
  import { compactionOffSidebarRows, nativeCompactionContextLabel } from "../compaction-off"
@@ -534,7 +535,10 @@ const SidebarContent = (props: {
534
535
  const sid = props.sessionID()
535
536
  if (!sid) return
536
537
  const sequence = ++snapshotRequestSequence
537
- const directory = props.api.state.path.directory ?? ""
538
+ const directory = directoryForSession(
539
+ props.api.state.session?.get?.(sid)?.directory,
540
+ props.api.state.path.directory ?? "",
541
+ )
538
542
  void loadSidebarSnapshot(sid, directory)
539
543
  .then((data) => {
540
544
  // Guard against a session switch while this load was in flight:
@@ -600,7 +604,10 @@ const SidebarContent = (props: {
600
604
  return
601
605
  }
602
606
  const sequence = ++snapshotRequestSequence
603
- const directory = props.api.state.path.directory ?? ""
607
+ const directory = directoryForSession(
608
+ props.api.state.session?.get?.(sid)?.directory,
609
+ props.api.state.path.directory ?? "",
610
+ )
604
611
  void loadSidebarSnapshot(sid, directory)
605
612
  .then((data) => {
606
613
  if (