@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
@@ -10,8 +10,11 @@ import {
10
10
  classifyProcessKind,
11
11
  discoverLivePiProcessIds,
12
12
  inspectLivePiProcesses,
13
+ inspectWindowsProcessesSync,
13
14
  isPidAlive,
14
15
  isPidIdentityPlausible,
16
+ parseTasklistOutput,
17
+ processCannotBeRpcHost,
15
18
  type RpcPortFileRecord,
16
19
  readProcessProbeEvidence,
17
20
  } from "./rpc-utils";
@@ -441,7 +444,7 @@ describe("isPidAlive", () => {
441
444
  expect(calls).toEqual([
442
445
  {
443
446
  file: "tasklist",
444
- args: ["/FO", "CSV", "/FI", `PID eq ${PID}`],
447
+ args: ["/FO", "CSV", "/NH", "/FI", `PID eq ${PID}`],
445
448
  stdio: ["ignore", "pipe", "pipe"],
446
449
  },
447
450
  ]);
@@ -623,19 +626,195 @@ describe("isPidIdentityPlausible", () => {
623
626
  });
624
627
 
625
628
  expect(isPidIdentityPlausible(record(0))).toBe("plausible");
626
- expect(calls).toEqual([{ file: "tasklist", args: ["/FO", "CSV", "/FI", `PID eq ${PID}`] }]);
629
+ expect(calls).toEqual([
630
+ { file: "tasklist", args: ["/FO", "CSV", "/NH", "/FI", `PID eq ${PID}`] },
631
+ ]);
627
632
 
628
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.
629
636
  expect(isPidIdentityPlausible(record(NOW_MS))).toBe("inconclusive");
630
- expect(calls).toEqual([
631
- {
632
- file: "powershell",
633
- args: [
634
- "-NoProfile",
635
- "-Command",
636
- "Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,CommandLine,CreationDate | ConvertTo-Json -Compress",
637
- ],
638
- },
639
- ]);
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,
667
+ });
668
+ const inspection = inspectWindowsProcessesSync();
669
+ expect(inspection.processSnapshot?.source).toBe("cim");
670
+ expect(limits).toEqual([8 * 1024 * 1024]);
671
+ });
672
+
673
+ test("Spanish tasklist no-match is not running", () => {
674
+ const output =
675
+ "INFORMACIÓN: no hay tareas ejecutándose que coincidan con los\ncriterios especificados.";
676
+ expect(parseTasklistOutput(output)).toEqual([]);
677
+ __setRpcIdentityTestHooks({ platform: "win32", execFileSync: psOutput(output) });
678
+ expect(isPidAlive(PID)).toBe("dead");
679
+ });
680
+
681
+ test("German tasklist no-match is not running", () => {
682
+ expect(
683
+ parseTasklistOutput(
684
+ "INFORMATION: Es werden keine Aufgaben mit den angegebenen Kriterien ausgeführt.",
685
+ ),
686
+ ).toEqual([]);
687
+ });
688
+
689
+ test("tasklist CSV live process is running", () => {
690
+ expect(parseTasklistOutput('"opencode.exe","1234","Console","1","10,000 K"')).toEqual([
691
+ { pid: 1234, command: "opencode.exe" },
692
+ ]);
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);
640
819
  });
641
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,10 +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"];
124
- const TASKLIST_NO_TASKS_PATTERN =
125
- /^INFO:\s+No tasks are running which match the specified criteria\.?$/im;
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.
126
164
  const WINDOWS_CIM_COMMAND =
127
- "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;
128
174
  const PI_HARNESS_ARC_MARKERS = [
129
175
  "pi-coding-agent",
130
176
  "oh-my-pi",
@@ -212,6 +258,12 @@ export function readProcessProbeEvidence(pid: number): ProcessProbeEvidence {
212
258
  };
213
259
  }
214
260
 
