@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
@@ -4,6 +4,7 @@ import {
4
4
  linkSync,
5
5
  openSync,
6
6
  readFileSync,
7
+ realpathSync,
7
8
  renameSync,
8
9
  statSync,
9
10
  unlinkSync,
@@ -434,9 +435,13 @@ export function loadRawConfigFile(options: RawConfigLoadOptions): RawConfigLoadR
434
435
 
435
436
  let temporaryPath: string | undefined;
436
437
  try {
437
- const mode = statSync(options.configPath).mode & 0o777;
438
+ // Write through a symlinked config (stow, chezmoi, home-manager keep
439
+ // it in a dotfiles repo): the temporary file is created next to the
440
+ // real file and renamed onto it, so the link itself stays a link.
441
+ const writePath = realpathSync(options.configPath);
442
+ const mode = statSync(writePath).mode & 0o777;
438
443
  writeExclusiveBackup(backupPath, observedBytes, mode);
439
- temporaryPath = writeTemporaryCandidate(options.configPath, migration.bytes, mode);
444
+ temporaryPath = writeTemporaryCandidate(writePath, migration.bytes, mode);
440
445
  options.afterTemporaryWrite?.();
441
446
 
442
447
  const currentBytes = readFileSync(options.configPath);
@@ -456,7 +461,7 @@ export function loadRawConfigFile(options: RawConfigLoadOptions): RawConfigLoadR
456
461
  continue;
457
462
  }
458
463
 
459
- renameSync(temporaryPath, options.configPath);
464
+ renameSync(temporaryPath, writePath);
460
465
  return {
461
466
  configPath: options.configPath,
462
467
  bytes: migration.bytes,
@@ -6,6 +6,7 @@ import type {
6
6
  AGENTIC_DREAM_TASKS,
7
7
  DreamTaskName,
8
8
  } from "../../features/magic-context/dreamer/task-registry";
9
+ import { toolTemplateError } from "../../shared/historian-tool-template";
9
10
  import { isValidPromptSurfaceModelKey } from "../../shared/prompt-surface";
10
11
  import { AgentOverrideConfigSchema } from "./agent-overrides";
11
12
 
@@ -490,7 +491,7 @@ const DreamTaskBaseConfigSchema = z
490
491
  .positive()
491
492
  .optional()
492
493
  .describe(
493
- "Maximum cumulative prompt tokens (input + cache read + cache write) for one tool-loop child. Defaults vary by task.",
494
+ "Cumulative prompt-token investigation budget (input + cache read + cache write) for one tool-loop child. Defaults: 2,500,000 for map-memories and verify; 3,000,000 for verify-broad; other tool-loop tasks vary. Completed answers are retained even if their usage crosses the budget.",
494
495
  ),
495
496
  })
496
497
  .strict();
@@ -663,6 +664,21 @@ export type DreamerConfig = z.infer<typeof DreamerConfigSchema>;
663
664
  * the strict opencode, pi, and omp blocks; two_pass and disallowed_tools stay here.
664
665
  */
