@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
@@ -10,9 +10,11 @@ import {
10
10
  classifyProcessKind,
11
11
  discoverLivePiProcessIds,
12
12
  inspectLivePiProcesses,
13
+ inspectWindowsProcessesSync,
13
14
  isPidAlive,
14
15
  isPidIdentityPlausible,
15
16
  parseTasklistOutput,
17
+ processCannotBeRpcHost,
16
18
  type RpcPortFileRecord,
17
19
  readProcessProbeEvidence,
18
20
  } from "./rpc-utils";
@@ -629,18 +631,43 @@ describe("isPidIdentityPlausible", () => {
629
631
  ]);
630
632
 
631
633
  calls.length = 0;
634
+ // With the start time unreadable, the image is read next: only an image
635
+ // that cannot be a host would prove the record stale, and OpenCode.exe can.
632
636
  expect(isPidIdentityPlausible(record(NOW_MS))).toBe("inconclusive");
633
- expect(calls).toEqual([
634
- {
635
- file: "powershell",
636
- args: [
637
- "-NoProfile",
638
- "-Command",
639
- "Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,CommandLine,CreationDate | ConvertTo-Json -Compress",
640
- ],
641
- },
642
- ]);
637
+ expect(calls.map((call) => call.file)).toEqual(["powershell", "tasklist"]);
638
+ expect(calls[0]?.args.slice(0, 2)).toEqual(["-NoProfile", "-Command"]);
639
+ expect(String(calls[0]?.args[2])).toContain("Get-CimInstance Win32_Process");
640
+ expect(String(calls[0]?.args[2])).toContain("ToString('o')");
641
+ });
642
+ });
643
+
644
+ test("the synchronous Windows process list allows more output than the 1 MiB default", () => {
645
+ // Bun's execFileSync throws ENOBUFS past 1 MiB, and a Win32_Process listing
646
+ // with command lines passes that on a busy desktop; the snapshot then falls
647
+ // back to tasklist, which has no start times.
648
+ const limits: unknown[] = [];
649
+ __setRpcIdentityTestHooks({
650
+ platform: "win32",
651
+ processListExecFileSync: ((
652
+ _file: string,
653
+ _args: readonly string[],
654
+ options?: { maxBuffer?: number },
655
+ ) => {
656
+ limits.push(options?.maxBuffer);
657
+ return JSON.stringify([
658
+ {
659
+ ProcessId: 7,
660
+ ParentProcessId: 1,
661
+ Name: "opencode.exe",
662
+ CommandLine: "opencode",
663
+ CreationDate: "2026-09-30T10:15:00Z",
664
+ },
665
+ ]);
666
+ }) as unknown as typeof execFileSync,
643
667
  });
668
+ const inspection = inspectWindowsProcessesSync();
669
+ expect(inspection.processSnapshot?.source).toBe("cim");
670
+ expect(limits).toEqual([8 * 1024 * 1024]);
644
671
  });
645
672
 
646
673
  test("Spanish tasklist no-match is not running", () => {
@@ -664,3 +691,130 @@ test("tasklist CSV live process is running", () => {
664
691
  { pid: 1234, command: "opencode.exe" },
665
692
  ]);
666
693
  });
