@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
@@ -18,6 +18,12 @@ import { formatCacheTtlDisplay } from "./cache-ttl-display";
18
18
  import { type ConfigParseFailure, formatConfigParseStatusLine } from "./config-diagnostics";
19
19
  import { formatThresholdPercent } from "./format-threshold";
20
20
  import type { TailHygieneStatus } from "./rpc-types";
21
+ import {
22
+ type StatusCheck,
23
+ type StatusUnavailableReason,
24
+ type StatusVersions,
25
+ statusVersionNotice,
26
+ } from "./status-view-check";
21
27
  import { formatTailHygiene } from "./tail-hygiene-status";
22
28
  import {
23
29
  renderUserFacingFailure,
@@ -140,6 +146,7 @@ export interface StatusViewSource {
140
146
  * backlog that silently never falls.
141
147
  */
142
148
  readonly dreamerUnsupportedTasks?: readonly string[];
149
+ readonly dreamerSkipped?: readonly string[];
143
150
  /**
144
151
  * Set when the last background maintenance pass stopped before finishing.
145
152
  * Shown so "the dreamer has nothing to do" and "the dreamer never got to
@@ -159,9 +166,31 @@ export interface StatusViewSource {
159
166
  readonly compactionEnabled?: boolean;
160
167
  /** Failure codes to print under the sections, already selected by the host. */
161
168
  readonly warnings?: readonly UserFacingFailureKey[];
169
+ /**
170
+ * Set when this server migrated the shared store at startup while other
171
+ * OpenCode servers (these PIDs, from their RPC discovery records) could not
172
+ * be checked; if one was an older build still running, it now reads a
173
+ * store newer than it supports.
174
+ */
175
+ readonly unconfirmedMigrationHolders?: {
176
+ readonly pids: readonly number[];
177
+ readonly fromVersion: number;
178
+ readonly toVersion: number;
179
+ };
162
180
  readonly hiddenVariantWarnings?: readonly string[];
163
181
  }
164
182
 
183
+ declare const checkedStatusViewSource: unique symbol;
184
+
185
+ /**
186
+ * A `StatusViewSource` that has passed `checkStatusViewSource`. The brand exists
187
+ * only in the type system: `buildStatusView` accepts nothing else, so a payload
188
+ * cannot reach the view model without going through the check.
189
+ */
190
+ export type CheckedStatusViewSource = StatusViewSource & {
191
+ readonly [checkedStatusViewSource]: true;
192
+ };
193
+
165
194
  export interface StatusViewOptions {
166
195
  /** Plugin version shown next to the title. */
167
196
  readonly version: string;
@@ -475,11 +504,17 @@ function historyRows(source: StatusViewSource, now: number): StatusRow[] {
475
504
  return rows;
476
505
  }
477
506
 
478
- /** One row naming every Dreamer task this host cannot run, or nothing when it runs them all. */
507
+ /** Availability rows for unsupported tasks and explicitly disabled/unavailable runs. */
479
508
  function dreamerUnsupportedRows(source: StatusViewSource): StatusRow[] {
480
509
  const unsupported = source.dreamerUnsupportedTasks ?? [];
481
- if (unsupported.length === 0) return [];
510
+ const skipped: StatusRow[] = (source.dreamerSkipped ?? []).map((value) => ({
511
+ label: "Dreamer skipped",
512
+ value,
513
+ tone: "muted",
514
+ }));
515
+ if (unsupported.length === 0) return skipped;
482
516
  return [
517
+ ...skipped,
483
518
  {
484
519
  label: "Dreamer unavailable",
485
520
  value: `${unsupported.join(", ")} (${userFacingFailureCode("dream_task_needs_tool_loop")})`,
@@ -627,7 +662,16 @@ function statusSections(source: StatusViewSource, now: number): StatusSection[]
627
662
  }
628
663
 
629
664
  function warningBlock(source: StatusViewSource): StatusWarning[] {
665
+ const holders = source.unconfirmedMigrationHolders;
630
666
  return [
667
+ ...(holders && holders.pids.length > 0
668
+ ? [
669
+ {
670
+ text: `Magic Context upgraded its database from v${holders.fromVersion} to v${holders.toVersion} while OpenCode PID ${holders.pids.join(", ")} could not be checked. If an older OpenCode is still open, quit all OpenCode processes and start again.`,
671
+ tone: "error" as const,
672
+ },
673
+ ]
674
+ : []),
631
675
  ...(source.hiddenVariantWarnings ?? []).map((text) => ({ text, tone: "warning" as const })),
632
676
  ...(source.configReloadFailure
633
677
  ? [
@@ -651,8 +695,11 @@ function warningBlock(source: StatusViewSource): StatusWarning[] {
651
695
  ];
652
696
  }
653
697
 
654
- /** Builds the full status view from one snapshot. */
655
- export function buildStatusView(source: StatusViewSource, options: StatusViewOptions): StatusView {
698
+ /** Builds the full status view from one checked snapshot. */
699
+ export function buildStatusView(
700
+ source: CheckedStatusViewSource,
701
+ options: StatusViewOptions,
702
+ ): StatusView {
656
703
  const now = options.now ?? Date.now();
657
704
  const off = !compactionEnabled(source);
658
705
  const tone = off ? "accent" : pressureTone(source.usagePercentage);
@@ -699,6 +746,131 @@ export function buildStatusView(source: StatusViewSource, options: StatusViewOpt
699
746
  };
700
747
  }
701
748
 
749
+ /** Short name for the reason, shown on the headline and in the reason row. */
750
+ function unavailableLabel(reason: StatusUnavailableReason): string {
751
+ if (reason.kind === "rpc_error") return "server did not answer";
752
+ if (reason.kind === "not_tracked") {
753
+ return reason.cause === "home_directory" ? "home directory" : "memory paused";
754
+ }
755
+ if (reason.kind === "malformed") return "incomplete status data";
756
+ return "view error";
757
+ }
758
+
759
+ /** Full-width sentences explaining the reason and what to do about it. */
760
+ function unavailableExplanation(
761
+ reason: StatusUnavailableReason,
762
+ versionNotice: string | null,
763
+ ): string[] {
764
+ const persists = "If this persists after a restart, report it with magic-context.log attached.";
765
+ if (reason.kind === "rpc_error") {
766
+ return [
767
+ `The Magic Context server did not return status: ${reason.message}`,
768
+ renderUserFacingFailure("status_unavailable", "plain"),
769
+ ];
770
+ }
771
+ if (reason.kind === "not_tracked" && reason.cause === "home_directory") {
772
+ return [
773
+ "This is your home directory, so Magic Context keeps no project history or memory here.",
774
+ "Set allow_home_project in magic-context.jsonc to opt in.",
775
+ ];
776
+ }
777
+ if (reason.kind === "not_tracked") {
778
+ return [
779
+ "Magic Context could not work out a project identity for this directory, so its memory features are paused.",
780
+ 'magic-context.log names the cause (search for "memory features paused"), for example a git command that failed.',
781
+ ];
782
+ }
783
+ if (reason.kind === "malformed") {
784
+ return [
785
+ `The status reply is missing, or has unexpected values for: ${reason.fields.join(", ")}.`,
786
+ versionNotice ? "The version difference above is the likely cause." : persists,
787
+ ];
788
+ }
789
+ return [`The status view could not be drawn: ${reason.message}`, persists];
790
+ }
791
+
792
+ /**
793
+ * The view drawn instead of the status when there is no usable snapshot. It has
794
+ * the same shape as a full view (headline, sections, warnings, footer), so a
795
+ * host draws it with the same code and cannot crash on a missing part.
796
+ */
797
+ export function buildUnavailableStatusView(
798
+ reason: StatusUnavailableReason,
799
+ versions: StatusVersions | null,
800
+ options: StatusViewOptions,
801
+ ): StatusView {
802
+ const label = unavailableLabel(reason);
803
+ const versionNotice = statusVersionNotice(versions);
804
+ const rows: StatusRow[] = [{ label: "Reason", value: label, tone: "warning" }];
805
+ if (versions) {
806
+ rows.push(
807
+ { label: "Server", value: versions.server ?? "not reported", tone: "muted" },
808
+ { label: "UI", value: versions.ui, tone: "muted" },
809
+ );
810
+ }
811
+ return {
812
+ title: "⚡ Magic Context Status",
813
+ version: `v${options.version}`,
814
+ headline: {
815
+ left: { text: "Status unavailable", tone: "error" },
816
+ right: { text: label, tone: "muted" },
817
+ },
818
+ windowLine: null,
819
+ bar: [],
820
+ breakdown: [],
821
+ hygiene: null,
822
+ sections: [{ title: "Status unavailable", labelWidth: 8, rows }],
823
+ warnings: [
824
+ ...(versionNotice ? [{ text: versionNotice, tone: "error" as const }] : []),
825
+ ...unavailableExplanation(reason, versionNotice).map((text) => ({
826
+ text,
827
+ tone: "warning" as const,
828
+ })),
829
+ ],
830
+ footer: "Esc to close",
831
+ };
832
+ }
833
+
834
+ /**
835
+ * The view for one checked status result: the full status, or the
836
+ * "status unavailable" view naming why there is none. A version difference
837
+ * between the server and this UI is named in both. This never throws, so a
838
+ * host can call it inside a render without guarding it.
839
+ */
840
+ export function buildStatusViewFor(
841
+ check: StatusCheck<unknown>,
842
+ options: StatusViewOptions,
843
+ ): StatusView {
844
+ if (check.state === "unavailable") {
845
+ return buildUnavailableStatusView(check.reason, check.versions, options);
846
+ }
847
+ try {
848
+ const view = buildStatusView(check.source, options);
849
+ const versionNotice = statusVersionNotice(check.versions);
850
+ const notices: StatusWarning[] = [
851
+ ...(versionNotice ? [{ text: versionNotice, tone: "warning" as const }] : []),
852
+ ...(check.ignoredFields.length > 0
853
+ ? [
854
+ {
855
+ text: `Ignored status fields with an unexpected shape: ${check.ignoredFields.join(", ")}`,
856
+ tone: "warning" as const,
857
+ },
858
+ ]
859
+ : []),
860
+ ];
861
+ return notices.length > 0 ? { ...view, warnings: [...notices, ...view.warnings] } : view;
862
+ } catch (error) {
863
+ return buildUnavailableStatusView(
864
+ {
865
+ kind: "view_error",
866
+ message: error instanceof Error ? error.message : String(error),
867
+ },
868
+ check.versions,
869
+ options,
870
+ );
871
+ }
872
+ }
873
+
702
874
  /** Pads one row to its section's label column; values print flush right. */
703
875
  export function formatStatusRowText(row: StatusRow, labelWidth: number, width: number): string {
704
876
  const label = row.label.padEnd(labelWidth);
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, test } from "bun:test";
2
- import { mkdtempSync, rmSync } from "node:fs";
2
+ import { rmSync } from "node:fs";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
5
  import {
@@ -8,10 +8,11 @@ import {
8
8
  withAsyncPrivilegedWriter,
9
9
  withPrivilegedWriter,
10
10
  } from "./sqlite";
11
+ import { createTestTempDirFromPath } from "./test-temp-dir";
11
12
 
12
13
  describe("writer acquisition", () => {
13
14
  test("exhausted async admission preserves the foreground budget and never invokes the callback", async () => {
14
- const dir = mkdtempSync(join(tmpdir(), "mc-writer-budget-"));
15
+ const dir = createTestTempDirFromPath(join(tmpdir(), "mc-writer-budget-"));
15
16
  const path = join(dir, "context.db");
16
17
  const blocker = new Database(path);
17
18
  blocker.exec(
@@ -0,0 +1,33 @@
1
+ /// <reference types="bun-types" />
2
+
3
+ import { describe, expect, it } from "bun:test";
4
+ import { contentTagOwnerMessageId } from "./tag-owner-id";
5
+
6
+ const DIGEST_A = "a".repeat(64);
7
+ const DIGEST_B = "0123456789abcdef".repeat(4);
8
+
9
+ describe("contentTagOwnerMessageId", () => {
10
+ it("strips positional text and file suffixes", () => {
11
+ expect(contentTagOwnerMessageId("pi-msg-1:p0")).toBe("pi-msg-1");
12
+ expect(contentTagOwnerMessageId("pi-msg-1:p12")).toBe("pi-msg-1");
13
+ expect(contentTagOwnerMessageId("pi-msg-1:file3")).toBe("pi-msg-1");
14
+ });
15
+
16
+ it("strips a content-derived text suffix", () => {
17
+ expect(contentTagOwnerMessageId(`pi-msg-1:mc-text-v1:${DIGEST_A}:${DIGEST_B}:o0`)).toBe(
18
+ "pi-msg-1",
19
+ );
20
+ expect(
21
+ contentTagOwnerMessageId(`m:with:colons:mc-text-v1:${DIGEST_A}:${DIGEST_B}:o7`),
22
+ ).toBe("m:with:colons");
23
+ });
24
+
25
+ it("leaves an id with no content suffix unchanged", () => {
26
+ expect(contentTagOwnerMessageId("pi-msg-1")).toBe("pi-msg-1");
27
+ expect(contentTagOwnerMessageId("pi-msg-1:pfile")).toBe("pi-msg-1:pfile");
28
+ // A marker without the digest shape is not a content-derived id.
29
+ expect(contentTagOwnerMessageId("pi-msg-1:mc-text-v1:not-hex")).toBe(
30
+ "pi-msg-1:mc-text-v1:not-hex",
31
+ );
32
+ });
33
+ });
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Content tag ids name the message that owns them plus a suffix that picks one
3
+ * part of it. Two suffix families exist:
4
+ *
5
+ * - positional: `<messageId>:p<N>` for the Nth text part, `<messageId>:file<N>`
6
+ * for the Nth file part;
7
+ * - content-derived (Pi, after the text of a message drifts):
8
+ * `<messageId>:mc-text-v1:<vector digest>:<content digest>:o<occurrence>`.
9
+ *
10
+ * Anything that groups tags by message has to strip both, or a content-derived
11
+ * tag is treated as belonging to a message that does not exist.
12
+ */
13
+
14
+ export const TEXT_TAG_IDENTITY_MARKER = ":mc-text-v1:";
15
+
16
+ const POSITIONAL_CONTENT_SUFFIX = /:(?:p|file)\d+$/;
17
+ const CONTENT_DERIVED_TEXT_SUFFIX = /:mc-text-v1:[0-9a-f]+:[0-9a-f]+:o\d+$/;
18
+
19
+ /**
20
+ * The owning message id of a content tag id. An id with neither suffix is
21
+ * returned unchanged: it already is the message id.
22
+ */
23
+ export function contentTagOwnerMessageId(contentId: string): string {
24
+ const positional = POSITIONAL_CONTENT_SUFFIX.exec(contentId);
25
+ if (positional) return contentId.slice(0, positional.index);
26
+ const derived = CONTENT_DERIVED_TEXT_SUFFIX.exec(contentId);
27
+ if (derived) return contentId.slice(0, derived.index);
28
+ return contentId;
29
+ }
@@ -67,9 +67,11 @@ import {
67
67
  } from "../hooks/magic-context/tag-content-primitives";
68
68
  import type { TagTarget } from "../hooks/magic-context/tag-messages";
69
69
  import { toolInputStringBytes } from "../hooks/magic-context/tool-input-size";
70
+ import { TEXT_TAG_IDENTITY_MARKER } from "./tag-owner-id";
70
71
  import type { Transcript, TranscriptMessage, TranscriptPart } from "./transcript";
71
72
 
72
- export const TEXT_TAG_IDENTITY_MARKER = ":mc-text-v1:";
73
+ // Re-exported so existing importers keep one source for the marker.
74
+ export { TEXT_TAG_IDENTITY_MARKER };
73
75
 
74
76
  export interface TagTranscriptOptions {
75
77
  /**
@@ -972,7 +974,14 @@ function applyTextPrefixAndTarget(args: TagTextPartArgs, tagId: number, text: st
972
974
  }
973
975
 
974
976
  const targetStart = args.timing ? performance.now() : 0;
975
- args.targets.set(tagId, buildTextTarget(args.part, args.message));
977
+ args.targets.set(
978
+ tagId,
979
+ buildTextTarget(
980
+ args.part,
981
+ args.message,
982
+ args.skipPrefixInjection ? "" : prependTag(tagId, ""),
983
+ ),
984
+ );
976
985
  if (args.timing) args.timing.targets += performance.now() - targetStart;
977
986
  }
978
987
 
@@ -1307,8 +1316,10 @@ function buildAggregateTarget(
1307
1316
  function buildTextTarget(
1308
1317
  part: TranscriptPart,
1309
1318
  message: { info: { id?: string; role: string } },
1319
+ textPrefix: string,
1310
1320
  ): TagTarget {
1311
1321
  return {
1322
+ textPrefix,
1312
1323
  setContent(content: string): boolean {
1313
1324
  return part.setText(content);
1314
1325
  },
@@ -0,0 +1,33 @@
1
+ import { expect, it } from "bun:test";
2
+ import { readdirSync, readFileSync } from "node:fs";
3
+ import { join, relative, resolve } from "node:path";
4
+
5
+ const packagesRoot = resolve(import.meta.dir, "../../..");
6
+
7
+ function testFiles(directory: string): string[] {
8
+ return readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
9
+ const path = join(directory, entry.name);
10
+ return entry.isDirectory()
11
+ ? testFiles(path)
12
+ : /\.(test|spec)\.[cm]?[jt]sx?$/.test(entry.name)
13
+ ? [path]
14
+ : [];
15
+ });
16
+ }
17
+
18
+ it("source tests allocate temporary directories only through the registered helper", () => {
19
+ // Ban the raw API name, including imports and aliases, rather than just one
20
+ // spelling of a call. Nested fixtures also need registration on setup failure.
21
+ const rawApi = new RegExp("\\b" + "mk" + "dtemp(?:Sync)?\\b");
22
+ const violations = readdirSync(packagesRoot, { withFileTypes: true }).flatMap((entry) => {
23
+ if (!entry.isDirectory()) return [];
24
+ const src = join(packagesRoot, entry.name, "src");
25
+ try {
26
+ return testFiles(src).filter((path) => rawApi.test(readFileSync(path, "utf8")));
27
+ } catch (error) {
28
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return [];
29
+ throw error;
30
+ }
31
+ });
32
+ expect(violations.map((path) => relative(packagesRoot, path))).toEqual([]);
33
+ });
@@ -4,6 +4,7 @@ import { join } from "node:path";
4
4
  import {
5
5
  cleanupTestTempDir,
6
6
  createTestTempDir,
7
+ createTestTempDirFromPath,
7
8
  sweepStaleTestTempDirs,
8
9
  withTestTempDir,
9
10
  } from "./test-temp-dir";
@@ -21,6 +22,32 @@ function createFixtureRoot(): string {
21
22
  }
22
23
 
23
24
  describe("test temp directories", () => {
25
+ it("rejects labels that could escape the system temp directory", () => {
26
+ for (const label of [
27
+ "",
28
+ ".",
29
+ "..",
30
+ "../outside-",
31
+ "nested/path-",
32
+ "nested\\path-",
33
+ "nul\0-",
34
+ ]) {
35
+ expect(() => createTestTempDir(label)).toThrow("single path segments");
36
+ }
37
+ });
38
+ it("cleans and sweeps previously unknown labels", () => {
39
+ const root = createFixtureRoot();
40
+ const dir = createTestTempDirFromPath(join(root, "previously-unlisted-"));
41
+ expect(existsSync(dir)).toBe(true);
42
+ const old = new Date(Date.now() - 7_200_000);
43
+ utimesSync(dir, old, old);
44
+ expect(sweepStaleTestTempDirs({ tempDir: root })).toContain(dir);
45
+ expect(existsSync(dir)).toBe(false);
46
+ cleanupTestTempDir(dir);
47
+ const fixture = createTestTempDir("another-unlisted-");
48
+ fixture.cleanup();
49
+ expect(existsSync(fixture.dir)).toBe(false);
50
+ });
24
51
  it("removes a root when its fixture callback throws", () => {
25
52
  let directory = "";
26
53
 
@@ -44,7 +44,8 @@ export const TEST_TEMP_DIR_PREFIXES = [
44
44
  "mc-test-db-backstop-",
45
45
  ] as const;
46
46
 
47
- export type TestTempDirPrefix = (typeof TEST_TEMP_DIR_PREFIXES)[number];
47
+ export type TestTempDirPrefix = string;
48
+ const OWNED_PREFIX = "mc-test-owned-";
48
49
 
49
50
  type AfterAll = (callback: () => void) => void;
50
51
  type SweepOptions = {
@@ -55,18 +56,18 @@ type SweepOptions = {
55
56
 
56
57
  const registeredTempDirs = new Set<string>();
57
58
  let lifecycleCleanupInstalled = false;
59
+ let exitCleanupInstalled = false;
58
60
 
59
61
  function hasRecognizedPrefix(name: string): boolean {
60
- return TEST_TEMP_DIR_PREFIXES.some((prefix) => name.startsWith(prefix));
62
+ return (
63
+ name.startsWith(OWNED_PREFIX) ||
64
+ TEST_TEMP_DIR_PREFIXES.some((prefix) => name.startsWith(prefix))
65
+ );
61
66
  }
62
67
 
63
68
  function isRegisteredTempDir(directory: string): boolean {
64
69
  const resolvedDirectory = resolve(directory);
65
- return (
66
- registeredTempDirs.has(resolvedDirectory) &&
67
- dirname(resolvedDirectory) === resolve(tmpdir()) &&
68
- hasRecognizedPrefix(basename(resolvedDirectory))
69
- );
70
+ return registeredTempDirs.has(resolvedDirectory);
70
71
  }
71
72
 
72
73
  /**
@@ -78,17 +79,36 @@ export function createTestTempDir(
78
79
  prefix: TestTempDirPrefix,
79
80
  nameSuffix = "",
80
81
  ): { dir: string; cleanup: () => void } {
81
- const dir = resolve(mkdtempSync(join(tmpdir(), `${prefix}${nameSuffix}`)));
82
- registeredTempDirs.add(dir);
82
+ const label = prefix + nameSuffix;
83
+ if (!label || label === "." || label === ".." || /[/\\\0]/.test(label)) {
84
+ throw new Error("Test temp directory labels must be single path segments");
85
+ }
86
+ const dir = createTestTempDirFromPath(join(tmpdir(), `${prefix}${nameSuffix}`));
83
87
  return { dir, cleanup: () => cleanupTestTempDir(dir) };
84
88
  }
85
89
 
86
- /** Removes one registered test root and forgets it even when best-effort removal fails. */
90
+ /**
91
+ * Registers fixtures with an explicit parent (including ADV_ROOT and nested roots).
92
+ * A common namespace lets the stale sweep recognize every system-temp fixture,
93
+ * without maintaining a list of caller-supplied labels.
94
+ */
95
+ export function createTestTempDirFromPath(prefixPath: string): string {
96
+ const dir = resolve(
97
+ mkdtempSync(join(dirname(prefixPath), `${OWNED_PREFIX}${basename(prefixPath)}`)),
98
+ );
99
+ registeredTempDirs.add(dir);
100
+ if (!exitCleanupInstalled) {
101
+ exitCleanupInstalled = true;
102
+ process.once("exit", cleanupRegisteredTestTempDirs);
103
+ }
104
+ return dir;
105
+ }
106
+
107
+ /** Removes one registered test root; busy roots remain registered for an exit retry. */
87
108
  export function cleanupTestTempDir(directory: string): void {
88
109
  const resolvedDirectory = resolve(directory);
89
110
  if (!isRegisteredTempDir(resolvedDirectory)) return;
90
111
 
91
- registeredTempDirs.delete(resolvedDirectory);
92
112
  try {
93
113
  rmSync(resolvedDirectory, {
94
114
  recursive: true,
@@ -96,6 +116,7 @@ export function cleanupTestTempDir(directory: string): void {
96
116
  maxRetries: 10,
97
117
  retryDelay: 100,
98
118
  });
119
+ registeredTempDirs.delete(resolvedDirectory);
99
120
  } catch {
100
121
  // A process can still hold a file open on Windows. The next startup sweep retries it.
101
122
  }
@@ -131,7 +152,10 @@ export function installTestTempDirCleanup(afterAll: AfterAll): void {
131
152
  if (lifecycleCleanupInstalled) return;
132
153
  lifecycleCleanupInstalled = true;
133
154
  afterAll(cleanupRegisteredTestTempDirs);
134
- process.once("exit", cleanupRegisteredTestTempDirs);
155
+ if (!exitCleanupInstalled) {
156
+ exitCleanupInstalled = true;
157
+ process.once("exit", cleanupRegisteredTestTempDirs);
158
+ }
135
159
  }
136
160
 
137
161
  /**
@@ -1,7 +1,8 @@
1
1
  import { afterEach, describe, expect, it } from "bun:test";
2
- import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
+ import { existsSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
+ import { createTestTempDirFromPath } from "./test-temp-dir";
5
6
 
6
7
  const roots: string[] = [];
7
8
  afterEach(() => {
@@ -12,7 +13,7 @@ afterEach(() => {
12
13
 
13
14
  describe("ensureTuiPluginEntry", () => {
14
15
  it("preserves tuple dev-path plugin entry and does not add @latest", async () => {
15
- const root = mkdtempSync(join(tmpdir(), "mc-tui-"));
16
+ const root = createTestTempDirFromPath(join(tmpdir(), "mc-tui-"));
16
17
  roots.push(root);
17
18
  const devPath = "/Work/magic-context/packages/plugin";
18
19
  const tuiPath = join(root, "tui.json");
@@ -33,7 +34,7 @@ describe("ensureTuiPluginEntry", () => {
33
34
  });
34
35
 
35
36
  it("upgrades bare npm name to @latest while preserving tuple options", async () => {
36
- const root = mkdtempSync(join(tmpdir(), "mc-tui-npm-"));
37
+ const root = createTestTempDirFromPath(join(tmpdir(), "mc-tui-npm-"));
37
38
  roots.push(root);
38
39
  const tuiPath = join(root, "tui.json");
39
40
  writeFileSync(
@@ -56,7 +57,7 @@ describe("ensureTuiPluginEntry", () => {
56
57
  });
57
58
 
58
59
  it("creates tui.jsonc (not tui.json) on a fresh install", async () => {
59
- const root = mkdtempSync(join(tmpdir(), "mc-tui-fresh-"));
60
+ const root = createTestTempDirFromPath(join(tmpdir(), "mc-tui-fresh-"));
60
61
  roots.push(root);
61
62
 
62
63
  const { ensureTuiPluginEntry } = await import("./tui-config");
@@ -73,7 +74,7 @@ describe("ensureTuiPluginEntry", () => {
73
74
  });
74
75
 
75
76
  it("writes into the existing tui.jsonc when both files exist", async () => {
76
- const root = mkdtempSync(join(tmpdir(), "mc-tui-both-"));
77
+ const root = createTestTempDirFromPath(join(tmpdir(), "mc-tui-both-"));
77
78
  roots.push(root);
78
79
  // A real user config in tui.jsonc plus a leftover empty tui.json.
79
80
  writeFileSync(
@@ -1,8 +1,9 @@
1
1
  import { afterEach, beforeEach, describe, expect, test } from "bun:test";
2
- import { mkdtemp, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { readFile, rename, rm, writeFile } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import { basename, join } from "node:path";
5
5
  import { parse } from "comment-json";
6
+ import { createTestTempDirFromPath } from "./test-temp-dir";
6
7
  import {
7
8
  __resetTuiPreferencesWatchTestHooks,
8
9
  __setTuiPreferencesWatchTestHooks,
@@ -25,7 +26,7 @@ const ENV_KEYS = [TUI_PREFS_FILE_ENV, "OPENCODE_CONFIG_DIR", "XDG_CONFIG_HOME"];
25
26
 
26
27
  beforeEach(async () => {
27
28
  for (const key of ENV_KEYS) savedEnv[key] = process.env[key];
28
- dir = await mkdtemp(join(tmpdir(), "mc-tui-prefs-test-"));
29
+ dir = await createTestTempDirFromPath(join(tmpdir(), "mc-tui-prefs-test-"));
29
30
  file = join(dir, "tui-preferences.jsonc");
30
31
  process.env[TUI_PREFS_FILE_ENV] = file;
31
32
  });