@retaw106/mmc-oc 0.0.0-stage → 1.2.2

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 (1018) hide show
  1. package/dist/agents/historian.d.ts +4 -0
  2. package/dist/agents/historian.d.ts.map +1 -0
  3. package/dist/agents/language-directive.d.ts +26 -0
  4. package/dist/agents/language-directive.d.ts.map +1 -0
  5. package/dist/agents/magic-context-prompt.d.ts +5 -0
  6. package/dist/agents/magic-context-prompt.d.ts.map +1 -0
  7. package/dist/agents/memory-maintainer.d.ts +96 -0
  8. package/dist/agents/memory-maintainer.d.ts.map +1 -0
  9. package/dist/config/agent-disable.d.ts +29 -0
  10. package/dist/config/agent-disable.d.ts.map +1 -0
  11. package/dist/config/config-paths.d.ts +7 -0
  12. package/dist/config/config-paths.d.ts.map +1 -0
  13. package/dist/config/index.d.ts +69 -0
  14. package/dist/config/index.d.ts.map +1 -0
  15. package/dist/config/live-run-config.d.ts +11 -0
  16. package/dist/config/live-run-config.d.ts.map +1 -0
  17. package/dist/config/live-snapshot.d.ts +32 -0
  18. package/dist/config/live-snapshot.d.ts.map +1 -0
  19. package/dist/config/migrate-experimental.d.ts +26 -0
  20. package/dist/config/migrate-experimental.d.ts.map +1 -0
  21. package/dist/config/profiles.d.ts +22 -0
  22. package/dist/config/profiles.d.ts.map +1 -0
  23. package/dist/config/project-security.d.ts +124 -0
  24. package/dist/config/project-security.d.ts.map +1 -0
  25. package/dist/config/prune-config-leaf.d.ts +26 -0
  26. package/dist/config/prune-config-leaf.d.ts.map +1 -0
  27. package/dist/config/raw-loader.d.ts +42 -0
  28. package/dist/config/raw-loader.d.ts.map +1 -0
  29. package/dist/config/removed-agent-config.d.ts +8 -0
  30. package/dist/config/removed-agent-config.d.ts.map +1 -0
  31. package/dist/config/schema/agent-overrides.d.ts +52 -0
  32. package/dist/config/schema/agent-overrides.d.ts.map +1 -0
  33. package/dist/config/schema/magic-context.d.ts +805 -0
  34. package/dist/config/schema/magic-context.d.ts.map +1 -0
  35. package/dist/config/variable.d.ts +48 -0
  36. package/dist/config/variable.d.ts.map +1 -0
  37. package/dist/context-a6px04s0.js +23932 -0
  38. package/dist/derive-budgets-fhk00zv8.js +18 -0
  39. package/dist/features/magic-context/compaction-marker.d.ts +211 -0
  40. package/dist/features/magic-context/compaction-marker.d.ts.map +1 -0
  41. package/dist/features/magic-context/compaction.d.ts +7 -0
  42. package/dist/features/magic-context/compaction.d.ts.map +1 -0
  43. package/dist/features/magic-context/compartment-events.d.ts +50 -0
  44. package/dist/features/magic-context/compartment-events.d.ts.map +1 -0
  45. package/dist/features/magic-context/compartment-lease.d.ts +28 -0
  46. package/dist/features/magic-context/compartment-lease.d.ts.map +1 -0
  47. package/dist/features/magic-context/compartment-storage.d.ts +178 -0
  48. package/dist/features/magic-context/compartment-storage.d.ts.map +1 -0
  49. package/dist/features/magic-context/compression-depth-storage.d.ts +14 -0
  50. package/dist/features/magic-context/compression-depth-storage.d.ts.map +1 -0
  51. package/dist/features/magic-context/context-authority.d.ts +15 -0
  52. package/dist/features/magic-context/context-authority.d.ts.map +1 -0
  53. package/dist/features/magic-context/fail-closed-block.d.ts +117 -0
  54. package/dist/features/magic-context/fail-closed-block.d.ts.map +1 -0
  55. package/dist/features/magic-context/index.d.ts +10 -0
  56. package/dist/features/magic-context/index.d.ts.map +1 -0
  57. package/dist/features/magic-context/literal-probes.d.ts +24 -0
  58. package/dist/features/magic-context/literal-probes.d.ts.map +1 -0
  59. package/dist/features/magic-context/lkg-prefix-chunks.d.ts +53 -0
  60. package/dist/features/magic-context/lkg-prefix-chunks.d.ts.map +1 -0
  61. package/dist/features/magic-context/memory/constants.d.ts +16 -0
  62. package/dist/features/magic-context/memory/constants.d.ts.map +1 -0
  63. package/dist/features/magic-context/memory/index.d.ts +11 -0
  64. package/dist/features/magic-context/memory/index.d.ts.map +1 -0
  65. package/dist/features/magic-context/memory/memory-diagnostics.d.ts +6 -0
  66. package/dist/features/magic-context/memory/memory-diagnostics.d.ts.map +1 -0
  67. package/dist/features/magic-context/memory/memory-selection.d.ts +12 -0
  68. package/dist/features/magic-context/memory/memory-selection.d.ts.map +1 -0
  69. package/dist/features/magic-context/memory/memory-visibility.d.ts +46 -0
  70. package/dist/features/magic-context/memory/memory-visibility.d.ts.map +1 -0
  71. package/dist/features/magic-context/memory/normalize-hash.d.ts +3 -0
  72. package/dist/features/magic-context/memory/normalize-hash.d.ts.map +1 -0
  73. package/dist/features/magic-context/memory/project-identity-cache.d.ts +7 -0
  74. package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -0
  75. package/dist/features/magic-context/memory/project-identity.d.ts +97 -0
  76. package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -0
  77. package/dist/features/magic-context/memory/promotion.d.ts +26 -0
  78. package/dist/features/magic-context/memory/promotion.d.ts.map +1 -0
  79. package/dist/features/magic-context/memory/relocate-memory.d.ts +58 -0
  80. package/dist/features/magic-context/memory/relocate-memory.d.ts.map +1 -0
  81. package/dist/features/magic-context/memory/storage-memory-fts.d.ts +11 -0
  82. package/dist/features/magic-context/memory/storage-memory-fts.d.ts.map +1 -0
  83. package/dist/features/magic-context/memory/storage-memory-verifications.d.ts +35 -0
  84. package/dist/features/magic-context/memory/storage-memory-verifications.d.ts.map +1 -0
  85. package/dist/features/magic-context/memory/storage-memory.d.ts +89 -0
  86. package/dist/features/magic-context/memory/storage-memory.d.ts.map +1 -0
  87. package/dist/features/magic-context/memory/types.d.ts +59 -0
  88. package/dist/features/magic-context/memory/types.d.ts.map +1 -0
  89. package/dist/features/magic-context/memory/verification-paths.d.ts +48 -0
  90. package/dist/features/magic-context/memory/verification-paths.d.ts.map +1 -0
  91. package/dist/features/magic-context/memory/visibility.d.ts +6 -0
  92. package/dist/features/magic-context/memory/visibility.d.ts.map +1 -0
  93. package/dist/features/magic-context/memory-maintainer/apply.d.ts +65 -0
  94. package/dist/features/magic-context/memory-maintainer/apply.d.ts.map +1 -0
  95. package/dist/features/magic-context/memory-maintainer/budget.d.ts +75 -0
  96. package/dist/features/magic-context/memory-maintainer/budget.d.ts.map +1 -0
  97. package/dist/features/magic-context/memory-maintainer/coverage.d.ts +91 -0
  98. package/dist/features/magic-context/memory-maintainer/coverage.d.ts.map +1 -0
  99. package/dist/features/magic-context/memory-maintainer/dream-state.d.ts +18 -0
  100. package/dist/features/magic-context/memory-maintainer/dream-state.d.ts.map +1 -0
  101. package/dist/features/magic-context/memory-maintainer/launcher.d.ts +119 -0
  102. package/dist/features/magic-context/memory-maintainer/launcher.d.ts.map +1 -0
  103. package/dist/features/magic-context/memory-maintainer/lease.d.ts +56 -0
  104. package/dist/features/magic-context/memory-maintainer/lease.d.ts.map +1 -0
  105. package/dist/features/magic-context/memory-maintainer/manifest.d.ts +127 -0
  106. package/dist/features/magic-context/memory-maintainer/manifest.d.ts.map +1 -0
  107. package/dist/features/magic-context/memory-maintainer/manual-commands.d.ts +46 -0
  108. package/dist/features/magic-context/memory-maintainer/manual-commands.d.ts.map +1 -0
  109. package/dist/features/magic-context/memory-maintainer/oc2-adapter.d.ts +79 -0
  110. package/dist/features/magic-context/memory-maintainer/oc2-adapter.d.ts.map +1 -0
  111. package/dist/features/magic-context/memory-maintainer/pause-report.d.ts +37 -0
  112. package/dist/features/magic-context/memory-maintainer/pause-report.d.ts.map +1 -0
  113. package/dist/features/magic-context/memory-maintainer/pipeline.d.ts +199 -0
  114. package/dist/features/magic-context/memory-maintainer/pipeline.d.ts.map +1 -0
  115. package/dist/features/magic-context/memory-maintainer/provider-output-failure.d.ts +15 -0
  116. package/dist/features/magic-context/memory-maintainer/provider-output-failure.d.ts.map +1 -0
  117. package/dist/features/magic-context/memory-maintainer/schedule-storage.d.ts +76 -0
  118. package/dist/features/magic-context/memory-maintainer/schedule-storage.d.ts.map +1 -0
  119. package/dist/features/magic-context/memory-maintainer/schedule.d.ts +90 -0
  120. package/dist/features/magic-context/memory-maintainer/schedule.d.ts.map +1 -0
  121. package/dist/features/magic-context/merged-reasoning-decisions.d.ts +6 -0
  122. package/dist/features/magic-context/merged-reasoning-decisions.d.ts.map +1 -0
  123. package/dist/features/magic-context/message-fts-rowid-map.d.ts +50 -0
  124. package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -0
  125. package/dist/features/magic-context/message-fts-session-filter.d.ts +14 -0
  126. package/dist/features/magic-context/message-fts-session-filter.d.ts.map +1 -0
  127. package/dist/features/magic-context/message-index-async.d.ts +33 -0
  128. package/dist/features/magic-context/message-index-async.d.ts.map +1 -0
  129. package/dist/features/magic-context/message-index-sweep.d.ts +11 -0
  130. package/dist/features/magic-context/message-index-sweep.d.ts.map +1 -0
  131. package/dist/features/magic-context/message-index.d.ts +88 -0
  132. package/dist/features/magic-context/message-index.d.ts.map +1 -0
  133. package/dist/features/magic-context/message-time-backfill.d.ts +19 -0
  134. package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -0
  135. package/dist/features/magic-context/migration-v2-write-split.d.ts +62 -0
  136. package/dist/features/magic-context/migration-v2-write-split.d.ts.map +1 -0
  137. package/dist/features/magic-context/migrations.d.ts +73 -0
  138. package/dist/features/magic-context/migrations.d.ts.map +1 -0
  139. package/dist/features/magic-context/mock-database.d.ts +3 -0
  140. package/dist/features/magic-context/mock-database.d.ts.map +1 -0
  141. package/dist/features/magic-context/mural/storage-mural-cues.d.ts +65 -0
  142. package/dist/features/magic-context/mural/storage-mural-cues.d.ts.map +1 -0
  143. package/dist/features/magic-context/no-content-compartment.d.ts +12 -0
  144. package/dist/features/magic-context/no-content-compartment.d.ts.map +1 -0
  145. package/dist/features/magic-context/opencode2-relabel.d.ts +132 -0
  146. package/dist/features/magic-context/opencode2-relabel.d.ts.map +1 -0
  147. package/dist/features/magic-context/overflow-detection.d.ts +108 -0
  148. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -0
  149. package/dist/features/magic-context/pi-content-decisions.d.ts +9 -0
  150. package/dist/features/magic-context/pi-content-decisions.d.ts.map +1 -0
  151. package/dist/features/magic-context/project-identity.d.ts +2 -0
  152. package/dist/features/magic-context/project-identity.d.ts.map +1 -0
  153. package/dist/features/magic-context/protection-window.d.ts +79 -0
  154. package/dist/features/magic-context/protection-window.d.ts.map +1 -0
  155. package/dist/features/magic-context/range-parser.d.ts +18 -0
  156. package/dist/features/magic-context/range-parser.d.ts.map +1 -0
  157. package/dist/features/magic-context/reclaim-protection.d.ts +13 -0
  158. package/dist/features/magic-context/reclaim-protection.d.ts.map +1 -0
  159. package/dist/features/magic-context/resolve-subagent-fallback.d.ts +42 -0
  160. package/dist/features/magic-context/resolve-subagent-fallback.d.ts.map +1 -0
  161. package/dist/features/magic-context/scheduler.d.ts +20 -0
  162. package/dist/features/magic-context/scheduler.d.ts.map +1 -0
  163. package/dist/features/magic-context/schema-fence-probe.d.ts +29 -0
  164. package/dist/features/magic-context/schema-fence-probe.d.ts.map +1 -0
  165. package/dist/features/magic-context/search.d.ts +118 -0
  166. package/dist/features/magic-context/search.d.ts.map +1 -0
  167. package/dist/features/magic-context/session-cache-ttl.d.ts +10 -0
  168. package/dist/features/magic-context/session-cache-ttl.d.ts.map +1 -0
  169. package/dist/features/magic-context/session-decision-calibration.d.ts +31 -0
  170. package/dist/features/magic-context/session-decision-calibration.d.ts.map +1 -0
  171. package/dist/features/magic-context/session-project-backfill.d.ts +37 -0
  172. package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -0
  173. package/dist/features/magic-context/session-project-storage.d.ts +23 -0
  174. package/dist/features/magic-context/session-project-storage.d.ts.map +1 -0
  175. package/dist/features/magic-context/storage-caveman-rules.d.ts +21 -0
  176. package/dist/features/magic-context/storage-caveman-rules.d.ts.map +1 -0
  177. package/dist/features/magic-context/storage-clone.d.ts +44 -0
  178. package/dist/features/magic-context/storage-clone.d.ts.map +1 -0
  179. package/dist/features/magic-context/storage-db.d.ts +183 -0
  180. package/dist/features/magic-context/storage-db.d.ts.map +1 -0
  181. package/dist/features/magic-context/storage-historian-runs.d.ts +79 -0
  182. package/dist/features/magic-context/storage-historian-runs.d.ts.map +1 -0
  183. package/dist/features/magic-context/storage-identity-merge.d.ts +26 -0
  184. package/dist/features/magic-context/storage-identity-merge.d.ts.map +1 -0
  185. package/dist/features/magic-context/storage-identity-rekey-map.d.ts +11 -0
  186. package/dist/features/magic-context/storage-identity-rekey-map.d.ts.map +1 -0
  187. package/dist/features/magic-context/storage-m0-mutation-log.d.ts +22 -0
  188. package/dist/features/magic-context/storage-m0-mutation-log.d.ts.map +1 -0
  189. package/dist/features/magic-context/storage-memory-mutation-log.d.ts +29 -0
  190. package/dist/features/magic-context/storage-memory-mutation-log.d.ts.map +1 -0
  191. package/dist/features/magic-context/storage-meta-persisted.d.ts +623 -0
  192. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -0
  193. package/dist/features/magic-context/storage-meta-session.d.ts +14 -0
  194. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -0
  195. package/dist/features/magic-context/storage-meta-shared.d.ts +102 -0
  196. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -0
  197. package/dist/features/magic-context/storage-meta.d.ts +4 -0
  198. package/dist/features/magic-context/storage-meta.d.ts.map +1 -0
  199. package/dist/features/magic-context/storage-native-replay.d.ts +29 -0
  200. package/dist/features/magic-context/storage-native-replay.d.ts.map +1 -0
  201. package/dist/features/magic-context/storage-notes.d.ts +80 -0
  202. package/dist/features/magic-context/storage-notes.d.ts.map +1 -0
  203. package/dist/features/magic-context/storage-ops.d.ts +14 -0
  204. package/dist/features/magic-context/storage-ops.d.ts.map +1 -0
  205. package/dist/features/magic-context/storage-primers.d.ts +96 -0
  206. package/dist/features/magic-context/storage-primers.d.ts.map +1 -0
  207. package/dist/features/magic-context/storage-project-state.d.ts +19 -0
  208. package/dist/features/magic-context/storage-project-state.d.ts.map +1 -0
  209. package/dist/features/magic-context/storage-reasoning-removal.d.ts +30 -0
  210. package/dist/features/magic-context/storage-reasoning-removal.d.ts.map +1 -0
  211. package/dist/features/magic-context/storage-replay-document.d.ts +72 -0
  212. package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -0
  213. package/dist/features/magic-context/storage-schema-helpers.d.ts +31 -0
  214. package/dist/features/magic-context/storage-schema-helpers.d.ts.map +1 -0
  215. package/dist/features/magic-context/storage-session-tables.d.ts +18 -0
  216. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -0
  217. package/dist/features/magic-context/storage-source.d.ts +5 -0
  218. package/dist/features/magic-context/storage-source.d.ts.map +1 -0
  219. package/dist/features/magic-context/storage-subagent-invocations.d.ts +62 -0
  220. package/dist/features/magic-context/storage-subagent-invocations.d.ts.map +1 -0
  221. package/dist/features/magic-context/storage-tags.d.ts +542 -0
  222. package/dist/features/magic-context/storage-tags.d.ts.map +1 -0
  223. package/dist/features/magic-context/storage-unavailable-reason.d.ts +17 -0
  224. package/dist/features/magic-context/storage-unavailable-reason.d.ts.map +1 -0
  225. package/dist/features/magic-context/storage-v22-backfill-failures.d.ts +26 -0
  226. package/dist/features/magic-context/storage-v22-backfill-failures.d.ts.map +1 -0
  227. package/dist/features/magic-context/storage.d.ts +23 -0
  228. package/dist/features/magic-context/storage.d.ts.map +1 -0
  229. package/dist/features/magic-context/store-generation-rebase.d.ts +188 -0
  230. package/dist/features/magic-context/store-generation-rebase.d.ts.map +1 -0
  231. package/dist/features/magic-context/subagent-token-capture.d.ts +35 -0
  232. package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -0
  233. package/dist/features/magic-context/tag-input.d.ts +4 -0
  234. package/dist/features/magic-context/tag-input.d.ts.map +1 -0
  235. package/dist/features/magic-context/tagger.d.ts +119 -0
  236. package/dist/features/magic-context/tagger.d.ts.map +1 -0
  237. package/dist/features/magic-context/tool-definition-tokens.d.ts +90 -0
  238. package/dist/features/magic-context/tool-definition-tokens.d.ts.map +1 -0
  239. package/dist/features/magic-context/tool-owner-backfill.d.ts +93 -0
  240. package/dist/features/magic-context/tool-owner-backfill.d.ts.map +1 -0
  241. package/dist/features/magic-context/transform-decision-log.d.ts +110 -0
  242. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -0
  243. package/dist/features/magic-context/types.d.ts +133 -0
  244. package/dist/features/magic-context/types.d.ts.map +1 -0
  245. package/dist/features/magic-context/window-report-ledger.d.ts +70 -0
  246. package/dist/features/magic-context/window-report-ledger.d.ts.map +1 -0
  247. package/dist/features/magic-context/work-metrics.d.ts +79 -0
  248. package/dist/features/magic-context/work-metrics.d.ts.map +1 -0
  249. package/dist/features/magic-context/workspaces.d.ts +28 -0
  250. package/dist/features/magic-context/workspaces.d.ts.map +1 -0
  251. package/dist/hooks/auto-update-checker/semver.d.ts +26 -0
  252. package/dist/hooks/auto-update-checker/semver.d.ts.map +1 -0
  253. package/dist/hooks/magic-context/apply-operations.d.ts +158 -0
  254. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -0
  255. package/dist/hooks/magic-context/auto-search-deadline.d.ts +10 -0
  256. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -0
  257. package/dist/hooks/magic-context/auto-search-hint.d.ts +36 -0
  258. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -0
  259. package/dist/hooks/magic-context/auto-search-runner.d.ts +60 -0
  260. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -0
  261. package/dist/hooks/magic-context/cache-busting-signals.d.ts +42 -0
  262. package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -0
  263. package/dist/hooks/magic-context/caveman-cleanup.d.ts +98 -0
  264. package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -0
  265. package/dist/hooks/magic-context/caveman.d.ts +90 -0
  266. package/dist/hooks/magic-context/caveman.d.ts.map +1 -0
  267. package/dist/hooks/magic-context/channel2-cycle.d.ts +16 -0
  268. package/dist/hooks/magic-context/channel2-cycle.d.ts.map +1 -0
  269. package/dist/hooks/magic-context/channel2-delivery.d.ts +32 -0
  270. package/dist/hooks/magic-context/channel2-delivery.d.ts.map +1 -0
  271. package/dist/hooks/magic-context/child-session-spawn.d.ts +27 -0
  272. package/dist/hooks/magic-context/child-session-spawn.d.ts.map +1 -0
  273. package/dist/hooks/magic-context/compaction-marker-manager.d.ts +154 -0
  274. package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -0
  275. package/dist/hooks/magic-context/compaction-off-transition.d.ts +97 -0
  276. package/dist/hooks/magic-context/compaction-off-transition.d.ts.map +1 -0
  277. package/dist/hooks/magic-context/compartment-parser.d.ts +66 -0
  278. package/dist/hooks/magic-context/compartment-parser.d.ts.map +1 -0
  279. package/dist/hooks/magic-context/compartment-prompt.d.ts +33 -0
  280. package/dist/hooks/magic-context/compartment-prompt.d.ts.map +1 -0
  281. package/dist/hooks/magic-context/compartment-render-epoch.d.ts +27 -0
  282. package/dist/hooks/magic-context/compartment-render-epoch.d.ts.map +1 -0
  283. package/dist/hooks/magic-context/compartment-runner-drop-queue.d.ts +29 -0
  284. package/dist/hooks/magic-context/compartment-runner-drop-queue.d.ts.map +1 -0
  285. package/dist/hooks/magic-context/compartment-runner-historian.d.ts +43 -0
  286. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -0
  287. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +31 -0
  288. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -0
  289. package/dist/hooks/magic-context/compartment-runner-mapping.d.ts +25 -0
  290. package/dist/hooks/magic-context/compartment-runner-mapping.d.ts.map +1 -0
  291. package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts +29 -0
  292. package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -0
  293. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts +11 -0
  294. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -0
  295. package/dist/hooks/magic-context/compartment-runner-types.d.ts +295 -0
  296. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -0
  297. package/dist/hooks/magic-context/compartment-runner-validation.d.ts +83 -0
  298. package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -0
  299. package/dist/hooks/magic-context/compartment-runner.d.ts +59 -0
  300. package/dist/hooks/magic-context/compartment-runner.d.ts.map +1 -0
  301. package/dist/hooks/magic-context/compartment-trigger.d.ts +77 -0
  302. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -0
  303. package/dist/hooks/magic-context/ctx-reduce-availability.d.ts +170 -0
  304. package/dist/hooks/magic-context/ctx-reduce-availability.d.ts.map +1 -0
  305. package/dist/hooks/magic-context/ctx-reduce-nudge.d.ts +104 -0
  306. package/dist/hooks/magic-context/ctx-reduce-nudge.d.ts.map +1 -0
  307. package/dist/hooks/magic-context/decay-curve.d.ts +84 -0
  308. package/dist/hooks/magic-context/decay-curve.d.ts.map +1 -0
  309. package/dist/hooks/magic-context/decay-render.d.ts +80 -0
  310. package/dist/hooks/magic-context/decay-render.d.ts.map +1 -0
  311. package/dist/hooks/magic-context/decision-calibration.d.ts +24 -0
  312. package/dist/hooks/magic-context/decision-calibration.d.ts.map +1 -0
  313. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +35 -0
  314. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -0
  315. package/dist/hooks/magic-context/derive-budgets.d.ts +60 -0
  316. package/dist/hooks/magic-context/derive-budgets.d.ts.map +1 -0
  317. package/dist/hooks/magic-context/drop-stale-reduce-calls.d.ts +39 -0
  318. package/dist/hooks/magic-context/drop-stale-reduce-calls.d.ts.map +1 -0
  319. package/dist/hooks/magic-context/dropped-input-guard.d.ts +55 -0
  320. package/dist/hooks/magic-context/dropped-input-guard.d.ts.map +1 -0
  321. package/dist/hooks/magic-context/dropped-token-estimate.d.ts +20 -0
  322. package/dist/hooks/magic-context/dropped-token-estimate.d.ts.map +1 -0
  323. package/dist/hooks/magic-context/edit-marker.d.ts +11 -0
  324. package/dist/hooks/magic-context/edit-marker.d.ts.map +1 -0
  325. package/dist/hooks/magic-context/emergency-drop.d.ts +112 -0
  326. package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -0
  327. package/dist/hooks/magic-context/emergency-fail-closed.d.ts +14 -0
  328. package/dist/hooks/magic-context/emergency-fail-closed.d.ts.map +1 -0
  329. package/dist/hooks/magic-context/empty-task-output.d.ts +16 -0
  330. package/dist/hooks/magic-context/empty-task-output.d.ts.map +1 -0
  331. package/dist/hooks/magic-context/event-payloads.d.ts +73 -0
  332. package/dist/hooks/magic-context/event-payloads.d.ts.map +1 -0
  333. package/dist/hooks/magic-context/event-resolvers.d.ts +114 -0
  334. package/dist/hooks/magic-context/event-resolvers.d.ts.map +1 -0
  335. package/dist/hooks/magic-context/execute-flush.d.ts +3 -0
  336. package/dist/hooks/magic-context/execute-flush.d.ts.map +1 -0
  337. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +56 -0
  338. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -0
  339. package/dist/hooks/magic-context/fold-execution-gate.d.ts +2 -0
  340. package/dist/hooks/magic-context/fold-execution-gate.d.ts.map +1 -0
  341. package/dist/hooks/magic-context/format-bytes.d.ts +2 -0
  342. package/dist/hooks/magic-context/format-bytes.d.ts.map +1 -0
  343. package/dist/hooks/magic-context/heuristic-cleanup.d.ts +48 -0
  344. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -0
  345. package/dist/hooks/magic-context/historian-no-fire-cause.d.ts +5 -0
  346. package/dist/hooks/magic-context/historian-no-fire-cause.d.ts.map +1 -0
  347. package/dist/hooks/magic-context/historian-prompt-fit.d.ts +112 -0
  348. package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -0
  349. package/dist/hooks/magic-context/historian-prompt.generated.d.ts +2 -0
  350. package/dist/hooks/magic-context/historian-prompt.generated.d.ts.map +1 -0
  351. package/dist/hooks/magic-context/historian-publish-stage-logger.d.ts +3 -0
  352. package/dist/hooks/magic-context/historian-publish-stage-logger.d.ts.map +1 -0
  353. package/dist/hooks/magic-context/historian-state-file.d.ts +43 -0
  354. package/dist/hooks/magic-context/historian-state-file.d.ts.map +1 -0
  355. package/dist/hooks/magic-context/history-boundary-repair.d.ts +44 -0
  356. package/dist/hooks/magic-context/history-boundary-repair.d.ts.map +1 -0
  357. package/dist/hooks/magic-context/hook-handlers.d.ts +177 -0
  358. package/dist/hooks/magic-context/hook-handlers.d.ts.map +1 -0
  359. package/dist/hooks/magic-context/host-served-rows.d.ts +58 -0
  360. package/dist/hooks/magic-context/host-served-rows.d.ts.map +1 -0
  361. package/dist/hooks/magic-context/image-token-estimate.d.ts +15 -0
  362. package/dist/hooks/magic-context/image-token-estimate.d.ts.map +1 -0
  363. package/dist/hooks/magic-context/inject-compartments.d.ts +389 -0
  364. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -0
  365. package/dist/hooks/magic-context/issue-135-wire-fixtures.d.ts +8 -0
  366. package/dist/hooks/magic-context/issue-135-wire-fixtures.d.ts.map +1 -0
  367. package/dist/hooks/magic-context/issue-423-fixture.d.ts +37 -0
  368. package/dist/hooks/magic-context/issue-423-fixture.d.ts.map +1 -0
  369. package/dist/hooks/magic-context/issue-424-fixture.d.ts +11 -0
  370. package/dist/hooks/magic-context/issue-424-fixture.d.ts.map +1 -0
  371. package/dist/hooks/magic-context/legacy-compartments.d.ts +20 -0
  372. package/dist/hooks/magic-context/legacy-compartments.d.ts.map +1 -0
  373. package/dist/hooks/magic-context/live-session-state.d.ts +68 -0
  374. package/dist/hooks/magic-context/live-session-state.d.ts.map +1 -0
  375. package/dist/hooks/magic-context/lkg-persist.d.ts +22 -0
  376. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -0
  377. package/dist/hooks/magic-context/lkg-replay.d.ts +71 -0
  378. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -0
  379. package/dist/hooks/magic-context/lkg-slot.d.ts +119 -0
  380. package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -0
  381. package/dist/hooks/magic-context/m0-token-breakdown.d.ts +44 -0
  382. package/dist/hooks/magic-context/m0-token-breakdown.d.ts.map +1 -0
  383. package/dist/hooks/magic-context/maintenance-authority.d.ts +2 -0
  384. package/dist/hooks/magic-context/maintenance-authority.d.ts.map +1 -0
  385. package/dist/hooks/magic-context/openai-compat-adjacency.d.ts +38 -0
  386. package/dist/hooks/magic-context/openai-compat-adjacency.d.ts.map +1 -0
  387. package/dist/hooks/magic-context/opencode-v1-store-fixture.d.ts +12 -0
  388. package/dist/hooks/magic-context/opencode-v1-store-fixture.d.ts.map +1 -0
  389. package/dist/hooks/magic-context/pass-outcome.d.ts +70 -0
  390. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -0
  391. package/dist/hooks/magic-context/persist-filtered-noise.d.ts +5 -0
  392. package/dist/hooks/magic-context/persist-filtered-noise.d.ts.map +1 -0
  393. package/dist/hooks/magic-context/postprocess-read-cache.d.ts +8 -0
  394. package/dist/hooks/magic-context/postprocess-read-cache.d.ts.map +1 -0
  395. package/dist/hooks/magic-context/producer-window-guard.d.ts +63 -0
  396. package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -0
  397. package/dist/hooks/magic-context/producer-window-test-support.d.ts +14 -0
  398. package/dist/hooks/magic-context/producer-window-test-support.d.ts.map +1 -0
  399. package/dist/hooks/magic-context/protected-tail-boundary.d.ts +234 -0
  400. package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -0
  401. package/dist/hooks/magic-context/raw-fallback-context-limit.d.ts +10 -0
  402. package/dist/hooks/magic-context/raw-fallback-context-limit.d.ts.map +1 -0
  403. package/dist/hooks/magic-context/read-session-chunk.d.ts +271 -0
  404. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -0
  405. package/dist/hooks/magic-context/read-session-db.d.ts +66 -0
  406. package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -0
  407. package/dist/hooks/magic-context/read-session-formatting.d.ts +65 -0
  408. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -0
  409. package/dist/hooks/magic-context/read-session-raw.d.ts +164 -0
  410. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -0
  411. package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts +82 -0
  412. package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts.map +1 -0
  413. package/dist/hooks/magic-context/reasoning-removal.d.ts +60 -0
  414. package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -0
  415. package/dist/hooks/magic-context/recomp-orchestrator.d.ts +93 -0
  416. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -0
  417. package/dist/hooks/magic-context/reference-retrieval.d.ts +72 -0
  418. package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -0
  419. package/dist/hooks/magic-context/reference-seeds.generated.d.ts +8 -0
  420. package/dist/hooks/magic-context/reference-seeds.generated.d.ts.map +1 -0
  421. package/dist/hooks/magic-context/send-session-notification.d.ts +43 -0
  422. package/dist/hooks/magic-context/send-session-notification.d.ts.map +1 -0
  423. package/dist/hooks/magic-context/sentinel.d.ts +146 -0
  424. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -0
  425. package/dist/hooks/magic-context/storage-busy-refusal.d.ts +20 -0
  426. package/dist/hooks/magic-context/storage-busy-refusal.d.ts.map +1 -0
  427. package/dist/hooks/magic-context/strip-content.d.ts +216 -0
  428. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -0
  429. package/dist/hooks/magic-context/strip-structural-noise.d.ts +15 -0
  430. package/dist/hooks/magic-context/strip-structural-noise.d.ts.map +1 -0
  431. package/dist/hooks/magic-context/stripped-command.d.ts +56 -0
  432. package/dist/hooks/magic-context/stripped-command.d.ts.map +1 -0
  433. package/dist/hooks/magic-context/supersession-reclaim.d.ts +58 -0
  434. package/dist/hooks/magic-context/supersession-reclaim.d.ts.map +1 -0
  435. package/dist/hooks/magic-context/system-injection-stripper.d.ts +2 -0
  436. package/dist/hooks/magic-context/system-injection-stripper.d.ts.map +1 -0
  437. package/dist/hooks/magic-context/system-prompt-hash.d.ts +129 -0
  438. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -0
  439. package/dist/hooks/magic-context/tag-content-primitives.d.ts +31 -0
  440. package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -0
  441. package/dist/hooks/magic-context/tag-id-fallback.d.ts +11 -0
  442. package/dist/hooks/magic-context/tag-id-fallback.d.ts.map +1 -0
  443. package/dist/hooks/magic-context/tag-messages.d.ts +145 -0
  444. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -0
  445. package/dist/hooks/magic-context/tag-part-guards.d.ts +23 -0
  446. package/dist/hooks/magic-context/tag-part-guards.d.ts.map +1 -0
  447. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts +178 -0
  448. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -0
  449. package/dist/hooks/magic-context/temporal-awareness.d.ts +73 -0
  450. package/dist/hooks/magic-context/temporal-awareness.d.ts.map +1 -0
  451. package/dist/hooks/magic-context/text-complete.d.ts +31 -0
  452. package/dist/hooks/magic-context/text-complete.d.ts.map +1 -0
  453. package/dist/hooks/magic-context/todo-view.d.ts +127 -0
  454. package/dist/hooks/magic-context/todo-view.d.ts.map +1 -0
  455. package/dist/hooks/magic-context/tokenizer-calibration.d.ts +92 -0
  456. package/dist/hooks/magic-context/tokenizer-calibration.d.ts.map +1 -0
  457. package/dist/hooks/magic-context/tool-drop-target.d.ts +144 -0
  458. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -0
  459. package/dist/hooks/magic-context/tool-input-size.d.ts +21 -0
  460. package/dist/hooks/magic-context/tool-input-size.d.ts.map +1 -0
  461. package/dist/hooks/magic-context/tool-reclaim.d.ts +12 -0
  462. package/dist/hooks/magic-context/tool-reclaim.d.ts.map +1 -0
  463. package/dist/hooks/magic-context/tool-sweep-policy.d.ts +50 -0
  464. package/dist/hooks/magic-context/tool-sweep-policy.d.ts.map +1 -0
  465. package/dist/hooks/magic-context/transform-compartment-phase.d.ts +133 -0
  466. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -0
  467. package/dist/hooks/magic-context/transform-context-state.d.ts +28 -0
  468. package/dist/hooks/magic-context/transform-context-state.d.ts.map +1 -0
  469. package/dist/hooks/magic-context/transform-message-helpers.d.ts +32 -0
  470. package/dist/hooks/magic-context/transform-message-helpers.d.ts.map +1 -0
  471. package/dist/hooks/magic-context/transform-operations.d.ts +5 -0
  472. package/dist/hooks/magic-context/transform-operations.d.ts.map +1 -0
  473. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +350 -0
  474. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -0
  475. package/dist/hooks/magic-context/transform-stage-logger.d.ts +2 -0
  476. package/dist/hooks/magic-context/transform-stage-logger.d.ts.map +1 -0
  477. package/dist/hooks/magic-context/transform.d.ts +334 -0
  478. package/dist/hooks/magic-context/transform.d.ts.map +1 -0
  479. package/dist/hooks/magic-context/unmanaged-over-window.d.ts +36 -0
  480. package/dist/hooks/magic-context/unmanaged-over-window.d.ts.map +1 -0
  481. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts +15 -0
  482. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts.map +1 -0
  483. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts +14 -0
  484. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -0
  485. package/dist/index-1vs6anwz.js +126 -0
  486. package/dist/index-3wagyrnj.js +670 -0
  487. package/dist/index-53g38ggt.js +40 -0
  488. package/dist/index-5pg0acf7.js +410 -0
  489. package/dist/index-977gxfz0.js +514 -0
  490. package/dist/index-by6h2pav.js +27883 -0
  491. package/dist/index-e1q8002h.js +16 -0
  492. package/dist/index-fg34g6a5.js +584 -0
  493. package/dist/index-jdxxq8cz.js +99 -0
  494. package/dist/index-me3zcj5t.js +69 -0
  495. package/dist/index-qbkzdkk0.js +496 -0
  496. package/dist/index-wgt4gamw.js +6388 -0
  497. package/dist/index-zx63j2e2.js +907 -0
  498. package/dist/index.d.ts +7 -0
  499. package/dist/index.d.ts.map +1 -0
  500. package/dist/index.js +37 -0
  501. package/dist/message-time-backfill-5ewk0axe.js +116 -0
  502. package/dist/model-resolution-5haaxnpt.js +6 -0
  503. package/dist/plugin/boot-deadline.d.ts +47 -0
  504. package/dist/plugin/boot-deadline.d.ts.map +1 -0
  505. package/dist/plugin/boot-quiet.d.ts +12 -0
  506. package/dist/plugin/boot-quiet.d.ts.map +1 -0
  507. package/dist/plugin/normalize-tool-arg-schemas.d.ts +7 -0
  508. package/dist/plugin/normalize-tool-arg-schemas.d.ts.map +1 -0
  509. package/dist/plugin/rpc-handlers.d.ts +52 -0
  510. package/dist/plugin/rpc-handlers.d.ts.map +1 -0
  511. package/dist/plugin/sidebar-snapshot-cache.d.ts +19 -0
  512. package/dist/plugin/sidebar-snapshot-cache.d.ts.map +1 -0
  513. package/dist/plugin/subagent-tool-policy.d.ts +9 -0
  514. package/dist/plugin/subagent-tool-policy.d.ts.map +1 -0
  515. package/dist/plugin/types.d.ts +3 -0
  516. package/dist/plugin/types.d.ts.map +1 -0
  517. package/dist/prompt-context-ffa5xcfx.js +76 -0
  518. package/dist/read-session-chunk-apjwrttc.js +56 -0
  519. package/dist/recomp-orchestrator-gyeevxaw.js +21 -0
  520. package/dist/rpc-notifications-4amf6mf4.js +14 -0
  521. package/dist/safe-notification-target-ph3xd1ve.js +9 -0
  522. package/dist/send-session-notification-y29y9fsr.js +18 -0
  523. package/dist/shared/announcement.d.ts +69 -0
  524. package/dist/shared/announcement.d.ts.map +1 -0
  525. package/dist/shared/assistant-message-extractor.d.ts +13 -0
  526. package/dist/shared/assistant-message-extractor.d.ts.map +1 -0
  527. package/dist/shared/auto-update-provenance.d.ts +9 -0
  528. package/dist/shared/auto-update-provenance.d.ts.map +1 -0
  529. package/dist/shared/bounded-session-map.d.ts +45 -0
  530. package/dist/shared/bounded-session-map.d.ts.map +1 -0
  531. package/dist/shared/builtin-commands.d.ts +24 -0
  532. package/dist/shared/builtin-commands.d.ts.map +1 -0
  533. package/dist/shared/cache-ttl-display.d.ts +25 -0
  534. package/dist/shared/cache-ttl-display.d.ts.map +1 -0
  535. package/dist/shared/cache-ttl-seed.d.ts +10 -0
  536. package/dist/shared/cache-ttl-seed.d.ts.map +1 -0
  537. package/dist/shared/child-session-teardown.d.ts +34 -0
  538. package/dist/shared/child-session-teardown.d.ts.map +1 -0
  539. package/dist/shared/commit-detection.d.ts +29 -0
  540. package/dist/shared/commit-detection.d.ts.map +1 -0
  541. package/dist/shared/config-diagnostics.d.ts +30 -0
  542. package/dist/shared/config-diagnostics.d.ts.map +1 -0
  543. package/dist/shared/conflict-detector.d.ts +139 -0
  544. package/dist/shared/conflict-detector.d.ts.map +1 -0
  545. package/dist/shared/conflict-fixer.d.ts +20 -0
  546. package/dist/shared/conflict-fixer.d.ts.map +1 -0
  547. package/dist/shared/context-limit-provenance.d.ts +3 -0
  548. package/dist/shared/context-limit-provenance.d.ts.map +1 -0
  549. package/dist/shared/data-path.d.ts +176 -0
  550. package/dist/shared/data-path.d.ts.map +1 -0
  551. package/dist/shared/error-message.d.ts +32 -0
  552. package/dist/shared/error-message.d.ts.map +1 -0
  553. package/dist/shared/escalation-bands.d.ts +9 -0
  554. package/dist/shared/escalation-bands.d.ts.map +1 -0
  555. package/dist/shared/format-bytes.d.ts +2 -0
  556. package/dist/shared/format-bytes.d.ts.map +1 -0
  557. package/dist/shared/format-threshold.d.ts +43 -0
  558. package/dist/shared/format-threshold.d.ts.map +1 -0
  559. package/dist/shared/harness-provider-map.d.ts +64 -0
  560. package/dist/shared/harness-provider-map.d.ts.map +1 -0
  561. package/dist/shared/harness.d.ts +55 -0
  562. package/dist/shared/harness.d.ts.map +1 -0
  563. package/dist/shared/hidden-variant-warnings.d.ts +5 -0
  564. package/dist/shared/hidden-variant-warnings.d.ts.map +1 -0
  565. package/dist/shared/historian-tool-expansions.d.ts +5 -0
  566. package/dist/shared/historian-tool-expansions.d.ts.map +1 -0
  567. package/dist/shared/historian-tool-template.d.ts +5 -0
  568. package/dist/shared/historian-tool-template.d.ts.map +1 -0
  569. package/dist/shared/historian-transient-error.d.ts +2 -0
  570. package/dist/shared/historian-transient-error.d.ts.map +1 -0
  571. package/dist/shared/host-limitations.d.ts +14 -0
  572. package/dist/shared/host-limitations.d.ts.map +1 -0
  573. package/dist/shared/index.d.ts +8 -0
  574. package/dist/shared/index.d.ts.map +1 -0
  575. package/dist/shared/internal-initiator-marker.d.ts +2 -0
  576. package/dist/shared/internal-initiator-marker.d.ts.map +1 -0
  577. package/dist/shared/jsonc-edit.d.ts +23 -0
  578. package/dist/shared/jsonc-edit.d.ts.map +1 -0
  579. package/dist/shared/jsonc-parser.d.ts +30 -0
  580. package/dist/shared/jsonc-parser.d.ts.map +1 -0
  581. package/dist/shared/keep-subagents.d.ts +7 -0
  582. package/dist/shared/keep-subagents.d.ts.map +1 -0
  583. package/dist/shared/logger.d.ts +18 -0
  584. package/dist/shared/logger.d.ts.map +1 -0
  585. package/dist/shared/model-cache-ttl.d.ts +9 -0
  586. package/dist/shared/model-cache-ttl.d.ts.map +1 -0
  587. package/dist/shared/model-resolution.d.ts +35 -0
  588. package/dist/shared/model-resolution.d.ts.map +1 -0
  589. package/dist/shared/model-suggestion-retry.d.ts +138 -0
  590. package/dist/shared/model-suggestion-retry.d.ts.map +1 -0
  591. package/dist/shared/models-dev-cache.d.ts +156 -0
  592. package/dist/shared/models-dev-cache.d.ts.map +1 -0
  593. package/dist/shared/normalize-sdk-response.d.ts +5 -0
  594. package/dist/shared/normalize-sdk-response.d.ts.map +1 -0
  595. package/dist/shared/opencode-config-dir-types.d.ts +14 -0
  596. package/dist/shared/opencode-config-dir-types.d.ts.map +1 -0
  597. package/dist/shared/opencode-config-dir.d.ts +57 -0
  598. package/dist/shared/opencode-config-dir.d.ts.map +1 -0
  599. package/dist/shared/opencode-db-path.d.ts +68 -0
  600. package/dist/shared/opencode-db-path.d.ts.map +1 -0
  601. package/dist/shared/pi-executable.d.ts +6 -0
  602. package/dist/shared/pi-executable.d.ts.map +1 -0
  603. package/dist/shared/plugin-package-version.d.ts +14 -0
  604. package/dist/shared/plugin-package-version.d.ts.map +1 -0
  605. package/dist/shared/project-directory-key.d.ts +26 -0
  606. package/dist/shared/project-directory-key.d.ts.map +1 -0
  607. package/dist/shared/prompt-context.d.ts +31 -0
  608. package/dist/shared/prompt-context.d.ts.map +1 -0
  609. package/dist/shared/prompt-surface-a1-golden.d.ts +28 -0
  610. package/dist/shared/prompt-surface-a1-golden.d.ts.map +1 -0
  611. package/dist/shared/prompt-surface-runtime.d.ts +62 -0
  612. package/dist/shared/prompt-surface-runtime.d.ts.map +1 -0
  613. package/dist/shared/prompt-surface.d.ts +53 -0
  614. package/dist/shared/prompt-surface.d.ts.map +1 -0
  615. package/dist/shared/provider-response-completion.d.ts +12 -0
  616. package/dist/shared/provider-response-completion.d.ts.map +1 -0
  617. package/dist/shared/record-type-guard.d.ts +2 -0
  618. package/dist/shared/record-type-guard.d.ts.map +1 -0
  619. package/dist/shared/redaction.d.ts +7 -0
  620. package/dist/shared/redaction.d.ts.map +1 -0
  621. package/dist/shared/resolve-fallbacks.d.ts +48 -0
  622. package/dist/shared/resolve-fallbacks.d.ts.map +1 -0
  623. package/dist/shared/rpc-client.d.ts +28 -0
  624. package/dist/shared/rpc-client.d.ts.map +1 -0
  625. package/dist/shared/rpc-notifications.d.ts +74 -0
  626. package/dist/shared/rpc-notifications.d.ts.map +1 -0
  627. package/dist/shared/rpc-server.d.ts +52 -0
  628. package/dist/shared/rpc-server.d.ts.map +1 -0
  629. package/dist/shared/rpc-types.d.ts +385 -0
  630. package/dist/shared/rpc-types.d.ts.map +1 -0
  631. package/dist/shared/rpc-utils.d.ts +162 -0
  632. package/dist/shared/rpc-utils.d.ts.map +1 -0
  633. package/dist/shared/run-token-log.d.ts +13 -0
  634. package/dist/shared/run-token-log.d.ts.map +1 -0
  635. package/dist/shared/safe-notification-target.d.ts +23 -0
  636. package/dist/shared/safe-notification-target.d.ts.map +1 -0
  637. package/dist/shared/sqlite-context-pragmas.d.ts +12 -0
  638. package/dist/shared/sqlite-context-pragmas.d.ts.map +1 -0
  639. package/dist/shared/sqlite-helpers.d.ts +25 -0
  640. package/dist/shared/sqlite-helpers.d.ts.map +1 -0
  641. package/dist/shared/sqlite-write-locker-test-support.d.ts +7 -0
  642. package/dist/shared/sqlite-write-locker-test-support.d.ts.map +1 -0
  643. package/dist/shared/sqlite.d.ts +163 -0
  644. package/dist/shared/sqlite.d.ts.map +1 -0
  645. package/dist/shared/stable-json.d.ts +21 -0
  646. package/dist/shared/stable-json.d.ts.map +1 -0
  647. package/dist/shared/status-detail-text.d.ts +4 -0
  648. package/dist/shared/status-detail-text.d.ts.map +1 -0
  649. package/dist/shared/status-summary.d.ts +54 -0
  650. package/dist/shared/status-summary.d.ts.map +1 -0
  651. package/dist/shared/status-view-check.d.ts +130 -0
  652. package/dist/shared/status-view-check.d.ts.map +1 -0
  653. package/dist/shared/status-view.d.ts +230 -0
  654. package/dist/shared/status-view.d.ts.map +1 -0
  655. package/dist/shared/storage-permissions.d.ts +29 -0
  656. package/dist/shared/storage-permissions.d.ts.map +1 -0
  657. package/dist/shared/subagent-runner.d.ts +231 -0
  658. package/dist/shared/subagent-runner.d.ts.map +1 -0
  659. package/dist/shared/summarize-child-stderr.d.ts +2 -0
  660. package/dist/shared/summarize-child-stderr.d.ts.map +1 -0
  661. package/dist/shared/system-directive.d.ts +3 -0
  662. package/dist/shared/system-directive.d.ts.map +1 -0
  663. package/dist/shared/tag-owner-id.d.ts +19 -0
  664. package/dist/shared/tag-owner-id.d.ts.map +1 -0
  665. package/dist/shared/tag-transcript.d.ts +103 -0
  666. package/dist/shared/tag-transcript.d.ts.map +1 -0
  667. package/dist/shared/tail-hygiene-status.d.ts +24 -0
  668. package/dist/shared/tail-hygiene-status.d.ts.map +1 -0
  669. package/dist/shared/test-temp-dir.d.ts +46 -0
  670. package/dist/shared/test-temp-dir.d.ts.map +1 -0
  671. package/dist/shared/transcript.d.ts +251 -0
  672. package/dist/shared/transcript.d.ts.map +1 -0
  673. package/dist/shared/user-answer.d.ts +4 -0
  674. package/dist/shared/user-answer.d.ts.map +1 -0
  675. package/dist/shared/user-facing-codes.d.ts +135 -0
  676. package/dist/shared/user-facing-codes.d.ts.map +1 -0
  677. package/dist/shared/window-geometry.d.ts +121 -0
  678. package/dist/shared/window-geometry.d.ts.map +1 -0
  679. package/dist/shared/write-transaction-timing.d.ts +11 -0
  680. package/dist/shared/write-transaction-timing.d.ts.map +1 -0
  681. package/dist/shared/xml-unescape.d.ts +9 -0
  682. package/dist/shared/xml-unescape.d.ts.map +1 -0
  683. package/dist/tools/ctx-expand/constants.d.ts +3 -0
  684. package/dist/tools/ctx-expand/constants.d.ts.map +1 -0
  685. package/dist/tools/ctx-expand/index.d.ts +2 -0
  686. package/dist/tools/ctx-expand/index.d.ts.map +1 -0
  687. package/dist/tools/ctx-expand/mode.d.ts +35 -0
  688. package/dist/tools/ctx-expand/mode.d.ts.map +1 -0
  689. package/dist/tools/ctx-expand/render.d.ts +47 -0
  690. package/dist/tools/ctx-expand/render.d.ts.map +1 -0
  691. package/dist/tools/ctx-expand/tools.d.ts +10 -0
  692. package/dist/tools/ctx-expand/tools.d.ts.map +1 -0
  693. package/dist/tools/ctx-expand/types.d.ts +11 -0
  694. package/dist/tools/ctx-expand/types.d.ts.map +1 -0
  695. package/dist/tools/ctx-memory/constants.d.ts +3 -0
  696. package/dist/tools/ctx-memory/constants.d.ts.map +1 -0
  697. package/dist/tools/ctx-memory/index.d.ts +4 -0
  698. package/dist/tools/ctx-memory/index.d.ts.map +1 -0
  699. package/dist/tools/ctx-memory/tools.d.ts +5 -0
  700. package/dist/tools/ctx-memory/tools.d.ts.map +1 -0
  701. package/dist/tools/ctx-memory/types.d.ts +38 -0
  702. package/dist/tools/ctx-memory/types.d.ts.map +1 -0
  703. package/dist/tools/ctx-memory/verification-recording.d.ts +8 -0
  704. package/dist/tools/ctx-memory/verification-recording.d.ts.map +1 -0
  705. package/dist/tools/ctx-note/constants.d.ts +2 -0
  706. package/dist/tools/ctx-note/constants.d.ts.map +1 -0
  707. package/dist/tools/ctx-note/index.d.ts +4 -0
  708. package/dist/tools/ctx-note/index.d.ts.map +1 -0
  709. package/dist/tools/ctx-note/render.d.ts +67 -0
  710. package/dist/tools/ctx-note/render.d.ts.map +1 -0
  711. package/dist/tools/ctx-note/tools.d.ts +13 -0
  712. package/dist/tools/ctx-note/tools.d.ts.map +1 -0
  713. package/dist/tools/ctx-note/types.d.ts +14 -0
  714. package/dist/tools/ctx-note/types.d.ts.map +1 -0
  715. package/dist/tools/ctx-reduce/constants.d.ts +4 -0
  716. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -0
  717. package/dist/tools/ctx-reduce/index.d.ts +4 -0
  718. package/dist/tools/ctx-reduce/index.d.ts.map +1 -0
  719. package/dist/tools/ctx-reduce/tools.d.ts +19 -0
  720. package/dist/tools/ctx-reduce/tools.d.ts.map +1 -0
  721. package/dist/tools/ctx-reduce/types.d.ts +5 -0
  722. package/dist/tools/ctx-reduce/types.d.ts.map +1 -0
  723. package/dist/tools/ctx-search/constants.d.ts +4 -0
  724. package/dist/tools/ctx-search/constants.d.ts.map +1 -0
  725. package/dist/tools/ctx-search/date-range.d.ts +9 -0
  726. package/dist/tools/ctx-search/date-range.d.ts.map +1 -0
  727. package/dist/tools/ctx-search/index.d.ts +4 -0
  728. package/dist/tools/ctx-search/index.d.ts.map +1 -0
  729. package/dist/tools/ctx-search/tools.d.ts +5 -0
  730. package/dist/tools/ctx-search/tools.d.ts.map +1 -0
  731. package/dist/tools/ctx-search/types.d.ts +34 -0
  732. package/dist/tools/ctx-search/types.d.ts.map +1 -0
  733. package/dist/tools/light-descriptions.d.ts +6 -0
  734. package/dist/tools/light-descriptions.d.ts.map +1 -0
  735. package/dist/tools/parameter-descriptions.d.ts +75 -0
  736. package/dist/tools/parameter-descriptions.d.ts.map +1 -0
  737. package/dist/tools/unwrap-imitated-reduced-args.d.ts +21 -0
  738. package/dist/tools/unwrap-imitated-reduced-args.d.ts.map +1 -0
  739. package/dist/v2/fold/boundary.d.ts +61 -0
  740. package/dist/v2/fold/boundary.d.ts.map +1 -0
  741. package/dist/v2/fold/host-media.d.ts +36 -0
  742. package/dist/v2/fold/host-media.d.ts.map +1 -0
  743. package/dist/v2/fold/markers.d.ts +7 -0
  744. package/dist/v2/fold/markers.d.ts.map +1 -0
  745. package/dist/v2/fold/owner.d.ts +40 -0
  746. package/dist/v2/fold/owner.d.ts.map +1 -0
  747. package/dist/v2/fold/restore.d.ts +31 -0
  748. package/dist/v2/fold/restore.d.ts.map +1 -0
  749. package/dist/v2/fork-inheritance.d.ts +101 -0
  750. package/dist/v2/fork-inheritance.d.ts.map +1 -0
  751. package/dist/v2/hidden-child-cleanup.d.ts +11 -0
  752. package/dist/v2/hidden-child-cleanup.d.ts.map +1 -0
  753. package/dist/v2/hidden-child-native.d.ts +29 -0
  754. package/dist/v2/hidden-child-native.d.ts.map +1 -0
  755. package/dist/v2/hidden-child-record.d.ts +137 -0
  756. package/dist/v2/hidden-child-record.d.ts.map +1 -0
  757. package/dist/v2/hidden-completion.d.ts +57 -0
  758. package/dist/v2/hidden-completion.d.ts.map +1 -0
  759. package/dist/v2/hooks/channel2.d.ts +10 -0
  760. package/dist/v2/hooks/channel2.d.ts.map +1 -0
  761. package/dist/v2/hooks/commands.d.ts +29 -0
  762. package/dist/v2/hooks/commands.d.ts.map +1 -0
  763. package/dist/v2/hooks/context.d.ts +112 -0
  764. package/dist/v2/hooks/context.d.ts.map +1 -0
  765. package/dist/v2/hooks/deleted-session-tombstones.d.ts +10 -0
  766. package/dist/v2/hooks/deleted-session-tombstones.d.ts.map +1 -0
  767. package/dist/v2/hooks/generate.d.ts +10 -0
  768. package/dist/v2/hooks/generate.d.ts.map +1 -0
  769. package/dist/v2/hooks/hidden-child.d.ts +76 -0
  770. package/dist/v2/hooks/hidden-child.d.ts.map +1 -0
  771. package/dist/v2/hooks/hidden-terminal-error.d.ts +8 -0
  772. package/dist/v2/hooks/hidden-terminal-error.d.ts.map +1 -0
  773. package/dist/v2/hooks/lkg-system.d.ts +11 -0
  774. package/dist/v2/hooks/lkg-system.d.ts.map +1 -0
  775. package/dist/v2/hooks/model-limit-cache.d.ts +19 -0
  776. package/dist/v2/hooks/model-limit-cache.d.ts.map +1 -0
  777. package/dist/v2/hooks/payload.d.ts +15 -0
  778. package/dist/v2/hooks/payload.d.ts.map +1 -0
  779. package/dist/v2/hooks/refusal.d.ts +15 -0
  780. package/dist/v2/hooks/refusal.d.ts.map +1 -0
  781. package/dist/v2/hooks/restore-rows.d.ts +29 -0
  782. package/dist/v2/hooks/restore-rows.d.ts.map +1 -0
  783. package/dist/v2/hooks/rpc-live-state.d.ts +9 -0
  784. package/dist/v2/hooks/rpc-live-state.d.ts.map +1 -0
  785. package/dist/v2/hooks/session-api-gate.d.ts +4 -0
  786. package/dist/v2/hooks/session-api-gate.d.ts.map +1 -0
  787. package/dist/v2/hooks/session-project-backfill.d.ts +15 -0
  788. package/dist/v2/hooks/session-project-backfill.d.ts.map +1 -0
  789. package/dist/v2/hooks/storage-gate.d.ts +48 -0
  790. package/dist/v2/hooks/storage-gate.d.ts.map +1 -0
  791. package/dist/v2/hooks/storage-notice.d.ts +29 -0
  792. package/dist/v2/hooks/storage-notice.d.ts.map +1 -0
  793. package/dist/v2/hooks/store.d.ts +58 -0
  794. package/dist/v2/hooks/store.d.ts.map +1 -0
  795. package/dist/v2/hooks/tools.d.ts +8 -0
  796. package/dist/v2/hooks/tools.d.ts.map +1 -0
  797. package/dist/v2/hooks/types.d.ts +250 -0
  798. package/dist/v2/hooks/types.d.ts.map +1 -0
  799. package/dist/v2/hooks/usage-persist.d.ts +31 -0
  800. package/dist/v2/hooks/usage-persist.d.ts.map +1 -0
  801. package/dist/v2/hooks/usage-reading.d.ts +46 -0
  802. package/dist/v2/hooks/usage-reading.d.ts.map +1 -0
  803. package/dist/v2/server.d.ts +27 -0
  804. package/dist/v2/server.d.ts.map +1 -0
  805. package/dist/v2/server.js +76235 -0
  806. package/dist/v2/store-reader.d.ts +218 -0
  807. package/dist/v2/store-reader.d.ts.map +1 -0
  808. package/dist/web/api.d.ts +40 -0
  809. package/dist/web/api.d.ts.map +1 -0
  810. package/dist/web/context-store.d.ts +74 -0
  811. package/dist/web/context-store.d.ts.map +1 -0
  812. package/dist/web/fixtures.d.ts +53 -0
  813. package/dist/web/fixtures.d.ts.map +1 -0
  814. package/dist/web/host-opencode.d.ts +56 -0
  815. package/dist/web/host-opencode.d.ts.map +1 -0
  816. package/dist/web/host-pi.d.ts +116 -0
  817. package/dist/web/host-pi.d.ts.map +1 -0
  818. package/dist/web/main.d.ts +24 -0
  819. package/dist/web/main.d.ts.map +1 -0
  820. package/dist/web/main.js +6071 -0
  821. package/dist/web/memories.d.ts +67 -0
  822. package/dist/web/memories.d.ts.map +1 -0
  823. package/dist/web/server.d.ts +42 -0
  824. package/dist/web/server.d.ts.map +1 -0
  825. package/dist/web/types.d.ts +52 -0
  826. package/dist/web/types.d.ts.map +1 -0
  827. package/dist/web/ui/favicon.svg +4 -0
  828. package/dist/web/ui/index.html +36 -0
  829. package/dist/web/ui/panel.css +8 -0
  830. package/dist/web/ui/panel.js +373 -0
  831. package/dist/web/views.d.ts +155 -0
  832. package/dist/web/views.d.ts.map +1 -0
  833. package/dist/web/writes.d.ts +86 -0
  834. package/dist/web/writes.d.ts.map +1 -0
  835. package/dist/wrapup-orchestrator-z9sqpqjf.js +420 -0
  836. package/index.js +1 -0
  837. package/package.json +84 -4
  838. package/src/agents/historian.ts +3 -0
  839. package/src/agents/language-directive.test.ts +129 -0
  840. package/src/agents/language-directive.ts +113 -0
  841. package/src/agents/magic-context-prompt.language.test.ts +37 -0
  842. package/src/agents/magic-context-prompt.test.ts +520 -0
  843. package/src/agents/magic-context-prompt.ts +196 -0
  844. package/src/agents/memory-maintainer.test.ts +249 -0
  845. package/src/agents/memory-maintainer.ts +374 -0
  846. package/src/config/agent-disable.ts +58 -0
  847. package/src/config/compaction-accessor-guard.test.ts +81 -0
  848. package/src/config/compaction-backcompat.test.ts +52 -0
  849. package/src/config/config-paths.ts +42 -0
  850. package/src/config/index.test.ts +1252 -0
  851. package/src/config/index.ts +762 -0
  852. package/src/config/latch-permanence-guard.test.ts +218 -0
  853. package/src/config/live-run-config.test.ts +139 -0
  854. package/src/config/live-run-config.ts +79 -0
  855. package/src/config/live-schema-drift.test.ts +67 -0
  856. package/src/config/live-snapshot.test.ts +86 -0
  857. package/src/config/live-snapshot.ts +187 -0
  858. package/src/config/migrate-experimental.ts +92 -0
  859. package/src/config/misplaced-agent-model.test.ts +55 -0
  860. package/src/config/profiles.ts +106 -0
  861. package/src/config/project-config-trust-boundary.test.ts +185 -0
  862. package/src/config/project-security.hostile-matrix.test.ts +281 -0
  863. package/src/config/project-security.test.ts +329 -0
  864. package/src/config/project-security.ts +940 -0
  865. package/src/config/protected-tokens.test.ts +229 -0
  866. package/src/config/prune-config-leaf.test.ts +78 -0
  867. package/src/config/prune-config-leaf.ts +67 -0
  868. package/src/config/raw-loader.test.ts +389 -0
  869. package/src/config/raw-loader.ts +435 -0
  870. package/src/config/removed-agent-config.ts +45 -0
  871. package/src/config/removed-agent-source-fence.test.ts +53 -0
  872. package/src/config/removed-config-keys.test.ts +106 -0
  873. package/src/config/schema/agent-overrides.ts +45 -0
  874. package/src/config/schema/magic-context.test.ts +434 -0
  875. package/src/config/schema/magic-context.ts +1019 -0
  876. package/src/config/variable.test.ts +324 -0
  877. package/src/config/variable.ts +192 -0
  878. package/src/shared/__fixtures__/window-overlay.v1.json +337 -0
  879. package/src/shared/announcement.test.ts +198 -0
  880. package/src/shared/announcement.ts +145 -0
  881. package/src/shared/assistant-message-extractor.test.ts +47 -0
  882. package/src/shared/assistant-message-extractor.ts +156 -0
  883. package/src/shared/auto-update-provenance.ts +42 -0
  884. package/src/shared/bounded-session-map.test.ts +97 -0
  885. package/src/shared/bounded-session-map.ts +84 -0
  886. package/src/shared/builtin-commands.ts +46 -0
  887. package/src/shared/cache-ttl-display.test.ts +84 -0
  888. package/src/shared/cache-ttl-display.ts +58 -0
  889. package/src/shared/cache-ttl-seed.ts +23 -0
  890. package/src/shared/child-session-teardown.test.ts +241 -0
  891. package/src/shared/child-session-teardown.ts +66 -0
  892. package/src/shared/commit-detection.test.ts +63 -0
  893. package/src/shared/commit-detection.ts +53 -0
  894. package/src/shared/config-diagnostics.test.ts +29 -0
  895. package/src/shared/config-diagnostics.ts +64 -0
  896. package/src/shared/conflict-detector.test.ts +780 -0
  897. package/src/shared/conflict-detector.ts +596 -0
  898. package/src/shared/conflict-fixer.test.ts +608 -0
  899. package/src/shared/conflict-fixer.ts +295 -0
  900. package/src/shared/context-limit-provenance.ts +6 -0
  901. package/src/shared/data-path.test.ts +352 -0
  902. package/src/shared/data-path.ts +310 -0
  903. package/src/shared/error-message.test.ts +94 -0
  904. package/src/shared/error-message.ts +115 -0
  905. package/src/shared/escalation-bands.test.ts +23 -0
  906. package/src/shared/escalation-bands.ts +18 -0
  907. package/src/shared/format-bytes.ts +5 -0
  908. package/src/shared/format-threshold.ts +54 -0
  909. package/src/shared/harness-provider-map.test.ts +176 -0
  910. package/src/shared/harness-provider-map.ts +130 -0
  911. package/src/shared/harness.ts +76 -0
  912. package/src/shared/hidden-variant-warnings.ts +21 -0
  913. package/src/shared/historian-tool-defaults.json +13 -0
  914. package/src/shared/historian-tool-expansions.ts +18 -0
  915. package/src/shared/historian-tool-template.ts +248 -0
  916. package/src/shared/historian-transient-error.test.ts +36 -0
  917. package/src/shared/historian-transient-error.ts +22 -0
  918. package/src/shared/host-limitations.ts +43 -0
  919. package/src/shared/index.ts +7 -0
  920. package/src/shared/internal-initiator-marker.ts +1 -0
  921. package/src/shared/jsonc-edit.ts +387 -0
  922. package/src/shared/jsonc-parser.test.ts +46 -0
  923. package/src/shared/jsonc-parser.ts +283 -0
  924. package/src/shared/keep-subagents.test.ts +39 -0
  925. package/src/shared/keep-subagents.ts +28 -0
  926. package/src/shared/logger.test.ts +292 -0
  927. package/src/shared/logger.ts +248 -0
  928. package/src/shared/model-cache-ttl.test.ts +40 -0
  929. package/src/shared/model-cache-ttl.ts +58 -0
  930. package/src/shared/model-resolution.test.ts +132 -0
  931. package/src/shared/model-resolution.ts +158 -0
  932. package/src/shared/model-suggestion-retry.test.ts +698 -0
  933. package/src/shared/model-suggestion-retry.ts +838 -0
  934. package/src/shared/models-dev-cache.test.ts +720 -0
  935. package/src/shared/models-dev-cache.ts +661 -0
  936. package/src/shared/normalize-sdk-response.ts +40 -0
  937. package/src/shared/opencode-config-dir-types.ts +15 -0
  938. package/src/shared/opencode-config-dir.ts +111 -0
  939. package/src/shared/opencode-db-path.test.ts +389 -0
  940. package/src/shared/opencode-db-path.ts +396 -0
  941. package/src/shared/opencode-host-generation.test.ts +29 -0
  942. package/src/shared/pi-executable.ts +20 -0
  943. package/src/shared/plugin-package-version.ts +52 -0
  944. package/src/shared/project-directory-key.test.ts +111 -0
  945. package/src/shared/project-directory-key.ts +54 -0
  946. package/src/shared/prompt-context.ts +135 -0
  947. package/src/shared/prompt-surface-a1-golden.md +407 -0
  948. package/src/shared/prompt-surface-a1-golden.ts +41 -0
  949. package/src/shared/prompt-surface-runtime.test.ts +190 -0
  950. package/src/shared/prompt-surface-runtime.ts +263 -0
  951. package/src/shared/prompt-surface.test.ts +195 -0
  952. package/src/shared/prompt-surface.ts +162 -0
  953. package/src/shared/provider-response-completion.ts +23 -0
  954. package/src/shared/record-type-guard.ts +3 -0
  955. package/src/shared/redaction.test.ts +134 -0
  956. package/src/shared/redaction.ts +298 -0
  957. package/src/shared/resolve-fallbacks.test.ts +114 -0
  958. package/src/shared/resolve-fallbacks.ts +95 -0
  959. package/src/shared/rpc-async-probes.test.ts +320 -0
  960. package/src/shared/rpc-client.test.ts +576 -0
  961. package/src/shared/rpc-client.ts +218 -0
  962. package/src/shared/rpc-notifications.test.ts +151 -0
  963. package/src/shared/rpc-notifications.ts +222 -0
  964. package/src/shared/rpc-server.ts +431 -0
  965. package/src/shared/rpc-types.ts +386 -0
  966. package/src/shared/rpc-utils.test.ts +822 -0
  967. package/src/shared/rpc-utils.ts +1146 -0
  968. package/src/shared/run-token-log.test.ts +65 -0
  969. package/src/shared/run-token-log.ts +39 -0
  970. package/src/shared/safe-notification-target.test.ts +97 -0
  971. package/src/shared/safe-notification-target.ts +102 -0
  972. package/src/shared/session-messages-bounded.test.ts +112 -0
  973. package/src/shared/sqlite-acquisition-fence.test.ts +133 -0
  974. package/src/shared/sqlite-acquisition-routing.test.ts +145 -0
  975. package/src/shared/sqlite-bind-style.test.ts +80 -0
  976. package/src/shared/sqlite-context-pragmas.ts +24 -0
  977. package/src/shared/sqlite-helpers.ts +44 -0
  978. package/src/shared/sqlite-import-fence.test.ts +19 -0
  979. package/src/shared/sqlite-pass-scope.test.ts +154 -0
  980. package/src/shared/sqlite-transaction-mode-guard.test.ts +234 -0
  981. package/src/shared/sqlite-write-locker-test-support.ts +63 -0
  982. package/src/shared/sqlite.test.ts +58 -0
  983. package/src/shared/sqlite.ts +988 -0
  984. package/src/shared/stable-json.test.ts +87 -0
  985. package/src/shared/stable-json.ts +37 -0
  986. package/src/shared/status-detail-text.test.ts +194 -0
  987. package/src/shared/status-detail-text.ts +7 -0
  988. package/src/shared/status-summary.ts +189 -0
  989. package/src/shared/status-view-check.test.ts +252 -0
  990. package/src/shared/status-view-check.ts +519 -0
  991. package/src/shared/status-view.test.ts +395 -0
  992. package/src/shared/status-view.ts +794 -0
  993. package/src/shared/storage-busy.test.ts +73 -0
  994. package/src/shared/storage-permissions.test.ts +190 -0
  995. package/src/shared/storage-permissions.ts +212 -0
  996. package/src/shared/subagent-runner.ts +240 -0
  997. package/src/shared/summarize-child-stderr.test.ts +55 -0
  998. package/src/shared/summarize-child-stderr.ts +33 -0
  999. package/src/shared/system-directive.ts +9 -0
  1000. package/src/shared/tag-owner-id.test.ts +33 -0
  1001. package/src/shared/tag-owner-id.ts +29 -0
  1002. package/src/shared/tag-transcript.test.ts +554 -0
  1003. package/src/shared/tag-transcript.ts +1400 -0
  1004. package/src/shared/tail-hygiene-status.ts +73 -0
  1005. package/src/shared/test-temp-dir.test.ts +84 -0
  1006. package/src/shared/test-temp-dir.ts +192 -0
  1007. package/src/shared/transcript.ts +274 -0
  1008. package/src/shared/user-answer.test.ts +12 -0
  1009. package/src/shared/user-answer.ts +17 -0
  1010. package/src/shared/user-facing-codes.test.ts +82 -0
  1011. package/src/shared/user-facing-codes.ts +180 -0
  1012. package/src/shared/window-geometry.test.ts +405 -0
  1013. package/src/shared/window-geometry.ts +726 -0
  1014. package/src/shared/windows-hidden-spawns.test.ts +133 -0
  1015. package/src/shared/write-transaction-attribution.test.ts +214 -0
  1016. package/src/shared/write-transaction-timing.ts +26 -0
  1017. package/src/shared/xml-unescape.ts +19 -0
  1018. package/README.md +0 -3
