@cortexkit/opencode-magic-context 0.44.4 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (679) hide show
  1. package/dist/agents/hidden-agent-registrations.d.ts +3 -2
  2. package/dist/agents/hidden-agent-registrations.d.ts.map +1 -1
  3. package/dist/agents/magic-context-prompt.d.ts +1 -0
  4. package/dist/agents/magic-context-prompt.d.ts.map +1 -1
  5. package/dist/agents/permissions.d.ts +8 -28
  6. package/dist/agents/permissions.d.ts.map +1 -1
  7. package/dist/{announcement-n8hs7kjw.js → announcement-f75t58v9.js} +4 -2
  8. package/dist/config/index.d.ts.map +1 -1
  9. package/dist/config/project-security.d.ts +48 -0
  10. package/dist/config/project-security.d.ts.map +1 -1
  11. package/dist/config/raw-loader.d.ts.map +1 -1
  12. package/dist/config/schema/magic-context.d.ts +10 -7
  13. package/dist/config/schema/magic-context.d.ts.map +1 -1
  14. package/dist/{conflict-warning-hook-hmpzxep6.js → conflict-warning-hook-5yrz2r24.js} +10 -6
  15. package/dist/{derive-budgets-ncwn1jk9.js → derive-budgets-a63zsm5c.js} +3 -3
  16. package/dist/embedding-worker.js +49 -0
  17. package/dist/emscripten-module-0g8f45e6.js +602 -0
  18. package/dist/emscripten-module-0pekdjxz.js +1532 -0
  19. package/dist/emscripten-module-e67xwsp3.js +503 -0
  20. package/dist/emscripten-module-pj1vyb44.js +4559 -0
  21. package/dist/features/magic-context/compartment-chunk-embedding.d.ts +23 -3
  22. package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
  23. package/dist/features/magic-context/compartment-embedding.d.ts.map +1 -1
  24. package/dist/features/magic-context/compartment-storage.d.ts +14 -3
  25. package/dist/features/magic-context/compartment-storage.d.ts.map +1 -1
  26. package/dist/features/magic-context/context-store-uuid.d.ts +7 -0
  27. package/dist/features/magic-context/context-store-uuid.d.ts.map +1 -0
  28. package/dist/features/magic-context/dreamer/classify.d.ts +1 -3
  29. package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
  30. package/dist/features/magic-context/dreamer/cron.d.ts +5 -4
  31. package/dist/features/magic-context/dreamer/cron.d.ts.map +1 -1
  32. package/dist/features/magic-context/dreamer/docs-proposals.d.ts.map +1 -1
  33. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
  34. package/dist/features/magic-context/dreamer/expire-memories.d.ts.map +1 -1
  35. package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts +24 -0
  36. package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts.map +1 -0
  37. package/dist/features/magic-context/dreamer/manual-summary.d.ts.map +1 -1
  38. package/dist/features/magic-context/dreamer/map-memories.d.ts +5 -5
  39. package/dist/features/magic-context/dreamer/module-apply.d.ts +4 -25
  40. package/dist/features/magic-context/dreamer/module-apply.d.ts.map +1 -1
  41. package/dist/features/magic-context/dreamer/retrospective-learnings.d.ts.map +1 -1
  42. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts +5 -1
  43. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
  44. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts +12 -5
  45. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts.map +1 -1
  46. package/dist/features/magic-context/dreamer/task-executor.d.ts +6 -0
  47. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  48. package/dist/features/magic-context/dreamer/task-gates.d.ts +34 -0
  49. package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
  50. package/dist/features/magic-context/dreamer/task-prompts.d.ts +1 -1
  51. package/dist/features/magic-context/dreamer/task-prompts.d.ts.map +1 -1
  52. package/dist/features/magic-context/dreamer/task-registry.d.ts +7 -5
  53. package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
  54. package/dist/features/magic-context/dreamer/task-scheduler.d.ts +10 -3
  55. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  56. package/dist/features/magic-context/dreamer/token-budget.d.ts +3 -0
  57. package/dist/features/magic-context/dreamer/token-budget.d.ts.map +1 -1
  58. package/dist/features/magic-context/dreamer/verify.d.ts +2 -2
  59. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  60. package/dist/features/magic-context/git-commits/git-log-reader.d.ts +11 -2
  61. package/dist/features/magic-context/git-commits/git-log-reader.d.ts.map +1 -1
  62. package/dist/features/magic-context/git-commits/indexer.d.ts.map +1 -1
  63. package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
  64. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts +2 -0
  65. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts.map +1 -1
  66. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts +6 -0
  67. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts.map +1 -0
  68. package/dist/features/magic-context/lkg-prefix-chunks.d.ts +53 -0
  69. package/dist/features/magic-context/lkg-prefix-chunks.d.ts.map +1 -0
  70. package/dist/features/magic-context/memory/embedding-backfill.d.ts.map +1 -1
  71. package/dist/features/magic-context/memory/embedding-local.d.ts +8 -0
  72. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  73. package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
  74. package/dist/features/magic-context/memory/embedding-worker-client.d.ts +27 -0
  75. package/dist/features/magic-context/memory/embedding-worker-client.d.ts.map +1 -0
  76. package/dist/features/magic-context/memory/embedding-worker.d.ts +2 -0
  77. package/dist/features/magic-context/memory/embedding-worker.d.ts.map +1 -0
  78. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts +2 -0
  79. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts.map +1 -0
  80. package/dist/features/magic-context/memory/memory-selection.d.ts.map +1 -1
  81. package/dist/features/magic-context/memory/project-identity-cache.d.ts +4 -3
  82. package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
  83. package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -1
  84. package/dist/features/magic-context/memory/storage-memory-fts.d.ts.map +1 -1
  85. package/dist/features/magic-context/memory/visibility.d.ts +1 -1
  86. package/dist/features/magic-context/memory/visibility.d.ts.map +1 -1
  87. package/dist/features/magic-context/message-fts-rowid-map.d.ts +14 -1
  88. package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -1
  89. package/dist/features/magic-context/message-fts-session-filter.d.ts +14 -0
  90. package/dist/features/magic-context/message-fts-session-filter.d.ts.map +1 -0
  91. package/dist/features/magic-context/message-index.d.ts +1 -7
  92. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  93. package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -1
  94. package/dist/features/magic-context/migration-v94-write-split.d.ts +62 -0
  95. package/dist/features/magic-context/migration-v94-write-split.d.ts.map +1 -0
  96. package/dist/features/magic-context/migration-worker-client.d.ts +23 -0
  97. package/dist/features/magic-context/migration-worker-client.d.ts.map +1 -0
  98. package/dist/features/magic-context/migration-worker-protocol.d.ts +30 -0
  99. package/dist/features/magic-context/migration-worker-protocol.d.ts.map +1 -0
  100. package/dist/features/magic-context/migration-worker.d.ts +2 -0
  101. package/dist/features/magic-context/migration-worker.d.ts.map +1 -0
  102. package/dist/features/magic-context/migrations.d.ts +7 -0
  103. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  104. package/dist/features/magic-context/mural/render-mural.d.ts +24 -2
  105. package/dist/features/magic-context/mural/render-mural.d.ts.map +1 -1
  106. package/dist/features/magic-context/mural/render-trigger.d.ts +1 -1
  107. package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
  108. package/dist/features/magic-context/overflow-detection.d.ts +18 -7
  109. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
  110. package/dist/features/magic-context/project-embedding-registry.d.ts +2 -0
  111. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  112. package/dist/features/magic-context/range-parser.d.ts +2 -3
  113. package/dist/features/magic-context/range-parser.d.ts.map +1 -1
  114. package/dist/features/magic-context/resolve-subagent-fallback.d.ts +2 -0
  115. package/dist/features/magic-context/resolve-subagent-fallback.d.ts.map +1 -1
  116. package/dist/features/magic-context/scheduler.d.ts +2 -0
  117. package/dist/features/magic-context/scheduler.d.ts.map +1 -1
  118. package/dist/features/magic-context/search.d.ts +7 -0
  119. package/dist/features/magic-context/search.d.ts.map +1 -1
  120. package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -1
  121. package/dist/features/magic-context/session-project-storage.d.ts +10 -1
  122. package/dist/features/magic-context/session-project-storage.d.ts.map +1 -1
  123. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts +1 -1
  124. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts.map +1 -1
  125. package/dist/features/magic-context/smart-notes/compiler.d.ts +4 -0
  126. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  127. package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
  128. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts +2 -0
  129. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts.map +1 -1
  130. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts +10 -8
  131. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts.map +1 -1
  132. package/dist/features/magic-context/smart-notes/storage.d.ts +2 -2
  133. package/dist/features/magic-context/smart-notes/storage.d.ts.map +1 -1
  134. package/dist/features/magic-context/smart-notes/types.d.ts +7 -2
  135. package/dist/features/magic-context/smart-notes/types.d.ts.map +1 -1
  136. package/dist/features/magic-context/storage-caveman-rules.d.ts +21 -0
  137. package/dist/features/magic-context/storage-caveman-rules.d.ts.map +1 -0
  138. package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
  139. package/dist/features/magic-context/storage-compartment-history-version.d.ts +4 -0
  140. package/dist/features/magic-context/storage-compartment-history-version.d.ts.map +1 -0
  141. package/dist/features/magic-context/storage-db.d.ts +62 -2
  142. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  143. package/dist/features/magic-context/storage-identity-merge.d.ts +6 -0
  144. package/dist/features/magic-context/storage-identity-merge.d.ts.map +1 -1
  145. package/dist/features/magic-context/storage-meta-persisted.d.ts +15 -0
  146. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  147. package/dist/features/magic-context/storage-meta-session.d.ts +1 -1
  148. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  149. package/dist/features/magic-context/storage-meta-shared.d.ts +1 -1
  150. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  151. package/dist/features/magic-context/storage-notes.d.ts +2 -2
  152. package/dist/features/magic-context/storage-notes.d.ts.map +1 -1
  153. package/dist/features/magic-context/storage-reasoning-removal.d.ts +30 -0
  154. package/dist/features/magic-context/storage-reasoning-removal.d.ts.map +1 -0
  155. package/dist/features/magic-context/storage-replay-document.d.ts +42 -5
  156. package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
  157. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  158. package/dist/features/magic-context/storage-tags.d.ts +7 -1
  159. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  160. package/dist/features/magic-context/storage.d.ts +1 -1
  161. package/dist/features/magic-context/storage.d.ts.map +1 -1
  162. package/dist/features/magic-context/store-generation-rebase.d.ts.map +1 -1
  163. package/dist/features/magic-context/tag-input.d.ts +4 -0
  164. package/dist/features/magic-context/tag-input.d.ts.map +1 -0
  165. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  166. package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
  167. package/dist/features/magic-context/user-memory/storage-user-memory.d.ts.map +1 -1
  168. package/dist/ffi-3cx1cxpk.js +78 -0
  169. package/dist/ffi-7bqqe4cd.js +91 -0
  170. package/dist/ffi-7e6gryj5.js +91 -0
  171. package/dist/ffi-bpvkebwr.js +78 -0
  172. package/dist/hooks/magic-context/apply-operations.d.ts +9 -1
  173. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  174. package/dist/hooks/magic-context/auto-search-deadline.d.ts +10 -0
  175. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -0
  176. package/dist/hooks/magic-context/auto-search-hint.d.ts +3 -0
  177. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
  178. package/dist/hooks/magic-context/auto-search-runner.d.ts +3 -0
  179. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  180. package/dist/hooks/magic-context/caveman-cleanup.d.ts +8 -1
  181. package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -1
  182. package/dist/hooks/magic-context/caveman.d.ts +56 -1
  183. package/dist/hooks/magic-context/caveman.d.ts.map +1 -1
  184. package/dist/hooks/magic-context/child-session-spawn.d.ts +2 -0
  185. package/dist/hooks/magic-context/child-session-spawn.d.ts.map +1 -1
  186. package/dist/hooks/magic-context/command-handler.d.ts +1 -1
  187. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  188. package/dist/hooks/magic-context/compaction-marker-manager.d.ts +1 -1
  189. package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
  190. package/dist/hooks/magic-context/compartment-parser.d.ts +3 -3
  191. package/dist/hooks/magic-context/compartment-parser.d.ts.map +1 -1
  192. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  193. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +0 -1
  194. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  195. package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -1
  196. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  197. package/dist/hooks/magic-context/compartment-runner-types.d.ts +3 -0
  198. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  199. package/dist/hooks/magic-context/compartment-runner-validation.d.ts +6 -0
  200. package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -1
  201. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  202. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +35 -0
  203. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -0
  204. package/dist/hooks/magic-context/derive-budgets.d.ts.map +1 -1
  205. package/dist/hooks/magic-context/dropped-input-guard.d.ts.map +1 -1
  206. package/dist/hooks/magic-context/embed-history-runner.d.ts.map +1 -1
  207. package/dist/hooks/magic-context/emergency-drop.d.ts +15 -0
  208. package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
  209. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  210. package/dist/hooks/magic-context/execute-status.d.ts +1 -0
  211. package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
  212. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +17 -0
  213. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  214. package/dist/hooks/magic-context/heuristic-cleanup.d.ts +2 -0
  215. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
  216. package/dist/hooks/magic-context/historian-host-runner.d.ts +5 -0
  217. package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
  218. package/dist/hooks/magic-context/historian-prompt-fit.d.ts +116 -0
  219. package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -0
  220. package/dist/hooks/magic-context/historian-prompt.generated.d.ts +1 -1
  221. package/dist/hooks/magic-context/historian-prompt.generated.d.ts.map +1 -1
  222. package/dist/hooks/magic-context/history-boundary-repair.d.ts +44 -0
  223. package/dist/hooks/magic-context/history-boundary-repair.d.ts.map +1 -0
  224. package/dist/hooks/magic-context/hook.d.ts +4 -0
  225. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  226. package/dist/hooks/magic-context/inject-compartments.d.ts +8 -0
  227. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  228. package/dist/hooks/magic-context/lkg-persist.d.ts +12 -0
  229. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  230. package/dist/hooks/magic-context/lkg-replay-fit.d.ts +104 -0
  231. package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -0
  232. package/dist/hooks/magic-context/lkg-replay.d.ts +64 -0
  233. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  234. package/dist/hooks/magic-context/module-client.d.ts.map +1 -1
  235. package/dist/hooks/magic-context/module-state-sync-timing.d.ts +1 -1
  236. package/dist/hooks/magic-context/module-state-sync-timing.d.ts.map +1 -1
  237. package/dist/hooks/magic-context/module-state-sync.d.ts +6 -68
  238. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  239. package/dist/hooks/magic-context/module-tool-backends.d.ts +1 -34
  240. package/dist/hooks/magic-context/module-tool-backends.d.ts.map +1 -1
  241. package/dist/hooks/magic-context/module-transport.d.ts +1 -55
  242. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  243. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  244. package/dist/hooks/magic-context/note-nudger.d.ts +2 -0
  245. package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
  246. package/dist/hooks/magic-context/pass-outcome.d.ts +59 -2
  247. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
  248. package/dist/hooks/magic-context/producer-window-guard.d.ts +6 -0
  249. package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -1
  250. package/dist/hooks/magic-context/read-session-chunk.d.ts +13 -2
  251. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  252. package/dist/hooks/magic-context/read-session-formatting.d.ts +11 -0
  253. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  254. package/dist/hooks/magic-context/reasoning-removal.d.ts +60 -0
  255. package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -0
  256. package/dist/hooks/magic-context/recomp-orchestrator.d.ts +1 -0
  257. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
  258. package/dist/hooks/magic-context/reference-retrieval.d.ts +1 -1
  259. package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -1
  260. package/dist/hooks/magic-context/reply-pages.d.ts +3 -0
  261. package/dist/hooks/magic-context/reply-pages.d.ts.map +1 -0
  262. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts +62 -0
  263. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts.map +1 -0
  264. package/dist/hooks/magic-context/rust-mode-transform.d.ts +17 -85
  265. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  266. package/dist/hooks/magic-context/send-session-notification.d.ts.map +1 -1
  267. package/dist/hooks/magic-context/sentinel.d.ts +35 -0
  268. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
  269. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +28 -0
  270. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -0
  271. package/dist/hooks/magic-context/single-store-refusal.d.ts +14 -0
  272. package/dist/hooks/magic-context/single-store-refusal.d.ts.map +1 -0
  273. package/dist/hooks/magic-context/storage-busy-refusal.d.ts +7 -0
  274. package/dist/hooks/magic-context/storage-busy-refusal.d.ts.map +1 -1
  275. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  276. package/dist/hooks/magic-context/stripped-command.d.ts +1 -1
  277. package/dist/hooks/magic-context/stripped-command.d.ts.map +1 -1
  278. package/dist/hooks/magic-context/system-injection-stripper.d.ts +7 -0
  279. package/dist/hooks/magic-context/system-injection-stripper.d.ts.map +1 -1
  280. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  281. package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -1
  282. package/dist/hooks/magic-context/tag-id-fallback.d.ts.map +1 -1
  283. package/dist/hooks/magic-context/tag-messages.d.ts +18 -1
  284. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  285. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  286. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  287. package/dist/hooks/magic-context/transform-compartment-phase.d.ts +1 -0
  288. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  289. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +37 -4
  290. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  291. package/dist/hooks/magic-context/transform.d.ts +12 -39
  292. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  293. package/dist/hooks/magic-context/unmanaged-over-window.d.ts +36 -0
  294. package/dist/hooks/magic-context/unmanaged-over-window.d.ts.map +1 -0
  295. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts +15 -0
  296. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts.map +1 -0
  297. package/dist/hooks/magic-context/user-profile-render.d.ts +3 -0
  298. package/dist/hooks/magic-context/user-profile-render.d.ts.map +1 -0
  299. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  300. package/dist/{index-sqp1hz9v.js → index-16ny736w.js} +10190 -25296
  301. package/dist/{index-mrc0twf3.js → index-2aq21j41.js} +1201 -428
  302. package/dist/{index-32b096cc.js → index-2ntg5sd4.js} +6 -2
  303. package/dist/index-4krbw8z9.js +6034 -0
  304. package/dist/{index-33q7s9y2.js → index-75zjgwga.js} +61 -85
  305. package/dist/{index-zx7pmr39.js → index-8fgkmxmy.js} +28 -10
  306. package/dist/index-a4m2b1yv.js +530 -0
  307. package/dist/index-anq4nn6f.js +131 -0
  308. package/dist/index-avwt563y.js +62 -0
  309. package/dist/index-bmzf7zxv.js +445 -0
  310. package/dist/index-e44zzy84.js +10 -0
  311. package/dist/index-en1k8h8m.js +244 -0
  312. package/dist/{index-638hf49n.js → index-f85teqck.js} +15 -6
  313. package/dist/index-fr2z4qy8.js +7810 -0
  314. package/dist/{index-kwe03yde.js → index-fzbvakh0.js} +1 -1
  315. package/dist/{module-asyncify-2EFITU5U-rkqjhjxd.js → index-g20jdh0p.js} +114 -105
  316. package/dist/index-gd5qx1j9.js +398 -0
  317. package/dist/{index-3bygzk2d.js → index-hybnrwq0.js} +169 -4
  318. package/dist/{index-jqcbs2k1.js → index-mc22ayvf.js} +24 -5
  319. package/dist/index-q7yesyk9.js +9118 -0
  320. package/dist/index-remp7e2g.js +214 -0
  321. package/dist/{index-7k55qm8a.js → index-sfpzqvdz.js} +8 -8
  322. package/dist/{index-msqr3x6m.js → index-vvtfyw1z.js} +12 -75
  323. package/dist/index-w9jwmntv.js +202 -0
  324. package/dist/{index-kr5qehbd.js → index-x23gah8c.js} +1 -1
  325. package/dist/{index-jdxxq8cz.js → index-x8a7jmkh.js} +6 -1
  326. package/dist/{index-wprsye9w.js → index-xgt9k6c6.js} +23 -12
  327. package/dist/index-y8v6yerm.js +77 -0
  328. package/dist/index.d.ts.map +1 -1
  329. package/dist/index.js +7519 -8096
  330. package/dist/message-time-backfill-an311pmk.js +124 -0
  331. package/dist/migration-worker.js +53 -0
  332. package/dist/{model-resolution-dxatzjde.js → model-resolution-xhfmyyvy.js} +5 -1
  333. package/dist/module-ES6BEMUI-3cet1pyp.js +12 -0
  334. package/dist/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  335. package/dist/plugin/boot-deadline.d.ts.map +1 -1
  336. package/dist/plugin/conflict-warning-hook.d.ts.map +1 -1
  337. package/dist/plugin/dream-timer-module-client.d.ts +1 -11
  338. package/dist/plugin/dream-timer-module-client.d.ts.map +1 -1
  339. package/dist/plugin/dream-timer.d.ts.map +1 -1
  340. package/dist/plugin/hooks/create-session-hooks.d.ts +8 -0
  341. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  342. package/dist/plugin/messages-transform.d.ts +20 -13
  343. package/dist/plugin/messages-transform.d.ts.map +1 -1
  344. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  345. package/dist/plugin/stale-build-notice.d.ts +16 -0
  346. package/dist/plugin/stale-build-notice.d.ts.map +1 -0
  347. package/dist/{read-session-chunk-339hg90t.js → read-session-chunk-8rxs0tc9.js} +24 -6
  348. package/dist/recomp-orchestrator-nzamtw29.js +39 -0
  349. package/dist/{rpc-notifications-4amf6mf4.js → rpc-notifications-3hed126v.js} +3 -1
  350. package/dist/{safe-notification-target-50gm9c58.js → safe-notification-target-43r8jsxw.js} +3 -3
  351. package/dist/send-session-notification-nqpv7cne.js +28 -0
  352. package/dist/shared/assistant-message-extractor.d.ts +4 -0
  353. package/dist/shared/assistant-message-extractor.d.ts.map +1 -1
  354. package/dist/shared/background-batch-drain.d.ts +8 -0
  355. package/dist/shared/background-batch-drain.d.ts.map +1 -0
  356. package/dist/{features/builtin-commands/commands.d.ts → shared/builtin-commands.d.ts} +1 -1
  357. package/dist/shared/builtin-commands.d.ts.map +1 -0
  358. package/dist/shared/embedding-activity.d.ts +13 -0
  359. package/dist/shared/embedding-activity.d.ts.map +1 -0
  360. package/dist/shared/historian-tool-expansions.d.ts +5 -0
  361. package/dist/shared/historian-tool-expansions.d.ts.map +1 -0
  362. package/dist/shared/historian-tool-template.d.ts +5 -0
  363. package/dist/shared/historian-tool-template.d.ts.map +1 -0
  364. package/dist/shared/historian-transient-error.d.ts +2 -0
  365. package/dist/shared/historian-transient-error.d.ts.map +1 -0
  366. package/dist/shared/jsonc-edit.d.ts.map +1 -1
  367. package/dist/shared/logger.d.ts +7 -0
  368. package/dist/shared/logger.d.ts.map +1 -1
  369. package/dist/shared/model-suggestion-retry.d.ts +2 -1
  370. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  371. package/dist/shared/models-dev-cache.d.ts.map +1 -1
  372. package/dist/shared/off-thread-migration-clock.d.ts +38 -0
  373. package/dist/shared/off-thread-migration-clock.d.ts.map +1 -0
  374. package/dist/shared/plugin-package-version.d.ts +14 -0
  375. package/dist/shared/plugin-package-version.d.ts.map +1 -0
  376. package/dist/shared/project-directory-key.d.ts +26 -0
  377. package/dist/shared/project-directory-key.d.ts.map +1 -0
  378. package/dist/shared/prompt-async-transport.d.ts +4 -0
  379. package/dist/shared/prompt-async-transport.d.ts.map +1 -1
  380. package/dist/shared/prompt-surface-runtime.d.ts +3 -3
  381. package/dist/shared/provider-response-completion.d.ts +12 -0
  382. package/dist/shared/provider-response-completion.d.ts.map +1 -0
  383. package/dist/shared/redaction.d.ts.map +1 -1
  384. package/dist/shared/rpc-client.d.ts +23 -2
  385. package/dist/shared/rpc-client.d.ts.map +1 -1
  386. package/dist/shared/rpc-types.d.ts +19 -0
  387. package/dist/shared/rpc-types.d.ts.map +1 -1
  388. package/dist/shared/rpc-utils.d.ts +34 -0
  389. package/dist/shared/rpc-utils.d.ts.map +1 -1
  390. package/dist/shared/sqlite.d.ts +13 -2
  391. package/dist/shared/sqlite.d.ts.map +1 -1
  392. package/dist/shared/stale-plugin-build.d.ts +21 -0
  393. package/dist/shared/stale-plugin-build.d.ts.map +1 -0
  394. package/dist/shared/status-summary.d.ts +29 -0
  395. package/dist/shared/status-summary.d.ts.map +1 -1
  396. package/dist/shared/status-view-check.d.ts +124 -0
  397. package/dist/shared/status-view-check.d.ts.map +1 -0
  398. package/dist/shared/status-view.d.ts +38 -2
  399. package/dist/shared/status-view.d.ts.map +1 -1
  400. package/dist/shared/tag-owner-id.d.ts +19 -0
  401. package/dist/shared/tag-owner-id.d.ts.map +1 -0
  402. package/dist/shared/tag-transcript.d.ts +2 -1
  403. package/dist/shared/tag-transcript.d.ts.map +1 -1
  404. package/dist/shared/test-temp-dir.d.ts +8 -2
  405. package/dist/shared/test-temp-dir.d.ts.map +1 -1
  406. package/dist/shared/user-facing-codes.d.ts +41 -6
  407. package/dist/shared/user-facing-codes.d.ts.map +1 -1
  408. package/dist/shared/xml-unescape.d.ts +9 -0
  409. package/dist/shared/xml-unescape.d.ts.map +1 -0
  410. package/dist/task-config-v81k8jvk.js +17 -0
  411. package/dist/tools/ctx-expand/constants.d.ts +1 -1
  412. package/dist/tools/ctx-expand/constants.d.ts.map +1 -1
  413. package/dist/tools/ctx-expand/mode.d.ts +4 -0
  414. package/dist/tools/ctx-expand/mode.d.ts.map +1 -1
  415. package/dist/tools/ctx-expand/render.d.ts +5 -1
  416. package/dist/tools/ctx-expand/render.d.ts.map +1 -1
  417. package/dist/tools/ctx-expand/tools.d.ts +2 -0
  418. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  419. package/dist/tools/ctx-expand/types.d.ts +1 -0
  420. package/dist/tools/ctx-expand/types.d.ts.map +1 -1
  421. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  422. package/dist/tools/ctx-note/render.d.ts +2 -0
  423. package/dist/tools/ctx-note/render.d.ts.map +1 -1
  424. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  425. package/dist/tools/ctx-reduce/constants.d.ts +1 -1
  426. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
  427. package/dist/tools/ctx-search/constants.d.ts +1 -1
  428. package/dist/tools/ctx-search/constants.d.ts.map +1 -1
  429. package/dist/tools/light-descriptions.d.ts +3 -3
  430. package/dist/tools/light-descriptions.d.ts.map +1 -1
  431. package/dist/tools/parameter-descriptions.d.ts +14 -14
  432. package/dist/transform-postprocess-phase-414phndq.js +61 -0
  433. package/dist/tui/data/context-db.d.ts +34 -10
  434. package/dist/tui/data/context-db.d.ts.map +1 -1
  435. package/dist/tui/data/notification-socket.d.ts +6 -0
  436. package/dist/tui/data/notification-socket.d.ts.map +1 -1
  437. package/dist/tui/data/session-directory.d.ts +16 -0
  438. package/dist/tui/data/session-directory.d.ts.map +1 -0
  439. package/dist/tui-compiled/data/context-db.d.ts +34 -10
  440. package/dist/tui-compiled/data/context-db.d.ts.map +1 -1
  441. package/dist/tui-compiled/data/notification-socket.d.ts +6 -0
  442. package/dist/tui-compiled/data/notification-socket.d.ts.map +1 -1
  443. package/dist/tui-compiled/data/session-directory.d.ts +16 -0
  444. package/dist/tui-compiled/data/session-directory.d.ts.map +1 -0
  445. package/dist/v2/derive-budgets-v0krf3t7.js +18 -0
  446. package/dist/v2/embedding-worker.js +47 -0
  447. package/dist/v2/emscripten-module-0g8f45e6.js +602 -0
  448. package/dist/v2/emscripten-module-0pekdjxz.js +1532 -0
  449. package/dist/v2/emscripten-module-e67xwsp3.js +503 -0
  450. package/dist/v2/emscripten-module-pj1vyb44.js +4559 -0
  451. package/dist/v2/ffi-3cx1cxpk.js +78 -0
  452. package/dist/v2/ffi-7bqqe4cd.js +91 -0
  453. package/dist/v2/ffi-7e6gryj5.js +91 -0
  454. package/dist/v2/ffi-bpvkebwr.js +78 -0
  455. package/dist/v2/fold/boundary.d.ts.map +1 -1
  456. package/dist/v2/fork-inheritance.d.ts +101 -0
  457. package/dist/v2/fork-inheritance.d.ts.map +1 -0
  458. package/dist/v2/hidden-child-cleanup.d.ts +11 -0
  459. package/dist/v2/hidden-child-cleanup.d.ts.map +1 -0
  460. package/dist/v2/hidden-child-native.d.ts +29 -0
  461. package/dist/v2/hidden-child-native.d.ts.map +1 -0
  462. package/dist/v2/hidden-child-record.d.ts +135 -0
  463. package/dist/v2/hidden-child-record.d.ts.map +1 -0
  464. package/dist/v2/hidden-completion.d.ts +12 -97
  465. package/dist/v2/hidden-completion.d.ts.map +1 -1
  466. package/dist/v2/hooks/context.d.ts +20 -8
  467. package/dist/v2/hooks/context.d.ts.map +1 -1
  468. package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
  469. package/dist/v2/hooks/dream-trigger.d.ts +5 -0
  470. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  471. package/dist/v2/hooks/generate.d.ts +10 -0
  472. package/dist/v2/hooks/generate.d.ts.map +1 -0
  473. package/dist/v2/hooks/hidden-child.d.ts +33 -2
  474. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  475. package/dist/v2/hooks/payload.d.ts +3 -0
  476. package/dist/v2/hooks/payload.d.ts.map +1 -1
  477. package/dist/v2/hooks/session-api-gate.d.ts +4 -0
  478. package/dist/v2/hooks/session-api-gate.d.ts.map +1 -0
  479. package/dist/v2/hooks/storage-gate.d.ts +3 -1
  480. package/dist/v2/hooks/storage-gate.d.ts.map +1 -1
  481. package/dist/v2/hooks/tools.d.ts.map +1 -1
  482. package/dist/v2/hooks/types.d.ts +10 -0
  483. package/dist/v2/hooks/types.d.ts.map +1 -1
  484. package/dist/v2/hooks/update-check.d.ts.map +1 -1
  485. package/dist/v2/hooks/usage-persist.d.ts.map +1 -1
  486. package/dist/v2/hooks/usage-reading.d.ts +4 -0
  487. package/dist/v2/hooks/usage-reading.d.ts.map +1 -1
  488. package/dist/v2/index-6e4mwffh.js +5662 -0
  489. package/dist/v2/index-en1k8h8m.js +244 -0
  490. package/dist/{message-time-backfill-q374fxc5.js → v2/message-time-backfill-0n93vrd7.js} +19 -5
  491. package/dist/v2/migration-worker.js +52 -0
  492. package/dist/v2/model-resolution-xhfmyyvy.js +16 -0
  493. package/dist/v2/module-ES6BEMUI-3cet1pyp.js +12 -0
  494. package/dist/v2/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  495. package/dist/v2/prompt-context-5y5ms8f9.js +6 -0
  496. package/dist/v2/read-session-chunk-hjza38hr.js +83 -0
  497. package/dist/v2/recomp-orchestrator-1aq7h44c.js +36 -0
  498. package/dist/v2/retrospective-raw-provider.d.ts +21 -0
  499. package/dist/v2/retrospective-raw-provider.d.ts.map +1 -0
  500. package/dist/v2/rpc-notifications-3hed126v.js +16 -0
  501. package/dist/v2/safe-notification-target-wtj0bbc2.js +9 -0
  502. package/dist/{send-session-notification-04hvd54c.js → v2/send-session-notification-mq9frrtm.js} +10 -5
  503. package/dist/v2/server-0jqw05sa.js +803 -0
  504. package/dist/v2/server-5317ykaf.js +40 -0
  505. package/dist/v2/server-a4m2b1yv.js +530 -0
  506. package/dist/v2/server-avwt563y.js +62 -0
  507. package/dist/v2/server-c4g2y1z8.js +28824 -0
  508. package/dist/v2/server-ckpc8pxy.js +662 -0
  509. package/dist/v2/server-e36nf2p1.js +7702 -0
  510. package/dist/v2/server-e44zzy84.js +10 -0
  511. package/dist/v2/server-fgmxwrgy.js +16 -0
  512. package/dist/v2/server-fmsr7v69.js +75 -0
  513. package/dist/v2/server-g20jdh0p.js +1273 -0
  514. package/dist/{index-qm36k34q.js → v2/server-hfjfbg59.js} +796 -737
  515. package/dist/v2/server-n96ag4rk.js +633 -0
  516. package/dist/v2/server-qdjnb2z1.js +181 -0
  517. package/dist/v2/server-qpg6wf72.js +187 -0
  518. package/dist/v2/server-r7cmye3k.js +131 -0
  519. package/dist/v2/server-remp7e2g.js +214 -0
  520. package/dist/v2/server-rhdgxp1t.js +398 -0
  521. package/dist/v2/server-sfpzqvdz.js +137 -0
  522. package/dist/v2/server-syahy8j8.js +50 -0
  523. package/dist/v2/server-v5xgft5v.js +9116 -0
  524. package/dist/v2/server-w99cyt6a.js +361 -0
  525. package/dist/v2/server-x8a7jmkh.js +104 -0
  526. package/dist/v2/server-y8v6yerm.js +77 -0
  527. package/dist/v2/server-z19x7eqz.js +423 -0
  528. package/dist/v2/server.d.ts.map +1 -1
  529. package/dist/v2/server.js +8796 -107376
  530. package/dist/v2/store-reader.d.ts +50 -0
  531. package/dist/v2/store-reader.d.ts.map +1 -1
  532. package/dist/v2/task-config-tbndqyny.js +17 -0
  533. package/dist/v2/transformers-node-wasm.js +26768 -0
  534. package/dist/v2/transformers-web.js +25670 -0
  535. package/dist/v2/transformers.node-hj754h7s.js +29997 -0
  536. package/dist/v2/tui/index.d.ts +10 -1
  537. package/dist/v2/tui/index.d.ts.map +1 -1
  538. package/dist/v2/tui/sidebar-mount.d.ts +6 -0
  539. package/dist/v2/tui/sidebar-mount.d.ts.map +1 -1
  540. package/dist/v2/tui/status-dialog-mount.d.ts +7 -4
  541. package/dist/v2/tui/status-dialog-mount.d.ts.map +1 -1
  542. package/dist/v2/tui/types.d.ts +12 -0
  543. package/dist/v2/tui/types.d.ts.map +1 -1
  544. package/dist/v2/wrapup-orchestrator-tbyx78dz.js +425 -0
  545. package/dist/wrapup-orchestrator-h28bqsy6.js +26 -0
  546. package/package.json +8 -8
  547. package/src/agents/hidden-agent-registrations.ts +24 -16
  548. package/src/agents/magic-context-prompt.test.ts +41 -0
  549. package/src/agents/magic-context-prompt.ts +8 -5
  550. package/src/agents/permissions.test.ts +31 -49
  551. package/src/agents/permissions.ts +8 -28
  552. package/src/config/index.test.ts +60 -20
  553. package/src/config/index.ts +53 -1
  554. package/src/config/live-run-config.test.ts +5 -5
  555. package/src/config/live-snapshot.test.ts +4 -4
  556. package/src/config/migrate-config-location.test.ts +3 -10
  557. package/src/config/project-config-trust-boundary.test.ts +207 -0
  558. package/src/config/project-security.hostile-matrix.test.ts +4 -4
  559. package/src/config/project-security.ts +218 -1
  560. package/src/config/protected-tokens.test.ts +14 -9
  561. package/src/config/raw-loader.test.ts +31 -3
  562. package/src/config/raw-loader.ts +8 -3
  563. package/src/config/schema/magic-context.ts +20 -3
  564. package/src/config/variable.test.ts +3 -2
  565. package/src/features/magic-context/dreamer/cron.ts +30 -9
  566. package/src/features/magic-context/dreamer/task-registry.ts +7 -5
  567. package/src/shared/announcement.test.ts +2 -1
  568. package/src/shared/assistant-message-extractor.test.ts +27 -1
  569. package/src/shared/assistant-message-extractor.ts +27 -0
  570. package/src/shared/background-batch-drain.test.ts +38 -0
  571. package/src/shared/background-batch-drain.ts +29 -0
  572. package/src/shared/builtin-commands.ts +50 -0
  573. package/src/shared/console-diagnostics-fence.test.ts +145 -0
  574. package/src/shared/data-path.test.ts +6 -5
  575. package/src/shared/embedding-activity.test.ts +21 -0
  576. package/src/shared/embedding-activity.ts +36 -0
  577. package/src/shared/historian-tool-defaults.json +13 -0
  578. package/src/shared/historian-tool-expansions.ts +18 -0
  579. package/src/shared/historian-tool-template.ts +248 -0
  580. package/src/shared/historian-transient-error.test.ts +36 -0
  581. package/src/shared/historian-transient-error.ts +22 -0
  582. package/src/shared/jsonc-edit.ts +20 -1
  583. package/src/shared/logger.test.ts +3 -2
  584. package/src/shared/logger.ts +40 -1
  585. package/src/shared/model-suggestion-retry.test.ts +46 -0
  586. package/src/shared/model-suggestion-retry.ts +16 -1
  587. package/src/shared/models-dev-cache.test.ts +74 -2
  588. package/src/shared/models-dev-cache.ts +5 -1
  589. package/src/shared/off-thread-migration-clock.test.ts +55 -0
  590. package/src/shared/off-thread-migration-clock.ts +124 -0
  591. package/src/shared/opencode-db-path.test.ts +3 -2
  592. package/src/shared/plugin-package-version.ts +52 -0
  593. package/src/shared/project-directory-key.test.ts +111 -0
  594. package/src/shared/project-directory-key.ts +54 -0
  595. package/src/shared/prompt-async-transport.test.ts +249 -72
  596. package/src/shared/prompt-async-transport.ts +131 -24
  597. package/src/shared/prompt-surface-a1-golden.md +41 -25
  598. package/src/shared/prompt-surface-runtime.test.ts +3 -3
  599. package/src/shared/provider-response-completion.ts +23 -0
  600. package/src/shared/redaction.test.ts +51 -1
  601. package/src/shared/redaction.ts +33 -0
  602. package/src/shared/rpc-async-probes.test.ts +32 -2
  603. package/src/shared/rpc-client.test.ts +3 -2
  604. package/src/shared/rpc-client.ts +76 -18
  605. package/src/shared/rpc-types.ts +15 -0
  606. package/src/shared/rpc-utils.test.ts +164 -10
  607. package/src/shared/rpc-utils.ts +144 -15
  608. package/src/shared/sqlite-acquisition-routing.test.ts +46 -3
  609. package/src/shared/sqlite-pass-scope.test.ts +3 -2
  610. package/src/shared/sqlite-transaction-mode-guard.test.ts +4 -0
  611. package/src/shared/sqlite-writer-diagnostics.test.ts +134 -0
  612. package/src/shared/sqlite.ts +225 -41
  613. package/src/shared/stale-plugin-build.test.ts +129 -0
  614. package/src/shared/stale-plugin-build.ts +151 -0
  615. package/src/shared/status-summary.ts +40 -13
  616. package/src/shared/status-view-check.test.ts +253 -0
  617. package/src/shared/status-view-check.ts +536 -0
  618. package/src/shared/status-view.test.ts +6 -1
  619. package/src/shared/status-view.ts +176 -4
  620. package/src/shared/storage-busy.test.ts +3 -2
  621. package/src/shared/tag-owner-id.test.ts +33 -0
  622. package/src/shared/tag-owner-id.ts +29 -0
  623. package/src/shared/tag-transcript.ts +13 -2
  624. package/src/shared/test-temp-dir-policy.test.ts +33 -0
  625. package/src/shared/test-temp-dir.test.ts +27 -0
  626. package/src/shared/test-temp-dir.ts +36 -12
  627. package/src/shared/tui-config.test.ts +6 -5
  628. package/src/shared/tui-preferences.test.ts +3 -2
  629. package/src/shared/user-facing-codes.ts +52 -6
  630. package/src/shared/window-geometry.test.ts +3 -2
  631. package/src/shared/write-transaction-attribution.test.ts +11 -7
  632. package/src/shared/write-transaction-hold-clock.test.ts +160 -0
  633. package/src/shared/xml-unescape.ts +19 -0
  634. package/src/tui/data/context-db.test.ts +92 -4
  635. package/src/tui/data/context-db.ts +184 -18
  636. package/src/tui/data/notification-socket.test.ts +49 -2
  637. package/src/tui/data/notification-socket.ts +47 -9
  638. package/src/tui/data/session-directory.ts +19 -0
  639. package/src/tui/dialogs/status-dialog-render.test.ts +284 -0
  640. package/src/tui/dialogs/status-dialog.tsx +41 -38
  641. package/src/tui/index.tsx +30 -18
  642. package/src/tui/slots/sidebar-content.tsx +9 -2
  643. package/src/tui-compiled/data/context-db.ts +184 -18
  644. package/src/tui-compiled/data/notification-socket.ts +47 -9
  645. package/src/tui-compiled/data/session-directory.ts +19 -0
  646. package/src/tui-compiled/dialogs/status-dialog.tsx +38 -29
  647. package/src/tui-compiled/index.tsx +29 -16
  648. package/src/tui-compiled/slots/sidebar-content.tsx +3 -2
  649. package/src/v2/tui/host-contract.test.ts +9 -10
  650. package/src/v2/tui/index.ts +78 -23
  651. package/src/v2/tui/load-compiled-sidebar.d.mts +5 -1
  652. package/src/v2/tui/load-compiled-status-dialog.d.mts +3 -2
  653. package/src/v2/tui/session-directory.test.ts +53 -0
  654. package/src/v2/tui/sidebar-mount.ts +19 -1
  655. package/src/v2/tui/status-dialog-mount.ts +10 -7
  656. package/src/v2/tui/types.ts +10 -0
  657. package/dist/features/builtin-commands/commands.d.ts.map +0 -1
  658. package/dist/features/builtin-commands/types.d.ts +0 -3
  659. package/dist/features/builtin-commands/types.d.ts.map +0 -1
  660. package/dist/features/magic-context/context-authority.d.ts +0 -272
  661. package/dist/features/magic-context/context-authority.d.ts.map +0 -1
  662. package/dist/features/magic-context/memory/mirror-reembed.d.ts +0 -22
  663. package/dist/features/magic-context/memory/mirror-reembed.d.ts.map +0 -1
  664. package/dist/hooks/magic-context/historian-state-file.d.ts +0 -43
  665. package/dist/hooks/magic-context/historian-state-file.d.ts.map +0 -1
  666. package/dist/index-4an2p8qa.js +0 -1056
  667. package/dist/index-rn7gafjr.js +0 -8
  668. package/dist/index-v6t0tg85.js +0 -13
  669. package/dist/plugin/memory-id-translation.d.ts +0 -109
  670. package/dist/plugin/memory-id-translation.d.ts.map +0 -1
  671. package/dist/plugin/rust-note-backend.d.ts +0 -84
  672. package/dist/plugin/rust-note-backend.d.ts.map +0 -1
  673. package/dist/recomp-orchestrator-0ers6smx.js +0 -22
  674. package/dist/task-config-2bm68628.js +0 -9
  675. package/dist/transform-postprocess-phase-ttdkrm6r.js +0 -36
  676. package/dist/v2/host-service.d.ts +0 -66
  677. package/dist/v2/host-service.d.ts.map +0 -1
  678. package/dist/wrapup-orchestrator-x0jvvrqn.js +0 -19
  679. /package/dist/{index-s70wtd8k.js → index-q6hef7fh.js} +0 -0
