@cortexkit/opencode-magic-context 0.44.3 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (701) hide show
  1. package/dist/agents/hidden-agent-registrations.d.ts +3 -2
  2. package/dist/agents/hidden-agent-registrations.d.ts.map +1 -1
  3. package/dist/agents/magic-context-prompt.d.ts +1 -0
  4. package/dist/agents/magic-context-prompt.d.ts.map +1 -1
  5. package/dist/agents/permissions.d.ts +8 -28
  6. package/dist/agents/permissions.d.ts.map +1 -1
  7. package/dist/{announcement-n8hs7kjw.js → announcement-f75t58v9.js} +4 -2
  8. package/dist/config/index.d.ts.map +1 -1
  9. package/dist/config/project-security.d.ts +48 -0
  10. package/dist/config/project-security.d.ts.map +1 -1
  11. package/dist/config/raw-loader.d.ts.map +1 -1
  12. package/dist/config/schema/magic-context.d.ts +10 -7
  13. package/dist/config/schema/magic-context.d.ts.map +1 -1
  14. package/dist/{conflict-warning-hook-hmpzxep6.js → conflict-warning-hook-5yrz2r24.js} +10 -6
  15. package/dist/{derive-budgets-vjmvh6pz.js → derive-budgets-a63zsm5c.js} +4 -4
  16. package/dist/embedding-worker.js +49 -0
  17. package/dist/emscripten-module-0g8f45e6.js +602 -0
  18. package/dist/emscripten-module-0pekdjxz.js +1532 -0
  19. package/dist/emscripten-module-e67xwsp3.js +503 -0
  20. package/dist/emscripten-module-pj1vyb44.js +4559 -0
  21. package/dist/features/magic-context/compartment-chunk-embedding.d.ts +23 -3
  22. package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
  23. package/dist/features/magic-context/compartment-embedding.d.ts.map +1 -1
  24. package/dist/features/magic-context/compartment-storage.d.ts +14 -3
  25. package/dist/features/magic-context/compartment-storage.d.ts.map +1 -1
  26. package/dist/features/magic-context/context-store-uuid.d.ts +7 -0
  27. package/dist/features/magic-context/context-store-uuid.d.ts.map +1 -0
  28. package/dist/features/magic-context/dreamer/classify.d.ts +1 -3
  29. package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
  30. package/dist/features/magic-context/dreamer/cron.d.ts +5 -4
  31. package/dist/features/magic-context/dreamer/cron.d.ts.map +1 -1
  32. package/dist/features/magic-context/dreamer/docs-proposals.d.ts.map +1 -1
  33. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
  34. package/dist/features/magic-context/dreamer/expire-memories.d.ts.map +1 -1
  35. package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts +24 -0
  36. package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts.map +1 -0
  37. package/dist/features/magic-context/dreamer/manual-summary.d.ts.map +1 -1
  38. package/dist/features/magic-context/dreamer/map-memories.d.ts +5 -5
  39. package/dist/features/magic-context/dreamer/map-memories.d.ts.map +1 -1
  40. package/dist/features/magic-context/dreamer/module-apply.d.ts +4 -25
  41. package/dist/features/magic-context/dreamer/module-apply.d.ts.map +1 -1
  42. package/dist/features/magic-context/dreamer/retrospective-learnings.d.ts.map +1 -1
  43. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts +5 -1
  44. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
  45. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts +12 -5
  46. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts.map +1 -1
  47. package/dist/features/magic-context/dreamer/task-executor.d.ts +6 -0
  48. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  49. package/dist/features/magic-context/dreamer/task-gates.d.ts +34 -0
  50. package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
  51. package/dist/features/magic-context/dreamer/task-prompts.d.ts +1 -1
  52. package/dist/features/magic-context/dreamer/task-prompts.d.ts.map +1 -1
  53. package/dist/features/magic-context/dreamer/task-registry.d.ts +7 -5
  54. package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
  55. package/dist/features/magic-context/dreamer/task-scheduler.d.ts +10 -3
  56. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  57. package/dist/features/magic-context/dreamer/token-budget.d.ts +3 -0
  58. package/dist/features/magic-context/dreamer/token-budget.d.ts.map +1 -1
  59. package/dist/features/magic-context/dreamer/verify.d.ts +2 -2
  60. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  61. package/dist/features/magic-context/git-commits/git-log-reader.d.ts +11 -2
  62. package/dist/features/magic-context/git-commits/git-log-reader.d.ts.map +1 -1
  63. package/dist/features/magic-context/git-commits/indexer.d.ts.map +1 -1
  64. package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
  65. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts +2 -0
  66. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts.map +1 -1
  67. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts +6 -0
  68. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts.map +1 -0
  69. package/dist/features/magic-context/lkg-prefix-chunks.d.ts +53 -0
  70. package/dist/features/magic-context/lkg-prefix-chunks.d.ts.map +1 -0
  71. package/dist/features/magic-context/memory/embedding-backfill.d.ts.map +1 -1
  72. package/dist/features/magic-context/memory/embedding-local.d.ts +8 -0
  73. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  74. package/dist/features/magic-context/memory/embedding-openai.d.ts +1 -0
  75. package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
  76. package/dist/features/magic-context/memory/embedding-worker-client.d.ts +27 -0
  77. package/dist/features/magic-context/memory/embedding-worker-client.d.ts.map +1 -0
  78. package/dist/features/magic-context/memory/embedding-worker.d.ts +2 -0
  79. package/dist/features/magic-context/memory/embedding-worker.d.ts.map +1 -0
  80. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts +2 -0
  81. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts.map +1 -0
  82. package/dist/features/magic-context/memory/memory-selection.d.ts.map +1 -1
  83. package/dist/features/magic-context/memory/project-identity-cache.d.ts +4 -3
  84. package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
  85. package/dist/features/magic-context/memory/project-identity.d.ts +5 -4
  86. package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -1
  87. package/dist/features/magic-context/memory/storage-memory-fts.d.ts.map +1 -1
  88. package/dist/features/magic-context/memory/visibility.d.ts +1 -1
  89. package/dist/features/magic-context/memory/visibility.d.ts.map +1 -1
  90. package/dist/features/magic-context/message-fts-rowid-map.d.ts +14 -1
  91. package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -1
  92. package/dist/features/magic-context/message-fts-session-filter.d.ts +14 -0
  93. package/dist/features/magic-context/message-fts-session-filter.d.ts.map +1 -0
  94. package/dist/features/magic-context/message-index.d.ts +1 -7
  95. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  96. package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -1
  97. package/dist/features/magic-context/migration-v94-write-split.d.ts +62 -0
  98. package/dist/features/magic-context/migration-v94-write-split.d.ts.map +1 -0
  99. package/dist/features/magic-context/migration-worker-client.d.ts +23 -0
  100. package/dist/features/magic-context/migration-worker-client.d.ts.map +1 -0
  101. package/dist/features/magic-context/migration-worker-protocol.d.ts +30 -0
  102. package/dist/features/magic-context/migration-worker-protocol.d.ts.map +1 -0
  103. package/dist/features/magic-context/migration-worker.d.ts +2 -0
  104. package/dist/features/magic-context/migration-worker.d.ts.map +1 -0
  105. package/dist/features/magic-context/migrations.d.ts +7 -0
  106. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  107. package/dist/features/magic-context/mural/render-mural.d.ts +24 -2
  108. package/dist/features/magic-context/mural/render-mural.d.ts.map +1 -1
  109. package/dist/features/magic-context/mural/render-trigger.d.ts +1 -1
  110. package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
  111. package/dist/features/magic-context/overflow-detection.d.ts +18 -7
  112. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
  113. package/dist/features/magic-context/project-embedding-registry.d.ts +2 -0
  114. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  115. package/dist/features/magic-context/range-parser.d.ts +2 -3
  116. package/dist/features/magic-context/range-parser.d.ts.map +1 -1
  117. package/dist/features/magic-context/resolve-subagent-fallback.d.ts +2 -0
  118. package/dist/features/magic-context/resolve-subagent-fallback.d.ts.map +1 -1
  119. package/dist/features/magic-context/scheduler.d.ts +2 -0
  120. package/dist/features/magic-context/scheduler.d.ts.map +1 -1
  121. package/dist/features/magic-context/search.d.ts +7 -0
  122. package/dist/features/magic-context/search.d.ts.map +1 -1
  123. package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -1
  124. package/dist/features/magic-context/session-project-storage.d.ts +10 -1
  125. package/dist/features/magic-context/session-project-storage.d.ts.map +1 -1
  126. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts +1 -1
  127. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts.map +1 -1
  128. package/dist/features/magic-context/smart-notes/compiler.d.ts +4 -0
  129. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  130. package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
  131. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts +2 -0
  132. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts.map +1 -1
  133. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts +10 -8
  134. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts.map +1 -1
  135. package/dist/features/magic-context/smart-notes/storage.d.ts +2 -2
  136. package/dist/features/magic-context/smart-notes/storage.d.ts.map +1 -1
  137. package/dist/features/magic-context/smart-notes/types.d.ts +7 -2
  138. package/dist/features/magic-context/smart-notes/types.d.ts.map +1 -1
  139. package/dist/features/magic-context/storage-caveman-rules.d.ts +21 -0
  140. package/dist/features/magic-context/storage-caveman-rules.d.ts.map +1 -0
  141. package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
  142. package/dist/features/magic-context/storage-compartment-history-version.d.ts +4 -0
  143. package/dist/features/magic-context/storage-compartment-history-version.d.ts.map +1 -0
  144. package/dist/features/magic-context/storage-db.d.ts +68 -3
  145. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  146. package/dist/features/magic-context/storage-identity-merge.d.ts +6 -0
  147. package/dist/features/magic-context/storage-identity-merge.d.ts.map +1 -1
  148. package/dist/features/magic-context/storage-meta-persisted.d.ts +15 -0
  149. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  150. package/dist/features/magic-context/storage-meta-session.d.ts +1 -1
  151. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  152. package/dist/features/magic-context/storage-meta-shared.d.ts +1 -1
  153. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  154. package/dist/features/magic-context/storage-notes.d.ts +2 -2
  155. package/dist/features/magic-context/storage-notes.d.ts.map +1 -1
  156. package/dist/features/magic-context/storage-reasoning-removal.d.ts +30 -0
  157. package/dist/features/magic-context/storage-reasoning-removal.d.ts.map +1 -0
  158. package/dist/features/magic-context/storage-replay-document.d.ts +42 -5
  159. package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
  160. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  161. package/dist/features/magic-context/storage-tags.d.ts +7 -1
  162. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  163. package/dist/features/magic-context/storage.d.ts +1 -1
  164. package/dist/features/magic-context/storage.d.ts.map +1 -1
  165. package/dist/features/magic-context/store-generation-rebase.d.ts.map +1 -1
  166. package/dist/features/magic-context/tag-input.d.ts +4 -0
  167. package/dist/features/magic-context/tag-input.d.ts.map +1 -0
  168. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  169. package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
  170. package/dist/features/magic-context/user-memory/storage-user-memory.d.ts.map +1 -1
  171. package/dist/features/magic-context/v22-deferred-backfill.d.ts.map +1 -1
  172. package/dist/ffi-3cx1cxpk.js +78 -0
  173. package/dist/ffi-7bqqe4cd.js +91 -0
  174. package/dist/ffi-7e6gryj5.js +91 -0
  175. package/dist/ffi-bpvkebwr.js +78 -0
  176. package/dist/hooks/magic-context/apply-operations.d.ts +9 -1
  177. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  178. package/dist/hooks/magic-context/auto-search-deadline.d.ts +10 -0
  179. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -0
  180. package/dist/hooks/magic-context/auto-search-hint.d.ts +3 -0
  181. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
  182. package/dist/hooks/magic-context/auto-search-runner.d.ts +3 -0
  183. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  184. package/dist/hooks/magic-context/caveman-cleanup.d.ts +8 -1
  185. package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -1
  186. package/dist/hooks/magic-context/caveman.d.ts +56 -1
  187. package/dist/hooks/magic-context/caveman.d.ts.map +1 -1
  188. package/dist/hooks/magic-context/child-session-spawn.d.ts +2 -0
  189. package/dist/hooks/magic-context/child-session-spawn.d.ts.map +1 -1
  190. package/dist/hooks/magic-context/command-handler.d.ts +1 -1
  191. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  192. package/dist/hooks/magic-context/compaction-marker-manager.d.ts +1 -1
  193. package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
  194. package/dist/hooks/magic-context/compartment-parser.d.ts +3 -3
  195. package/dist/hooks/magic-context/compartment-parser.d.ts.map +1 -1
  196. package/dist/hooks/magic-context/compartment-render-epoch.d.ts +12 -1
  197. package/dist/hooks/magic-context/compartment-render-epoch.d.ts.map +1 -1
  198. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  199. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +0 -1
  200. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  201. package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -1
  202. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  203. package/dist/hooks/magic-context/compartment-runner-types.d.ts +3 -0
  204. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  205. package/dist/hooks/magic-context/compartment-runner-validation.d.ts +6 -0
  206. package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -1
  207. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  208. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +35 -0
  209. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -0
  210. package/dist/hooks/magic-context/derive-budgets.d.ts.map +1 -1
  211. package/dist/hooks/magic-context/drop-stale-reduce-calls.d.ts.map +1 -1
  212. package/dist/hooks/magic-context/dropped-input-guard.d.ts.map +1 -1
  213. package/dist/hooks/magic-context/embed-history-runner.d.ts.map +1 -1
  214. package/dist/hooks/magic-context/emergency-drop.d.ts +15 -0
  215. package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
  216. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  217. package/dist/hooks/magic-context/event-resolvers.d.ts +7 -0
  218. package/dist/hooks/magic-context/event-resolvers.d.ts.map +1 -1
  219. package/dist/hooks/magic-context/execute-status.d.ts +1 -0
  220. package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
  221. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +17 -0
  222. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  223. package/dist/hooks/magic-context/heuristic-cleanup.d.ts +2 -0
  224. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
  225. package/dist/hooks/magic-context/historian-host-runner.d.ts +5 -0
  226. package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
  227. package/dist/hooks/magic-context/historian-prompt-fit.d.ts +116 -0
  228. package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -0
  229. package/dist/hooks/magic-context/historian-prompt.generated.d.ts +1 -1
  230. package/dist/hooks/magic-context/historian-prompt.generated.d.ts.map +1 -1
  231. package/dist/hooks/magic-context/history-boundary-repair.d.ts +44 -0
  232. package/dist/hooks/magic-context/history-boundary-repair.d.ts.map +1 -0
  233. package/dist/hooks/magic-context/hook.d.ts +4 -0
  234. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  235. package/dist/hooks/magic-context/inject-compartments.d.ts +13 -0
  236. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  237. package/dist/hooks/magic-context/lkg-persist.d.ts +12 -0
  238. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  239. package/dist/hooks/magic-context/lkg-replay-fit.d.ts +104 -0
  240. package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -0
  241. package/dist/hooks/magic-context/lkg-replay.d.ts +64 -0
  242. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  243. package/dist/hooks/magic-context/module-client.d.ts.map +1 -1
  244. package/dist/hooks/magic-context/module-state-sync-timing.d.ts +1 -1
  245. package/dist/hooks/magic-context/module-state-sync-timing.d.ts.map +1 -1
  246. package/dist/hooks/magic-context/module-state-sync.d.ts +6 -68
  247. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  248. package/dist/hooks/magic-context/module-tool-backends.d.ts +1 -34
  249. package/dist/hooks/magic-context/module-tool-backends.d.ts.map +1 -1
  250. package/dist/hooks/magic-context/module-transport.d.ts +1 -55
  251. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  252. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  253. package/dist/hooks/magic-context/note-nudger.d.ts +2 -0
  254. package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
  255. package/dist/hooks/magic-context/pass-outcome.d.ts +59 -2
  256. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
  257. package/dist/hooks/magic-context/producer-window-guard.d.ts +6 -0
  258. package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -1
  259. package/dist/hooks/magic-context/read-session-chunk.d.ts +17 -4
  260. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  261. package/dist/hooks/magic-context/read-session-formatting.d.ts +11 -0
  262. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  263. package/dist/hooks/magic-context/read-session-raw.d.ts +2 -2
  264. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
  265. package/dist/hooks/magic-context/reasoning-removal.d.ts +60 -0
  266. package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -0
  267. package/dist/hooks/magic-context/recomp-orchestrator.d.ts +1 -0
  268. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
  269. package/dist/hooks/magic-context/reference-retrieval.d.ts +1 -1
  270. package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -1
  271. package/dist/hooks/magic-context/reply-pages.d.ts +3 -0
  272. package/dist/hooks/magic-context/reply-pages.d.ts.map +1 -0
  273. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts +62 -0
  274. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts.map +1 -0
  275. package/dist/hooks/magic-context/rust-mode-transform.d.ts +17 -85
  276. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  277. package/dist/hooks/magic-context/send-session-notification.d.ts.map +1 -1
  278. package/dist/hooks/magic-context/sentinel.d.ts +35 -0
  279. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
  280. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +28 -0
  281. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -0
  282. package/dist/hooks/magic-context/single-store-refusal.d.ts +14 -0
  283. package/dist/hooks/magic-context/single-store-refusal.d.ts.map +1 -0
  284. package/dist/hooks/magic-context/storage-busy-refusal.d.ts +7 -0
  285. package/dist/hooks/magic-context/storage-busy-refusal.d.ts.map +1 -1
  286. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  287. package/dist/hooks/magic-context/stripped-command.d.ts +1 -1
  288. package/dist/hooks/magic-context/stripped-command.d.ts.map +1 -1
  289. package/dist/hooks/magic-context/system-injection-stripper.d.ts +7 -0
  290. package/dist/hooks/magic-context/system-injection-stripper.d.ts.map +1 -1
  291. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  292. package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -1
  293. package/dist/hooks/magic-context/tag-id-fallback.d.ts.map +1 -1
  294. package/dist/hooks/magic-context/tag-messages.d.ts +18 -1
  295. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  296. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  297. package/dist/hooks/magic-context/tokenizer-calibration.d.ts +1 -1
  298. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  299. package/dist/hooks/magic-context/transform-compartment-phase.d.ts +1 -0
  300. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  301. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +38 -4
  302. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  303. package/dist/hooks/magic-context/transform.d.ts +12 -39
  304. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  305. package/dist/hooks/magic-context/unmanaged-over-window.d.ts +36 -0
  306. package/dist/hooks/magic-context/unmanaged-over-window.d.ts.map +1 -0
  307. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts +15 -0
  308. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts.map +1 -0
  309. package/dist/hooks/magic-context/user-profile-render.d.ts +3 -0
  310. package/dist/hooks/magic-context/user-profile-render.d.ts.map +1 -0
  311. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  312. package/dist/{index-yhm60r53.js → index-16ny736w.js} +13622 -28584
  313. package/dist/{index-q5p1aqvv.js → index-2aq21j41.js} +1208 -429
  314. package/dist/{index-32b096cc.js → index-2ntg5sd4.js} +6 -2
  315. package/dist/index-4krbw8z9.js +6034 -0
  316. package/dist/{index-33q7s9y2.js → index-75zjgwga.js} +61 -85
  317. package/dist/{index-nf9sk8sh.js → index-8fgkmxmy.js} +28 -10
  318. package/dist/index-a4m2b1yv.js +530 -0
  319. package/dist/index-anq4nn6f.js +131 -0
  320. package/dist/index-avwt563y.js +62 -0
  321. package/dist/index-bmzf7zxv.js +445 -0
  322. package/dist/index-e44zzy84.js +10 -0
  323. package/dist/index-en1k8h8m.js +244 -0
  324. package/dist/{index-638hf49n.js → index-f85teqck.js} +15 -6
  325. package/dist/index-fr2z4qy8.js +7810 -0
  326. package/dist/{index-kwe03yde.js → index-fzbvakh0.js} +1 -1
  327. package/dist/{module-asyncify-2EFITU5U-rkqjhjxd.js → index-g20jdh0p.js} +114 -105
  328. package/dist/index-gd5qx1j9.js +398 -0
  329. package/dist/{index-3bygzk2d.js → index-hybnrwq0.js} +169 -4
  330. package/dist/{index-jqcbs2k1.js → index-mc22ayvf.js} +24 -5
  331. package/dist/{index-y5145x8k.js → index-n96ag4rk.js} +15 -1
  332. package/dist/index-q7yesyk9.js +9118 -0
  333. package/dist/index-remp7e2g.js +214 -0
  334. package/dist/{index-7k55qm8a.js → index-sfpzqvdz.js} +8 -8
  335. package/dist/{index-9y5p0d50.js → index-vvtfyw1z.js} +13 -76
  336. package/dist/index-w9jwmntv.js +202 -0
  337. package/dist/{index-kr5qehbd.js → index-x23gah8c.js} +1 -1
  338. package/dist/{index-jdxxq8cz.js → index-x8a7jmkh.js} +6 -1
  339. package/dist/{index-rdsaxnf2.js → index-xgt9k6c6.js} +23 -12
  340. package/dist/index-y8v6yerm.js +77 -0
  341. package/dist/index.d.ts.map +1 -1
  342. package/dist/index.js +7560 -8084
  343. package/dist/message-time-backfill-an311pmk.js +124 -0
  344. package/dist/migration-worker.js +53 -0
  345. package/dist/{model-resolution-dxatzjde.js → model-resolution-xhfmyyvy.js} +5 -1
  346. package/dist/module-ES6BEMUI-3cet1pyp.js +12 -0
  347. package/dist/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  348. package/dist/plugin/boot-deadline.d.ts.map +1 -1
  349. package/dist/plugin/conflict-warning-hook.d.ts.map +1 -1
  350. package/dist/plugin/dream-timer-module-client.d.ts +1 -11
  351. package/dist/plugin/dream-timer-module-client.d.ts.map +1 -1
  352. package/dist/plugin/dream-timer.d.ts.map +1 -1
  353. package/dist/plugin/hooks/create-session-hooks.d.ts +8 -0
  354. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  355. package/dist/plugin/messages-transform.d.ts +20 -13
  356. package/dist/plugin/messages-transform.d.ts.map +1 -1
  357. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  358. package/dist/plugin/stale-build-notice.d.ts +16 -0
  359. package/dist/plugin/stale-build-notice.d.ts.map +1 -0
  360. package/dist/read-session-chunk-8rxs0tc9.js +84 -0
  361. package/dist/recomp-orchestrator-nzamtw29.js +39 -0
  362. package/dist/{rpc-notifications-4amf6mf4.js → rpc-notifications-3hed126v.js} +3 -1
  363. package/dist/{safe-notification-target-50gm9c58.js → safe-notification-target-43r8jsxw.js} +3 -3
  364. package/dist/send-session-notification-nqpv7cne.js +28 -0
  365. package/dist/shared/assistant-message-extractor.d.ts +4 -0
  366. package/dist/shared/assistant-message-extractor.d.ts.map +1 -1
  367. package/dist/shared/background-batch-drain.d.ts +8 -0
  368. package/dist/shared/background-batch-drain.d.ts.map +1 -0
  369. package/dist/{features/builtin-commands/commands.d.ts → shared/builtin-commands.d.ts} +1 -1
  370. package/dist/shared/builtin-commands.d.ts.map +1 -0
  371. package/dist/shared/embedding-activity.d.ts +13 -0
  372. package/dist/shared/embedding-activity.d.ts.map +1 -0
  373. package/dist/shared/historian-tool-expansions.d.ts +5 -0
  374. package/dist/shared/historian-tool-expansions.d.ts.map +1 -0
  375. package/dist/shared/historian-tool-template.d.ts +5 -0
  376. package/dist/shared/historian-tool-template.d.ts.map +1 -0
  377. package/dist/shared/historian-transient-error.d.ts +2 -0
  378. package/dist/shared/historian-transient-error.d.ts.map +1 -0
  379. package/dist/shared/jsonc-edit.d.ts.map +1 -1
  380. package/dist/shared/logger.d.ts +7 -0
  381. package/dist/shared/logger.d.ts.map +1 -1
  382. package/dist/shared/model-suggestion-retry.d.ts +2 -1
  383. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  384. package/dist/shared/models-dev-cache.d.ts.map +1 -1
  385. package/dist/shared/off-thread-migration-clock.d.ts +38 -0
  386. package/dist/shared/off-thread-migration-clock.d.ts.map +1 -0
  387. package/dist/shared/plugin-package-version.d.ts +14 -0
  388. package/dist/shared/plugin-package-version.d.ts.map +1 -0
  389. package/dist/shared/project-directory-key.d.ts +26 -0
  390. package/dist/shared/project-directory-key.d.ts.map +1 -0
  391. package/dist/shared/prompt-async-transport.d.ts +4 -0
  392. package/dist/shared/prompt-async-transport.d.ts.map +1 -1
  393. package/dist/shared/prompt-surface-runtime.d.ts +3 -3
  394. package/dist/shared/provider-response-completion.d.ts +12 -0
  395. package/dist/shared/provider-response-completion.d.ts.map +1 -0
  396. package/dist/shared/redaction.d.ts.map +1 -1
  397. package/dist/shared/rpc-client.d.ts +23 -2
  398. package/dist/shared/rpc-client.d.ts.map +1 -1
  399. package/dist/shared/rpc-types.d.ts +19 -0
  400. package/dist/shared/rpc-types.d.ts.map +1 -1
  401. package/dist/shared/rpc-utils.d.ts +41 -0
  402. package/dist/shared/rpc-utils.d.ts.map +1 -1
  403. package/dist/shared/sqlite.d.ts +13 -2
  404. package/dist/shared/sqlite.d.ts.map +1 -1
  405. package/dist/shared/stale-plugin-build.d.ts +21 -0
  406. package/dist/shared/stale-plugin-build.d.ts.map +1 -0
  407. package/dist/shared/status-summary.d.ts +29 -0
  408. package/dist/shared/status-summary.d.ts.map +1 -1
  409. package/dist/shared/status-view-check.d.ts +124 -0
  410. package/dist/shared/status-view-check.d.ts.map +1 -0
  411. package/dist/shared/status-view.d.ts +38 -2
  412. package/dist/shared/status-view.d.ts.map +1 -1
  413. package/dist/shared/tag-owner-id.d.ts +19 -0
  414. package/dist/shared/tag-owner-id.d.ts.map +1 -0
  415. package/dist/shared/tag-transcript.d.ts +2 -1
  416. package/dist/shared/tag-transcript.d.ts.map +1 -1
  417. package/dist/shared/test-temp-dir.d.ts +8 -2
  418. package/dist/shared/test-temp-dir.d.ts.map +1 -1
  419. package/dist/shared/transcript.d.ts +2 -0
  420. package/dist/shared/transcript.d.ts.map +1 -1
  421. package/dist/shared/user-answer.d.ts +4 -0
  422. package/dist/shared/user-answer.d.ts.map +1 -0
  423. package/dist/shared/user-facing-codes.d.ts +41 -6
  424. package/dist/shared/user-facing-codes.d.ts.map +1 -1
  425. package/dist/shared/xml-unescape.d.ts +9 -0
  426. package/dist/shared/xml-unescape.d.ts.map +1 -0
  427. package/dist/task-config-v81k8jvk.js +17 -0
  428. package/dist/tools/ctx-expand/constants.d.ts +1 -1
  429. package/dist/tools/ctx-expand/constants.d.ts.map +1 -1
  430. package/dist/tools/ctx-expand/mode.d.ts +4 -0
  431. package/dist/tools/ctx-expand/mode.d.ts.map +1 -1
  432. package/dist/tools/ctx-expand/render.d.ts +5 -1
  433. package/dist/tools/ctx-expand/render.d.ts.map +1 -1
  434. package/dist/tools/ctx-expand/tools.d.ts +2 -0
  435. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  436. package/dist/tools/ctx-expand/types.d.ts +1 -0
  437. package/dist/tools/ctx-expand/types.d.ts.map +1 -1
  438. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  439. package/dist/tools/ctx-note/render.d.ts +2 -0
  440. package/dist/tools/ctx-note/render.d.ts.map +1 -1
  441. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  442. package/dist/tools/ctx-reduce/constants.d.ts +1 -1
  443. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
  444. package/dist/tools/ctx-search/constants.d.ts +1 -1
  445. package/dist/tools/ctx-search/constants.d.ts.map +1 -1
  446. package/dist/tools/light-descriptions.d.ts +3 -3
  447. package/dist/tools/light-descriptions.d.ts.map +1 -1
  448. package/dist/tools/parameter-descriptions.d.ts +14 -14
  449. package/dist/transform-postprocess-phase-414phndq.js +61 -0
  450. package/dist/tui/data/context-db.d.ts +34 -10
  451. package/dist/tui/data/context-db.d.ts.map +1 -1
  452. package/dist/tui/data/notification-socket.d.ts +6 -0
  453. package/dist/tui/data/notification-socket.d.ts.map +1 -1
  454. package/dist/tui/data/session-directory.d.ts +16 -0
  455. package/dist/tui/data/session-directory.d.ts.map +1 -0
  456. package/dist/tui-compiled/data/context-db.d.ts +34 -10
  457. package/dist/tui-compiled/data/context-db.d.ts.map +1 -1
  458. package/dist/tui-compiled/data/notification-socket.d.ts +6 -0
  459. package/dist/tui-compiled/data/notification-socket.d.ts.map +1 -1
  460. package/dist/tui-compiled/data/session-directory.d.ts +16 -0
  461. package/dist/tui-compiled/data/session-directory.d.ts.map +1 -0
  462. package/dist/v2/derive-budgets-v0krf3t7.js +18 -0
  463. package/dist/v2/embedding-worker.js +47 -0
  464. package/dist/v2/emscripten-module-0g8f45e6.js +602 -0
  465. package/dist/v2/emscripten-module-0pekdjxz.js +1532 -0
  466. package/dist/v2/emscripten-module-e67xwsp3.js +503 -0
  467. package/dist/v2/emscripten-module-pj1vyb44.js +4559 -0
  468. package/dist/v2/ffi-3cx1cxpk.js +78 -0
  469. package/dist/v2/ffi-7bqqe4cd.js +91 -0
  470. package/dist/v2/ffi-7e6gryj5.js +91 -0
  471. package/dist/v2/ffi-bpvkebwr.js +78 -0
  472. package/dist/v2/fold/boundary.d.ts.map +1 -1
  473. package/dist/v2/fork-inheritance.d.ts +101 -0
  474. package/dist/v2/fork-inheritance.d.ts.map +1 -0
  475. package/dist/v2/hidden-child-cleanup.d.ts +11 -0
  476. package/dist/v2/hidden-child-cleanup.d.ts.map +1 -0
  477. package/dist/v2/hidden-child-native.d.ts +29 -0
  478. package/dist/v2/hidden-child-native.d.ts.map +1 -0
  479. package/dist/v2/hidden-child-record.d.ts +135 -0
  480. package/dist/v2/hidden-child-record.d.ts.map +1 -0
  481. package/dist/v2/hidden-completion.d.ts +12 -97
  482. package/dist/v2/hidden-completion.d.ts.map +1 -1
  483. package/dist/v2/hooks/context.d.ts +20 -8
  484. package/dist/v2/hooks/context.d.ts.map +1 -1
  485. package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
  486. package/dist/v2/hooks/dream-trigger.d.ts +5 -0
  487. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  488. package/dist/v2/hooks/generate.d.ts +10 -0
  489. package/dist/v2/hooks/generate.d.ts.map +1 -0
  490. package/dist/v2/hooks/hidden-child.d.ts +33 -2
  491. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  492. package/dist/v2/hooks/payload.d.ts +3 -0
  493. package/dist/v2/hooks/payload.d.ts.map +1 -1
  494. package/dist/v2/hooks/session-api-gate.d.ts +4 -0
  495. package/dist/v2/hooks/session-api-gate.d.ts.map +1 -0
  496. package/dist/v2/hooks/storage-gate.d.ts +3 -1
  497. package/dist/v2/hooks/storage-gate.d.ts.map +1 -1
  498. package/dist/v2/hooks/store.d.ts +1 -1
  499. package/dist/v2/hooks/store.d.ts.map +1 -1
  500. package/dist/v2/hooks/tools.d.ts.map +1 -1
  501. package/dist/v2/hooks/types.d.ts +10 -0
  502. package/dist/v2/hooks/types.d.ts.map +1 -1
  503. package/dist/v2/hooks/update-check.d.ts.map +1 -1
  504. package/dist/v2/hooks/usage-persist.d.ts.map +1 -1
  505. package/dist/v2/hooks/usage-reading.d.ts +4 -0
  506. package/dist/v2/hooks/usage-reading.d.ts.map +1 -1
  507. package/dist/v2/index-6e4mwffh.js +5662 -0
  508. package/dist/v2/index-en1k8h8m.js +244 -0
  509. package/dist/{message-time-backfill-q374fxc5.js → v2/message-time-backfill-0n93vrd7.js} +19 -5
  510. package/dist/v2/migration-worker.js +52 -0
  511. package/dist/v2/model-resolution-xhfmyyvy.js +16 -0
  512. package/dist/v2/module-ES6BEMUI-3cet1pyp.js +12 -0
  513. package/dist/v2/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  514. package/dist/v2/prompt-context-5y5ms8f9.js +6 -0
  515. package/dist/{read-session-chunk-n072mcq4.js → v2/read-session-chunk-hjza38hr.js} +24 -7
  516. package/dist/v2/recomp-orchestrator-1aq7h44c.js +36 -0
  517. package/dist/v2/retrospective-raw-provider.d.ts +21 -0
  518. package/dist/v2/retrospective-raw-provider.d.ts.map +1 -0
  519. package/dist/v2/rpc-notifications-3hed126v.js +16 -0
  520. package/dist/v2/safe-notification-target-wtj0bbc2.js +9 -0
  521. package/dist/{send-session-notification-04hvd54c.js → v2/send-session-notification-mq9frrtm.js} +10 -5
  522. package/dist/v2/server-0jqw05sa.js +803 -0
  523. package/dist/v2/server-5317ykaf.js +40 -0
  524. package/dist/v2/server-a4m2b1yv.js +530 -0
  525. package/dist/v2/server-avwt563y.js +62 -0
  526. package/dist/v2/server-c4g2y1z8.js +28824 -0
  527. package/dist/v2/server-ckpc8pxy.js +662 -0
  528. package/dist/v2/server-e36nf2p1.js +7702 -0
  529. package/dist/v2/server-e44zzy84.js +10 -0
  530. package/dist/v2/server-fgmxwrgy.js +16 -0
  531. package/dist/v2/server-fmsr7v69.js +75 -0
  532. package/dist/v2/server-g20jdh0p.js +1273 -0
  533. package/dist/{index-dgg5y7er.js → v2/server-hfjfbg59.js} +849 -747
  534. package/dist/v2/server-n96ag4rk.js +633 -0
  535. package/dist/v2/server-qdjnb2z1.js +181 -0
  536. package/dist/v2/server-qpg6wf72.js +187 -0
  537. package/dist/v2/server-r7cmye3k.js +131 -0
  538. package/dist/v2/server-remp7e2g.js +214 -0
  539. package/dist/v2/server-rhdgxp1t.js +398 -0
  540. package/dist/v2/server-sfpzqvdz.js +137 -0
  541. package/dist/v2/server-syahy8j8.js +50 -0
  542. package/dist/v2/server-v5xgft5v.js +9116 -0
  543. package/dist/v2/server-w99cyt6a.js +361 -0
  544. package/dist/v2/server-x8a7jmkh.js +104 -0
  545. package/dist/v2/server-y8v6yerm.js +77 -0
  546. package/dist/v2/server-z19x7eqz.js +423 -0
  547. package/dist/v2/server.d.ts.map +1 -1
  548. package/dist/v2/server.js +8868 -107184
  549. package/dist/v2/store-reader.d.ts +52 -1
  550. package/dist/v2/store-reader.d.ts.map +1 -1
  551. package/dist/v2/task-config-tbndqyny.js +17 -0
  552. package/dist/v2/transformers-node-wasm.js +26768 -0
  553. package/dist/v2/transformers-web.js +25670 -0
  554. package/dist/v2/transformers.node-hj754h7s.js +29997 -0
  555. package/dist/v2/tui/index.d.ts +10 -1
  556. package/dist/v2/tui/index.d.ts.map +1 -1
  557. package/dist/v2/tui/sidebar-mount.d.ts +6 -0
  558. package/dist/v2/tui/sidebar-mount.d.ts.map +1 -1
  559. package/dist/v2/tui/status-dialog-mount.d.ts +7 -4
  560. package/dist/v2/tui/status-dialog-mount.d.ts.map +1 -1
  561. package/dist/v2/tui/types.d.ts +12 -0
  562. package/dist/v2/tui/types.d.ts.map +1 -1
  563. package/dist/v2/wrapup-orchestrator-tbyx78dz.js +425 -0
  564. package/dist/wrapup-orchestrator-h28bqsy6.js +26 -0
  565. package/package.json +8 -8
  566. package/src/agents/hidden-agent-registrations.ts +24 -16
  567. package/src/agents/magic-context-prompt.test.ts +41 -0
  568. package/src/agents/magic-context-prompt.ts +8 -5
  569. package/src/agents/permissions.test.ts +31 -49
  570. package/src/agents/permissions.ts +8 -28
  571. package/src/config/index.test.ts +60 -20
  572. package/src/config/index.ts +53 -1
  573. package/src/config/live-run-config.test.ts +5 -5
  574. package/src/config/live-snapshot.test.ts +4 -4
  575. package/src/config/migrate-config-location.test.ts +3 -10
  576. package/src/config/project-config-trust-boundary.test.ts +207 -0
  577. package/src/config/project-security.hostile-matrix.test.ts +4 -4
  578. package/src/config/project-security.ts +218 -1
  579. package/src/config/protected-tokens.test.ts +14 -9
  580. package/src/config/raw-loader.test.ts +31 -3
  581. package/src/config/raw-loader.ts +8 -3
  582. package/src/config/schema/magic-context.ts +20 -3
  583. package/src/config/variable.test.ts +3 -2
  584. package/src/features/magic-context/dreamer/cron.ts +30 -9
  585. package/src/features/magic-context/dreamer/task-registry.ts +7 -5
  586. package/src/shared/announcement.test.ts +2 -1
  587. package/src/shared/assistant-message-extractor.test.ts +27 -1
  588. package/src/shared/assistant-message-extractor.ts +27 -0
  589. package/src/shared/background-batch-drain.test.ts +38 -0
  590. package/src/shared/background-batch-drain.ts +29 -0
  591. package/src/shared/builtin-commands.ts +50 -0
  592. package/src/shared/console-diagnostics-fence.test.ts +145 -0
  593. package/src/shared/data-path.test.ts +6 -5
  594. package/src/shared/embedding-activity.test.ts +21 -0
  595. package/src/shared/embedding-activity.ts +36 -0
  596. package/src/shared/historian-tool-defaults.json +13 -0
  597. package/src/shared/historian-tool-expansions.ts +18 -0
  598. package/src/shared/historian-tool-template.ts +248 -0
  599. package/src/shared/historian-transient-error.test.ts +36 -0
  600. package/src/shared/historian-transient-error.ts +22 -0
  601. package/src/shared/jsonc-edit.ts +20 -1
  602. package/src/shared/logger.test.ts +3 -2
  603. package/src/shared/logger.ts +40 -1
  604. package/src/shared/model-suggestion-retry.test.ts +46 -0
  605. package/src/shared/model-suggestion-retry.ts +16 -1
  606. package/src/shared/models-dev-cache.test.ts +74 -2
  607. package/src/shared/models-dev-cache.ts +5 -1
  608. package/src/shared/off-thread-migration-clock.test.ts +55 -0
  609. package/src/shared/off-thread-migration-clock.ts +124 -0
  610. package/src/shared/opencode-db-path.test.ts +3 -2
  611. package/src/shared/plugin-package-version.ts +52 -0
  612. package/src/shared/project-directory-key.test.ts +111 -0
  613. package/src/shared/project-directory-key.ts +54 -0
  614. package/src/shared/prompt-async-transport.test.ts +249 -72
  615. package/src/shared/prompt-async-transport.ts +131 -24
  616. package/src/shared/prompt-surface-a1-golden.md +41 -25
  617. package/src/shared/prompt-surface-runtime.test.ts +3 -3
  618. package/src/shared/provider-response-completion.ts +23 -0
  619. package/src/shared/redaction.test.ts +51 -1
  620. package/src/shared/redaction.ts +33 -0
  621. package/src/shared/rpc-async-probes.test.ts +32 -2
  622. package/src/shared/rpc-client.test.ts +3 -2
  623. package/src/shared/rpc-client.ts +76 -18
  624. package/src/shared/rpc-types.ts +15 -0
  625. package/src/shared/rpc-utils.test.ts +191 -12
  626. package/src/shared/rpc-utils.ts +184 -26
  627. package/src/shared/sqlite-acquisition-routing.test.ts +46 -3
  628. package/src/shared/sqlite-pass-scope.test.ts +3 -2
  629. package/src/shared/sqlite-transaction-mode-guard.test.ts +4 -0
  630. package/src/shared/sqlite-writer-diagnostics.test.ts +134 -0
  631. package/src/shared/sqlite.ts +225 -41
  632. package/src/shared/stale-plugin-build.test.ts +129 -0
  633. package/src/shared/stale-plugin-build.ts +151 -0
  634. package/src/shared/status-summary.ts +40 -13
  635. package/src/shared/status-view-check.test.ts +253 -0
  636. package/src/shared/status-view-check.ts +536 -0
  637. package/src/shared/status-view.test.ts +6 -1
  638. package/src/shared/status-view.ts +176 -4
  639. package/src/shared/storage-busy.test.ts +3 -2
  640. package/src/shared/tag-owner-id.test.ts +33 -0
  641. package/src/shared/tag-owner-id.ts +29 -0
  642. package/src/shared/tag-transcript.ts +17 -3
  643. package/src/shared/test-temp-dir-policy.test.ts +33 -0
  644. package/src/shared/test-temp-dir.test.ts +27 -0
  645. package/src/shared/test-temp-dir.ts +36 -12
  646. package/src/shared/transcript.ts +3 -0
  647. package/src/shared/tui-config.test.ts +6 -5
  648. package/src/shared/tui-preferences.test.ts +3 -2
  649. package/src/shared/user-answer.test.ts +40 -0
  650. package/src/shared/user-answer.ts +17 -0
  651. package/src/shared/user-facing-codes.ts +52 -6
  652. package/src/shared/window-geometry.test.ts +3 -2
  653. package/src/shared/write-transaction-attribution.test.ts +11 -7
  654. package/src/shared/write-transaction-hold-clock.test.ts +160 -0
  655. package/src/shared/xml-unescape.ts +19 -0
  656. package/src/tui/data/context-db.test.ts +92 -4
  657. package/src/tui/data/context-db.ts +184 -18
  658. package/src/tui/data/notification-socket.test.ts +49 -2
  659. package/src/tui/data/notification-socket.ts +47 -9
  660. package/src/tui/data/session-directory.ts +19 -0
  661. package/src/tui/dialogs/status-dialog-render.test.ts +284 -0
  662. package/src/tui/dialogs/status-dialog.tsx +41 -38
  663. package/src/tui/index.tsx +30 -18
  664. package/src/tui/slots/sidebar-content.tsx +9 -2
  665. package/src/tui-compiled/data/context-db.ts +184 -18
  666. package/src/tui-compiled/data/notification-socket.ts +47 -9
  667. package/src/tui-compiled/data/session-directory.ts +19 -0
  668. package/src/tui-compiled/dialogs/status-dialog.tsx +38 -29
  669. package/src/tui-compiled/index.tsx +29 -16
  670. package/src/tui-compiled/slots/sidebar-content.tsx +3 -2
  671. package/src/v2/tui/host-contract.test.ts +9 -10
  672. package/src/v2/tui/index.ts +78 -23
  673. package/src/v2/tui/load-compiled-sidebar.d.mts +5 -1
  674. package/src/v2/tui/load-compiled-status-dialog.d.mts +3 -2
  675. package/src/v2/tui/session-directory.test.ts +53 -0
  676. package/src/v2/tui/sidebar-mount.ts +19 -1
  677. package/src/v2/tui/status-dialog-mount.ts +10 -7
  678. package/src/v2/tui/types.ts +10 -0
  679. package/dist/features/builtin-commands/commands.d.ts.map +0 -1
  680. package/dist/features/builtin-commands/types.d.ts +0 -3
  681. package/dist/features/builtin-commands/types.d.ts.map +0 -1
  682. package/dist/features/magic-context/context-authority.d.ts +0 -272
  683. package/dist/features/magic-context/context-authority.d.ts.map +0 -1
  684. package/dist/features/magic-context/memory/mirror-reembed.d.ts +0 -22
  685. package/dist/features/magic-context/memory/mirror-reembed.d.ts.map +0 -1
  686. package/dist/hooks/magic-context/historian-state-file.d.ts +0 -43
  687. package/dist/hooks/magic-context/historian-state-file.d.ts.map +0 -1
  688. package/dist/index-4an2p8qa.js +0 -1056
  689. package/dist/index-rn7gafjr.js +0 -8
  690. package/dist/index-v6t0tg85.js +0 -13
  691. package/dist/plugin/memory-id-translation.d.ts +0 -109
  692. package/dist/plugin/memory-id-translation.d.ts.map +0 -1
  693. package/dist/plugin/rust-note-backend.d.ts +0 -84
  694. package/dist/plugin/rust-note-backend.d.ts.map +0 -1
  695. package/dist/recomp-orchestrator-19tr6zya.js +0 -22
  696. package/dist/task-config-2bm68628.js +0 -9
  697. package/dist/transform-postprocess-phase-z2mfc5w1.js +0 -36
  698. package/dist/v2/host-service.d.ts +0 -66
  699. package/dist/v2/host-service.d.ts.map +0 -1
  700. package/dist/wrapup-orchestrator-sy4m56a7.js +0 -19
  701. /package/dist/{index-s70wtd8k.js → index-q6hef7fh.js} +0 -0