@@ -0,0 +1,1146 @@
1
+ import { execFile, execFileSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { readFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
+
6
+ import { log } from "./logger";
7
+ import { PI_IMAGE_NAMES, piHarnessKindFromExecutable } from "./pi-executable";
8
+ import { canonicalProjectDirectory } from "./project-directory-key";
9
+
10
+ export type ProcessKind = "OpenCode server" | "OpenCode instance (TUI/CLI)" | "Pi" | "process";
11
+
12
+ /** Best-effort process details captured while validating a migration blocker. */
13
+ export interface ProcessProbeEvidence {
14
+ /** Epoch milliseconds, or null when the platform/probe cannot provide it. */
15
+ startTime: number | null;
16
+ /** The raw command line, or null when the platform/probe cannot provide it. */
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;
23
+ }
24
+
25
+ export interface RpcPortFileRecord {
26
+ port: number;
27
+ pid: number;
28
+ started_at: number;
29
+ /** Optional producer-provided kind; older records omit it. */
30
+ kind?: string;
31
+ /** Compatibility with discovery records that used the harness name. */
32
+ harness?: string;
33
+ /**
34
+ * Per-process bearer token. The server requires it on all non-health RPC
35
+ * calls so a random local process or browser-origin script that merely
36
+ * discovers/guesses the port cannot drive side-effecting endpoints
37
+ * (recomp/upgrade/dismiss). Optional in the type for forward/backward
38
+ * compatibility with port files written by older builds (treated as "no
39
+ * auth required" only when the server itself didn't set one).
40
+ */
41
+ token?: string;
42
+ /** Per-server filename nonce; prevents same-process instances from sharing one file. */
43
+ instance_id?: string;
44
+ }
45
+
46
+ /**
47
+ * RPC server instances started by this process. The storage migration guard reads
48
+ * the same discovery files to find live hosts that may still run an older build;
49
+ * a server this process started runs this process's own build, so its discovery
50
+ * file must never count as such a host. Without this, a process that was refused
51
+ * once and retries after its own RPC server has started would find itself as the
52
+ * blocker and refuse forever.
53
+ */
54
+ const ownRpcServerInstanceIds = new Set<string>();
55
+
56
+ export function registerOwnRpcServerInstance(instanceId: string): () => void {
57
+ ownRpcServerInstanceIds.add(instanceId);
58
+ return () => {
59
+ ownRpcServerInstanceIds.delete(instanceId);
60
+ };
61
+ }
62
+
63
+ /** Whether a discovery record belongs to an RPC server started by this process. */
64
+ export function isOwnRpcServerRecord(
65
+ record: Pick<RpcPortFileRecord, "pid" | "instance_id">,
66
+ ): boolean {
67
+ return (
68
+ record.pid === process.pid &&
69
+ record.instance_id !== undefined &&
70
+ ownRpcServerInstanceIds.has(record.instance_id)
71
+ );
72
+ }
73
+
74
+ /**
75
+ * Stable hash for a project directory — scopes RPC port files per-project
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.
84
+ */
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 {
98
+ const normalized = directory.replace(/\/+$/, "");
99
+ return createHash("sha256").update(normalized).digest("hex").slice(0, 16);
100
+ }
101
+
102
+ /** Directory containing per-process RPC discovery files for a project. */
103
+ export function rpcPortDir(storageDir: string, directory: string): string {
104
+ return join(storageDir, "rpc", projectHash(directory));
105
+ }
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
+
117
+ /** Per-process RPC port file path. */
118
+ export function rpcPortFilePath(
119
+ storageDir: string,
120
+ directory: string,
121
+ pid = process.pid,
122
+ instanceId?: string,
123
+ ): string {
124
+ const suffix = instanceId ? `-${instanceId}` : "";
125
+ return join(rpcPortDir(storageDir, directory), `port-${pid}${suffix}.json`);
126
+ }
127
+
128
+ /** Legacy single-port file used by v0.18.0 and earlier. */
129
+ export function legacyRpcPortFilePath(storageDir: string, directory: string): string {
130
+ return join(storageDir, "rpc", legacyProjectHash(directory), "port");
131
+ }
132
+
133
+ export type PidLiveness = "alive" | "dead" | "inconclusive";
134
+
135
+ /**
136
+ * Check whether the platform confirms a PID is live without treating a denied
137
+ * probe as confirmation. Windows uses tasklist because MSYS2/Cygwin ps does not
138
+ * support the options used by the Unix probe. Sandboxes commonly reject
139
+ * `kill(pid, 0)` with EPERM even when the PID does not exist outside their view.
140
+ */
141
+ export function isPidAlive(pid: number): PidLiveness {
142
+ if (!Number.isInteger(pid) || pid <= 0) return "dead";
143
+ if (rpcIdentityPlatform === "win32") return readWindowsProcess(pid).state;
144
+ try {
145
+ rpcIdentityProcessKill(pid, 0);
146
+ return "alive";
147
+ } catch (error) {
148
+ return (error as NodeJS.ErrnoException).code === "ESRCH" ? "dead" : "inconclusive";
149
+ }
150
+ }
151
+
152
+ const RPC_IDENTITY_SKEW_TOLERANCE_MS = 120_000;
153
+ const LINUX_CLOCK_TICKS_PER_SECOND = 100;
154
+ const PS_PROBE_TIMEOUT_MS = 1_000;
155
+ const WINDOWS_CIM_PROBE_TIMEOUT_MS = 5_000;
156
+ const WINDOWS_PROCESS_SNAPSHOT_TTL_MS = 2_000;
157
+ const MAX_ANCESTOR_WALK_DEPTH = 16;
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.
164
+ const WINDOWS_CIM_COMMAND =
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;
174
+ const PI_HARNESS_ARC_MARKERS = [
175
+ "pi-coding-agent",
176
+ "oh-my-pi",
177
+ "@oh-my-pi",
178
+ "cljs/dist",
179
+ "dist/bundle/cli",
180
+ ];
181
+ let rpcIdentityReadFileSync: typeof readFileSync = readFileSync;
182
+ let rpcIdentityExecFileSync: typeof execFileSync = execFileSync;
183
+ let rpcIdentityProcessKill: typeof process.kill = process.kill;
184
+ let rpcProcessListExecFileSync: typeof execFileSync = execFileSync;
185
+ let rpcProcessListTestOverride = false;
186
+ let rpcIdentityPlatform: NodeJS.Platform = process.platform;
187
+ let rpcIdentityNowMs: () => number = () => Date.now();
188
+
189
+ function parseLinuxProcessStartTime(statContent: string, uptimeContent: string): number | null {
190
+ const closingCommandName = statContent.lastIndexOf(")");
191
+ if (closingCommandName < 0) return null;
192
+
193
+ // The fields after the command name begin at field 3 (`state`), so field 22
194
+ // (`starttime`) is index 19 in this suffix. The command name can contain ')',
195
+ // hence the last closing parenthesis rather than the first one is significant.
196
+ const statFields = statContent
197
+ .slice(closingCommandName + 1)
198
+ .trim()
199
+ .split(/\s+/);
200
+ const startTimeTicks = Number(statFields[19]);
201
+ const uptimeSeconds = Number(uptimeContent.trim().split(/\s+/)[0]);
202
+ if (
203
+ !Number.isFinite(startTimeTicks) ||
204
+ startTimeTicks < 0 ||
205
+ !Number.isFinite(uptimeSeconds) ||
206
+ uptimeSeconds < 0
207
+ ) {
208
+ return null;
209
+ }
210
+
211
+ const processStartTime =
212
+ rpcIdentityNowMs() -
213
+ uptimeSeconds * 1_000 +
214
+ (startTimeTicks / LINUX_CLOCK_TICKS_PER_SECOND) * 1_000;
215
+ return Number.isFinite(processStartTime) ? processStartTime : null;
216
+ }
217
+
218
+ function readLinuxProcessStartTime(pid: number): number | null {
219
+ try {
220
+ const statContent = String(rpcIdentityReadFileSync(`/proc/${pid}/stat`, "utf8"));
221
+ const uptimeContent = String(rpcIdentityReadFileSync("/proc/uptime", "utf8"));
222
+ return parseLinuxProcessStartTime(statContent, uptimeContent);
223
+ } catch {
224
+ return null;
225
+ }
226
+ }
227
+
228
+ function readPsProcessStartTime(pid: number): number | null {
229
+ try {
230
+ const output = rpcIdentityExecFileSync("ps", ["-p", String(pid), "-o", "lstart="], {
231
+ encoding: "utf8",
232
+ timeout: PS_PROBE_TIMEOUT_MS,
233
+ stdio: ["ignore", "pipe", "pipe"],
234
+ windowsHide: true,
235
+ });
236
+ const processStartTime = Date.parse(String(output).trim());
237
+ return Number.isFinite(processStartTime) ? processStartTime : null;
238
+ } catch {
239
+ return null;
240
+ }
241
+ }
242
+
243
+ /** Read a process start time without changing the guard's liveness decision. */
244
+ export function readProcessStartTime(pid: number): number | null {
245
+ if (!Number.isInteger(pid) || pid <= 0) return null;
246
+ return rpcIdentityPlatform === "linux"
247
+ ? readLinuxProcessStartTime(pid)
248
+ : rpcIdentityPlatform === "win32"
249
+ ? readWindowsProcessStartTime(pid)
250
+ : readPsProcessStartTime(pid);
251
+ }
252
+
253
+ /** Capture the command and start-time probes used to explain a blocker. */
254
+ export function readProcessProbeEvidence(pid: number): ProcessProbeEvidence {
255
+ return {
256
+ startTime: readProcessStartTime(pid),
257
+ commandLine: readProcessCommand(pid),
258
+ };
259
+ }
260
+
261
+ function readCachedWindowsImageName(pid: number): string | null {
262
+ return rpcIdentityPlatform === "win32"
263
+ ? (windowsProcessFactsCache?.get(pid)?.imageName ?? null)
264
+ : null;
265
+ }
266
+
267
+ interface ProcessListEntry {
268
+ pid: number;
269
+ command: string;
270
+ }
271
+
272
+ interface ProcessFacts {
273
+ pid: number;
274
+ parentPid: number | null;
275
+ commandLine: string | null;
276
+ imageName: string | null;
277
+ startTime: number | null;
278
+ }
279
+
280
+ type ProcessSnapshotSource = "cim" | "tasklist" | "ps";
281
+
282
+ interface ProcessSnapshot {
283
+ facts: ProcessFacts[];
284
+ parentByPid: Map<number, number>;
285
+ source: ProcessSnapshotSource;
286
+ }
287
+
288
+ let windowsProcessFactsCache: Map<number, ProcessFacts> | null = null;
289
+ let windowsProcessSnapshotCache: { snapshot: ProcessSnapshot; at: number } | null = null;
290
+
291
+ function rememberWindowsProcessFacts(facts: ProcessFacts[]): void {
292
+ windowsProcessFactsCache = new Map(facts.map((fact) => [fact.pid, fact]));
293
+ }
294
+
295
+ function clearWindowsProcessFactsCache(): void {
296
+ windowsProcessFactsCache = null;
297
+ windowsProcessSnapshotCache = null;
298
+ }
299
+
300
+ function parseCsvLine(line: string): string[] | null {
301
+ const fields: string[] = [];
302
+ let field = "";
303
+ let quoted = false;
304
+ for (let index = 0; index < line.length; index += 1) {
305
+ const character = line[index];
306
+ if (character === '"') {
307
+ if (quoted && line[index + 1] === '"') {
308
+ field += '"';
309
+ index += 1;
310
+ } else {
311
+ quoted = !quoted;
312
+ }
313
+ } else if (character === "," && !quoted) {
314
+ fields.push(field);
315
+ field = "";
316
+ } else {
317
+ field += character;
318
+ }
319
+ }
320
+ if (quoted) return null;
321
+ fields.push(field);
322
+ return fields;
323
+ }
324
+
325
+ export function parseTasklistOutput(output: string): ProcessListEntry[] | null {
326
+ const entries: ProcessListEntry[] = [];
327
+
328
+ for (const rawLine of output.split(/\r?\n/)) {
329
+ const line = rawLine.trim();
330
+ if (!line) continue;
331
+
332
+ const fields = parseCsvLine(line);
333
+ if (!fields) continue;
334
+ if (fields[1]?.trim().toLowerCase() === "pid") {
335
+ continue;
336
+ }
337
+ const pid = Number(fields[1]);
338
+ if (!Number.isInteger(pid) || pid <= 0 || !fields[0]) continue;
339
+ entries.push({ pid, command: fields[0] });
340
+ }
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;
344
+ }
345
+
346
+ function readWindowsProcess(pid: number): { state: PidLiveness; command?: string } {
347
+ try {
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
+ );
358
+ const entries = parseTasklistOutput(String(output));
359
+ if (entries === null) return { state: "inconclusive" };
360
+ const process = entries.find((entry) => entry.pid === pid);
361
+ return process ? { state: "alive", command: process.command } : { state: "dead" };
362
+ } catch {
363
+ return { state: "inconclusive" };
364
+ }
365
+ }
366
+
367
+ function readWindowsProcessStartTime(pid: number): number | null {
368
+ const cached = windowsProcessFactsCache?.get(pid);
369
+ if (cached) return cached.startTime;
370
+ const snapshot = tryReadWindowsCimSnapshot(rpcIdentityExecFileSync);
371
+ if (!snapshot) return null;
372
+ rememberWindowsProcessFacts(snapshot.facts);
373
+ return windowsProcessFactsCache?.get(pid)?.startTime ?? null;
374
+ }
375
+
376
+ function readLinuxProcessCommand(pid: number): string | null {
377
+ try {
378
+ return String(rpcIdentityReadFileSync(`/proc/${pid}/cmdline`, "utf8"));
379
+ } catch {
380
+ return null;
381
+ }
382
+ }
383
+
384
+ function readPsProcessCommand(pid: number): string | null {
385
+ try {
386
+ const output = rpcIdentityExecFileSync("ps", ["-p", String(pid), "-o", "command="], {
387
+ encoding: "utf8",
388
+ timeout: PS_PROBE_TIMEOUT_MS,
389
+ stdio: ["ignore", "pipe", "pipe"],
390
+ windowsHide: true,
391
+ });
392
+ return String(output);
393
+ } catch {
394
+ return null;
395
+ }
396
+ }
397
+
398
+ /** Reuse the platform-gated command probes used by PID identity checks. */
399
+ export function readProcessCommand(pid: number): string | null {
400
+ if (!Number.isInteger(pid) || pid <= 0) return null;
401
+ if (rpcIdentityPlatform === "linux") return readLinuxProcessCommand(pid);
402
+ if (rpcIdentityPlatform === "win32") {
403
+ const cached = windowsProcessFactsCache?.get(pid);
404
+ if (cached?.commandLine) return cached.commandLine;
405
+ return readWindowsProcess(pid).command ?? null;
406
+ }
407
+ return readPsProcessCommand(pid);
408
+ }
409
+
410
+ function executableName(token: string | undefined): string {
411
+ return (
412
+ (token ?? "")
413
+ .replace(/^['"]|['"]$/g, "")
414
+ .split("/")
415
+ .at(-1) ?? ""
416
+ );
417
+ }
418
+
419
+ function commandTokens(command: string): string[] {
420
+ return command
421
+ .toLowerCase()
422
+ .replaceAll("\\", "/")
423
+ .replaceAll("\u0000", " ")
424
+ .split(/\s+/)
425
+ .map((token) => token.replace(/^['"]|['"]$/g, ""))
426
+ .filter(Boolean);
427
+ }
428
+
429
+ function commandHasOpenCodeExecutable(tokens: readonly string[]): number {
430
+ return tokens.findIndex((token) => {
431
+ const executable = executableName(token).replace(/\.(?:exe|cmd)$/, "");
432
+ return executable === "opencode" || executable.endsWith("/opencode");
433
+ });
434
+ }
435
+
436
+ function commandHasPiExecutable(tokens: readonly string[]): boolean {
437
+ for (let index = 0; index < tokens.length; index += 1) {
438
+ const executable = executableName(tokens[index]).replace(/\.(?:exe|cmd)$/, "");
439
+ if (piHarnessKindFromExecutable(executable) !== undefined) return true;
440
+ if (["node", "bun", "deno"].includes(executable)) {
441
+ const script = executableName(tokens[index + 1]).replace(/\.(?:exe|cmd)$/, "");
442
+ if (
443
+ ["pi", "pi.js", "pi.mjs", "pi.cjs"].includes(script) ||
444
+ tokens[index + 1]?.includes("pi-coding-agent")
445
+ ) {
446
+ return true;
447
+ }
448
+ }
449
+ }
450
+ return false;
451
+ }
452
+
453
+ /** Classify a process command without changing the liveness decision. */
454
+ export function classifyProcessKind(command: string | null | undefined): ProcessKind {
455
+ if (!command) return "process";
456
+ const tokens = commandTokens(command);
457
+ const openCodeIndex = commandHasOpenCodeExecutable(tokens);
458
+ if (openCodeIndex >= 0) {
459
+ const args = tokens.slice(openCodeIndex + 1);
460
+ if (
461
+ args.some(
462
+ (token) => token === "serve" || token === "--serve" || token.startsWith("--serve="),
463
+ )
464
+ ) {
465
+ return "OpenCode server";
466
+ }
467
+ return "OpenCode instance (TUI/CLI)";
468
+ }
469
+ return commandHasPiExecutable(tokens) ? "Pi" : "process";
470
+ }
471
+
472
+ function commandLooksLikeOpenCode(command: string): boolean {
473
+ const normalized = command.toLowerCase();
474
+ return OPEN_CODE_COMMAND_MARKERS.some((marker) => normalized.includes(marker));
475
+ }
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
+
521
+ /**
522
+ * Verify that a live PID still belongs to the process that wrote a port record.
523
+ *
524
+ * A PID can be reused after its original process exits. On Linux, procfs gives
525
+ * us a process start time without spawning a helper; macOS and other Unix-like
526
+ * platforms use `ps`, while Windows uses `tasklist`, only on this cold
527
+ * database-open guard path. Legacy records without a start time use a weaker
528
+ * command-name check. A failed filesystem or process probe is inconclusive,
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.
534
+ */
535
+ export type PidIdentityPlausibility = "plausible" | "implausible" | "inconclusive";
536
+
537
+ export function isPidIdentityPlausible(
538
+ record: RpcPortFileRecord,
539
+ evidence?: ProcessProbeEvidence,
540
+ ): PidIdentityPlausibility {
541
+ if (!Number.isInteger(record.pid) || record.pid <= 0) return "implausible";
542
+
543
+ if (Number.isFinite(record.started_at) && record.started_at > 0) {
544
+ const processStartTime = evidence ? evidence.startTime : readProcessStartTime(record.pid);
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";
561
+ }
562
+
563
+ const command = evidence
564
+ ? evidence.commandLine
565
+ : rpcIdentityPlatform === "linux"
566
+ ? readLinuxProcessCommand(record.pid)
567
+ : rpcIdentityPlatform === "win32"
568
+ ? (readWindowsProcess(record.pid).command ?? null)
569
+ : readPsProcessCommand(record.pid);
570
+ if (command === null) return "inconclusive";
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";
578
+ }
579
+
580
+ export function __setRpcIdentityTestHooks(hooks: {
581
+ readFileSync?: typeof readFileSync;
582
+ execFileSync?: typeof execFileSync;
583
+ processKill?: typeof process.kill;
584
+ processListExecFileSync?: typeof execFileSync;
585
+ platform?: NodeJS.Platform;
586
+ nowMs?: () => number;
587
+ }): void {
588
+ clearWindowsProcessFactsCache();
589
+ rpcIdentityReadFileSync = hooks.readFileSync ?? readFileSync;
590
+ rpcIdentityExecFileSync = hooks.execFileSync ?? execFileSync;
591
+ rpcIdentityProcessKill = hooks.processKill ?? process.kill;
592
+ rpcProcessListExecFileSync = hooks.processListExecFileSync ?? execFileSync;
593
+ rpcProcessListTestOverride = hooks.processListExecFileSync !== undefined;
594
+ rpcIdentityPlatform = hooks.platform ?? process.platform;
595
+ rpcIdentityNowMs = hooks.nowMs ?? (() => Date.now());
596
+ }
597
+
598
+ export function __resetRpcIdentityTestHooks(): void {
599
+ clearWindowsProcessFactsCache();
600
+ rpcIdentityReadFileSync = readFileSync;
601
+ rpcIdentityExecFileSync = execFileSync;
602
+ rpcIdentityProcessKill = process.kill;
603
+ rpcProcessListExecFileSync = execFileSync;
604
+ rpcProcessListTestOverride = false;
605
+ rpcIdentityPlatform = process.platform;
606
+ rpcIdentityNowMs = () => Date.now();
607
+ }
608
+
609
+ function commandLooksLikePiImage(command: string): boolean {
610
+ const tokens = commandTokens(command);
611
+ const first = executableName(tokens[0]).replace(/\.(?:exe|cmd)$/, "");
612
+ return PI_IMAGE_NAMES.has(first);
613
+ }
614
+
615
+ /**
616
+ * A process is a verified Pi/OMP harness only when its command line names a
617
+ * known package entry (pi-coding-agent, oh-my-pi, the bun/node cli shim).
618
+ * Bare `omp.exe` / `pi.exe` image names are not enough: Windows tasklist
619
+ * reports only the image, and that matches the session's own launcher shim.
620
+ */
621
+ function commandHasPiHarnessArc(command: string): boolean {
622
+ const normalized = command.trim().toLowerCase().replaceAll("\\", "/").replaceAll("\u0000", " ");
623
+ if (!normalized) return false;
624
+ const tokens = commandTokens(command);
625
+ if (tokens.length === 0) return false;
626
+ const hasArc = PI_HARNESS_ARC_MARKERS.some((marker) => normalized.includes(marker));
627
+ const first = executableName(tokens[0]).replace(/\.(?:exe|cmd)$/, "");
628
+ if (hasArc && ["pi", "omp", "oh-my-pi", "node", "bun", "deno", "cmd"].includes(first)) {
629
+ return true;
630
+ }
631
+ if (hasArc && PI_HARNESS_ARC_MARKERS.some((marker) => tokens[0].includes(marker))) {
632
+ return true;
633
+ }
634
+ if (["node", "bun", "deno"].includes(first)) {
635
+ const script = executableName(tokens[1]).replace(/\.(?:exe|cmd)$/, "");
636
+ if (["pi", "pi.js", "pi.mjs", "pi.cjs"].includes(script)) return true;
637
+ if (hasArc) return true;
638
+ }
639
+ return false;
640
+ }
641
+
642
+ function execProcessList(
643
+ exec: typeof execFileSync,
644
+ file: string,
645
+ args: readonly string[],
646
+ timeout = PS_PROBE_TIMEOUT_MS,
647
+ ): string {
648
+ return String(
649
+ exec(file, [...args], {
650
+ encoding: "utf8",
651
+ timeout,
652
+ maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,
653
+ stdio: ["ignore", "pipe", "pipe"],
654
+ windowsHide: true,
655
+ }),
656
+ );
657
+ }
658
+
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
+ }
665
+ if (typeof value === "number" && Number.isFinite(value)) {
666
+ return value > 1e12 ? value : value * 1_000;
667
+ }
668
+ if (typeof value !== "string") return null;
669
+ const trimmed = value.trim();
670
+ if (!trimmed) return null;
671
+ const wmi = /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\.(\d{6})([+-])(\d{3})$/.exec(trimmed);
672
+ if (wmi) {
673
+ const utcMs = Date.UTC(
674
+ Number(wmi[1]),
675
+ Number(wmi[2]) - 1,
676
+ Number(wmi[3]),
677
+ Number(wmi[4]),
678
+ Number(wmi[5]),
679
+ Number(wmi[6]),
680
+ Number(wmi[7]) / 1_000,
681
+ );
682
+ if (!Number.isFinite(utcMs)) return null;
683
+ const offsetMinutes = Number(wmi[9]);
684
+ const sign = wmi[8] === "+" ? 1 : -1;
685
+ return utcMs - sign * offsetMinutes * 60_000;
686
+ }
687
+ const dotNet = /^\/Date\((-?\d+)\)\/$/.exec(trimmed);
688
+ if (dotNet) {
689
+ const milliseconds = Number(dotNet[1]);
690
+ return Number.isFinite(milliseconds) ? milliseconds : null;
691
+ }
692
+ const parsed = Date.parse(trimmed);
693
+ return Number.isFinite(parsed) ? parsed : null;
694
+ }
695
+
696
+ function parseWindowsCimOutput(output: string): ProcessFacts[] | null {
697
+ const trimmed = output.trim();
698
+ if (!trimmed) return null;
699
+ const bracket = trimmed.indexOf("[");
700
+ const brace = trimmed.indexOf("{");
701
+ const start = Math.min(
702
+ bracket === -1 ? Number.POSITIVE_INFINITY : bracket,
703
+ brace === -1 ? Number.POSITIVE_INFINITY : brace,
704
+ );
705
+ if (!Number.isFinite(start)) return null;
706
+ let parsed: unknown;
707
+ try {
708
+ parsed = JSON.parse(trimmed.slice(start));
709
+ } catch {
710
+ return null;
711
+ }
712
+ if (parsed == null) return null;
713
+ const rows = Array.isArray(parsed) ? parsed : [parsed];
714
+ const facts: ProcessFacts[] = [];
715
+ for (const row of rows) {
716
+ if (!row || typeof row !== "object") continue;
717
+ const record = row as Record<string, unknown>;
718
+ const pid = Number(record.ProcessId);
719
+ if (!Number.isInteger(pid) || pid <= 0) continue;
720
+ const parentRaw = record.ParentProcessId;
721
+ const parentPid = parentRaw == null || parentRaw === "" ? Number.NaN : Number(parentRaw);
722
+ const commandLine = typeof record.CommandLine === "string" ? record.CommandLine : null;
723
+ facts.push({
724
+ pid,
725
+ parentPid: Number.isInteger(parentPid) && parentPid > 0 ? parentPid : null,
726
+ commandLine,
727
+ imageName:
728
+ typeof record.Name === "string"
729
+ ? record.Name
730
+ : commandLine
731
+ ? executableName(commandTokens(commandLine)[0])
732
+ : null,
733
+ startTime: parseWindowsCreationDate(record.CreationDate),
734
+ });
735
+ }
736
+ return facts.length > 0 ? facts : null;
737
+ }
738
+
739
+ function snapshotFromFacts(facts: ProcessFacts[], source: ProcessSnapshotSource): ProcessSnapshot {
740
+ const parentByPid = new Map<number, number>();
741
+ for (const fact of facts) {
742
+ if (fact.parentPid != null) parentByPid.set(fact.pid, fact.parentPid);
743
+ }
744
+ return { facts, parentByPid, source };
745
+ }
746
+
747
+ function tryReadWindowsCimSnapshot(exec: typeof execFileSync): ProcessSnapshot | null {
748
+ try {
749
+ const output = execProcessList(
750
+ exec,
751
+ "powershell",
752
+ ["-NoProfile", "-Command", WINDOWS_CIM_COMMAND],
753
+ WINDOWS_CIM_PROBE_TIMEOUT_MS,
754
+ );
755
+ const facts = parseWindowsCimOutput(output);
756
+ return facts ? snapshotFromFacts(facts, "cim") : null;
757
+ } catch {
758
+ return null;
759
+ }
760
+ }
761
+
762
+ function tryReadWindowsTasklistSnapshot(): ProcessSnapshot | null {
763
+ try {
764
+ const output = execProcessList(rpcProcessListExecFileSync, "tasklist", [
765
+ "/FO",
766
+ "CSV",
767
+ "/NH",
768
+ ]);
769
+ const entries = parseTasklistOutput(output);
770
+ if (entries === null) return null;
771
+ const facts = entries.map((entry) => ({
772
+ pid: entry.pid,
773
+ parentPid: null,
774
+ commandLine: null,
775
+ imageName: entry.command,
776
+ startTime: null,
777
+ }));
778
+ return snapshotFromFacts(facts, "tasklist");
779
+ } catch {
780
+ return null;
781
+ }
782
+ }
783
+
784
+ function readPosixProcessSnapshot(): ProcessSnapshot {
785
+ const output = execProcessList(rpcProcessListExecFileSync, "ps", ["-axo", "pid=,command="]);
786
+ const facts: ProcessFacts[] = [];
787
+ for (const line of output.split(/\r?\n/)) {
788
+ const match = /^\s*(\d+)\s+(.+)$/.exec(line);
789
+ if (!match) continue;
790
+ const pid = Number(match[1]);
791
+ if (!Number.isInteger(pid) || pid <= 0) continue;
792
+ facts.push({
793
+ pid,
794
+ parentPid: null,
795
+ commandLine: match[2],
796
+ imageName: executableName(commandTokens(match[2])[0]),
797
+ startTime: null,
798
+ });
799
+ }
800
+ return snapshotFromFacts(facts, "ps");
801
+ }
802
+
803
+ function readPosixParentPid(pid: number): number | null {
804
+ try {
805
+ const output = execProcessList(rpcProcessListExecFileSync, "ps", [
806
+ "-o",
807
+ "ppid=",
808
+ "-p",
809
+ String(pid),
810
+ ]);
811
+ const match = /^\s*(\d+)\s*$/.exec(output);
812
+ if (!match) return null;
813
+ const ppid = Number(match[1]);
814
+ return Number.isInteger(ppid) && ppid > 0 ? ppid : null;
815
+ } catch {
816
+ return null;
817
+ }
818
+ }
819
+
820
+ /**
821
+ * Walk toward init from `selfPid` so the session's own launcher cannot be
822
+ * treated as a foreign blocker. On Windows, OMP/Pi is two processes: a
823
+ * long-lived `omp.exe`/`pi.exe` shim and the bun/node child where this
824
+ * plugin runs. Bound the walk and stop on cycles so a broken parent map
825
+ * cannot loop.
826
+ */
827
+ function collectAncestorPids(
828
+ selfPid: number,
829
+ parentByPid: Map<number, number>,
830
+ probeParents = true,
831
+ ): Set<number> {
832
+ const ancestors = new Set<number>();
833
+ let current = selfPid;
834
+ for (let depth = 0; depth < MAX_ANCESTOR_WALK_DEPTH; depth += 1) {
835
+ let ppid: number | null = null;
836
+ if (parentByPid.has(current)) {
837
+ ppid = parentByPid.get(current) ?? null;
838
+ } else if (rpcIdentityPlatform !== "win32" && probeParents) {
839
+ ppid = readPosixParentPid(current);
840
+ if (ppid == null && current === process.pid && process.ppid > 0) {
841
+ ppid = process.ppid;
842
+ }
843
+ } else if (current === process.pid && process.ppid > 0) {
844
+ ppid = process.ppid;
845
+ } else {
846
+ break;
847
+ }
848
+ if (ppid == null || ppid <= 0 || ppid === current || ancestors.has(ppid)) break;
849
+ ancestors.add(ppid);
850
+ current = ppid;
851
+ }
852
+ return ancestors;
853
+ }
854
+
855
+ function classifyLivePiSnapshot(
856
+ snapshot: ProcessSnapshot,
857
+ probeParents = true,
858
+ ): PiProcessDiscovery {
859
+ const ancestors = collectAncestorPids(process.pid, snapshot.parentByPid, probeParents);
860
+ const processIds = new Set<number>();
861
+ const inconclusivePids = new Set<number>();
862
+ const skippedAncestorPids: number[] = [];
863
+ for (const fact of snapshot.facts) {
864
+ if (fact.pid === process.pid) continue;
865
+ const command = fact.commandLine ?? fact.imageName ?? "";
866
+ const looksLikeHarness =
867
+ commandHasPiHarnessArc(command) || commandLooksLikePiImage(command);
868
+ if (!looksLikeHarness) continue;
869
+ if (ancestors.has(fact.pid)) {
870
+ skippedAncestorPids.push(fact.pid);
871
+ log(
872
+ `[magic-context] Pi process scan: skipping ancestor PID ${fact.pid} (session launcher shim)`,
873
+ );
874
+ continue;
875
+ }
876
+ if (commandHasPiHarnessArc(command)) {
877
+ processIds.add(fact.pid);
878
+ continue;
879
+ }
880
+ inconclusivePids.add(fact.pid);
881
+ log(
882
+ `[magic-context] Pi process scan: PID ${fact.pid} command line is ambiguous (image-name or missing Pi/OMP arc); treating as inconclusive`,
883
+ );
884
+ }
885
+ skippedAncestorPids.sort((left, right) => left - right);
886
+ const verified = [...processIds].sort((left, right) => left - right);
887
+ const inconclusive = [...inconclusivePids].sort((left, right) => left - right);
888
+ if (verified.length === 0 && inconclusive.length > 0) {
889
+ return {
890
+ state: "inconclusive",
891
+ processIds: [],
892
+ inconclusivePids: inconclusive,
893
+ ...(skippedAncestorPids.length > 0 ? { skippedAncestorPids } : {}),
894
+ };
895
+ }
896
+ return {
897
+ state: "known",
898
+ processIds: verified,
899
+ ...(inconclusive.length > 0 ? { inconclusivePids: inconclusive } : {}),
900
+ ...(skippedAncestorPids.length > 0 ? { skippedAncestorPids } : {}),
901
+ };
902
+ }
903
+
904
+ /** Result of checking whether Pi/OMP processes may currently hold the shared database. */
905
+ export interface PiProcessDiscovery {
906
+ state: "known" | "unreadable" | "inconclusive";
907
+ processIds: number[];
908
+ inconclusivePids?: number[];
909
+ skippedAncestorPids?: number[];
910
+ error?: string;
911
+ }
912
+
913
+ /**
914
+ * Inspect Pi/OMP processes without converting a failed process-list probe into
915
+ * false evidence that no harness is running. Callers choose their own policy
916
+ * for the unreadable state: destructive maintenance can fail closed, while a
917
+ * migration guard can proceed after reporting that no live Pi process was confirmed.
918
+ */
919
+ export function inspectLivePiProcesses(): PiProcessDiscovery {
920
+ if (process.env.NODE_ENV === "test" && !rpcProcessListTestOverride) {
921
+ return { state: "known", processIds: [] };
922
+ }
923
+ try {
924
+ if (rpcIdentityPlatform === "win32") {
925
+ // Prefer one CIM query (pid, parent, command line, start time).
926
+ // tasklist is image-name-only, so it is a fallback and never a
927
+ // verified live-harness source.
928
+ const now = rpcIdentityNowMs();
929
+ const cached = windowsProcessSnapshotCache;
930
+ // A brief reuse avoids spawning PowerShell on every blocker scan.
931
+ const snapshot =
932
+ cached && now >= cached.at && now - cached.at < WINDOWS_PROCESS_SNAPSHOT_TTL_MS
933
+ ? cached.snapshot
934
+ : (tryReadWindowsCimSnapshot(rpcProcessListExecFileSync) ??
935
+ tryReadWindowsTasklistSnapshot());
936
+ if (!snapshot) {
937
+ return {
938
+ state: "unreadable",
939
+ processIds: [],
940
+ error: "process list unavailable",
941
+ };
942
+ }
943
+ if (snapshot !== cached?.snapshot) windowsProcessSnapshotCache = { snapshot, at: now };
944
+ rememberWindowsProcessFacts(snapshot.facts);
945
+ return classifyLivePiSnapshot(snapshot);
946
+ }
947
+ return classifyLivePiSnapshot(readPosixProcessSnapshot());
948
+ } catch (error) {
949
+ return {
950
+ state: "unreadable",
951
+ processIds: [],
952
+ error: error instanceof Error ? error.message : String(error),
953
+ };
954
+ }
955
+ }
956
+
957
+ /** Enumerate live Pi/OMP harness processes before deciding whether migration can proceed. */
958
+ export function discoverLivePiProcessIds(): number[] {
959
+ return inspectLivePiProcesses().processIds;
960
+ }
961
+
962
+ export function parseRpcPortFile(content: string, fallbackPid = 0): RpcPortFileRecord | null {
963
+ const trimmed = content.trim();
964
+ if (!trimmed) return null;
965
+
966
+ if (trimmed.startsWith("{")) {
967
+ try {
968
+ const parsed = JSON.parse(trimmed) as Partial<RpcPortFileRecord>;
969
+ const port = Number(parsed.port);
970
+ const pid = Number(parsed.pid);
971
+ const startedAt = Number(parsed.started_at);
972
+ if (!isValidPort(port) || !Number.isInteger(pid) || pid <= 0) return null;
973
+ return {
974
+ port,
975
+ pid,
976
+ started_at: Number.isFinite(startedAt) ? startedAt : 0,
977
+ kind: typeof parsed.kind === "string" ? parsed.kind : undefined,
978
+ harness: typeof parsed.harness === "string" ? parsed.harness : undefined,
979
+ token: typeof parsed.token === "string" ? parsed.token : undefined,
980
+ instance_id:
981
+ typeof parsed.instance_id === "string" ? parsed.instance_id : undefined,
982
+ };
983
+ } catch {
984
+ return null;
985
+ }
986
+ }
987
+
988
+ const port = Number.parseInt(trimmed, 10);
989
+ if (!isValidPort(port)) return null;
990
+ return { port, pid: fallbackPid, started_at: 0 };
991
+ }
992
+
993
+ function isValidPort(port: number): boolean {
994
+ return Number.isInteger(port) && port > 0 && port <= 65535;
995
+ }
996
+
997
+ /** One bounded, shared process scan for asynchronous storage opens. */
998
+ export interface AsyncProcessInspection {
999
+ pi: PiProcessDiscovery;
1000
+ /** Includes process names and commands so offline maintenance can rule out live store users. */
1001
+ processSnapshot?: {
1002
+ source: ProcessSnapshotSource;
1003
+ facts: Array<{ pid: number; imageName: string | null; commandLine: string | null }>;
1004
+ };
1005
+ evidence(pid: number): ProcessProbeEvidence;
1006
+ liveness(pid: number): PidLiveness;
1007
+ }
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
+
1018
+ function execProcessListAsync(file: string, args: string[], timeout: number): Promise<string> {
1019
+ return new Promise((resolve, reject) => {
1020
+ execFile(
1021
+ file,
1022
+ args,
1023
+ { encoding: "utf8", timeout, windowsHide: true, maxBuffer: 8 * 1024 * 1024 },
1024
+ (error, stdout) => {
1025
+ if (error) reject(error);
1026
+ else resolve(stdout);
1027
+ },
1028
+ );
1029
+ });
1030
+ }
1031
+
1032
+ let asyncProcessExec = execProcessListAsync;
1033
+ let asyncInspection: Promise<AsyncProcessInspection> | undefined;
1034
+ let asyncInspectionExpires = 0;
1035
+ let lastAsyncSnapshot: ProcessSnapshot | null = null;
1036
+
1037
+ /** Inject only the asynchronous transport; legacy synchronous probes stay isolated. */
1038
+ export function __setAsyncProcessProbeForTests(probe?: typeof execProcessListAsync): void {
1039
+ asyncProcessExec = probe ?? execProcessListAsync;
1040
+ asyncInspection = undefined;
1041
+ asyncInspectionExpires = 0;
1042
+ lastAsyncSnapshot = null;
1043
+ }
1044
+
1045
+ export function inspectProcessesAsync(forceFresh = false): Promise<AsyncProcessInspection> {
1046
+ if (!forceFresh && asyncInspection && rpcIdentityNowMs() < asyncInspectionExpires)
1047
+ return asyncInspection;
1048
+ asyncInspectionExpires = Number.POSITIVE_INFINITY;
1049
+ asyncInspection = (async () => {
1050
+ let snapshot: ProcessSnapshot | null = null;
1051
+ try {
1052
+ if (rpcIdentityPlatform === "win32") {
1053
+ try {
1054
+ const output = await asyncProcessExec(
1055
+ "powershell",
1056
+ ["-NoProfile", "-Command", WINDOWS_CIM_COMMAND],
1057
+ WINDOWS_CIM_PROBE_TIMEOUT_MS,
1058
+ );
1059
+ const facts = parseWindowsCimOutput(output);
1060
+ if (facts) snapshot = snapshotFromFacts(facts, "cim");
1061
+ } catch {
1062
+ /* tasklist is the bounded fallback when CIM is unavailable. */
1063
+ }
1064
+ if (!snapshot) {
1065
+ const entries = parseTasklistOutput(
1066
+ await asyncProcessExec(
1067
+ "tasklist",
1068
+ ["/FO", "CSV", "/NH"],
1069
+ PS_PROBE_TIMEOUT_MS,
1070
+ ),
1071
+ );
1072
+ if (entries)
1073
+ snapshot = snapshotFromFacts(
1074
+ entries.map(({ pid, command }) => ({
1075
+ pid,
1076
+ parentPid: null,
1077
+ commandLine: null,
1078
+ imageName: command,
1079
+ startTime: null,
1080
+ })),
1081
+ "tasklist",
1082
+ );
1083
+ }
1084
+ } else {
1085
+ const output = await asyncProcessExec(
1086
+ "ps",
1087
+ ["-axo", "pid=,ppid=,lstart=,command="],
1088
+ PS_PROBE_TIMEOUT_MS,
1089
+ );
1090
+ const facts: ProcessFacts[] = [];
1091
+ for (const line of output.split(/\r?\n/)) {
1092
+ const match =
1093
+ /^\s*(\d+)\s+(\d+)\s+(\S+\s+\S+\s+\d+\s+\d+:\d+:\d+\s+\d+)\s+(.+)$/.exec(
1094
+ line,
1095
+ );
1096
+ if (!match) continue;
1097
+ const startTime = Date.parse(match[3]);
1098
+ facts.push({
1099
+ pid: Number(match[1]),
1100
+ parentPid: Number(match[2]),
1101
+ commandLine: match[4],
1102
+ imageName: null,
1103
+ startTime: Number.isFinite(startTime) ? startTime : null,
1104
+ });
1105
+ }
1106
+ snapshot = facts.length > 0 ? snapshotFromFacts(facts, "ps") : null;
1107
+ }
1108
+ } catch {
1109
+ /* Missing process evidence is inconclusive, never proof of death. */
1110
+ }
1111
+ // A timed-out refresh cannot prove that a process blocking migration has
1112
+ // exited. Keep its evidence until a successful scan can establish death.
1113
+ const fresh = snapshot !== null;
1114
+ if (snapshot) lastAsyncSnapshot = snapshot;
1115
+ else snapshot = lastAsyncSnapshot;
1116
+ const byPid = new Map(snapshot?.facts.map((fact) => [fact.pid, fact]));
1117
+ return {
1118
+ pi: snapshot
1119
+ ? classifyLivePiSnapshot(snapshot, false)
1120
+ : { state: "unreadable", processIds: [] },
1121
+ ...(fresh && snapshot
1122
+ ? { processSnapshot: { source: snapshot.source, facts: snapshot.facts } }
1123
+ : {}),
1124
+ evidence: (pid: number) => snapshotEvidence(byPid.get(pid)),
1125
+ liveness: (pid: number) => (byPid.has(pid) ? "alive" : fresh ? "dead" : "inconclusive"),
1126
+ } satisfies AsyncProcessInspection;
1127
+ })().finally(() => {
1128
+ asyncInspectionExpires = rpcIdentityNowMs() + WINDOWS_PROCESS_SNAPSHOT_TTL_MS;
1129
+ });
1130
+ return asyncInspection;
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
+ }