665
666
  export const HistorianConfigSchema = AgentMetadataSchema.extend({
667
+ expand_tools: z
668
+ .record(
669
+ z.string(),
670
+ z.union([
671
+ z.string().superRefine((value, ctx) => {
672
+ const error = toolTemplateError(value);
673
+ if (error) ctx.addIssue({ code: "custom", message: error });
674
+ }),
675
+ z.literal(false),
676
+ ]),
677
+ )
678
+ .optional()
679
+ .describe(
680
+ 'Readable historian tool expansions, keyed by exact host tool name. Templates override built-in defaults; false disables an expansion. Supports ${input.path}, ${output.path}, bare ${output}, array [N], [*].field, .each("${field}"), .join("separator"), .count and final .truncate(N). Missing fields are empty; placeholders default to 300 characters, lists to 10 elements, expansions to 1000 characters. Valid in user and project config; affects historian/recomp and verbose ctx_expand only, never the wire or default ctx_expand transcript.',
681
+ ),
666
682
  opencode: OpenCodeHarnessBlockSchema.optional(),
667
683
  pi: PiHarnessBlockSchema.optional(),
668
684
  omp: OmpHarnessBlockSchema.optional(),
@@ -695,7 +711,7 @@ export const HistorianConfigSchema = AgentMetadataSchema.extend({
695
711
  .array(z.enum(["*", "read", "aft_outline", "aft_zoom", "aft_search"]))
696
712
  .default([])
697
713
  .describe(
698
- 'OpenCode only. Tools to REMOVE from the historian\'s default allow-list [read, aft_outline, aft_zoom, aft_search]. Applies to both historian and historian-editor agents. Use ["*"] to strip all tool definitions from the model request — this prevents weak instruction-following models (e.g. mistral-small-latest) from entering tool-calling loops. Individual tool names remove just that tool. Note: a user-supplied historian.permission override can re-allow a tool that disallowed_tools removed — disallowed_tools sets the baseline, permission overrides take precedence. (default: [])',
714
+ "Legacy compatibility setting. Historians, recomp and editor passes always run with zero tools and locked permissions; this list no longer changes their tool surface. (default: [])",
699
715
  ),
700
716
  }).optional();
701
717
  export type HistorianConfig = NonNullable<z.infer<typeof HistorianConfigSchema>>;
@@ -771,7 +787,7 @@ const BaseEmbeddingConfigSchema = z
771
787
  .enum(["auto", "native", "wasm"])
772
788
  .default("auto")
773
789
  .describe(
774
- "Local provider only: ONNX runtime selection. 'auto' uses native under Node and uses WASM under Bun versions before 1.4.0, where Bun's NAPI teardown race can panic on quit; native is restored automatically on Bun 1.4.0+. Set 'native' only to prefer speed while accepting that pre-1.4.0 Bun crash risk, or 'wasm' to avoid loading the native addon.",
790
+ "Local provider only: ONNX runtime selection. 'auto' uses native under Node and uses WASM under Bun versions before 1.4.0, where Bun's NAPI teardown race can panic on quit; native is restored automatically on Bun 1.4.0+. Inference runs in a dedicated worker. On Bun before 1.4.0, even explicit 'native' uses WASM because native worker teardown can crash the process. Set 'wasm' to avoid loading the native addon on newer hosts too.",
775
791
  ),
776
792
  local_dtype: z
777
793
  .enum([
@@ -1567,6 +1583,7 @@ export const LIVE_RELOAD_CONFIG_PATHS = [
1567
1583
  "historian.omp.fallback_models",
1568
1584
  "historian.omp.thinking_level",
1569
1585
  "historian.two_pass",
1586
+ "historian.expand_tools",
1570
1587
  "historian.maxTokens",
1571
1588
  "historian_timeout_ms",
1572
1589
  "commit_cluster_trigger.enabled",
@@ -1,7 +1,8 @@
1
1
  import { afterEach, beforeEach, describe, expect, it } from "bun:test";
2
- import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { rmSync, writeFileSync } from "node:fs";
3
3
  import { homedir, tmpdir } from "node:os";
4
4
  import { join, sep } from "node:path";
5
+ import { createTestTempDirFromPath } from "../shared/test-temp-dir";
5
6
 
6
7
  import { substituteConfigVariables } from "./variable";
7
8
 
@@ -10,7 +11,7 @@ describe("substituteConfigVariables", () => {
10
11
  let tmpDir: string;
11
12
 
12
13
  beforeEach(() => {
13
- tmpDir = mkdtempSync(join(tmpdir(), "mc-variable-test-"));
14
+ tmpDir = createTestTempDirFromPath(join(tmpdir(), "mc-variable-test-"));
14
15
  });
15
16
 
16
17
  afterEach(() => {
@@ -13,9 +13,10 @@
13
13
  * NAMES are intentionally unsupported (smaller surface; add later if asked).
14
14
  * Empty string `""` means "never" and is handled by the caller, not here.
15
15
  *
16
- * Day matching uses Vixie OR-semantics: when BOTH dom and dow are restricted
17
- * (not `*`), a day matches if EITHER matches; when only one is restricted, only
18
- * that one is consulted; when neither is restricted, every day matches.
16
+ * Day matching follows Vixie cron: a dom or dow field that starts with `*`
17
+ * (`*` itself or a star-step such as `*\/2`) counts as unrestricted. When BOTH
18
+ * fields are restricted a day matches if EITHER matches; otherwise a day must
19
+ * match both sets, which for a plain `*` field means only the other one counts.
19
20
  *
20
21
  * Timezone: all matching is in the machine's LOCAL time — the dreamer's whole
21
22
  * purpose is "run while the user is asleep", which is a wall-clock concept.
@@ -30,7 +31,7 @@ export interface ParsedCron {
30
31
  dom: Set<number>;
31
32
  month: Set<number>;
32
33
  dow: Set<number>;
33
- /** Original field token was not `*` — drives Vixie dom/dow OR-semantics. */
34
+ /** Field token does not start with `*` — drives Vixie dom/dow OR-semantics. */
34
35
  domRestricted: boolean;
35
36
  dowRestricted: boolean;
36
37
  }
@@ -145,8 +146,10 @@ export function parseCron(expression: string): ParseCronResult {
145
146
  dom: sets[2],
146
147
  month: sets[3],
147
148
  dow: sets[4],
148
- domRestricted: tokens[2] !== "*",
149
- dowRestricted: tokens[4] !== "*",
149
+ // Vixie cron treats any star-prefixed field (`*`, `*/2`) as
150
+ // unrestricted when choosing between OR and AND day matching.
151
+ domRestricted: !tokens[2].startsWith("*"),
152
+ dowRestricted: !tokens[4].startsWith("*"),
150
153
  },
151
154
  };
152
155
  }
@@ -160,9 +163,26 @@ function matchesDay(cron: ParsedCron, date: Date): boolean {
160
163
  const dom = cron.dom.has(date.getDate());
161
164
  const dow = cron.dow.has(date.getDay());
162
165
  if (cron.domRestricted && cron.dowRestricted) return dom || dow;
163
- if (cron.domRestricted) return dom;
164
- if (cron.dowRestricted) return dow;
165
- return true;
166
+ return dom && dow;
167
+ }
168
+
169
+ /** Longest each month can be, counting Feb 29. */
170
+ const MAX_DAYS_IN_MONTH = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
171
+
172
+ /**
173
+ * False when the day-of-month set fits in none of the cron's months (e.g.
174
+ * `0 0 31 2 *`, Feb 31), so the schedule can never fire. Lets nextOccurrence
175
+ * answer "never" at once instead of scanning ~2 million minutes on every
176
+ * evaluation. A restricted weekday under OR-matching always fires eventually.
177
+ */
178
+ function dayOfMonthCanOccur(cron: ParsedCron): boolean {
179
+ if (cron.domRestricted && cron.dowRestricted) return true;
180
+ for (const month of cron.month) {
181
+ for (const day of cron.dom) {
182
+ if (day <= MAX_DAYS_IN_MONTH[month - 1]) return true;
183
+ }
184
+ }
185
+ return false;
166
186
  }
167
187
 
168
188
  /** True if `date`'s local civil fields match the cron. */
@@ -199,6 +219,7 @@ export function nextOccurrence(
199
219
  excludeCivilMinute?: string,
200
220
  maxSearchMs = MAX_SEARCH_MS,
201
221
  ): Date | null {
222
+ if (!dayOfMonthCanOccur(cron)) return null;
202
223
  const afterMs = after.getTime();
203
224
  // Align to the next whole minute strictly after `after` (never returns `after`).
204
225
  let cursorMs = Math.floor(afterMs / MINUTE_MS) * MINUTE_MS + MINUTE_MS;
@@ -30,12 +30,14 @@ export const CANONICAL_DREAM_TASKS = [
30
30
  export type DreamTaskName = (typeof CANONICAL_DREAM_TASKS)[number];
31
31
 
32
32
  /** Prompt-token ceilings informed by docs/reports/dreamer-token-usage.md.
33
- * Multi-memory batches need more room than a single primer investigation;
34
- * curate's 150-step tool loop warrants a larger allowance too. */
33
+ * Completed Gemini run usage predicts 20-memory mapping/verification batches
34
+ * at about 70% of their allowance
35
+ * (docs/reports/verify-token-budget-2026-09-30.md); curate and other tasks retain
36
+ * their separate allowances. */
35
37
  export const DREAM_TOOL_LOOP_TOKEN_BUDGETS = {
36
- "map-memories": 1_500_000,
37
- verify: 1_700_000,
38
- "verify-broad": 1_700_000,
38
+ "map-memories": 2_500_000,
39
+ verify: 2_500_000,
40
+ "verify-broad": 3_000_000,
39
41
  curate: 1_500_000,
40
42
  retrospective: 300_000,
41
43
  "maintain-docs": 1_600_000,
@@ -2,6 +2,7 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
2
2
  import * as fs from "node:fs";
3
3
  import * as os from "node:os";
4
4
  import * as path from "node:path";
5
+ import { createTestTempDirFromPath } from "./test-temp-dir";
5
6
 
6
7
  /**
7
8
  * `announcement.ts` reads/writes a single `last_announced_version` file under
@@ -23,7 +24,7 @@ let tmpRoot = "";
23
24
  let originalXdg: string | undefined;
24
25
 
25
26
  beforeEach(() => {
26
- tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), "mc-announcement-test-"));
27
+ tmpRoot = createTestTempDirFromPath(path.join(os.tmpdir(), "mc-announcement-test-"));
27
28
  originalXdg = process.env.XDG_DATA_HOME;
28
29
  process.env.XDG_DATA_HOME = tmpRoot;
29
30
  });
@@ -1,5 +1,31 @@
1
1
  import { describe, expect, test } from "bun:test";
2
- import { hasLengthCappedOutput } from "./assistant-message-extractor";
2
+ import {
3
+ describeAssistantSettlement,
4
+ extractLatestAssistantText,
5
+ hasLengthCappedOutput,
6
+ } from "./assistant-message-extractor";
7
+
8
+ test("reasoning-only and tool-only turns stay out of manifest text and retain finish diagnostics", () => {
9
+ for (const [type, finish] of [
10
+ ["reasoning", "stop"],
11
+ ["tool", "tool-calls"],
12
+ ]) {
13
+ const messages = [
14
+ {
15
+ info: { role: "assistant", finish },
16
+ parts: [{ type, text: "private or tool data" }],
17
+ },
18
+ ];
19
+ expect(extractLatestAssistantText(messages)).toBeNull();
20
+ expect(describeAssistantSettlement(messages)).toContain(`finish=${finish}`);
21
+ }
22
+ expect(
23
+ describeAssistantSettlement({
24
+ tokenLog: { finish_reason: "length" },
25
+ reasoning: "private",
26
+ }),
27
+ ).toBe("finish=length, reasoning=true");
28
+ });
3
29
 
4
30
  describe("hasLengthCappedOutput", () => {
5
31
  test("detects OpenCode assistant info.finish", () => {
@@ -127,3 +127,30 @@ export function hasLengthCappedOutput(value: unknown): boolean {
127
127
 
128
128
  return Object.values(value).some((item) => hasLengthCappedOutput(item));
129
129
  }
130
+
131
+ /** Settlement metadata for diagnostics, never private reasoning as task output. */
132
+ export function describeAssistantSettlement(output: unknown): string {
133
+ if (isRecord(output) && isRecord(output.tokenLog)) {
134
+ return `finish=${String(output.tokenLog.finish_reason ?? "unknown")}, reasoning=${typeof output.reasoning === "string" && output.reasoning.length > 0}`;
135
+ }
136
+ const latest = getLatestAssistantMessage(output);
137
+ const parts = Array.isArray(latest?.parts) ? latest.parts.filter(isRecord) : [];
138
+ return `finish=${latest?.info?.finish ?? "unknown"}, reasoning=${parts.some((part) => part.type === "reasoning")}, tools=${parts.filter((part) => part.type === "tool").length}`;
139
+ }
140
+
141
+ /** Describe persisted host/provider errors without losing structured status or message fields. */
142
+ export function describeAssistantError(error: unknown): string {
143
+ if (error instanceof Error) return error.message;
144
+ if (!isRecord(error)) return String(error);
145
+ const data = isRecord(error.data) ? error.data : error;
146
+ const message = typeof data.message === "string" ? data.message : undefined;
147
+ const status = data.statusCode ?? data.status;
148
+ const name =
149
+ typeof error.name === "string"
150
+ ? error.name
151
+ : typeof error.type === "string"
152
+ ? error.type
153
+ : undefined;
154
+ const description = [name, message].filter(Boolean).join(": ") || JSON.stringify(error);
155
+ return status === undefined ? description : `${description} (status=${String(status)})`;
156
+ }
@@ -0,0 +1,38 @@
1
+ import { expect, test } from "bun:test";
2
+ import { drainBackgroundBatches } from "./background-batch-drain";
3
+
4
+ test("background drain yields after each committed slice and resumes after its tick budget", async () => {
5
+ let clock = 0;
6
+ let remaining = 10;
7
+ let yields = 0;
8
+ const options = {
9
+ budgetMs: 3,
10
+ now: () => clock,
11
+ yieldFn: async () => {
12
+ yields++;
13
+ clock++;
14
+ },
15
+ };
16
+ const step = () => {
17
+ if (remaining === 0) return false;
18
+ remaining--;
19
+ return true;
20
+ };
21
+ expect(await drainBackgroundBatches(step, options)).toBe(3);
22
+ expect(yields).toBe(3);
23
+ expect(remaining).toBe(7);
24
+ expect(await drainBackgroundBatches(step, { ...options, budgetMs: 20 })).toBe(7);
25
+ expect(yields).toBe(10);
26
+ expect(remaining).toBe(0);
27
+ });
28
+
29
+ test("a busy background slice defers without rerunning a partially executed callback", async () => {
30
+ let attempts = 0;
31
+ expect(
32
+ await drainBackgroundBatches(() => {
33
+ attempts++;
34
+ throw Object.assign(new Error("busy"), { code: "SQLITE_BUSY" });
35
+ }),
36
+ ).toBe(0);
37
+ expect(attempts).toBe(1);
38
+ });
@@ -0,0 +1,29 @@
1
+ import {
2
+ isTransientSqliteError,
3
+ withoutSqliteTransformPass,
4
+ withSqliteBackgroundWriter,
5
+ } from "./sqlite";
6
+
7
+ /** Drain committed slices without monopolizing the event loop or borrowing a
8
+ * foreground turn's lock-wait budget. A busy slice defers to the next timer tick. */
9
+ export async function drainBackgroundBatches(
10
+ step: () => boolean,
11
+ options: { budgetMs?: number; now?: () => number; yieldFn?: () => Promise<void> } = {},
12
+ ): Promise<number> {
13
+ const now = options.now ?? (() => performance.now());
14
+ const deadline = now() + (options.budgetMs ?? 2000);
15
+ const yieldFn =
16
+ options.yieldFn ?? (() => new Promise<void>((resolve) => setTimeout(resolve, 0)));
17
+ let batches = 0;
18
+ while (now() < deadline) {
19
+ try {
20
+ if (!withoutSqliteTransformPass(() => withSqliteBackgroundWriter(step))) break;
21
+ } catch (error) {
22
+ if (isTransientSqliteError(error)) break;
23
+ throw error;
24
+ }
25
+ batches++;
26
+ await yieldFn();
27
+ }
28
+ return batches;
29
+ }
@@ -0,0 +1,50 @@
1
+ import type { Config } from "@opencode-ai/sdk";
2
+
3
+ // Keep command metadata independent of server features: config validation and
4
+ // the separately shipped TUI need the same reserved command names.
5
+ type BuiltinCommandConfig = NonNullable<Config["command"]>;
6
+
7
+ const COMPACTION_ENABLED_PATH = `compaction${".enabled"}`;
8
+
9
+ export function getMagicContextBuiltinCommands(compactionEnabled = true) {
10
+ const unavailableInCompactionOff = (command: string) =>
11
+ `Unavailable when ${COMPACTION_ENABLED_PATH} is false: /${command} manages compacted history.`;
12
+
13
+ return {
14
+ "ctx-status": {
15
+ template: "ctx-status",
16
+ description: "Show magic context status, pending queue, cache TTL, and debug info",
17
+ },
18
+ "ctx-recomp": {
19
+ template: "ctx-recomp",
20
+ description: compactionEnabled
21
+ ? "Rebuild compressed history from raw history (full or <start>-<end> range); memories are not changed"
22
+ : unavailableInCompactionOff("ctx-recomp"),
23
+ },
24
+ "ctx-wrapup": {
25
+ template: "ctx-wrapup",
26
+ description: compactionEnabled
27
+ ? "Compact older live history while keeping the newest messages raw"
28
+ : unavailableInCompactionOff("ctx-wrapup"),
29
+ },
30
+ "ctx-flush": {
31
+ template: "ctx-flush",
32
+ description: compactionEnabled
33
+ ? "Force-process all pending magic context operations immediately"
34
+ : unavailableInCompactionOff("ctx-flush"),
35
+ },
36
+ "ctx-dream": {
37
+ template: "ctx-dream",
38
+ description: "Run the hidden dreamer maintenance pass for this project now",
39
+ },
40
+ "ctx-embed": {
41
+ template: "ctx-embed",
42
+ description:
43
+ "Embedding status, or start/pause history compartment embedding (start | pause)",
44
+ },
45
+ } satisfies BuiltinCommandConfig;
46
+ }
47
+
48
+ export type MagicContextBuiltinCommandName = keyof ReturnType<
49
+ typeof getMagicContextBuiltinCommands
50
+ >;
@@ -0,0 +1,145 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { readdirSync, readFileSync } from "node:fs";
3
+ import { join, relative, resolve } from "node:path";
4
+
5
+ // OpenCode and Pi pass plugin stdout/stderr straight through to the operator's
6
+ // terminal, so a `[magic-context]` line written with console.* lands in the
7
+ // middle of someone else's UI. Diagnostics belong in the Magic Context log file
8
+ // (shared/logger.ts). This fence scans production sources for console calls
9
+ // whose arguments carry the `[magic-context]` tag.
10
+ const repoRoot = resolve(import.meta.dir, "../../../../");
11
+ const scannedRoots = ["packages/plugin/src", "packages/pi-plugin/src"];
12
+
13
+ // Messages the operator is meant to read on the terminal. Each entry is a
14
+ // repo-relative path plus a substring of the call's text, so a new console
15
+ // call in an allow-listed file still trips the fence.
16
+ const userFacingAllowList: Array<{ path: string; contains: string; why: string }> = [
17
+ {
18
+ path: "packages/plugin/src/v2/hooks/context.ts",
19
+ contains: "v2 host API unavailable",
20
+ why: "startup error: the host lacks the required session API; shown once with the minimum version",
21
+ },
22
+ {
23
+ path: "packages/plugin/src/plugin/tool-registry.ts",
24
+ contains: "persistent storage unavailable; disabling magic-context tools",
25
+ why: "startup error: storage failed to open, so no ctx_* tool is registered",
26
+ },
27
+ {
28
+ path: "packages/plugin/src/v2/hooks/context.ts",
29
+ contains: "v2 setup disabled by conflicting context hooks",
30
+ why: "startup error: another plugin's context hook disables Magic Context",
31
+ },
32
+ {
33
+ path: "packages/plugin/src/v2/hooks/context.ts",
34
+ contains: "v2 storage unavailable",
35
+ why: "startup error: storage failed to open; reported once per distinct failure",
36
+ },
37
+ {
38
+ path: "packages/plugin/src/shared/data-path.ts",
39
+ contains: "TEST BACKSTOP",
40
+ why: "fires only under NODE_ENV=test, where the logger is silent and imports this module",
41
+ },
42
+ ];
43
+
44
+ // `[magic-context]` and `[magic-context][pi]`; the TUI's own `[magic-context-tui]`
45
+ // debug lines run in the host's TUI process and are not covered here.
46
+ const diagnosticTag = /\[magic-context\]/;
47
+
48
+ const consoleCall = /\bconsole\.(?:warn|log|error|info|debug)\(/g;
49
+
50
+ function isTestSource(relativePath: string): boolean {
51
+ return (
52
+ /\.test\.[cm]?[jt]sx?$/.test(relativePath) ||
53
+ relativePath.split("/").includes("__tests__") ||
54
+ relativePath.split("/").includes("test-support")
55
+ );
56
+ }
57
+
58
+ function listSources(dir: string): string[] {
59
+ const files: string[] = [];
60
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
61
+ const full = join(dir, entry.name);
62
+ if (entry.isDirectory()) {
63
+ if (entry.name === "node_modules") continue;
64
+ files.push(...listSources(full));
65
+ } else if (/\.[cm]?[jt]sx?$/.test(entry.name)) {
66
+ files.push(full);
67
+ }
68
+ }
69
+ return files;
70
+ }
71
+
72
+ /**
73
+ * Return the text of a call's argument list, starting just after its opening
74
+ * parenthesis. Quotes and template literals are skipped so a parenthesis in a
75
+ * message does not end the call early; `${...}` holes are scanned as code.
76
+ */
77
+ function callArguments(source: string, openParen: number): string {
78
+ let depth = 1;
79
+ const stack: string[] = [];
80
+ let index = openParen + 1;
81
+ while (index < source.length && depth > 0) {
82
+ const char = source[index];
83
+ const quote = stack.at(-1);
84
+ if (quote === "'" || quote === '"') {
85
+ if (char === "\\") index++;
86
+ else if (char === quote) stack.pop();
87
+ } else if (quote === "`") {
88
+ if (char === "\\") index++;
89
+ else if (char === "`") stack.pop();
90
+ else if (char === "$" && source[index + 1] === "{") {
91
+ stack.push("{");
92
+ index++;
93
+ }
94
+ } else if (char === "'" || char === '"' || char === "`") {
95
+ stack.push(char);
96
+ } else if (char === "{" && stack.length > 0) {
97
+ stack.push("{");
98
+ } else if (char === "}" && quote === "{") {
99
+ stack.pop();
100
+ } else if (char === "(") {
101
+ depth++;
102
+ } else if (char === ")") {
103
+ depth--;
104
+ }
105
+ index++;
106
+ }
107
+ return source.slice(openParen + 1, index - 1);
108
+ }
109
+
110
+ function findTaggedConsoleCalls(): string[] {
111
+ const findings: string[] = [];
112
+ for (const root of scannedRoots) {
113
+ for (const file of listSources(resolve(repoRoot, root))) {
114
+ const relativePath = relative(repoRoot, file).split("\\").join("/");
115
+ if (isTestSource(relativePath)) continue;
116
+ const source = readFileSync(file, "utf8");
117
+ for (const match of source.matchAll(consoleCall)) {
118
+ const args = callArguments(source, match.index + match[0].length - 1);
119
+ if (!diagnosticTag.test(args)) continue;
120
+ const allowed = userFacingAllowList.some(
121
+ (entry) => entry.path === relativePath && args.includes(entry.contains),
122
+ );
123
+ if (allowed) continue;
124
+ const line = source.slice(0, match.index).split("\n").length;
125
+ findings.push(`${relativePath}:${line}`);
126
+ }
127
+ }
128
+ }
129
+ return findings;
130
+ }
131
+
132
+ describe("console diagnostics fence", () => {
133
+ test("no production source writes [magic-context] diagnostics to the host console", () => {
134
+ expect(findTaggedConsoleCalls()).toEqual([]);
135
+ });
136
+
137
+ test("the scanner sees a tagged call nested in a template literal", () => {
138
+ const sample =
139
+ "console.warn(\n `[${new Date().toISOString()}] [magic-context] x=${Math.round(1)}ms`,\n);";
140
+ const open = sample.indexOf("(");
141
+ expect(callArguments(sample, open)).toContain("[magic-context]");
142
+ const untagged = 'console.warn("plain (paren"); const s = "[magic-context]";';
143
+ expect(callArguments(untagged, untagged.indexOf("("))).not.toContain("[magic-context]");
144
+ });
145
+ });
@@ -1,5 +1,5 @@
1
1
  import { afterEach, beforeEach, describe, expect, test } from "bun:test";
2
- import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
+ import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
3
  import * as os from "node:os";
4
4
  import * as path from "node:path";
5
5
  import {
@@ -15,6 +15,7 @@ import {
15
15
  getProjectMagicContextDir,
16
16
  getProjectMagicContextHistorianDir,
17
17
  } from "./data-path";
18
+ import { createTestTempDirFromPath } from "./test-temp-dir";
18
19
 
19
20
  const savedEnv = {
20
21
  XDG_CACHE_HOME: process.env.XDG_CACHE_HOME,
@@ -286,7 +287,7 @@ describe("data-path", () => {
286
287
 
287
288
  describe("ensureCortexKitArtifactGitignore", () => {
288
289
  test("creates .cortexkit/.gitignore with a fenced magic-context block", () => {
289
- const dir = mkdtempSync(path.join(os.tmpdir(), "mc-gi-"));
290
+ const dir = createTestTempDirFromPath(path.join(os.tmpdir(), "mc-gi-"));
290
291
  try {
291
292
  ensureCortexKitArtifactGitignore(dir);
292
293
  const gi = readFileSync(path.join(dir, ".cortexkit", ".gitignore"), "utf8");
@@ -299,7 +300,7 @@ describe("ensureCortexKitArtifactGitignore", () => {
299
300
  });
300
301
 
301
302
  test("is idempotent — a second call does not duplicate the block", () => {
302
- const dir = mkdtempSync(path.join(os.tmpdir(), "mc-gi-"));
303
+ const dir = createTestTempDirFromPath(path.join(os.tmpdir(), "mc-gi-"));
303
304
  try {
304
305
  ensureCortexKitArtifactGitignore(dir);
305
306
  ensureCortexKitArtifactGitignore(dir);
@@ -312,7 +313,7 @@ describe("ensureCortexKitArtifactGitignore", () => {
312
313
  });
313
314
 
314
315
  test("preserves a sibling module's existing entries (appends, never clobbers)", () => {
315
- const dir = mkdtempSync(path.join(os.tmpdir(), "mc-gi-"));
316
+ const dir = createTestTempDirFromPath(path.join(os.tmpdir(), "mc-gi-"));
316
317
  try {
317
318
  const ckDir = path.join(dir, ".cortexkit");
318
319
  mkdirSync(ckDir, { recursive: true });
@@ -333,7 +334,7 @@ describe("ensureCortexKitArtifactGitignore", () => {
333
334
  });
334
335
 
335
336
  test("does not ignore the project config — only the artifact dir", () => {
336
- const dir = mkdtempSync(path.join(os.tmpdir(), "mc-gi-"));
337
+ const dir = createTestTempDirFromPath(path.join(os.tmpdir(), "mc-gi-"));
337
338
  try {
338
339
  ensureCortexKitArtifactGitignore(dir);
339
340
  const gi = readFileSync(path.join(dir, ".cortexkit", ".gitignore"), "utf8");
@@ -0,0 +1,21 @@
1
+ import { expect, test } from "bun:test";
2
+ import { isEmbeddingHostBusy, observeEmbeddingActivity } from "./embedding-activity";
3
+
4
+ test("background embedding gate tracks all active sessions and releases on idle or deletion", () => {
5
+ const status = (sessionID: string, type: string) =>
6
+ observeEmbeddingActivity({
7
+ type: "session.status",
8
+ properties: { sessionID, status: { type } },
9
+ });
10
+ expect(isEmbeddingHostBusy()).toBe(false);
11
+ status("embedding-gate-a", "busy");
12
+ status("embedding-gate-b", "retry");
13
+ expect(isEmbeddingHostBusy()).toBe(true);
14
+ status("embedding-gate-a", "idle");
15
+ expect(isEmbeddingHostBusy()).toBe(true);
16
+ observeEmbeddingActivity({
17
+ type: "session.deleted",
18
+ properties: { sessionID: "embedding-gate-b" },
19
+ });
20
+ expect(isEmbeddingHostBusy()).toBe(false);
21
+ });