@@ -1,21 +1,21 @@
1
1
  import { expect, test } from "bun:test";
2
- import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
-
6
5
  import {
7
6
  buildDreamTaskRuntimeConfigs,
8
7
  userMemoryCollectionEnabled,
9
8
  } from "../features/magic-context/dreamer/task-config";
10
9
  import { producerInputTokenLimit } from "../hooks/magic-context/producer-window-guard";
11
10
  import { resolveHistorianModel } from "../shared/model-resolution";
11
+ import { createTestTempDirFromPath } from "../shared/test-temp-dir";
12
12
  import { loadPluginConfigDetailed } from "./index";
13
13
  import { dreamerRunConfig, historianRunConfig } from "./live-run-config";
14
14
  import { LiveConfigReader } from "./live-snapshot";
15
15
 
16
16
  for (const host of ["OC1", "OC2", "Pi", "OMP"] as const) {
17
17
  test(`${host} historian samples the next generation while an existing run keeps its model and fallback`, () => {
18
- const root = mkdtempSync(join(tmpdir(), "mc-live-historian-"));
18
+ const root = createTestTempDirFromPath(join(tmpdir(), "mc-live-historian-"));
19
19
  const previous = { home: process.env.HOME, config: process.env.XDG_CONFIG_HOME };
20
20
  process.env.HOME = root;
21
21
  process.env.XDG_CONFIG_HOME = join(root, "config");
@@ -87,7 +87,7 @@ for (const host of ["OC1", "OC2", "Pi", "OMP"] as const) {
87
87
 
88
88
  for (const host of ["OC1", "OC2", "Pi", "OMP"] as const) {
89
89
  test(`${host} dreamer samples the new schedule and model chain without changing a running task`, () => {
90
- const root = mkdtempSync(join(tmpdir(), "mc-live-dreamer-"));
90
+ const root = createTestTempDirFromPath(join(tmpdir(), "mc-live-dreamer-"));
91
91
  const previous = { home: process.env.HOME, config: process.env.XDG_CONFIG_HOME };
92
92
  process.env.HOME = root;
93
93
  process.env.XDG_CONFIG_HOME = join(root, "config");
@@ -171,7 +171,7 @@ for (const host of ["OC1", "OC2", "Pi", "OMP"] as const) {
171
171
  }
172
172
 
173
173
  test("malformed project config retains last good values and deduplicates the warning; project overrides remain tier-safe", () => {
174
- const root = mkdtempSync(join(tmpdir(), "mc-live-tiers-"));
174
+ const root = createTestTempDirFromPath(join(tmpdir(), "mc-live-tiers-"));
175
175
  const previous = { home: process.env.HOME, config: process.env.XDG_CONFIG_HOME };
176
176
  process.env.HOME = root;
177
177
  process.env.XDG_CONFIG_HOME = join(root, "config");
@@ -1,14 +1,14 @@
1
1
  import { 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 { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
-
6
5
  import { parseJsonc } from "../shared/jsonc-parser";
6
+ import { createTestTempDirFromPath } from "../shared/test-temp-dir";
7
7
  import { LiveConfigReader } from "./live-snapshot";
8
8
 
9
9
  test("one snapshot per run survives a malformed tier and adopts both tiers atomically", () => {
10
10
  const oldConfigHome = process.env.XDG_CONFIG_HOME;
11
- const root = mkdtempSync(join(tmpdir(), "mc-live-config-"));
11
+ const root = createTestTempDirFromPath(join(tmpdir(), "mc-live-config-"));
12
12
  const project = join(root, "project");
13
13
  const projectFile = join(project, ".cortexkit", "magic-context.jsonc");
14
14
  const userFile = join(root, "config", "cortexkit", "magic-context.jsonc");
@@ -53,7 +53,7 @@ test("one snapshot per run survives a malformed tier and adopts both tiers atomi
53
53
  });
54
54
 
55
55
  test("a write crossing the tier load boundary is not published as a mixed snapshot", () => {
56
- const root = mkdtempSync(join(tmpdir(), "mc-live-crossing-"));
56
+ const root = createTestTempDirFromPath(join(tmpdir(), "mc-live-crossing-"));
57
57
  const previous = process.env.XDG_CONFIG_HOME;
58
58
  process.env.XDG_CONFIG_HOME = join(root, "config");
59
59
  const project = join(root, "project");
@@ -1,15 +1,8 @@
1
1
  import { describe, expect, it } from "bun:test";
2
- import {
3
- existsSync,
4
- mkdirSync,
5
- mkdtempSync,
6
- readFileSync,
7
- rmSync,
8
- utimesSync,
9
- writeFileSync,
10
- } from "node:fs";
2
+ import { existsSync, mkdirSync, readFileSync, rmSync, utimesSync, writeFileSync } from "node:fs";
11
3
  import { tmpdir } from "node:os";
12
4
  import { join } from "node:path";
5
+ import { createTestTempDirFromPath } from "../shared/test-temp-dir";
13
6
  import {
14
7
  type LegacyConfigSource,
15
8
  migrateConfigFile,
@@ -17,7 +10,7 @@ import {
17
10
  } from "./migrate-config-location";
18
11
 
19
12
  function tmp(): string {
20
- return mkdtempSync(join(tmpdir(), "mc-cfgloc-"));
13
+ return createTestTempDirFromPath(join(tmpdir(), "mc-cfgloc-"));
21
14
  }
22
15
 
23
16
  function src(path: string, label = "legacy"): LegacyConfigSource {
@@ -0,0 +1,207 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { createTestTempDirFromPath } from "../shared/test-temp-dir";
6
+ import { loadPluginConfigDetailed } from "./index";
7
+
8
+ /**
9
+ * A repository's project config may only tighten what the user configured. A
10
+ * wrong-typed or otherwise invalid project value used to replace the user's
11
+ * value in the raw deep merge; schema recovery then dropped the key and used
12
+ * the schema DEFAULT, so a cloned repo could reset user-only settings (turn
13
+ * compaction back on, unset the historian model, force a re-embed) or lower
14
+ * compaction thresholds. These cases pin that an invalid project value is
15
+ * ignored and the user's value survives.
16
+ */
17
+ function loadUserAndProject(user: unknown, project: unknown) {
18
+ const xdg = createTestTempDirFromPath(join(tmpdir(), "mc-trust-user-"));
19
+ const projectDir = createTestTempDirFromPath(join(tmpdir(), "mc-trust-proj-"));
20
+ mkdirSync(join(xdg, "cortexkit"), { recursive: true });
21
+ mkdirSync(join(projectDir, ".cortexkit"), { recursive: true });
22
+ writeFileSync(join(xdg, "cortexkit", "magic-context.jsonc"), JSON.stringify(user), "utf-8");
23
+ writeFileSync(
24
+ join(projectDir, ".cortexkit", "magic-context.jsonc"),
25
+ JSON.stringify(project),
26
+ "utf-8",
27
+ );
28
+ const origXdg = process.env.XDG_CONFIG_HOME;
29
+ process.env.XDG_CONFIG_HOME = xdg;
30
+ try {
31
+ return loadPluginConfigDetailed(projectDir, false);
32
+ } finally {
33
+ if (origXdg === undefined) delete process.env.XDG_CONFIG_HOME;
34
+ else process.env.XDG_CONFIG_HOME = origXdg;
35
+ rmSync(xdg, { recursive: true, force: true });
36
+ rmSync(projectDir, { recursive: true, force: true });
37
+ }
38
+ }
39
+
40
+ describe("project config cannot reset user settings with a wrong-typed parent block", () => {
41
+ it("keeps the user's compaction block when the project sets compaction:false", () => {
42
+ const loaded = loadUserAndProject(
43
+ { compaction: { enabled: false } },
44
+ { compaction: false },
45
+ );
46
+ expect(loaded.config.compaction).toMatchObject({ enabled: false });
47
+ expect(loaded.config.configWarnings?.join("\n")).toContain("compaction");
48
+ });
49
+
50
+ it("keeps the user's historian model when the project sets historian:1", () => {
51
+ const loaded = loadUserAndProject(
52
+ { historian: { opencode: { model: "anthropic/claude-x" } } },
53
+ { historian: 1 },
54
+ );
55
+ expect(loaded.config.historian?.opencode?.model).toBe("anthropic/claude-x");
56
+ });
57
+
58
+ it("keeps the user's embedding provider when the project sets embedding:'x'", () => {
59
+ const loaded = loadUserAndProject(
60
+ {
61
+ embedding: {
62
+ provider: "openai-compatible",
63
+ endpoint: "https://fixture.example/v1",
64
+ model: "fixture-model",
65
+ },
66
+ },
67
+ { embedding: "x" },
68
+ );
69
+ expect(loaded.config.embedding).toMatchObject({
70
+ provider: "openai-compatible",
71
+ endpoint: "https://fixture.example/v1",
72
+ model: "fixture-model",
73
+ });
74
+ });
75
+
76
+ it("keeps storage.enforce_private_permissions:false when the project sets storage:0", () => {
77
+ const loaded = loadUserAndProject(
78
+ { storage: { enforce_private_permissions: false } },
79
+ { storage: 0 },
80
+ );
81
+ expect(loaded.config.storage?.enforce_private_permissions).toBe(false);
82
+ });
83
+
84
+ it("keeps the user's prompt_surface override when the project sets prompt_surface:1", () => {
85
+ const loaded = loadUserAndProject(
86
+ { prompt_surface: { default: "light" } },
87
+ { prompt_surface: 1 },
88
+ );
89
+ expect(loaded.config.prompt_surface).toMatchObject({ default: "light" });
90
+ });
91
+
92
+ it("keeps the user's nested leaf when the project gives that leaf a wrong type", () => {
93
+ const loaded = loadUserAndProject(
94
+ { memory: { auto_search: { enabled: false } } },
95
+ { memory: { auto_search: { enabled: "nope" } } },
96
+ );
97
+ expect(loaded.config.memory?.auto_search?.enabled).toBe(false);
98
+ });
99
+
100
+ it("still applies a valid project value next to an invalid one", () => {
101
+ const loaded = loadUserAndProject(
102
+ { compaction: { enabled: false }, cache_ttl: "5m" },
103
+ { compaction: false, cache_ttl: "1h" },
104
+ );
105
+ expect(loaded.config.compaction).toMatchObject({ enabled: false });
106
+ expect(loaded.config.cache_ttl).toBe("1h");
107
+ });
108
+
109
+ it("reports the ignored project value as schema recovery", () => {
110
+ const loaded = loadUserAndProject(
111
+ { compaction: { enabled: false } },
112
+ { compaction: false },
113
+ );
114
+ expect(loaded.recoveredTopLevelKeys).toContain("compaction");
115
+ expect(loaded.loadOutcome).toBe("schema-recovery");
116
+ });
117
+ });
118
+
119
+ describe("project config cannot lower compaction thresholds", () => {
120
+ it("does not lower a user threshold of 88 to a project value of 81", () => {
121
+ const loaded = loadUserAndProject(
122
+ { execute_threshold_percentage: 88 },
123
+ { execute_threshold_percentage: 81 },
124
+ );
125
+ expect(loaded.config.execute_threshold_percentage).toBe(88);
126
+ });
127
+
128
+ it("does not lower a per-model user threshold of 89 to a project value of 82", () => {
129
+ const loaded = loadUserAndProject(
130
+ { execute_threshold_percentage: { default: 70, "a/b": 89 } },
131
+ { execute_threshold_percentage: { "a/b": 82 } },
132
+ );
133
+ expect(loaded.config.execute_threshold_percentage).toEqual({ default: 70, "a/b": 89 });
134
+ });
135
+
136
+ it("still raises the threshold to a valid project value above 80", () => {
137
+ const loaded = loadUserAndProject(
138
+ { execute_threshold_percentage: 70 },
139
+ { execute_threshold_percentage: 85 },
140
+ );
141
+ expect(loaded.config.execute_threshold_percentage).toBe(85);
142
+ });
143
+
144
+ it("keeps the user threshold of 80 when the project value 10 is invalid", () => {
145
+ const loaded = loadUserAndProject(
146
+ { execute_threshold_percentage: 80 },
147
+ { execute_threshold_percentage: 10 },
148
+ );
149
+ expect(loaded.config.execute_threshold_percentage).toBe(80);
150
+ });
151
+
152
+ it("keeps the user threshold when the project value is a string or an invalid object", () => {
153
+ for (const projectValue of ["x", { default: 5 }]) {
154
+ const loaded = loadUserAndProject(
155
+ { execute_threshold_percentage: 80 },
156
+ { execute_threshold_percentage: projectValue },
157
+ );
158
+ expect(loaded.config.execute_threshold_percentage).toBe(80);
159
+ }
160
+ });
161
+
162
+ it("keeps the user's execute_threshold_tokens when the project sets a scalar", () => {
163
+ const loaded = loadUserAndProject(
164
+ { execute_threshold_tokens: { default: 300_000 } },
165
+ { execute_threshold_tokens: 5 },
166
+ );
167
+ expect(loaded.config.execute_threshold_tokens).toEqual({ default: 300_000 });
168
+ });
169
+
170
+ it("keeps the user's execute_threshold_tokens.default when the project value is out of range", () => {
171
+ const loaded = loadUserAndProject(
172
+ { execute_threshold_tokens: { default: 300_000 } },
173
+ { execute_threshold_tokens: { default: 10 } },
174
+ );
175
+ expect(loaded.config.execute_threshold_tokens).toEqual({ default: 300_000 });
176
+ });
177
+ });
178
+
179
+ describe("project command block", () => {
180
+ it("adds well-formed new commands but never replaces user or built-in ones", () => {
181
+ const loaded = loadUserAndProject(
182
+ { command: { "my-cmd": { template: "user template" } } },
183
+ {
184
+ command: {
185
+ "my-cmd": { template: "repository template" },
186
+ "ctx-status": { template: "repository status" },
187
+ "repo-cmd": { template: "repository command", description: "from the repo" },
188
+ "bad-cmd": { template: 5 },
189
+ "no-template": { description: "missing template" },
190
+ },
191
+ },
192
+ );
193
+ expect(loaded.config.command).toEqual({
194
+ "my-cmd": { template: "user template" },
195
+ "repo-cmd": { template: "repository command", description: "from the repo" },
196
+ });
197
+ expect(loaded.config.configWarnings?.join("\n")).toContain("command.my-cmd");
198
+ });
199
+
200
+ it("ignores a project command block that is not an object", () => {
201
+ const loaded = loadUserAndProject(
202
+ { command: { "my-cmd": { template: "user template" } } },
203
+ { command: "nope" },
204
+ );
205
+ expect(loaded.config.command).toEqual({ "my-cmd": { template: "user template" } });
206
+ });
207
+ });
@@ -1,9 +1,9 @@
1
1
  import { describe, expect, it } from "bun:test";
2
- import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
-
6
5
  import { CANONICAL_DREAM_TASKS } from "../features/magic-context/dreamer/task-registry";
6
+ import { createTestTempDirFromPath } from "../shared/test-temp-dir";
7
7
  import { loadPluginConfig } from "./index";
8
8
  import { stripUnsafeProjectConfigFields } from "./project-security";
9
9
  import {
@@ -339,8 +339,8 @@ function nestedMuralModelPaths(): string[] {
339
339
  }
340
340
 
341
341
  function loadWithUserAndProjectConfig(userConfigText: string, projectConfigText: string) {
342
- const xdg = mkdtempSync(join(tmpdir(), "mc-hostile-user-"));
343
- const projectDir = mkdtempSync(join(tmpdir(), "mc-hostile-proj-"));
342
+ const xdg = createTestTempDirFromPath(join(tmpdir(), "mc-hostile-user-"));
343
+ const projectDir = createTestTempDirFromPath(join(tmpdir(), "mc-hostile-proj-"));
344
344
  const configDir = join(xdg, "cortexkit");
345
345
  mkdirSync(configDir, { recursive: true });
346
346
  mkdirSync(join(projectDir, ".cortexkit"), { recursive: true });
@@ -203,8 +203,11 @@ function stripNestedMuralModels(
203
203
  }
204
204
  }
205
205
 
206
+ // Must match the schema's execute_threshold_percentage range (20-90). A narrower
207
+ // range here let a valid project value of 81-90 skip the raise-only clamp and
208
+ // reach the merged config as-is, lowering a higher user threshold.
206
209
  function isValidPercentageThreshold(value: unknown): value is number {
207
- return typeof value === "number" && Number.isFinite(value) && value >= 20 && value <= 80;
210
+ return typeof value === "number" && Number.isFinite(value) && value >= 20 && value <= 90;
208
211
  }
209
212
 
210
213
  function isValidTokenThreshold(value: unknown): value is number {
@@ -896,3 +899,217 @@ export function dropInheritedEmbeddingKeyOnRedirect(
896
899
  "exfiltration to a repository-chosen endpoint).",
897
900
  ];
898
901
  }
902
+
903
+ /** Path of a schema issue in the merged raw config, e.g. ["compaction", "enabled"]. */
904
+ export type ConfigIssuePath = readonly PropertyKey[];
905
+
906
+ /**
907
+ * Shortest prefix of `issuePath` whose value the PROJECT tier supplied, or
908
+ * undefined when the invalid value did not come from the project. The raw merge
909
+ * recurses only into plain objects on both sides, so the project owns the value
910
+ * at the first prefix where its node is not a plain object (a scalar, array or
911
+ * null replaces the user's value whole), or at the full issue path.
912
+ */
913
+ function projectContributionPath(
914
+ projectRaw: Record<string, unknown>,
915
+ issuePath: ConfigIssuePath,
916
+ ): ConfigIssuePath | undefined {
917
+ let node: unknown = projectRaw;
918
+ for (let index = 0; index < issuePath.length; index++) {
919
+ const segment = String(issuePath[index]);
920
+ if (!isPlainObject(node) || !Object.hasOwn(node, segment)) return undefined;
921
+ node = node[segment];
922
+ if (index === issuePath.length - 1 || !isPlainObject(node)) {
923
+ return issuePath.slice(0, index + 1);
924
+ }
925
+ }
926
+ return undefined;
927
+ }
928
+
929
+ /**
930
+ * The trusted value the project displaced along `contribution`, and where it
931
+ * sits. Walking down, the first trusted node that is not a plain object was
932
+ * replaced whole by the project's object (e.g. a user scalar threshold of 80
933
+ * under a project `{ default: 5 }`), so it is restored at that shorter path.
934
+ * Undefined when the trusted tier has no value there to protect.
935
+ */
936
+ function displacedTrustedValue(
937
+ trustedRaw: Record<string, unknown>,
938
+ contribution: ConfigIssuePath,
939
+ ): { path: ConfigIssuePath; value: unknown } | undefined {
940
+ let node: unknown = trustedRaw;
941
+ for (let index = 0; index < contribution.length; index++) {
942
+ const segment = String(contribution[index]);
943
+ if (!isPlainObject(node) || !Object.hasOwn(node, segment)) return undefined;
944
+ node = node[segment];
945
+ if (index === contribution.length - 1 || !isPlainObject(node)) {
946
+ return { path: contribution.slice(0, index + 1), value: node };
947
+ }
948
+ }
949
+ return undefined;
950
+ }
951
+
952
+ function defineOwnValue(target: Record<string, unknown>, key: string, value: unknown): void {
953
+ Object.defineProperty(target, key, {
954
+ value,
955
+ enumerable: true,
956
+ configurable: true,
957
+ writable: true,
958
+ });
959
+ }
960
+
961
+ /** Put `value` at `path` in `root`, copying each object on the way so objects
962
+ * shared with the trusted or project raw configs are never mutated. */
963
+ function writeOwnPath(root: Record<string, unknown>, path: ConfigIssuePath, value: unknown): void {
964
+ let node = root;
965
+ for (let index = 0; index < path.length - 1; index++) {
966
+ const segment = String(path[index]);
967
+ const child = node[segment];
968
+ if (!isPlainObject(child)) return;
969
+ const copy = { ...child };
970
+ defineOwnValue(node, segment, copy);
971
+ node = copy;
972
+ }
973
+ defineOwnValue(node, String(path[path.length - 1]), value);
974
+ }
975
+
976
+ /** Most rounds a single load can take; each round restores at least one path. */
977
+ const MAX_PROJECT_RESTORE_ROUNDS = 16;
978
+
979
+ /**
980
+ * After the project config is merged over the trusted (user + profile) config,
981
+ * put back the trusted value wherever an INVALID project value displaced it.
982
+ *
983
+ * Without this, a repository could reset user settings by writing a wrong type:
984
+ * `compaction: false` replaces the user's `compaction` block in the raw merge,
985
+ * the schema rejects it, and schema recovery drops the key and uses the schema
986
+ * default, so compaction turns back on, the historian loses its model, or the
987
+ * embedding provider flips and forces a full re-embed. A repository may only
988
+ * tighten what the user configured, so an invalid project value is ignored and
989
+ * the user's value stays. When the user has no value at that path, the project
990
+ * value is left for normal schema recovery, which already lands on the default
991
+ * the user would get anyway.
992
+ *
993
+ * `collectIssuePaths` runs the caller's own pre-schema migrations and schema
994
+ * check and returns every issue path (empty when the config is valid), so this
995
+ * stays aligned with the loader's real parse on every harness. `mergedRaw` is
996
+ * mutated in place.
997
+ */
998
+ export function restoreTrustedValuesOverInvalidProjectValues(args: {
999
+ mergedRaw: Record<string, unknown>;
1000
+ trustedRaw: Record<string, unknown>;
1001
+ projectRaw: Record<string, unknown>;
1002
+ collectIssuePaths: (raw: Record<string, unknown>) => readonly ConfigIssuePath[];
1003
+ }): { warnings: string[]; restoredTopLevelKeys: string[] } {
1004
+ const warnings: string[] = [];
1005
+ const restoredTopLevelKeys = new Set<string>();
1006
+ const restored = new Set<string>();
1007
+
1008
+ for (let round = 0; round < MAX_PROJECT_RESTORE_ROUNDS; round++) {
1009
+ let changed = false;
1010
+ for (const issuePath of args.collectIssuePaths(args.mergedRaw)) {
1011
+ const contribution = projectContributionPath(args.projectRaw, issuePath);
1012
+ if (contribution === undefined || contribution.length === 0) continue;
1013
+ const trusted = displacedTrustedValue(args.trustedRaw, contribution);
1014
+ if (trusted === undefined) continue;
1015
+ const key = trusted.path.map(String).join(".");
1016
+ // Already restored: any remaining issue there is in the user's own
1017
+ // value, which normal schema recovery handles.
1018
+ if (restored.has(key)) continue;
1019
+ writeOwnPath(args.mergedRaw, trusted.path, trusted.value);
1020
+ restored.add(key);
1021
+ restoredTopLevelKeys.add(String(trusted.path[0]));
1022
+ changed = true;
1023
+ warnings.push(
1024
+ `Ignoring invalid ${key} from project config and keeping the user-level value (security: a repository cannot reset user settings by supplying an invalid value).`,
1025
+ );
1026
+ }
1027
+ if (!changed) break;
1028
+ }
1029
+
1030
+ return { warnings, restoredTopLevelKeys: [...restoredTopLevelKeys] };
1031
+ }
1032
+
1033
+ const PROJECT_COMMAND_STRING_FIELDS = ["description", "agent", "model"] as const;
1034
+
1035
+ /** A well-formed command entry with only the fields the command config uses. */
1036
+ function wellFormedCommand(value: unknown): Record<string, unknown> | undefined {
1037
+ if (!isPlainObject(value)) return undefined;
1038
+ if (typeof value.template !== "string" || value.template.trim().length === 0) return undefined;
1039
+ const command: Record<string, unknown> = { template: value.template };
1040
+ for (const field of PROJECT_COMMAND_STRING_FIELDS) {
1041
+ if (value[field] === undefined) continue;
1042
+ if (typeof value[field] !== "string") return undefined;
1043
+ command[field] = value[field];
1044
+ }
1045
+ if (value.subtask !== undefined) {
1046
+ if (typeof value.subtask !== "boolean") return undefined;
1047
+ command.subtask = value.subtask;
1048
+ }
1049
+ return command;
1050
+ }
1051
+
1052
+ /**
1053
+ * Rebuild the merged `command` block so a repository may only ADD commands.
1054
+ *
1055
+ * The command block is not part of the schema; it is copied into the host's
1056
+ * command config after Magic Context's built-in commands. Merged as raw
1057
+ * config, a project could replace a command the user defined, shadow a
1058
+ * built-in /ctx-* command, wipe the user's commands with a non-object value,
1059
+ * or pass malformed entries to the host. Now the user's commands are kept as
1060
+ * they are, and a project entry is used only when it is well formed and its
1061
+ * name is neither a user command nor one of `reservedNames`. `mergedRaw` is
1062
+ * mutated in place.
1063
+ */
1064
+ export function constrainProjectCommands(args: {
1065
+ mergedRaw: Record<string, unknown>;
1066
+ trustedRaw: Record<string, unknown>;
1067
+ projectRaw: Record<string, unknown>;
1068
+ reservedNames: readonly string[];
1069
+ }): string[] {
1070
+ if (!("command" in args.projectRaw)) return [];
1071
+ const warnings: string[] = [];
1072
+ const trustedCommands = isPlainObject(args.trustedRaw.command)
1073
+ ? args.trustedRaw.command
1074
+ : undefined;
1075
+ const merged: Record<string, unknown> = { ...(trustedCommands ?? {}) };
1076
+ const projectCommands = args.projectRaw.command;
1077
+
1078
+ if (!isPlainObject(projectCommands)) {
1079
+ warnings.push(
1080
+ "Ignoring command from project config (it must be an object of named commands).",
1081
+ );
1082
+ } else {
1083
+ for (const [name, value] of Object.entries(projectCommands)) {
1084
+ if (trustedCommands && Object.hasOwn(trustedCommands, name)) {
1085
+ warnings.push(
1086
+ `Ignoring command.${name} from project config (security: a repository cannot replace a command defined in user config).`,
1087
+ );
1088
+ continue;
1089
+ }
1090
+ if (args.reservedNames.includes(name)) {
1091
+ warnings.push(
1092
+ `Ignoring command.${name} from project config (security: a repository cannot replace a built-in Magic Context command).`,
1093
+ );
1094
+ continue;
1095
+ }
1096
+ const command = wellFormedCommand(value);
1097
+ if (!command) {
1098
+ warnings.push(
1099
+ `Ignoring command.${name} from project config (it needs a non-empty string template; description, agent and model must be strings and subtask a boolean).`,
1100
+ );
1101
+ continue;
1102
+ }
1103
+ Object.defineProperty(merged, name, {
1104
+ value: command,
1105
+ enumerable: true,
1106
+ configurable: true,
1107
+ writable: true,
1108
+ });
1109
+ }
1110
+ }
1111
+
1112
+ if (Object.keys(merged).length === 0) delete args.mergedRaw.command;
1113
+ else args.mergedRaw.command = merged;
1114
+ return warnings;
1115
+ }
@@ -1,8 +1,9 @@
1
1
  /// <reference types="bun-types" />
2
2
 
3
- import { describe, expect, it } from "bun:test";
3
+ import { describe, expect, it, spyOn } from "bun:test";
4
4
  import { readFileSync } from "node:fs";
5
5
  import { resolve } from "node:path";
6
+ import * as logger from "../shared/logger";
6
7
  import { parsePluginConfig, resetProtectedTagsDeprecationWarningForTest } from "./index";
7
8
  import { constrainProjectThresholdOverrides } from "./project-security";
8
9
  import { deriveDefaultProtectedTokens, MagicContextConfigSchema } from "./schema/magic-context";
@@ -248,9 +249,13 @@ describe("protected_tokens config and derivation", () => {
248
249
 
249
250
  it("emits a once-per-process loud deprecation warning naming the replacement", () => {
250
251
  resetProtectedTagsDeprecationWarningForTest();
251
- const warnCalls: string[] = [];
252
- const originalWarn = console.warn;
253
- console.warn = (...args: unknown[]) => warnCalls.push(args.map(String).join(" "));
252
+ // The once-per-process line goes to the plugin log; the host passes
253
+ // console output straight to the operator's terminal.
254
+ const logged = spyOn(logger, "log");
255
+ const warnCalls = () =>
256
+ logged.mock.calls
257
+ .map(([message]) => message)
258
+ .filter((message) => message.includes("protected_tags is deprecated"));
254
259
 
255
260
  try {
256
261
  const res1 = parsePluginConfig({ protected_tags: 20 });
@@ -261,14 +266,14 @@ describe("protected_tokens config and derivation", () => {
261
266
  ),
262
267
  ),
263
268
  ).toBe(true);
264
- expect(warnCalls).toHaveLength(1);
265
- expect(warnCalls[0]).toContain("protected_tokens");
269
+ expect(warnCalls()).toHaveLength(1);
270
+ expect(warnCalls()[0]).toContain("protected_tokens");
266
271
 
267
- // Second parse in same process must NOT log to console again
272
+ // Second parse in same process must NOT log again
268
273
  parsePluginConfig({ protected_tags: 10 });
269
- expect(warnCalls).toHaveLength(1);
274
+ expect(warnCalls()).toHaveLength(1);
270
275
  } finally {
271
- console.warn = originalWarn;
276
+ logged.mockRestore();
272
277
  }
273
278
  });
274
279
  });
@@ -1,24 +1,26 @@
1
1
  import { afterEach, describe, expect, it } from "bun:test";
2
2
  import {
3
3
  chmodSync,
4
- mkdtempSync,
4
+ lstatSync,
5
5
  readdirSync,
6
6
  readFileSync,
7
+ readlinkSync,
7
8
  rmSync,
8
9
  statSync,
10
+ symlinkSync,
9
11
  writeFileSync,
10
12
  } from "node:fs";
11
13
  import { tmpdir } from "node:os";
12
14
  import { join } from "node:path";
13
-
14
15
  import { parseJsonc } from "../shared/jsonc-parser";
16
+ import { createTestTempDirFromPath } from "../shared/test-temp-dir";
15
17
  import { hasFlatKeys, loadRawConfigFile, migrateFlatDetailed } from "./raw-loader";
16
18
  import { PER_HARNESS_MIGRATION_INVENTORY } from "./schema/magic-context";
17
19
 
18
20
  const temporaryDirectories: string[] = [];
19
21
 
20
22
  function temporaryDirectory(): string {
21
- const directory = mkdtempSync(join(tmpdir(), "mc-per-harness-"));
23
+ const directory = createTestTempDirFromPath(join(tmpdir(), "mc-per-harness-"));
22
24
  temporaryDirectories.push(directory);
23
25
  return directory;
24
26
  }
@@ -373,6 +375,32 @@ describe("per-harness raw config migration", () => {
373
375
  expect(statSync(backupPath).ino).toBe(backupInode);
374
376
  });
375
377
 
378
+ // stow, chezmoi and home-manager link the user config into a dotfiles repo.
379
+ // Replacing the link with a regular file would silently stop later edits
380
+ // from reaching that repo, so the migration writes through to the target.
381
+ it("keeps a symlinked user config a symlink and migrates its target", () => {
382
+ const directory = temporaryDirectory();
383
+ const dotfiles = temporaryDirectory();
384
+ const targetPath = join(dotfiles, "magic-context.jsonc");
385
+ const configPath = join(directory, "magic-context.jsonc");
386
+ const original = Buffer.from('{ "historian": { "model": "provider/model" } }\n');
387
+ writeFileSync(targetPath, original);
388
+ chmodSync(targetPath, 0o600);
389
+ symlinkSync(targetPath, configPath);
390
+
391
+ const loaded = loadRawConfigFile({ configPath, tier: "user" });
392
+
393
+ expect(loaded?.migrated).toBe(true);
394
+ expect(lstatSync(configPath).isSymbolicLink()).toBe(true);
395
+ expect(readlinkSync(configPath)).toBe(targetPath);
396
+ expect(readFileSync(targetPath)).toEqual(loaded?.bytes);
397
+ expect(hasFlatKeys(readFileSync(targetPath))).toBe(false);
398
+ expect(statSync(targetPath).mode & 0o777).toBe(0o600);
399
+ expect(readFileSync(`${configPath}.pre-per-harness.bak`)).toEqual(original);
400
+ expect(readdirSync(dotfiles).filter((name) => name.endsWith(".tmp"))).toEqual([]);
401
+ expect(readdirSync(directory).filter((name) => name.endsWith(".tmp"))).toEqual([]);
402
+ });
403
+
376
404
  it("reloads the winning candidate when a concurrent loader replaces the target", () => {
377
405
  const directory = temporaryDirectory();
378
406
  const configPath = join(directory, "magic-context.jsonc");