@@ -3,14 +3,38 @@
3
3
  * All data is fetched from the server plugin via HTTP RPC.
4
4
  */
5
5
  import { getMagicContextStorageDir } from "../../shared/data-path";
6
- import { MagicContextRpcClient } from "../../shared/rpc-client";
6
+ import { pluginPackageVersion } from "../../shared/plugin-package-version";
7
+ import { MagicContextRpcClient, RpcServerNotFoundError } from "../../shared/rpc-client";
7
8
  import type { EmbedDetail, SidebarSnapshot, StatusDetail } from "../../shared/rpc-types";
9
+ import {
10
+ checkStatusDetailPayload,
11
+ type OpenCodeStatusExtras,
12
+ type StatusCheck,
13
+ statusRpcFailure,
14
+ } from "../../shared/status-view-check";
8
15
 
9
16
  export type { EmbedDetail, SidebarSnapshot, StatusDetail };
10
17
 
11
18
  let rpcClient: MagicContextRpcClient | null = null;
19
+ let rpcClientDirectory: string | null = null;
12
20
  let rpcGeneration = 0;
13
21
 
22
+ /**
23
+ * Clients for session directories other than the one the TUI started in.
24
+ *
25
+ * OpenCode runs one Magic Context server instance per directory, and each one
26
+ * writes its RPC discovery file under that directory's hash. A TUI started in
27
+ * one directory (commonly the home directory) can show a session whose
28
+ * directory is another project; asking the startup directory's server about
29
+ * that session returns the startup directory's answer (for the home directory:
30
+ * no project state at all), so the sidebar and `/ctx-status` showed nothing.
31
+ * Session-scoped calls therefore go to the client for the session's own
32
+ * directory. The startup client stays as it is for the notification socket and
33
+ * the process-wide calls.
34
+ */
35
+ const sessionDirectoryClients = new Map<string, MagicContextRpcClient>();
36
+ const MAX_SESSION_DIRECTORY_CLIENTS = 16;
37
+
14
38
  /** Initialize the RPC client. Call once on TUI startup. */