694
+
695
+ describe("proving a discovery record stale from the record's own start time", () => {
696
+ // Values from a Windows machine where PIDs from old records had been reused.
697
+ const RECORDED = Date.parse("2026-08-16T22:49:55Z");
698
+ const DAY_MS = 24 * 60 * 60 * 1000;
699
+ const windowsRecord = (startedAt: number): RpcPortFileRecord => ({
700
+ port: 54209,
701
+ pid: 15520,
702
+ started_at: startedAt,
703
+ });
704
+
705
+ test("a PID whose process started after the record was written is a reused PID", () => {
706
+ expect(
707
+ isPidIdentityPlausible(windowsRecord(RECORDED), {
708
+ startTime: RECORDED + 42 * DAY_MS,
709
+ commandLine: "C:\\Windows\\System32\\RuntimeBroker.exe -Embedding",
710
+ imageName: "RuntimeBroker.exe",
711
+ }),
712
+ ).toBe("implausible");
713
+ // The start time alone is proof, even when the new process is a runtime a
714
+ // host could use.
715
+ expect(
716
+ isPidIdentityPlausible(windowsRecord(RECORDED), {
717
+ startTime: RECORDED + 42 * DAY_MS,
718
+ commandLine: "node.exe C:\\tools\\unrelated.js",
719
+ imageName: "node.exe",
720
+ }),
721
+ ).toBe("implausible");
722
+ });
723
+
724
+ test("a host that started at or before its record is genuine", () => {
725
+ for (const startTime of [RECORDED - 13_000, RECORDED]) {
726
+ expect(
727
+ isPidIdentityPlausible(windowsRecord(RECORDED), {
728
+ startTime,
729
+ commandLine: null,
730
+ imageName: "RuntimeBroker.exe",
731
+ }),
732
+ ).toBe("plausible");
733
+ }
734
+ });
735
+
736
+ test("an unreadable start time with an image no host can run is a reused PID", () => {
737
+ for (const imageName of ["svchost.exe", "WinAutomation.UserAgent.exe"]) {
738
+ expect(
739
+ isPidIdentityPlausible(windowsRecord(RECORDED), {
740
+ startTime: null,
741
+ commandLine: imageName,
742
+ imageName,
743
+ }),
744
+ ).toBe("implausible");
745
+ }
746
+ });
747
+
748
+ test("an unreadable start time with a host-like image stays inconclusive", () => {
749
+ for (const imageName of [
750
+ "opencode.exe",
751
+ "OpenChamber.exe",
752
+ "pi.exe",
753
+ "omp.exe",
754
+ "bun.exe",
755
+ "node.exe",
756
+ "ck-mc.exe",
757
+ ]) {
758
+ expect(
759
+ isPidIdentityPlausible(windowsRecord(RECORDED), {
760
+ startTime: null,
761
+ commandLine: null,
762
+ imageName,
763
+ }),
764
+ ).toBe("inconclusive");
765
+ }
766
+ expect(
767
+ isPidIdentityPlausible(windowsRecord(RECORDED), {
768
+ startTime: null,
769
+ commandLine: null,
770
+ imageName: null,
771
+ }),
772
+ ).toBe("inconclusive");
773
+ });
774
+
775
+ test("an unreadable start time is resolved from the probed image when no evidence is passed", () => {
776
+ __setRpcIdentityTestHooks({
777
+ platform: "win32",
778
+ execFileSync: ((file: string | URL) => {
779
+ if (String(file) === "powershell") throw new Error("CIM unavailable");
780
+ return tasklistOutput([[15520, "svchost.exe"]]);
781
+ }) as typeof execFileSync,
782
+ });
783
+ expect(isPidIdentityPlausible(windowsRecord(RECORDED))).toBe("implausible");
784
+ });
785
+
786
+ test("a record without a start time is stale only when its image cannot be a host", () => {
787
+ expect(
788
+ isPidIdentityPlausible(windowsRecord(0), {
789
+ startTime: null,
790
+ commandLine: "dllhost.exe",
791
+ imageName: "dllhost.exe",
792
+ }),
793
+ ).toBe("implausible");
794
+ expect(
795
+ isPidIdentityPlausible(windowsRecord(0), {
796
+ startTime: null,
797
+ commandLine: "pi.exe",
798
+ imageName: "pi.exe",
799
+ }),
800
+ ).toBe("inconclusive");
801
+ });
802
+
803
+ test("host markers are matched in either the image name or the command line", () => {
804
+ expect(processCannotBeRpcHost({ commandLine: null, imageName: "Cherry Studio.exe" })).toBe(
805
+ true,
806
+ );
807
+ expect(
808
+ processCannotBeRpcHost({
809
+ commandLine: "C:\\Users\\a\\.bun\\bin\\omp.exe",
810
+ imageName: "unknown",
811
+ }),
812
+ ).toBe(false);
813
+ expect(
814
+ processCannotBeRpcHost({
815
+ commandLine: "/usr/bin/env node /opt/pi-coding-agent/dist/cli.js",
816
+ }),
817
+ ).toBe(false);
818
+ expect(processCannotBeRpcHost({ commandLine: " ", imageName: null })).toBe(false);
819
+ });
820
+ });
@@ -5,6 +5,7 @@ import { join } from "node:path";
5
5
 