261
+ function readCachedWindowsImageName(pid: number): string | null {
262
+ return rpcIdentityPlatform === "win32"
263
+ ? (windowsProcessFactsCache?.get(pid)?.imageName ?? null)
264
+ : null;
265
+ }
266
+
215
267
  interface ProcessListEntry {
216
268
  pid: number;
217
269
  command: string;
@@ -270,34 +322,39 @@ function parseCsvLine(line: string): string[] | null {
270
322
  return fields;
271
323
  }
272
324
 
273
- function parseTasklistOutput(output: string): ProcessListEntry[] | null {
325
+ export function parseTasklistOutput(output: string): ProcessListEntry[] | null {
274
326
  const entries: ProcessListEntry[] = [];
275
- let sawHeader = false;
327
+
276
328
  for (const rawLine of output.split(/\r?\n/)) {
277
329
  const line = rawLine.trim();
278
330
  if (!line) continue;
279
- if (TASKLIST_NO_TASKS_PATTERN.test(line)) return [];
331
+
280
332
  const fields = parseCsvLine(line);
281
333
  if (!fields) continue;
282
334
  if (fields[1]?.trim().toLowerCase() === "pid") {
283
- sawHeader = true;
284
335
  continue;
285
336
  }
286
337
  const pid = Number(fields[1]);
287
338
  if (!Number.isInteger(pid) || pid <= 0 || !fields[0]) continue;
288
339
  entries.push({ pid, command: fields[0] });
289
340
  }
290
- return entries.length > 0 || sawHeader ? entries : null;
341
+ // Successful tasklist commands return localized prose when no PID matches.
342
+ // Only CSV PID fields are evidence of a live process; failures are caught by the caller.
343
+ return entries;
291
344
  }
292
345
 
293
346
  function readWindowsProcess(pid: number): { state: PidLiveness; command?: string } {
294
347
  try {
295
- const output = rpcIdentityExecFileSync("tasklist", ["/FO", "CSV", "/FI", `PID eq ${pid}`], {
296
- encoding: "utf8",
297
- timeout: PS_PROBE_TIMEOUT_MS,
298
- stdio: ["ignore", "pipe", "pipe"],
299
- windowsHide: true,
300
- });
348
+ const output = rpcIdentityExecFileSync(
349
+ "tasklist",
350
+ ["/FO", "CSV", "/NH", "/FI", `PID eq ${pid}`],
351
+ {
352
+ encoding: "utf8",
353
+ timeout: PS_PROBE_TIMEOUT_MS,
354
+ stdio: ["ignore", "pipe", "pipe"],
355
+ windowsHide: true,
356
+ },
357
+ );
301
358
  const entries = parseTasklistOutput(String(output));
302
359
  if (entries === null) return { state: "inconclusive" };
303
360
  const process = entries.find((entry) => entry.pid === pid);
@@ -417,6 +474,50 @@ function commandLooksLikeOpenCode(command: string): boolean {
417
474
  return OPEN_CODE_COMMAND_MARKERS.some((marker) => normalized.includes(marker));
418
475
  }
419
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
+
420
521
  /**
421
522
  * Verify that a live PID still belongs to the process that wrote a port record.
422
523
  *
@@ -426,6 +527,10 @@ function commandLooksLikeOpenCode(command: string): boolean {
426
527
  * database-open guard path. Legacy records without a start time use a weaker
427
528
  * command-name check. A failed filesystem or process probe is inconclusive,
428
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.
429
534
  */
430
535
  export type PidIdentityPlausibility = "plausible" | "implausible" | "inconclusive";
431
536
 
@@ -437,10 +542,22 @@ export function isPidIdentityPlausible(
437
542
 
438
543
  if (Number.isFinite(record.started_at) && record.started_at > 0) {
439
544
  const processStartTime = evidence ? evidence.startTime : readProcessStartTime(record.pid);
440
- if (processStartTime === null) return "inconclusive";
441
- return processStartTime <= record.started_at + RPC_IDENTITY_SKEW_TOLERANCE_MS
442
- ? "plausible"
443
- : "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";
444
561
  }
445
562
 
446
563
  const command = evidence
@@ -451,7 +568,13 @@ export function isPidIdentityPlausible(
451
568
  ? (readWindowsProcess(record.pid).command ?? null)
452
569
  : readPsProcessCommand(record.pid);
453
570
  if (command === null) return "inconclusive";
454
- 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";
455
578
  }
456
579
 
457
580
  export function __setRpcIdentityTestHooks(hooks: {
@@ -526,6 +649,7 @@ function execProcessList(
526
649
  exec(file, [...args], {
527
650
  encoding: "utf8",
528
651
  timeout,
652
+ maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,
529
653
  stdio: ["ignore", "pipe", "pipe"],
530
654
  windowsHide: true,
531
655
  }),
@@ -533,6 +657,11 @@ function execProcessList(
533
657
  }
534
658
 
535
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
+ }
536
665
  if (typeof value === "number" && Number.isFinite(value)) {
537
666
  return value > 1e12 ? value : value * 1_000;
538
667
  }
@@ -632,7 +761,11 @@ function tryReadWindowsCimSnapshot(exec: typeof execFileSync): ProcessSnapshot |
632
761
 
633
762
  function tryReadWindowsTasklistSnapshot(): ProcessSnapshot | null {
634
763
  try {
635
- const output = execProcessList(rpcProcessListExecFileSync, "tasklist", ["/FO", "CSV"]);
764
+ const output = execProcessList(rpcProcessListExecFileSync, "tasklist", [
765
+ "/FO",
766
+ "CSV",
767
+ "/NH",
768
+ ]);
636
769
  const entries = parseTasklistOutput(output);
637
770
  if (entries === null) return null;
638
771
  const facts = entries.map((entry) => ({
@@ -873,6 +1006,15 @@ export interface AsyncProcessInspection {
873
1006
  liveness(pid: number): PidLiveness;
874
1007
  }
875
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
+
876
1018
  function execProcessListAsync(file: string, args: string[], timeout: number): Promise<string> {
877
1019
  return new Promise((resolve, reject) => {
878
1020
  execFile(
@@ -921,7 +1063,11 @@ export function inspectProcessesAsync(forceFresh = false): Promise<AsyncProcessI
921
1063
  }
922
1064
  if (!snapshot) {
923
1065
  const entries = parseTasklistOutput(
924
- await asyncProcessExec("tasklist", ["/FO", "CSV"], PS_PROBE_TIMEOUT_MS),
1066
+ await asyncProcessExec(
1067
+ "tasklist",
1068
+ ["/FO", "CSV", "/NH"],
1069
+ PS_PROBE_TIMEOUT_MS,
1070
+ ),
925
1071
  );
926
1072
  if (entries)
927
1073
  snapshot = snapshotFromFacts(
@@ -975,10 +1121,7 @@ export function inspectProcessesAsync(forceFresh = false): Promise<AsyncProcessI
975
1121
  ...(fresh && snapshot
976
1122
  ? { processSnapshot: { source: snapshot.source, facts: snapshot.facts } }
977
1123
  : {}),
978
- evidence: (pid: number) => ({
979
- startTime: byPid.get(pid)?.startTime ?? null,
980
- commandLine: byPid.get(pid)?.commandLine ?? byPid.get(pid)?.imageName ?? null,
981
- }),
1124
+ evidence: (pid: number) => snapshotEvidence(byPid.get(pid)),
982
1125
  liveness: (pid: number) => (byPid.has(pid) ? "alive" : fresh ? "dead" : "inconclusive"),
983
1126
  } satisfies AsyncProcessInspection;
984
1127
  })().finally(() => {
@@ -986,3 +1129,18 @@ export function inspectProcessesAsync(forceFresh = false): Promise<AsyncProcessI
986
1129
  });
987
1130
  return asyncInspection;
988
1131
  }
1132
+
1133
+ /** Take one fresh Windows process snapshot with command time limits for synchronous callers. */
1134
+ export function inspectWindowsProcessesSync(): AsyncProcessInspection {
1135
+ const snapshot =
1136
+ tryReadWindowsCimSnapshot(rpcProcessListExecFileSync) ?? tryReadWindowsTasklistSnapshot();
1137
+ const byPid = new Map(snapshot?.facts.map((fact) => [fact.pid, fact]));
1138
+ return {
1139
+ pi: snapshot ? classifyLivePiSnapshot(snapshot) : { state: "unreadable", processIds: [] },
1140
+ ...(snapshot
1141
+ ? { processSnapshot: { source: snapshot.source, facts: snapshot.facts } }
1142
+ : {}),
1143
+ evidence: (pid) => snapshotEvidence(byPid.get(pid)),
1144
+ liveness: (pid) => (byPid.has(pid) ? "alive" : snapshot ? "dead" : "inconclusive"),
1145
+ };
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(