15
39
  export function initRpcClient(directory: string): void {
16
40
  const storageDir = getMagicContextStorageDir();
@@ -19,6 +43,127 @@ export function initRpcClient(directory: string): void {
19
43
  // new generation and abandons its in-flight connect).
20
44
  rpcGeneration += 1;
21
45
  rpcClient = new MagicContextRpcClient(storageDir, directory);
46
+ rpcClientDirectory = directory;
47
+ resetSessionDirectoryClients();
48
+ }
49
+
50
+ function resetSessionDirectoryClients(): void {
51
+ for (const client of sessionDirectoryClients.values()) client.reset();
52
+ sessionDirectoryClients.clear();
53
+ }
54
+
55
+ /**
56
+ * The client for the server instance that owns `directory`: the startup client
57
+ * when the directory is the one the TUI started in (or unknown), otherwise a
58
+ * client discovering that directory's own server. Null before init.
59
+ */
60
+ function clientForDirectory(directory: string): MagicContextRpcClient | null {
61
+ if (!rpcClient) return null;
62
+ if (!directory || directory === rpcClientDirectory) return rpcClient;
63
+ const existing = sessionDirectoryClients.get(directory);
64
+ if (existing) return existing;
65
+ if (sessionDirectoryClients.size >= MAX_SESSION_DIRECTORY_CLIENTS) {
66
+ const oldest = sessionDirectoryClients.keys().next().value;
67
+ if (oldest !== undefined) {
68
+ sessionDirectoryClients.get(oldest)?.reset();
69
+ sessionDirectoryClients.delete(oldest);
70
+ }
71
+ }
72
+ // Short resolution: when this directory has no discovery file the caller
73
+ // falls back to asking every local server (see `callSessionRpc`) instead of
74
+ // retrying the miss for fifteen seconds.
75
+ const client = new MagicContextRpcClient(getMagicContextStorageDir(), directory, {
76
+ resolveAttempts: 2,
77
+ reresolveAttempts: 1,
78
+ });
79
+ sessionDirectoryClients.set(directory, client);
80
+ return client;
81
+ }
82
+
83
+ /**
84
+ * The server the notification socket should subscribe to: the one that owns
85
+ * the shown session's directory, so a push from the command that session runs
86
+ * (for example `/ctx-status` asking to open its dialog) reaches this TUI. That
87
+ * is the startup directory's server when no session is shown or the session is
88
+ * in the startup directory. A session directory with no discovery file falls
89
+ * back to the server that claims the session, then to the startup server so
90
+ * session-less notifications still arrive.
91
+ */
92
+ export async function resolveNotificationTarget(
93
+ sessionDirectory: string | null,
94
+ sessionId: string | null,
95
+ ): Promise<{
96
+ client: MagicContextRpcClient;
97
+ directory: string;
98
+ endpoint: { port: number; token: string | null; instanceId: string | null };
99
+ } | null> {
100
+ const startup = rpcClient;
101
+ if (!startup) return null;
102
+ const directory = sessionDirectory ?? "";
103
+ let client = clientForDirectory(directory) ?? startup;
104
+ let endpoint = await client.resolveEndpoint();
105
+ if (!endpoint && client !== startup && sessionId) {
106
+ const owner = await MagicContextRpcClient.findSessionOwner(
107
+ getMagicContextStorageDir(),
108
+ sessionId,
109
+ );
110
+ if (owner) {
111
+ sessionDirectoryClients.get(directory)?.reset();
112
+ sessionDirectoryClients.set(directory, owner);
113
+ client = owner;
114
+ endpoint = await owner.resolveEndpoint();
115
+ }
116
+ }
117
+ if (endpoint) {
118
+ return {
119
+ client,
120
+ directory: client === startup ? (rpcClientDirectory ?? "") : directory,
121
+ endpoint,
122
+ };
123
+ }
124
+ if (client === startup) return null;
125
+ const startupEndpoint = await startup.resolveEndpoint();
126
+ return startupEndpoint
127
+ ? { client: startup, directory: rpcClientDirectory ?? "", endpoint: startupEndpoint }
128
+ : null;
129
+ }
130
+
131
+ /** The directory whose server a notification subscription for `sessionDirectory` targets first. */
132
+ export function notificationDirectoryFor(sessionDirectory: string | null): string {
133
+ const directory = sessionDirectory ?? "";
134
+ if (!directory || directory === rpcClientDirectory) return rpcClientDirectory ?? "";
135
+ return directory;
136
+ }
137
+
138
+ /**
139
+ * Call a session-scoped RPC on the server that owns the session's directory.
140
+ * When no server is filed under that directory (the host spelled it in a way
141
+ * the canonical form still does not match), every live local server is asked
142
+ * whether it owns the session, and the owner, if any, answers this call and
143
+ * later ones for the directory. Only when no server claims the session does
144
+ * the call fail as before.
145
+ */
146
+ async function callSessionRpc<T>(
147
+ directory: string,
148
+ sessionId: string,
149
+ method: string,
150
+ params: Record<string, unknown>,
151
+ ): Promise<T> {
152
+ const client = clientForDirectory(directory);
153
+ if (!client) throw new Error("RPC client is not initialized");
154
+ try {
155
+ return await client.call<T>(method, params);
156
+ } catch (error) {
157
+ if (!(error instanceof RpcServerNotFoundError) || client === rpcClient) throw error;
158
+ const owner = await MagicContextRpcClient.findSessionOwner(
159
+ getMagicContextStorageDir(),
160
+ sessionId,
161
+ );
162
+ if (!owner) throw error;
163
+ sessionDirectoryClients.get(directory)?.reset();
164
+ sessionDirectoryClients.set(directory, owner);
165
+ return owner.call<T>(method, params);
166
+ }
22
167
  }
23
168
 
24
169
  export function getRpcGeneration(): number {
@@ -38,6 +183,8 @@ export function closeRpc(): void {
38
183
  rpcGeneration += 1;
39
184
  rpcClient?.reset();
40
185
  rpcClient = null;
186
+ rpcClientDirectory = null;
187
+ resetSessionDirectoryClients();
41
188
  }
42
189
 
43
190
  const EMPTY_SNAPSHOT: SidebarSnapshot = {
@@ -134,10 +281,15 @@ export async function loadSidebarSnapshot(
134
281
  const empty: SidebarSnapshot = { ...EMPTY_SNAPSHOT, sessionId };
135
282
  if (!rpcClient) return recallSidebarSnapshot(sessionId, empty);
136
283
  try {
137
- const result = await rpcClient.call<SidebarSnapshot>("sidebar-snapshot", {
138
- sessionId,
284
+ const result = await callSessionRpc<SidebarSnapshot>(
139
285
  directory,
140
- });
286
+ sessionId,
287
+ "sidebar-snapshot",
288
+ {
289
+ sessionId,
290
+ directory,
291
+ },
292
+ );
141
293
  if ((result as unknown as Record<string, unknown>).error) {
142
294
  // Snapshot-build errors are explicit failure envelopes, equivalent to
143
295
  // a transport failure: retain the last known-good client snapshot.
@@ -162,26 +314,29 @@ export async function loadSidebarSnapshot(
162
314
  }
163
315
  }
164
316
 
165
- export type StatusDetailResult = { ok: true; detail: StatusDetail } | { ok: false; error: string };
317
+ export type StatusDetailResult = StatusCheck<OpenCodeStatusExtras>;
166
318
 
167
- /** Fetch full status detail without presenting transport failure as an empty session. */
319
+ /**
320
+ * Fetch the status for the `/ctx-status` dialog. Every reply, including a
321
+ * transport failure, comes back as a checked result: either a snapshot the
322
+ * view model can draw, or the reason there is none. The dialog never receives
323
+ * an unchecked payload.
324
+ */
168
325
  export async function loadStatusDetail(
169
326
  sessionId: string,
170
327
  directory: string,
171
328
  modelKey?: string,
172
329
  ): Promise<StatusDetailResult> {
173
- if (!rpcClient) return { ok: false, error: "RPC client is not initialized" };
330
+ if (!rpcClient) return statusRpcFailure("RPC client is not initialized");
174
331
  try {
175
- const result = await rpcClient.call<StatusDetail>("status-detail", {
332
+ const reply = await callSessionRpc<unknown>(directory, sessionId, "status-detail", {
176
333
  sessionId,
177
334
  directory,
178
335
  modelKey,
179
336
  });
180
- const error = (result as unknown as Record<string, unknown>).error;
181
- if (typeof error === "string") return { ok: false, error };
182
- return { ok: true, detail: result };
337
+ return checkStatusDetailPayload(reply, pluginPackageVersion() ?? "unknown");
183
338
  } catch (error) {
184
- return { ok: false, error: error instanceof Error ? error.message : String(error) };
339
+ return statusRpcFailure(error instanceof Error ? error.message : String(error));
185
340
  }
186
341
  }
187
342
 
@@ -199,7 +354,7 @@ const EMPTY_EMBED_DETAIL: EmbedDetail = {
199
354
  export async function loadEmbedDetail(sessionId: string, directory: string): Promise<EmbedDetail> {
200
355
  if (!rpcClient) return EMPTY_EMBED_DETAIL;
201
356
  try {
202
- const result = await rpcClient.call<EmbedDetail>("embed-detail", {
357
+ const result = await callSessionRpc<EmbedDetail>(directory, sessionId, "embed-detail", {
203
358
  sessionId,
204
359
  directory,
205
360
  });
@@ -221,9 +376,14 @@ export async function getCompartmentCount(
221
376
  ): Promise<CompartmentCountResult> {
222
377
  if (!rpcClient) return { ok: false, error: "RPC client is not initialized" };
223
378
  try {
224
- const result = await rpcClient.call<{ count?: number; error?: string }>(
379
+ const result = await callSessionRpc<{ count?: number; error?: string }>(
380
+ directory ?? "",
381
+ sessionId,
225
382
  "compartment-count",
226
- { sessionId, directory },
383
+ {
384
+ sessionId,
385
+ directory,
386
+ },
227
387
  );
228
388
  if (typeof result.error === "string") return { ok: false, error: result.error };
229
389
  if (typeof result.count !== "number" || !Number.isFinite(result.count)) {
@@ -235,11 +395,17 @@ export async function getCompartmentCount(
235
395
  }
236
396
  }
237
397
 
238
- /** Send recomp request to server via RPC. */
239
- export async function requestRecomp(sessionId: string): Promise<boolean> {
398
+ /**
399
+ * Send recomp request to server via RPC. `directory` is the session's
400
+ * directory, so the request reaches the server instance that owns the session
401
+ * (the same one the recomp dialog read its compartment count from).
402
+ */
403
+ export async function requestRecomp(sessionId: string, directory?: string): Promise<boolean> {
240
404
  if (!rpcClient) return false;
241
405
  try {
242
- const result = await rpcClient.call<{ ok: boolean }>("recomp", { sessionId });
406
+ const result = await callSessionRpc<{ ok: boolean }>(directory ?? "", sessionId, "recomp", {
407
+ sessionId,
408
+ });
243
409
  return result.ok ?? false;
244
410
  } catch {
245
411
  return false;
@@ -18,7 +18,11 @@
18
18
  * unlike the old poll it does no network work at idle.
19
19
  */
20
20
 
21
- import { getRpcClient, getRpcGeneration } from "./context-db";
21
+ import {
22
+ getRpcGeneration,
23
+ notificationDirectoryFor,
24
+ resolveNotificationTarget,
25
+ } from "./context-db";
22
26
 
23
27
  export interface SocketNotification {
24
28
  id: number;
@@ -30,6 +34,12 @@ export interface SocketNotification {
30
34
  interface NotificationSocketOptions {
31
35
  /** Current active session id (re-read cheaply to follow session switches). */
32
36
  getSessionId: () => string | null;
37
+ /**
38
+ * Directory of the active session, when the host reports it. The socket
39
+ * subscribes to that directory's server, because that is the server whose
40
+ * commands push this session's notifications; null means the startup one.
41
+ */
42
+ getSessionDirectory?: () => string | null;
33
43
  /** Handle one delivered notification. Returns true only after it is fully
34
44
  * consumed and can be acknowledged. Async because dialog handlers await. */
35
45
  onNotification: (notification: SocketNotification) => boolean | Promise<boolean>;
@@ -47,6 +57,13 @@ let sessionWatchTimer: ReturnType<typeof setInterval> | undefined;
47
57
  let reconnectAttempt = 0;
48
58
  let closed = false;
49
59
  let helloedSession: string | null = null;
60
+ /** Directory whose server the open socket is subscribed to. */
61
+ let connectedDirectory: string | null = null;
62
+ /** Last time the socket was moved to follow a session's directory. */
63
+ let lastRetargetAt = 0;
64
+ /** Minimum spacing between moves, so a session whose server is not up yet does
65
+ * not reconnect the socket every watcher tick. */
66
+ const RETARGET_MIN_INTERVAL_MS = 10_000;
50
67
  let opts: NotificationSocketOptions | null = null;
51
68
  let activeToken: string | null = null;
52
69
  /** Generation of the rpc client used by the active socket. */
@@ -110,6 +127,8 @@ export function stopNotificationSocket(): void {
110
127
  opts = null;
111
128
  activeToken = null;
112
129
  helloedSession = null;
130
+ connectedDirectory = null;
131
+ lastRetargetAt = 0;
113
132
  reconnectAttempt = 0;
114
133
  activeInstanceId = null;
115
134
  notificationProtocolMode = null;
@@ -136,24 +155,22 @@ function scheduleReconnect(): void {
136
155
  async function connect(): Promise<void> {
137
156
  if (closed || socket || inFlightAttemptId !== null) return;
138
157
 
139
- const client = getRpcClient();
140
- if (!client) {
141
- scheduleReconnect();
142
- return;
143
- }
144
-
145
158
  const attemptId = ++nextAttemptId;
146
159
  const rpcGeneration = getRpcGeneration();
147
160
  inFlightAttemptId = attemptId;
148
- const endpoint = await client.resolveEndpoint();
161
+ const target = await resolveNotificationTarget(
162
+ opts?.getSessionDirectory?.() ?? null,
163
+ opts?.getSessionId() ?? null,
164
+ );
149
165
  if (closed || inFlightAttemptId !== attemptId || getRpcGeneration() !== rpcGeneration) {
150
166
  return;
151
167
  }
152
168
  inFlightAttemptId = null;
153
- if (!endpoint) {
169
+ if (!target) {
154
170
  scheduleReconnect();
155
171
  return;
156
172
  }
173
+ const { client, endpoint } = target;
157
174
 
158
175
  let ws: WebSocket;
159
176
  try {
@@ -171,6 +188,7 @@ async function connect(): Promise<void> {
171
188
  return;
172
189
  }
173
190
  connectGeneration = rpcGeneration;
191
+ connectedDirectory = target.directory;
174
192
  activeToken = endpoint.token;
175
193
  notificationProtocolMode = null;
176
194
  bufferedNotifications.length = 0;
@@ -457,6 +475,26 @@ export function _resetNotificationSocketStateForTesting(): void {
457
475
  * actually changes. Reads a property; no network at idle. */
458
476
  function watchSession(): void {
459
477
  if (closed || !socket || socket.readyState !== WebSocket.OPEN) return;
478
+ // The shown session belongs to another directory's server: move the socket
479
+ // there, or that server's pushes for this session never reach this TUI.
480
+ const wanted = notificationDirectoryFor(opts?.getSessionDirectory?.() ?? null);
481
+ if (wanted !== connectedDirectory && Date.now() - lastRetargetAt >= RETARGET_MIN_INTERVAL_MS) {
482
+ lastRetargetAt = Date.now();
483
+ const previous = socket;
484
+ socket = null;
485
+ activeToken = null;
486
+ helloedSession = null;
487
+ connectedDirectory = null;
488
+ notificationProtocolMode = null;
489
+ bufferedNotifications.length = 0;
490
+ try {
491
+ previous.close();
492
+ } catch {
493
+ // best-effort
494
+ }
495
+ void connect();
496
+ return;
497
+ }
460
498
  const current = opts?.getSessionId() ?? null;
461
499
  if (current === helloedSession) return;
462
500
  // Re-hello with the token authenticated by this socket; no rediscovery or
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The directory whose Magic Context server owns a session.
3
+ *
4
+ * OpenCode starts one Magic Context server instance per directory. The TUI
5
+ * starts in one directory but can show a session from another one (non-git
6
+ * directories share OpenCode's global project, so a TUI started in the home
7
+ * directory lists sessions from any of them). The sidebar and `/ctx-status`
8
+ * must ask the server for the session's directory, not the startup one.
9
+ *
10
+ * `sessionDirectory` is what the host reports for the session (OpenCode 1:
11
+ * `api.state.session.get(id).directory`; OpenCode 2:
12
+ * `context.data.session.get(id).location.directory`). The startup directory is
13
+ * the fallback while the host has not loaded the session yet.
14
+ */
15
+ export function directoryForSession(sessionDirectory: unknown, startupDirectory: string): string {
16
+ return typeof sessionDirectory === "string" && sessionDirectory.length > 0
17
+ ? sessionDirectory
18
+ : startupDirectory;
19
+ }
@@ -22,8 +22,7 @@ import { createElement as _$createElement } from "opentui:runtime-module:%40open
22
22
  */
23
23
  import { createMemo, createSignal, onCleanup } from "opentui:runtime-module:solid-js";
24
24
  import packageJson from "../../../package.json";
25
- import { statusSummaryFromDetail } from "../../shared/status-summary";
26
- import { buildStatusView, distributeBarWidths, statusColumnsFor } from "../../shared/status-view";
25
+ import { buildStatusViewFor, distributeBarWidths, statusColumnsFor } from "../../shared/status-view";
27
26
  import { RUST_MODE_HOST_PATHS_LINE } from "../../shared/rust-mode-status";
28
27
  const R = props => (() => {
29
28
  var _el$ = _$createElement("box"),
@@ -65,10 +64,13 @@ function toneColor(theme, tone) {
65
64
 
66
65
  /**
67
66
  * Width the dialog is actually laid out at, which is NOT the terminal width:
68
- * each host sizes its own dialog surface (OpenCode 2's widest is 88 columns on
69
- * a 200-column terminal), and that is the width the sections have to fit into.
70
- * Renderables carry their laid-out width and emit "resized" when it changes, so
71
- * the component reads it from its own root box.
67
+ * each host sizes its own dialog surface (OpenCode 1's default is 60 columns,
68
+ * OpenCode 2's widest is 88 columns on a 200-column terminal), and that is the
69
+ * width the sections have to fit into. Renderables carry their laid-out width
70
+ * and emit "resize" when a layout pass changes it, so the component reads it
71
+ * from its own root box. ("resized", with a d, is emitted only by the
72
+ * renderer's root; a box never sends it, and listening for it left the dialog
73
+ * sizing its sections from the terminal width forever.)
72
74
  *
73
75
  * Until the first layout there is no width to read; the terminal width is the
74
76
  * fallback, and an unknown terminal keeps the wide layout the dialog has always
@@ -132,26 +134,27 @@ const StatusSectionView = props => (() => {
132
134
  _$effect(_$p => _$setProp(_el$9, "fg", props.t.text, _$p));
133
135
  return _el$8;
134
136
  })();
137
+
138
+ /**
139
+ * `status` is the checked result of the status RPC (`loadStatusDetail`), never
140
+ * the raw reply: a reply the view cannot draw arrives as the reason it cannot,
141
+ * and the shared model turns that into a "status unavailable" view. An
142
+ * unchecked reply used to reach the view model directly, where a missing field
143
+ * threw inside this component's first render and crashed the whole TUI.
144
+ */
135
145
  export const StatusDialog = props => {
136
146
  const theme = createMemo(() => props.api.theme.current);
137
147
  const t = () => theme();
138
- const s = () => props.s;
139
- const compactionOff = () => s().compaction_enabled === false;
140
-
141
- // Prefer the RPC-provided model context limit (what the sidebar shows) so the
142
- // two surfaces never disagree. Fall back to deriving from usage% only when the
143
- // RPC limit is absent (0) — and that derivation is itself undefined at 0%, so
144
- // it stays "?" rather than showing a number inconsistent with the sidebar.
145
- const contextLimit = () => s().contextLimit > 0 ? s().contextLimit : s().usagePercentage > 0 ? Math.round(s().inputTokens / (s().usagePercentage / 100)) : 0;
148
+ const ready = () => props.status.state === "ready" ? props.status : null;
149
+ const compactionOff = () => ready()?.source.compaction_enabled === false;
150
+ const recompProgress = () => ready()?.extras.recompProgress ?? null;
151
+ const hostBackendsModuleSide = () => ready()?.extras.hostBackendsModuleSide === true;
146
152
 
147
153
  // Which rows exist, what they are called and which colour they carry is
148
154
  // decided by the shared model, so this dialog and Pi's overlay cannot drift
149
- // apart. This component only draws what the model returns.
150
- const view = createMemo(() => buildStatusView({
151
- ...s(),
152
- contextLimit: contextLimit(),
153
- warnings: statusSummaryFromDetail(s()).warnings
154
- }, {
155
+ // apart. This component only draws what the model returns, and the model
156
+ // never throws: a result it cannot draw becomes the unavailable view.
157
+ const view = createMemo(() => buildStatusViewFor(props.status, {
155
158
  version: packageJson.version
156
159
  }));
157
160
  // The dialog's own laid-out width, which is what the sections have to fit
@@ -163,8 +166,8 @@ export const StatusDialog = props => {
163
166
  if (Number.isFinite(width) && width > 0) setDialogWidth(width);
164
167
  };
165
168
  read();
166
- element?.on?.("resized", read);
167
- onCleanup(() => element?.off?.("resized", read));
169
+ element?.on?.("resize", read);
170
+ onCleanup(() => element?.off?.("resize", read));
168
171
  };
169
172
  // paddingLeft + paddingRight below; what the sections get is what is left.
170
173
  const contentWidth = () => dialogWidth() > 0 ? dialogWidth() - 4 : terminalColumns();
@@ -307,9 +310,9 @@ export const StatusDialog = props => {
307
310
  });
308
311
  })(), null);
309
312
  _$insert(_el$1, (() => {
310
- var _c$3 = _$memo(() => !!(!compactionOff() && s().recompProgress));
313
+ var _c$3 = _$memo(() => !!(!compactionOff() && recompProgress()));
311
314
  return () => _c$3() && (() => {
312
- const p = s().recompProgress;
315
+ const p = recompProgress();
313
316
  // Label follows the flow that started the run, so a plain
314
317
  // /ctx-recomp never reads as an "Upgrade" (dogfood 2026-06-04).
315
318
  const verb = p.kind === "upgrade" ? "Upgrade" : p.kind === "embed" ? "Embed" : "Recomp";
@@ -429,7 +432,7 @@ export const StatusDialog = props => {
429
432
  })();
430
433
  })(), _el$20);
431
434
  _$insert(_el$1, (() => {
432
- var _c$4 = _$memo(() => !!s().hostBackendsModuleSide);
435
+ var _c$4 = _$memo(() => !!hostBackendsModuleSide());
433
436
  return () => _c$4() && (() => {
434
437
  var _el$30 = _$createElement("box"),
435
438
  _el$31 = _$createElement("text"),
@@ -468,7 +471,10 @@ export const StatusDialog = props => {
468
471
  _$setProp(_el$35, "width", "100%");
469
472
  _$setProp(_el$35, "gap", 4);
470
473
  _$setProp(_el$36, "flexDirection", "column");
471
- _$setProp(_el$36, "flexShrink", 0);
474
+ _$setProp(_el$36, "flexGrow", 0);
475
+ _$setProp(_el$36, "flexShrink", 1);
476
+ _$setProp(_el$36, "minWidth", 0);
477
+ _$setProp(_el$36, "overflow", "hidden");
472
478
  _$insert(_el$36, () => columnSections(0).map(section => _$createComponent(StatusSectionView, {
473
479
  get t() {
474
480
  return t();
@@ -476,7 +482,10 @@ export const StatusDialog = props => {
476
482
  section: section
477
483
  })));
478
484
  _$setProp(_el$37, "flexDirection", "column");
479
- _$setProp(_el$37, "flexShrink", 0);
485
+ _$setProp(_el$37, "flexGrow", 0);
486
+ _$setProp(_el$37, "flexShrink", 1);
487
+ _$setProp(_el$37, "minWidth", 0);
488
+ _$setProp(_el$37, "overflow", "hidden");
480
489
  _$insert(_el$37, () => columnSections(1).map(section => _$createComponent(StatusSectionView, {
481
490
  get t() {
482
491
  return t();
@@ -486,8 +495,8 @@ export const StatusDialog = props => {
486
495
  _$effect(_p$ => {
487
496
  var _v$14 = columns().leftWidth,
488
497
  _v$15 = columns().rightWidth;
489
- _v$14 !== _p$.e && (_p$.e = _$setProp(_el$36, "width", _v$14, _p$.e));
490
- _v$15 !== _p$.t && (_p$.t = _$setProp(_el$37, "width", _v$15, _p$.t));
498
+ _v$14 !== _p$.e && (_p$.e = _$setProp(_el$36, "flexBasis", _v$14, _p$.e));
499
+ _v$15 !== _p$.t && (_p$.t = _$setProp(_el$37, "flexBasis", _v$15, _p$.t));
491
500
  return _p$;
492
501
  }, {
493
502
  e: undefined,
@@ -9,9 +9,9 @@ import { createComponent as _$createComponent } from "opentui:runtime-module:%40
9
9
  // @ts-nocheck
10
10
  import { createMemo } from "opentui:runtime-module:solid-js";
11
11
  import { StatusDialog } from "./dialogs/status-dialog";
12
- import { renderUserFacingFailure, userFacingFailureCode } from "../shared/user-facing-codes";
13
12
  import { createSidebarContentSlot, kickRecompProgressRefresh, refreshSidebarSnapshot } from "./slots/sidebar-content";
14
13
  import { closeRpc, getAnnouncement, getCompartmentCount, getRpcGeneration, initRpcClient, loadEmbedDetail, loadStatusDetail, loadToastDurationMs, markAnnounced, requestRecomp } from "./data/context-db";
14
+ import { directoryForSession } from "./data/session-directory";
15
15
  import { startNotificationSocket, stopNotificationSocket } from "./data/notification-socket";
16
16
  import { isCompactionEnabled } from "../config/agent-disable";
17
17
  import { loadPluginConfig } from "../config";
@@ -106,6 +106,20 @@ function getSessionId(api) {
106
106
  }
107
107
  return null;
108
108
  }
109
+
110
+ /**
111
+ * The directory whose Magic Context server owns this session, which is not
112
+ * necessarily the directory the TUI started in (see `directoryForSession`).
113
+ */
114
+ function sessionDirectory(api, sessionId) {
115
+ let reported;
116
+ try {
117
+ reported = api.state.session.get(sessionId)?.directory;
118
+ } catch {
119
+ // Session state not available yet: fall back to the startup directory.
120
+ }
121
+ return directoryForSession(reported, api.state.path.directory ?? "");
122
+ }
109
123
  function getModelKeyFromMessages(api, sessionId) {
110
124
  try {
111
125
  const msgs = api.state.session.messages(sessionId);
@@ -138,7 +152,7 @@ async function showRecompDialog(api, targetSessionId = getSessionId(api)) {
138
152
  });
139
153
  return false;
140
154
  }
141
- const countResult = await getCompartmentCount(sessionId, api.state.path.directory ?? "");
155
+ const countResult = await getCompartmentCount(sessionId, sessionDirectory(api, sessionId));
142
156
  // Ack only after the dialog is actually shown for the same active session;
143
157
  // route switches while the RPC detail load is in flight must leave it pending.
144
158
  if (getSessionId(api) !== sessionId) return false;
@@ -156,7 +170,7 @@ async function showRecompDialog(api, targetSessionId = getSessionId(api)) {
156
170
  return [count === 0 ? "This session has no compartments yet — recomp will build them from raw history." : `You have ${count} compartments.`, "", "Recomp will rebuild the compressed history from raw history. Saved memories are not changed.", "This may take a long time and consume significant tokens.", "", "Proceed?"].join("\n");
157
171
  },
158
172
  onConfirm: async () => {
159
- const requested = await requestRecomp(sessionId);
173
+ const requested = await requestRecomp(sessionId, sessionDirectory(api, sessionId));
160
174
  if (!requested) {
161
175
  showToast(api, {
162
176
  message: "Recomp request failed",
@@ -189,23 +203,17 @@ async function showStatusDialog(api, targetSessionId = getSessionId(api)) {
189
203
  });
190
204
  return false;
191
205
  }
192
- const directory = api.state.path.directory ?? "";
206
+ const directory = sessionDirectory(api, sessionId);
193
207
  const modelKey = getModelKeyFromMessages(api, sessionId);
194
208
  const result = await loadStatusDetail(sessionId, directory, modelKey);
195
209
  if (getSessionId(api) !== sessionId) return false;
196
- if (!result.ok) {
197
- console.error(`[magic-context] status unavailable code=${userFacingFailureCode("status_unavailable")}: ${result.error}`);
198
- showToast(api, {
199
- message: renderUserFacingFailure("status_unavailable"),
200
- variant: "warning"
201
- });
202
- return false;
203
- }
210
+ // A result without a usable snapshot still opens the dialog: it shows the
211
+ // "status unavailable" view naming the reason (RPC error, a directory the
212
+ // server keeps no state for, missing fields, a server/UI version
213
+ // difference) instead of a toast that disappears.
204
214
  api.ui.dialog.replace(() => _$createComponent(StatusDialog, {
205
215
  api: api,
206
- get s() {
207
- return result.detail;
208
- }
216
+ status: result
209
217
  }));
210
218
  return true;
211
219
  }
@@ -250,7 +258,7 @@ async function showEmbedDialog(api, targetSessionId = getSessionId(api)) {
250
258
  });
251
259
  return false;
252
260
  }
253
- const directory = api.state.path.directory ?? "";
261
+ const directory = sessionDirectory(api, sessionId);
254
262
  const detail = await loadEmbedDetail(sessionId, directory);
255
263
  if (getSessionId(api) !== sessionId) return false;
256
264
  api.ui.dialog.replace(() => _$createComponent(EmbedDialog, {
@@ -673,6 +681,11 @@ const tui = async (api, _options, meta) => {
673
681
  };
674
682
  startNotificationSocket({
675
683
  getSessionId: () => getSessionId(api),
684
+ // Follow the shown session's own server, whose commands push its dialogs.
685
+ getSessionDirectory: () => {
686
+ const sessionId = getSessionId(api);
687
+ return sessionId ? sessionDirectory(api, sessionId) : null;
688
+ },
676
689
  onNotification: handleNotification
677
690
  });
678
691