6
6
  import { log } from "./logger";
7
7
  import { PI_IMAGE_NAMES, piHarnessKindFromExecutable } from "./pi-executable";
8
+ import { canonicalProjectDirectory } from "./project-directory-key";
8
9
 
9
10
  export type ProcessKind = "OpenCode server" | "OpenCode instance (TUI/CLI)" | "Pi" | "process";
10
11
 
@@ -14,6 +15,11 @@ export interface ProcessProbeEvidence {
14
15
  startTime: number | null;
15
16
  /** The raw command line, or null when the platform/probe cannot provide it. */
16
17
  commandLine: string | null;
18
+ /**
19
+ * The executable image name when the process list reports it separately
20
+ * from the command line (Windows CIM and tasklist), otherwise absent.
21
+ */
22
+ imageName?: string | null;
17
23
  }
18
24
 
19
25
  export interface RpcPortFileRecord {
@@ -68,8 +74,27 @@ export function isOwnRpcServerRecord(
68
74
  /**
69
75
  * Stable hash for a project directory — scopes RPC port files per-project
70
76
  * so multiple OpenCode instances don't collide.
77
+ *
78
+ * The server that writes a discovery file and the TUI that looks it up often
79
+ * receive the same directory spelled differently (macOS `/var` vs
80
+ * `/private/var`; on Windows drive-letter case, separators, a trailing
81
+ * separator, `\\?\` prefixes, 8.3 short names). Both hash the one canonical
82
+ * spelling from `canonicalProjectDirectory`, so any of those spellings finds the
83
+ * same file.
71
84
  */
72
85
  export function projectHash(directory: string): string {
86
+ return createHash("sha256")
87
+ .update(canonicalProjectDirectory(directory))
88
+ .digest("hex")
89
+ .slice(0, 16);
90
+ }
91
+
92
+ /**
93
+ * The hash builds up to 0.44.4 used: the spelling as given, minus trailing
94
+ * slashes. Lookups also read that directory so a TUI can still find an older
95
+ * server (and tell the user it is older).
96
+ */
97
+ export function legacyProjectHash(directory: string): string {
73
98
  const normalized = directory.replace(/\/+$/, "");
74
99
  return createHash("sha256").update(normalized).digest("hex").slice(0, 16);
75
100
  }
@@ -79,6 +104,16 @@ export function rpcPortDir(storageDir: string, directory: string): string {
79
104
  return join(storageDir, "rpc", projectHash(directory));
80
105
  }
81
106
 
107
+ /**
108
+ * Every directory a lookup reads for this project: the canonical one servers
109
+ * write now, and the pre-canonical one older servers wrote.
110
+ */
111
+ export function rpcPortDirsForLookup(storageDir: string, directory: string): string[] {
112
+ const canonical = rpcPortDir(storageDir, directory);
113
+ const legacy = join(storageDir, "rpc", legacyProjectHash(directory));
114
+ return legacy === canonical ? [canonical] : [canonical, legacy];
115
+ }
116
+
82
117
  /** Per-process RPC port file path. */
83
118
  export function rpcPortFilePath(
84
119
  storageDir: string,
@@ -92,7 +127,7 @@ export function rpcPortFilePath(
92
127
 
93
128
  /** Legacy single-port file used by v0.18.0 and earlier. */
94
129
  export function legacyRpcPortFilePath(storageDir: string, directory: string): string {
95
- return join(rpcPortDir(storageDir, directory), "port");
130
+ return join(storageDir, "rpc", legacyProjectHash(directory), "port");
96
131
  }
97
132
 
98
133
  export type PidLiveness = "alive" | "dead" | "inconclusive";
@@ -121,8 +156,21 @@ const WINDOWS_CIM_PROBE_TIMEOUT_MS = 5_000;
121
156
  const WINDOWS_PROCESS_SNAPSHOT_TTL_MS = 2_000;
122
157
  const MAX_ANCESTOR_WALK_DEPTH = 16;
123
158
  const OPEN_CODE_COMMAND_MARKERS = ["opencode", "node", "bun", "electron"];
159
+ // CreationDate is formatted in the query as an ISO-8601 UTC string. Left as a
160
+ // DateTime, ConvertTo-Json's output depends on the PowerShell edition (Windows
161
+ // PowerShell 5.1 can emit `\/Date(ms)\/` or an object wrapping it; PowerShell 7
162
+ // emits a local-offset string), and a start time the parser cannot read turns
163
+ // every live RPC holder's identity check inconclusive.
124
164
  const WINDOWS_CIM_COMMAND =
125
- "Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,CommandLine,CreationDate | ConvertTo-Json -Compress";
165
+ "Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,CommandLine,@{Name='CreationDate';Expression={if ($_.CreationDate) { $_.CreationDate.ToUniversalTime().ToString('o') } else { $null }}} | ConvertTo-Json -Compress";
166
+ /**
167
+ * Output limit for process-list commands. A full Win32_Process listing with
168
+ * command lines routinely exceeds the 1 MiB `execFileSync` default (browser and
169
+ * editor processes carry very long command lines); past the limit the call
170
+ * throws ENOBUFS and the probe falls back to tasklist, which reports no start
171
+ * times.
172
+ */
173
+ const PROCESS_LIST_MAX_BUFFER_BYTES = 8 * 1024 * 1024;
126
174
  const PI_HARNESS_ARC_MARKERS = [
127
175
  "pi-coding-agent",
128
176
  "oh-my-pi",
@@ -210,6 +258,12 @@ export function readProcessProbeEvidence(pid: number): ProcessProbeEvidence {
210
258
  };
211
259
  }
212
260
 
261
+ function readCachedWindowsImageName(pid: number): string | null {
262
+ return rpcIdentityPlatform === "win32"
263
+ ? (windowsProcessFactsCache?.get(pid)?.imageName ?? null)
264
+ : null;
265
+ }
266
+
213
267
  interface ProcessListEntry {
214
268
  pid: number;
215
269
  command: string;
@@ -420,6 +474,50 @@ function commandLooksLikeOpenCode(command: string): boolean {
420
474
  return OPEN_CODE_COMMAND_MARKERS.some((marker) => normalized.includes(marker));
421
475
  }
422
476
 
477
+ /**
478
+ * Text found in the image name or command line of every process that can write
479
+ * an RPC discovery record: OpenCode (CLI, server, desktop app, the CLI bundled
480
+ * in OpenChamber), Pi and Oh My Pi, ck-mc, and the runtimes they run on. These
481
+ * are matched as substrings, so a renamed or wrapped launch still counts as a
482
+ * possible host. A false match only keeps a record, never deletes one.
483
+ */
484
+ const RPC_HOST_PROCESS_MARKERS = [
485
+ "opencode",
486
+ "openchamber",
487
+ "ck-mc",
488
+ "magic-context",
489
+ "cortexkit",
490
+ "electron",
491
+ "node",
492
+ "bun",
493
+ "deno",
494
+ "pi-coding-agent",
495
+ "oh-my-pi",
496
+ ];
497
+
498
+ /**
499
+ * Whether the process's image name or command line proves it cannot be a Magic
500
+ * Context host. Pi's image names (`pi`, `omp`) are too short to match as
501
+ * substrings, so they are compared as whole executable names. Missing evidence
502
+ * is never proof: with neither field readable this returns false.
503
+ */
504
+ export function processCannotBeRpcHost(
505
+ evidence: Pick<ProcessProbeEvidence, "commandLine" | "imageName">,
506
+ ): boolean {
507
+ const texts = [evidence.imageName, evidence.commandLine].filter(
508
+ (text): text is string => typeof text === "string" && text.trim().length > 0,
509
+ );
510
+ if (texts.length === 0) return false;
511
+ for (const text of texts) {
512
+ const normalized = text.toLowerCase();
513
+ if (RPC_HOST_PROCESS_MARKERS.some((marker) => normalized.includes(marker))) return false;
514
+ const tokens = commandTokens(text);
515
+ if (commandHasPiExecutable(tokens)) return false;
516
+ if (tokens.some((token) => piHarnessKindFromExecutable(token) !== undefined)) return false;
517
+ }
518
+ return true;
519
+ }
520
+
423
521
  /**
424
522
  * Verify that a live PID still belongs to the process that wrote a port record.
425
523
  *
@@ -429,6 +527,10 @@ function commandLooksLikeOpenCode(command: string): boolean {
429
527
  * database-open guard path. Legacy records without a start time use a weaker
430
528
  * command-name check. A failed filesystem or process probe is inconclusive,
431
529
  * not proof that this port record still belongs to OpenCode.
530
+ *
531
+ * "implausible" is returned only with proof that the live process did not write
532
+ * the record: it started after the record's `started_at`, or its image cannot
533
+ * be any Magic Context host. Callers may delete such a record on every platform.
432
534
  */
433
535
  export type PidIdentityPlausibility = "plausible" | "implausible" | "inconclusive";
434
536
 
@@ -440,10 +542,22 @@ export function isPidIdentityPlausible(
440
542
 
441
543
  if (Number.isFinite(record.started_at) && record.started_at > 0) {
442
544
  const processStartTime = evidence ? evidence.startTime : readProcessStartTime(record.pid);
443
- if (processStartTime === null) return "inconclusive";
444
- return processStartTime <= record.started_at + RPC_IDENTITY_SKEW_TOLERANCE_MS
445
- ? "plausible"
446
- : "implausible";
545
+ if (processStartTime !== null) {
546
+ // A host writes `started_at` after it starts, so a process that started
547
+ // later than the record (beyond clock skew) cannot have written it: the
548
+ // PID was reused and the record is stale.
549
+ return processStartTime <= record.started_at + RPC_IDENTITY_SKEW_TOLERANCE_MS
550
+ ? "plausible"
551
+ : "implausible";
552
+ }
553
+ // Some start times cannot be read at all (Windows service hosts such as
554
+ // svchost, when the query is not elevated). Then only an image that no host
555
+ // can run proves the PID was reused; anything else stays unknown.
556
+ const identity = evidence ?? {
557
+ commandLine: readProcessCommand(record.pid),
558
+ imageName: readCachedWindowsImageName(record.pid),
559
+ };
560
+ return processCannotBeRpcHost(identity) ? "implausible" : "inconclusive";
447
561
  }
448
562
 
449
563
  const command = evidence
@@ -454,7 +568,13 @@ export function isPidIdentityPlausible(
454
568
  ? (readWindowsProcess(record.pid).command ?? null)
455
569
  : readPsProcessCommand(record.pid);
456
570
  if (command === null) return "inconclusive";
457
- return commandLooksLikeOpenCode(command) ? "plausible" : "implausible";
571
+ if (commandLooksLikeOpenCode(command)) return "plausible";
572
+ // A record without a start time carries only a PID. Its process is proven
573
+ // unrelated only when its image cannot be a host (Pi and OpenChamber, for
574
+ // example, do not match the OpenCode markers above).
575
+ return processCannotBeRpcHost({ commandLine: command, imageName: evidence?.imageName })
576
+ ? "implausible"
577
+ : "inconclusive";
458
578
  }
459
579
 
460
580
  export function __setRpcIdentityTestHooks(hooks: {
@@ -529,6 +649,7 @@ function execProcessList(
529
649
  exec(file, [...args], {
530
650
  encoding: "utf8",
531
651
  timeout,
652
+ maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,
532
653
  stdio: ["ignore", "pipe", "pipe"],
533
654
  windowsHide: true,
534
655
  }),
@@ -536,6 +657,11 @@ function execProcessList(
536
657
  }
537
658
 
538
659
  function parseWindowsCreationDate(value: unknown): number | null {
660
+ // Windows PowerShell 5.1 can serialize a DateTime carrying extended
661
+ // properties as { value: "\/Date(ms)\/", DisplayHint, DateTime }.
662
+ if (value !== null && typeof value === "object" && "value" in value) {
663
+ return parseWindowsCreationDate((value as { value: unknown }).value);
664
+ }
539
665
  if (typeof value === "number" && Number.isFinite(value)) {
540
666
  return value > 1e12 ? value : value * 1_000;
541
667
  }
@@ -880,6 +1006,15 @@ export interface AsyncProcessInspection {
880
1006
  liveness(pid: number): PidLiveness;
881
1007
  }
882
1008
 
1009
+ /** Process evidence from one snapshot row; the image name is included only when known. */
1010
+ function snapshotEvidence(fact: ProcessFacts | undefined): ProcessProbeEvidence {
1011
+ return {
1012
+ startTime: fact?.startTime ?? null,
1013
+ commandLine: fact?.commandLine ?? fact?.imageName ?? null,
1014
+ ...(fact?.imageName ? { imageName: fact.imageName } : {}),
1015
+ };
1016
+ }
1017
+
883
1018
  function execProcessListAsync(file: string, args: string[], timeout: number): Promise<string> {
884
1019
  return new Promise((resolve, reject) => {
885
1020
  execFile(
@@ -986,10 +1121,7 @@ export function inspectProcessesAsync(forceFresh = false): Promise<AsyncProcessI
986
1121
  ...(fresh && snapshot
987
1122
  ? { processSnapshot: { source: snapshot.source, facts: snapshot.facts } }
988
1123
  : {}),
989
- evidence: (pid: number) => ({
990
- startTime: byPid.get(pid)?.startTime ?? null,
991
- commandLine: byPid.get(pid)?.commandLine ?? byPid.get(pid)?.imageName ?? null,
992
- }),
1124
+ evidence: (pid: number) => snapshotEvidence(byPid.get(pid)),
993
1125
  liveness: (pid: number) => (byPid.has(pid) ? "alive" : fresh ? "dead" : "inconclusive"),
994
1126
  } satisfies AsyncProcessInspection;
995
1127
  })().finally(() => {
@@ -1008,10 +1140,7 @@ export function inspectWindowsProcessesSync(): AsyncProcessInspection {
1008
1140
  ...(snapshot
1009
1141
  ? { processSnapshot: { source: snapshot.source, facts: snapshot.facts } }
1010
1142
  : {}),
1011
- evidence: (pid) => ({
1012
- startTime: byPid.get(pid)?.startTime ?? null,
1013
- commandLine: byPid.get(pid)?.commandLine ?? byPid.get(pid)?.imageName ?? null,
1014
- }),
1143
+ evidence: (pid) => snapshotEvidence(byPid.get(pid)),
1015
1144
  liveness: (pid) => (byPid.has(pid) ? "alive" : snapshot ? "dead" : "inconclusive"),
1016
1145
  };
1017
1146
  }
@@ -1,5 +1,5 @@
1
1
  import { 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 {
@@ -9,10 +9,11 @@ import {
9
9
  withSqliteTransformPass,
10
10
  } from "./sqlite";
11
11
  import { startSqliteWriteLocker } from "./sqlite-write-locker-test-support";
12
+ import { createTestTempDirFromPath } from "./test-temp-dir";
12
13
 
13
14
  for (const mode of ["default", "immediate", "exclusive", "literal"] as const) {
14
15
  test(`shared SQLite retries ${mode} acquisition before running any writes`, async () => {
15
- const dir = mkdtempSync(join(tmpdir(), "mc-routed-acquisition-"));
16
+ const dir = createTestTempDirFromPath(join(tmpdir(), "mc-routed-acquisition-"));
16
17
  const path = join(dir, "context.db");
17
18
  const db = new Database(path);
18
19
  db.exec(
@@ -75,7 +76,7 @@ test("routed transactions preserve nesting, receiver, arguments and rollback wit
75
76
  });
76
77
 
77
78
  test("exhausted routed acquisition never enters the callback or multiplies privileged retries", () => {
78
- const dir = mkdtempSync(join(tmpdir(), "mc-routed-exhaustion-"));
79
+ const dir = createTestTempDirFromPath(join(tmpdir(), "mc-routed-exhaustion-"));
79
80
  const path = join(dir, "context.db");
80
81
  const blocker = new Database(path);
81
82
  const db = new Database(path);
@@ -100,3 +101,45 @@ test("exhausted routed acquisition never enters the callback or multiplies privi
100
101
  rmSync(dir, { recursive: true, force: true });
101
102
  }
102
103
  });
104
+
105
+ for (const mode of ["run", "get", "all", "exec"] as const) {
106
+ test(`foreground ${mode} autocommit waits share one turn budget and restore production timeout`, () => {
107
+ const dir = createTestTempDirFromPath(join(tmpdir(), "mc-autocommit-budget-"));
108
+ const path = join(dir, "context.db");
109
+ const db = new Database(path);
110
+ db.exec(
111
+ "PRAGMA journal_mode=WAL; CREATE TABLE result(value TEXT); PRAGMA busy_timeout=5000",
112
+ );
113
+ const blocker = new Database(path);
114
+ blocker.exec("BEGIN IMMEDIATE");
115
+ try {
116
+ const started = performance.now();
117
+ withSqliteTransformPass(() => {
118
+ for (let attempt = 0; attempt < 3; attempt++) {
119
+ // Nested foreground wrappers must reuse the turn's remaining budget.
120
+ expect(() =>
121
+ withSqliteTransformPass(() => {
122
+ if (mode === "exec") db.exec("INSERT INTO result VALUES ('blocked')");
123
+ else
124
+ db.prepare("INSERT INTO result VALUES ('blocked') RETURNING value")[
125
+ mode
126
+ ]();
127
+ }),
128
+ ).toThrow("acquisition remained busy");
129
+ }
130
+ expect(() => db.exec("BEGIN IMMEDIATE")).toThrow("acquisition remained busy");
131
+ });
132
+ expect(performance.now() - started).toBeLessThan(650);
133
+ expect(db.prepare("PRAGMA busy_timeout").get()).toEqual({ timeout: 5000 });
134
+ expect(db.prepare("SELECT * FROM result").all()).toEqual([]);
135
+ blocker.exec("ROLLBACK");
136
+ withSqliteTransformPass(() => db.prepare("INSERT INTO result VALUES ('free')").run());
137
+ expect(db.prepare("SELECT * FROM result").all()).toEqual([{ value: "free" }]);
138
+ } finally {
139
+ if (blocker.inTransaction) blocker.exec("ROLLBACK");
140
+ blocker.close();
141
+ db.close();
142
+ rmSync(dir, { recursive: true, force: true });
143
+ }
144
+ });
145
+ }
@@ -1,5 +1,5 @@
1
1
  import { 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 {
@@ -13,9 +13,10 @@ import {
13
13
  withSqliteTransformPass,
14
14
  } from "./sqlite";
15
15
  import { startSqliteWriteLocker } from "./sqlite-write-locker-test-support";
16
+ import { createTestTempDirFromPath } from "./test-temp-dir";
16
17
 
17
18
  function fixture() {
18
- const dir = mkdtempSync(join(tmpdir(), "mc-busy-yield-"));
19
+ const dir = createTestTempDirFromPath(join(tmpdir(), "mc-busy-yield-"));
19
20
  const path = join(dir, "context.db");
20
21
  const db = new Database(path);
21
22
  db.exec(
@@ -23,6 +23,10 @@ const READ_ONLY_DEFERRED_TRANSACTIONS: Record<string, string> = {
23
23
  "reads the latest compaction and the rows after it as one consistent snapshot of the OpenCode 2 store; never writes",
24
24
  "packages/pi-plugin/src/inject-compartments-pi.ts#readFrozenM0InputsPi":
25
25
  "reads the m[0] render sources and their watermarks as one consistent snapshot; never writes",
26
+ "packages/plugin/src/features/magic-context/message-fts-session-filter.ts#withMessageFtsSessionFilter":
27
+ "pins one read snapshot so the session's rowid coverage proof and the filtered message search see the same rows; never writes (read-only connections use it too)",
28
+ "packages/plugin/src/hooks/magic-context/lkg-persist.ts#loadPersistedLkgSlot":
29
+ "reads an LKG slot row and its prefix slices as one consistent snapshot; never writes (a failed verification clears the slot afterwards, outside this transaction)",
26
30
  };
27
31
 
28
32
  const REPOSITORY_ROOT = resolve(import.meta.dir, "../../../..");