@phnx-labs/agents-cli 1.22.112 → 1.22.114

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 (706) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +10 -11
  3. package/dist/cli/command-registry.d.ts +0 -60
  4. package/dist/cli/command-registry.js +59 -61
  5. package/dist/commands/apply.d.ts +0 -4
  6. package/dist/commands/apply.js +3 -3
  7. package/dist/commands/browser-picker.d.ts +3 -6
  8. package/dist/commands/browser-picker.js +2 -2
  9. package/dist/commands/browser-sessions-picker.d.ts +2 -1
  10. package/dist/commands/computer-sessions-picker.d.ts +2 -1
  11. package/dist/commands/computer.d.ts +14 -19
  12. package/dist/commands/computer.js +65 -10
  13. package/dist/commands/config.js +46 -2
  14. package/dist/commands/daemon.d.ts +0 -23
  15. package/dist/commands/daemon.js +1 -1
  16. package/dist/commands/detach-core.d.ts +2 -1
  17. package/dist/commands/detach.d.ts +0 -3
  18. package/dist/commands/detach.js +3 -3
  19. package/dist/commands/feed.d.ts +3 -3
  20. package/dist/commands/feed.js +1 -1
  21. package/dist/commands/focus.d.ts +4 -4
  22. package/dist/commands/harness-hooks.d.ts +0 -7
  23. package/dist/commands/harness-hooks.js +1 -1
  24. package/dist/commands/harness-wizard.d.ts +2 -2
  25. package/dist/commands/harness.d.ts +3 -8
  26. package/dist/commands/harness.js +1 -1
  27. package/dist/commands/inspect.d.ts +2 -3
  28. package/dist/commands/inspect.js +1 -1
  29. package/dist/commands/message.d.ts +1 -1
  30. package/dist/commands/message.js +3 -3
  31. package/dist/commands/projects.d.ts +2 -18
  32. package/dist/commands/projects.js +89 -3
  33. package/dist/commands/resource-view.d.ts +3 -2
  34. package/dist/commands/resume.d.ts +0 -1
  35. package/dist/commands/resume.js +1 -1
  36. package/dist/commands/routines.d.ts +1 -3
  37. package/dist/commands/routines.js +1 -1
  38. package/dist/commands/run-account-picker.d.ts +2 -1
  39. package/dist/commands/run-broadcast.d.ts +2 -1
  40. package/dist/commands/run-device-picker.d.ts +2 -1
  41. package/dist/commands/secrets-passthrough.d.ts +14 -0
  42. package/dist/commands/secrets-passthrough.js +21 -2
  43. package/dist/commands/sessions-backfill.d.ts +2 -35
  44. package/dist/commands/sessions-backfill.js +1 -1
  45. package/dist/commands/sessions-bookmark.d.ts +0 -10
  46. package/dist/commands/sessions-bookmark.js +1 -1
  47. package/dist/commands/sessions-inject.d.ts +2 -3
  48. package/dist/commands/sessions-inject.js +8 -17
  49. package/dist/commands/sessions-picker-factory.d.ts +4 -14
  50. package/dist/commands/sessions-picker-factory.js +2 -2
  51. package/dist/commands/sessions-picker.d.ts +3 -9
  52. package/dist/commands/sessions-picker.js +2 -2
  53. package/dist/commands/sessions-resume.d.ts +2 -4
  54. package/dist/commands/sessions-resume.js +0 -5
  55. package/dist/commands/sessions-stats.d.ts +2 -1
  56. package/dist/commands/sessions-stop.d.ts +0 -3
  57. package/dist/commands/sessions-stop.js +1 -1
  58. package/dist/commands/sessions-tail.d.ts +2 -1
  59. package/dist/commands/sessions-trace.d.ts +4 -6
  60. package/dist/commands/sessions-trace.js +1 -1
  61. package/dist/commands/sessions.d.ts +14 -104
  62. package/dist/commands/sessions.js +22 -10
  63. package/dist/commands/setup-mine.d.ts +0 -6
  64. package/dist/commands/setup-mine.js +1 -1
  65. package/dist/commands/setup.d.ts +3 -4
  66. package/dist/commands/setup.js +1 -1
  67. package/dist/commands/share.d.ts +8 -8
  68. package/dist/commands/teams-picker.d.ts +2 -5
  69. package/dist/commands/teams-picker.js +2 -2
  70. package/dist/commands/teams.d.ts +1 -7
  71. package/dist/commands/teams.js +1 -1
  72. package/dist/commands/tmux.d.ts +1 -1
  73. package/dist/commands/tmux.js +1 -1
  74. package/dist/commands/upgrade.d.ts +2 -1
  75. package/dist/commands/utils.d.ts +1 -1
  76. package/dist/commands/utils.js +1 -1
  77. package/dist/lib/account-capabilities.d.ts +2 -1
  78. package/dist/lib/account-catalog.d.ts +4 -13
  79. package/dist/lib/account-catalog.js +1 -1
  80. package/dist/lib/account-registry.d.ts +3 -4
  81. package/dist/lib/account-registry.js +1 -1
  82. package/dist/lib/accounting/account-launch.d.ts +4 -3
  83. package/dist/lib/accounting/account-pool.d.ts +2 -1
  84. package/dist/lib/accounting/rotate.d.ts +3 -9
  85. package/dist/lib/accounting/rotate.js +2 -14
  86. package/dist/lib/accounting/usage-sync.d.ts +5 -4
  87. package/dist/lib/accounting/usage.d.ts +7 -31
  88. package/dist/lib/accounting/usage.js +4 -4
  89. package/dist/lib/accounts/migrate.d.ts +8 -8
  90. package/dist/lib/accounts/migrate.js +1 -1
  91. package/dist/lib/acp/client.d.ts +3 -2
  92. package/dist/lib/acp/harnesses.d.ts +2 -2
  93. package/dist/lib/acp/harnesses.js +1 -1
  94. package/dist/lib/acp/run.d.ts +2 -1
  95. package/dist/lib/actor.d.ts +3 -2
  96. package/dist/lib/add-dir.d.ts +2 -17
  97. package/dist/lib/add-dir.js +2 -6
  98. package/dist/lib/address.d.ts +56 -0
  99. package/dist/lib/address.js +143 -0
  100. package/dist/lib/agent-spec/agents.d.ts +12 -28
  101. package/dist/lib/agent-spec/agents.js +2 -6
  102. package/dist/lib/agent-spec/primitives.d.ts +0 -7
  103. package/dist/lib/agent-spec/primitives.js +0 -6
  104. package/dist/lib/agent-spec/types.d.ts +2 -1
  105. package/dist/lib/analytics/dashboard.d.ts +1 -5
  106. package/dist/lib/analytics/dashboard.js +0 -2
  107. package/dist/lib/analytics/mix-commands.d.ts +0 -7
  108. package/dist/lib/analytics/mix-commands.js +3 -3
  109. package/dist/lib/analytics/recipes.d.ts +0 -12
  110. package/dist/lib/analytics/recipes.js +7 -31
  111. package/dist/lib/analytics/usage-db.d.ts +5 -32
  112. package/dist/lib/analytics/usage-db.js +1 -70
  113. package/dist/lib/answer-router.d.ts +7 -6
  114. package/dist/lib/answer-router.js +5 -11
  115. package/dist/lib/artifact-actions.d.ts +0 -4
  116. package/dist/lib/ask-classifier.d.ts +3 -4
  117. package/dist/lib/ask-classifier.js +0 -7
  118. package/dist/lib/auth-health.d.ts +3 -46
  119. package/dist/lib/auth-health.js +3 -3
  120. package/dist/lib/auth-mint.d.ts +6 -6
  121. package/dist/lib/auth-mint.js +5 -5
  122. package/dist/lib/bench/runner.d.ts +2 -2
  123. package/dist/lib/bench/runner.js +1 -1
  124. package/dist/lib/bench/storage.d.ts +0 -1
  125. package/dist/lib/bench/storage.js +1 -1
  126. package/dist/lib/boot-profile.d.ts +0 -2
  127. package/dist/lib/boot-profile.js +0 -4
  128. package/dist/lib/brand.d.ts +0 -6
  129. package/dist/lib/brand.js +1 -1
  130. package/dist/lib/browser/arc-discovery.d.ts +4 -12
  131. package/dist/lib/browser/arc-discovery.js +1 -1
  132. package/dist/lib/browser/cdp.d.ts +1 -1
  133. package/dist/lib/browser/chrome.d.ts +2 -2
  134. package/dist/lib/browser/chrome.js +0 -4
  135. package/dist/lib/browser/chromium-discovery.d.ts +3 -2
  136. package/dist/lib/browser/drivers/arc.d.ts +3 -20
  137. package/dist/lib/browser/drivers/arc.js +2 -7
  138. package/dist/lib/browser/drivers/firefox.d.ts +2 -6
  139. package/dist/lib/browser/drivers/firefox.js +1 -1
  140. package/dist/lib/browser/drivers/local.d.ts +2 -1
  141. package/dist/lib/browser/drivers/ssh.d.ts +2 -3
  142. package/dist/lib/browser/drivers/ssh.js +0 -7
  143. package/dist/lib/browser/firefox-discovery.d.ts +4 -3
  144. package/dist/lib/browser/har.d.ts +8 -7
  145. package/dist/lib/browser/hygiene.d.ts +2 -3
  146. package/dist/lib/browser/hygiene.js +1 -1
  147. package/dist/lib/browser/ipc.d.ts +4 -3
  148. package/dist/lib/browser/ipc.js +1 -1
  149. package/dist/lib/browser/login-detection.d.ts +1 -8
  150. package/dist/lib/browser/registry.d.ts +2 -1
  151. package/dist/lib/browser/remote-control.d.ts +0 -7
  152. package/dist/lib/browser/remote-control.js +2 -2
  153. package/dist/lib/browser/resolve-target.d.ts +2 -6
  154. package/dist/lib/browser/resolve-target.js +3 -3
  155. package/dist/lib/browser/runtime-state.d.ts +4 -4
  156. package/dist/lib/browser/service.d.ts +4 -4
  157. package/dist/lib/browser/sessions-list.d.ts +0 -10
  158. package/dist/lib/browser/sessions-list.js +3 -3
  159. package/dist/lib/browser/stream.d.ts +2 -1
  160. package/dist/lib/browser/task-index.d.ts +4 -4
  161. package/dist/lib/browser/task-index.js +1 -1
  162. package/dist/lib/browser/types.d.ts +0 -20
  163. package/dist/lib/browser/types.js +1 -34
  164. package/dist/lib/browser/upload.d.ts +0 -27
  165. package/dist/lib/budget/ledger.d.ts +0 -2
  166. package/dist/lib/budget/ledger.js +1 -1
  167. package/dist/lib/budget/live-cloud.d.ts +2 -1
  168. package/dist/lib/budget/preflight.d.ts +3 -5
  169. package/dist/lib/budget/preflight.js +1 -1
  170. package/dist/lib/catchup.d.ts +2 -1
  171. package/dist/lib/channels/owner-forward.d.ts +5 -4
  172. package/dist/lib/channels/owner-sink.js +2 -2
  173. package/dist/lib/channels/providers/desktop.js +1 -1
  174. package/dist/lib/channels/providers/rush.d.ts +2 -1
  175. package/dist/lib/channels/registry.d.ts +1 -1
  176. package/dist/lib/channels/registry.js +1 -1
  177. package/dist/lib/channels/resolve.d.ts +3 -2
  178. package/dist/lib/channels/send.d.ts +5 -4
  179. package/dist/lib/cli-resources.d.ts +3 -9
  180. package/dist/lib/cli-resources.js +1 -1
  181. package/dist/lib/cloud/cursor.d.ts +1 -2
  182. package/dist/lib/cloud/cursor.js +1 -1
  183. package/dist/lib/cloud/dispatch.d.ts +2 -1
  184. package/dist/lib/cloud/factory.d.ts +0 -2
  185. package/dist/lib/cloud/factory.js +1 -1
  186. package/dist/lib/cloud/rush.d.ts +3 -11
  187. package/dist/lib/cloud/rush.js +1 -1
  188. package/dist/lib/cloud/session-index.d.ts +2 -1
  189. package/dist/lib/cloud/types.d.ts +2 -1
  190. package/dist/lib/codex-policy.d.ts +2 -1
  191. package/dist/lib/commands.d.ts +7 -7
  192. package/dist/lib/commands.js +1 -1
  193. package/dist/lib/comms-render.d.ts +1 -1
  194. package/dist/lib/computer/context.d.ts +11 -3
  195. package/dist/lib/computer/context.js +2 -2
  196. package/dist/lib/computer/policy.d.ts +0 -12
  197. package/dist/lib/computer/policy.js +1 -1
  198. package/dist/lib/computer-client.d.ts +3 -3
  199. package/dist/lib/computer-client.js +0 -1
  200. package/dist/lib/concurrency.d.ts +2 -1
  201. package/dist/lib/config-keys.d.ts +16 -3
  202. package/dist/lib/config-keys.js +47 -2
  203. package/dist/lib/convert.d.ts +0 -12
  204. package/dist/lib/convert.js +1 -12
  205. package/dist/lib/crabbox/cli.d.ts +6 -24
  206. package/dist/lib/crabbox/cli.js +2 -28
  207. package/dist/lib/crabbox/lease.d.ts +5 -6
  208. package/dist/lib/crabbox/lease.js +1 -1
  209. package/dist/lib/crabbox/progress.d.ts +2 -1
  210. package/dist/lib/crabbox/setup-copy.d.ts +2 -3
  211. package/dist/lib/crabbox/setup-copy.js +1 -1
  212. package/dist/lib/daemon/account-state-daemon-service.d.ts +1 -1
  213. package/dist/lib/daemon/attention-notify-service.d.ts +2 -1
  214. package/dist/lib/daemon/catchup-service.d.ts +2 -1
  215. package/dist/lib/daemon/daemon.d.ts +4 -12
  216. package/dist/lib/daemon/daemon.js +42 -23
  217. package/dist/lib/daemon/harness-update-service.d.ts +2 -19
  218. package/dist/lib/daemon/harness-update-service.js +3 -3
  219. package/dist/lib/daemon/runner.d.ts +3 -3
  220. package/dist/lib/daemon/self-update-service.d.ts +1 -16
  221. package/dist/lib/daemon/self-update-service.js +6 -6
  222. package/dist/lib/daemon/state-dir-check-service.d.ts +2 -1
  223. package/dist/lib/daemon/supervisor.d.ts +3 -2
  224. package/dist/lib/daemon/testdata/process-view-daemon.d.ts +1 -0
  225. package/dist/lib/daemon/testdata/process-view-daemon.js +14 -0
  226. package/dist/lib/daemon/testdata/process-view-start.d.ts +1 -0
  227. package/dist/lib/daemon/testdata/process-view-start.js +43 -0
  228. package/dist/lib/daemon-services.d.ts +2 -1
  229. package/dist/lib/daemon-webhooks.d.ts +1 -1
  230. package/dist/lib/deeplink/register.d.ts +3 -13
  231. package/dist/lib/deeplink/register.js +3 -3
  232. package/dist/lib/deeplink/url.d.ts +3 -2
  233. package/dist/lib/device-config.d.ts +4 -15
  234. package/dist/lib/device-config.js +164 -8
  235. package/dist/lib/devices/connect.d.ts +2 -1
  236. package/dist/lib/devices/discovery-policy.d.ts +3 -2
  237. package/dist/lib/devices/doctor-findings.js +1 -1
  238. package/dist/lib/devices/doctor-overview-cache.d.ts +3 -2
  239. package/dist/lib/devices/fleet-divergence.d.ts +2 -1
  240. package/dist/lib/devices/fleet.d.ts +3 -4
  241. package/dist/lib/devices/fleet.js +1 -1
  242. package/dist/lib/devices/harness-inventory.d.ts +3 -2
  243. package/dist/lib/devices/health-report.d.ts +3 -2
  244. package/dist/lib/devices/health.d.ts +1 -8
  245. package/dist/lib/devices/health.js +1 -1
  246. package/dist/lib/devices/interactive-host.d.ts +0 -2
  247. package/dist/lib/devices/interactive-host.js +1 -1
  248. package/dist/lib/devices/known-hosts.d.ts +2 -20
  249. package/dist/lib/devices/known-hosts.js +2 -2
  250. package/dist/lib/devices/pool.d.ts +2 -1
  251. package/dist/lib/devices/resolve-target.d.ts +2 -2
  252. package/dist/lib/devices/rollout-verify.d.ts +3 -2
  253. package/dist/lib/devices/stats-cache.d.ts +3 -2
  254. package/dist/lib/devices/sync.d.ts +6 -5
  255. package/dist/lib/devices/worker-pick.d.ts +3 -12
  256. package/dist/lib/devices/worker-pick.js +1 -1
  257. package/dist/lib/diff-text.d.ts +2 -1
  258. package/dist/lib/doctor-diff.d.ts +2 -1
  259. package/dist/lib/drift-sync.d.ts +3 -2
  260. package/dist/lib/drift.d.ts +3 -3
  261. package/dist/lib/drift.js +1 -1
  262. package/dist/lib/event-families.d.ts +0 -6
  263. package/dist/lib/event-families.js +3 -3
  264. package/dist/lib/event-provenance.d.ts +4 -1
  265. package/dist/lib/event-provenance.js +4 -0
  266. package/dist/lib/events-ingest.d.ts +4 -3
  267. package/dist/lib/exec-account-home.d.ts +2 -4
  268. package/dist/lib/exec-account-home.js +1 -1
  269. package/dist/lib/exec-bounded.d.ts +3 -4
  270. package/dist/lib/exec-bounded.js +1 -1
  271. package/dist/lib/exec.d.ts +6 -18
  272. package/dist/lib/exec.js +28 -8
  273. package/dist/lib/factory/snapshot.d.ts +2 -2
  274. package/dist/lib/factory/snapshot.js +1 -1
  275. package/dist/lib/feed/activity-stream.d.ts +2 -5
  276. package/dist/lib/feed/activity-stream.js +11 -2
  277. package/dist/lib/feed/activity.d.ts +16 -33
  278. package/dist/lib/feed/activity.js +69 -26
  279. package/dist/lib/feed/answer.d.ts +3 -2
  280. package/dist/lib/feed/attention.js +5 -1
  281. package/dist/lib/feed/events.d.ts +2 -47
  282. package/dist/lib/feed/events.js +1 -141
  283. package/dist/lib/feed/feed.d.ts +9 -42
  284. package/dist/lib/feed/feed.js +1 -60
  285. package/dist/lib/feed/pr-status.d.ts +0 -2
  286. package/dist/lib/feed/pr-status.js +1 -5
  287. package/dist/lib/feed/watch.d.ts +10 -2
  288. package/dist/lib/feed/watch.js +91 -4
  289. package/dist/lib/feed-broadcast.d.ts +5 -47
  290. package/dist/lib/feed-broadcast.js +9 -9
  291. package/dist/lib/feed-outcome.d.ts +3 -6
  292. package/dist/lib/feed-outcome.js +2 -2
  293. package/dist/lib/feed-policy.d.ts +5 -6
  294. package/dist/lib/feed-policy.js +2 -2
  295. package/dist/lib/feed-post.d.ts +3 -4
  296. package/dist/lib/feed-post.js +2 -2
  297. package/dist/lib/feed-ranking.d.ts +2 -2
  298. package/dist/lib/feed-ranking.js +1 -1
  299. package/dist/lib/fleet/apply.d.ts +5 -6
  300. package/dist/lib/fleet/apply.js +4 -4
  301. package/dist/lib/fleet/manifest.d.ts +2 -1
  302. package/dist/lib/fleet/remote-login.d.ts +18 -36
  303. package/dist/lib/fleet/remote-login.js +20 -19
  304. package/dist/lib/fleet/types.d.ts +0 -8
  305. package/dist/lib/fleet-cache.d.ts +1 -18
  306. package/dist/lib/fleet-cache.js +0 -5
  307. package/dist/lib/fleet-shared-repo-sync.d.ts +3 -3
  308. package/dist/lib/fleet-shared-repo-sync.js +1 -1
  309. package/dist/lib/fleet-shared-state.d.ts +3 -2
  310. package/dist/lib/format.d.ts +2 -1
  311. package/dist/lib/friction-heuristics.d.ts +2 -1
  312. package/dist/lib/fs-walk.d.ts +2 -1
  313. package/dist/lib/fuzzy.d.ts +2 -1
  314. package/dist/lib/gemini-settings.d.ts +0 -1
  315. package/dist/lib/gemini-settings.js +1 -1
  316. package/dist/lib/git.d.ts +7 -65
  317. package/dist/lib/git.js +3 -142
  318. package/dist/lib/github/gh-overload.d.ts +0 -4
  319. package/dist/lib/github/gh-overload.js +2 -2
  320. package/dist/lib/github/project-prs.d.ts +118 -0
  321. package/dist/lib/github/project-prs.js +173 -0
  322. package/dist/lib/github/rest.d.ts +2 -1
  323. package/dist/lib/harness/exec-config-version.d.ts +2 -1
  324. package/dist/lib/harness-auth-capabilities.d.ts +5 -4
  325. package/dist/lib/harness-connection-test.d.ts +2 -1
  326. package/dist/lib/heal.d.ts +3 -20
  327. package/dist/lib/heal.js +2 -39
  328. package/dist/lib/help.d.ts +3 -2
  329. package/dist/lib/helper-download.d.ts +0 -12
  330. package/dist/lib/helper-download.js +2 -2
  331. package/dist/lib/helper-versions.d.ts +2 -1
  332. package/dist/lib/helper-versions.js +1 -1
  333. package/dist/lib/hooks/install.d.ts +8 -49
  334. package/dist/lib/hooks/install.js +2 -96
  335. package/dist/lib/hooks/match.d.ts +2 -1
  336. package/dist/lib/hosts/credential-transport.d.ts +0 -2
  337. package/dist/lib/hosts/credential-transport.js +1 -1
  338. package/dist/lib/hosts/dispatch.d.ts +2 -34
  339. package/dist/lib/hosts/dispatch.js +4 -21
  340. package/dist/lib/hosts/logs.d.ts +2 -1
  341. package/dist/lib/hosts/passthrough.d.ts +1 -1
  342. package/dist/lib/hosts/passthrough.js +0 -1
  343. package/dist/lib/hosts/progress.d.ts +0 -5
  344. package/dist/lib/hosts/progress.js +1 -1
  345. package/dist/lib/hosts/ready.d.ts +3 -4
  346. package/dist/lib/hosts/ready.js +0 -8
  347. package/dist/lib/hosts/reconcile.d.ts +2 -8
  348. package/dist/lib/hosts/reconcile.js +1 -1
  349. package/dist/lib/hosts/reconnect.d.ts +4 -11
  350. package/dist/lib/hosts/reconnect.js +2 -2
  351. package/dist/lib/hosts/registry.d.ts +1 -1
  352. package/dist/lib/hosts/remote-cmd.d.ts +4 -3
  353. package/dist/lib/hosts/remote-session-id.d.ts +5 -27
  354. package/dist/lib/hosts/remote-session-id.js +18 -61
  355. package/dist/lib/hosts/session-index.d.ts +3 -2
  356. package/dist/lib/hosts/ssh-config.d.ts +2 -3
  357. package/dist/lib/hosts/ssh-config.js +0 -10
  358. package/dist/lib/humans.d.ts +0 -2
  359. package/dist/lib/humans.js +2 -2
  360. package/dist/lib/import.d.ts +4 -3
  361. package/dist/lib/installations/installation-lock.d.ts +0 -2
  362. package/dist/lib/installations/installation-lock.js +2 -2
  363. package/dist/lib/installations/launch-gate.d.ts +0 -9
  364. package/dist/lib/installations/launch-gate.js +1 -1
  365. package/dist/lib/installations/migrate.d.ts +0 -11
  366. package/dist/lib/installations/migrate.js +1 -1
  367. package/dist/lib/installations/shims.d.ts +1 -1
  368. package/dist/lib/installations/shims.js +2 -2
  369. package/dist/lib/installations/update-runtime.js +1 -1
  370. package/dist/lib/launch-identity.d.ts +10 -0
  371. package/dist/lib/launch-identity.js +31 -0
  372. package/dist/lib/linear-cache.d.ts +2 -1
  373. package/dist/lib/linux-userns.d.ts +2 -3
  374. package/dist/lib/linux-userns.js +0 -4
  375. package/dist/lib/loop.d.ts +2 -1
  376. package/dist/lib/mailbox-gc.d.ts +2 -1
  377. package/dist/lib/mailbox-target.d.ts +2 -1
  378. package/dist/lib/mailbox.d.ts +0 -6
  379. package/dist/lib/mailbox.js +1 -1
  380. package/dist/lib/manifest.d.ts +0 -14
  381. package/dist/lib/manifest.js +2 -2
  382. package/dist/lib/mcp-registry.d.ts +2 -1
  383. package/dist/lib/memory.d.ts +2 -13
  384. package/dist/lib/memory.js +4 -4
  385. package/dist/lib/menubar/download-menubar.d.ts +0 -2
  386. package/dist/lib/menubar/download-menubar.js +1 -5
  387. package/dist/lib/menubar/install-menubar.d.ts +3 -14
  388. package/dist/lib/menubar/install-menubar.js +3 -3
  389. package/dist/lib/menubar/migrate-prefs.d.ts +53 -0
  390. package/dist/lib/menubar/migrate-prefs.js +168 -0
  391. package/dist/lib/menubar/resolve-version.d.ts +1 -9
  392. package/dist/lib/menubar/resolve-version.js +4 -4
  393. package/dist/lib/menubar/snapshot.d.ts +24 -2
  394. package/dist/lib/menubar/snapshot.js +26 -0
  395. package/dist/lib/model-tier-overrides.d.ts +3 -2
  396. package/dist/lib/monitors/config.d.ts +0 -2
  397. package/dist/lib/monitors/config.js +0 -4
  398. package/dist/lib/monitors/engine.d.ts +1 -1
  399. package/dist/lib/monitors/remote.d.ts +3 -2
  400. package/dist/lib/monitors/sources/webhook.d.ts +2 -15
  401. package/dist/lib/monitors/sources/webhook.js +1 -38
  402. package/dist/lib/monitors/state.d.ts +4 -7
  403. package/dist/lib/monitors/state.js +2 -2
  404. package/dist/lib/notify.d.ts +1 -1
  405. package/dist/lib/notify.js +1 -1
  406. package/dist/lib/onepassword.d.ts +5 -14
  407. package/dist/lib/onepassword.js +0 -64
  408. package/dist/lib/open-url.d.ts +3 -2
  409. package/dist/lib/openclaw-keychain.d.ts +4 -17
  410. package/dist/lib/openclaw-keychain.js +3 -33
  411. package/dist/lib/operator.d.ts +2 -2
  412. package/dist/lib/operator.js +1 -1
  413. package/dist/lib/output/git-output.d.ts +4 -14
  414. package/dist/lib/output/git-output.js +1 -1
  415. package/dist/lib/owner-message.d.ts +3 -29
  416. package/dist/lib/owner-message.js +3 -3
  417. package/dist/lib/packages/output-home.d.ts +2 -4
  418. package/dist/lib/packages/output-home.js +2 -2
  419. package/dist/lib/perf/db.d.ts +0 -2
  420. package/dist/lib/perf/db.js +2 -7
  421. package/dist/lib/permissions-registry.d.ts +2 -3
  422. package/dist/lib/permissions-registry.js +0 -4
  423. package/dist/lib/permissions.d.ts +6 -16
  424. package/dist/lib/permissions.js +2 -15
  425. package/dist/lib/picker.d.ts +6 -5
  426. package/dist/lib/placement.d.ts +3 -6
  427. package/dist/lib/placement.js +0 -17
  428. package/dist/lib/platform/posixpath.d.ts +2 -1
  429. package/dist/lib/platform/winpath.d.ts +2 -1
  430. package/dist/lib/plugins/plugin-marketplace.d.ts +2 -2
  431. package/dist/lib/plugins/plugin-marketplace.js +1 -1
  432. package/dist/lib/pr-land-detach.d.ts +2 -1
  433. package/dist/lib/profiles-presets.d.ts +2 -1
  434. package/dist/lib/profiles.d.ts +3 -9
  435. package/dist/lib/profiles.js +1 -9
  436. package/dist/lib/project-doctor.d.ts +2 -1
  437. package/dist/lib/project-launch.d.ts +2 -2
  438. package/dist/lib/project-probe.d.ts +4 -3
  439. package/dist/lib/project-pull.d.ts +2 -1
  440. package/dist/lib/project-resources.d.ts +2 -2
  441. package/dist/lib/project-resources.js +1 -1
  442. package/dist/lib/project-root.d.ts +2 -6
  443. package/dist/lib/project-root.js +1 -1
  444. package/dist/lib/project-schedule.d.ts +2 -1
  445. package/dist/lib/project-status.d.ts +2 -16
  446. package/dist/lib/project-status.js +3 -3
  447. package/dist/lib/reconcile-and-repair.d.ts +5 -4
  448. package/dist/lib/redact.d.ts +7 -1
  449. package/dist/lib/redact.js +94 -3
  450. package/dist/lib/refresh-coordinator.d.ts +2 -1
  451. package/dist/lib/refresh.d.ts +3 -2
  452. package/dist/lib/remote-agents-json.d.ts +3 -2
  453. package/dist/lib/reserved-stores.d.ts +0 -2
  454. package/dist/lib/reserved-stores.js +3 -5
  455. package/dist/lib/resource-content-diff.d.ts +0 -2
  456. package/dist/lib/resource-content-diff.js +1 -1
  457. package/dist/lib/resource-patterns.d.ts +2 -1
  458. package/dist/lib/resource-profiles.d.ts +2 -8
  459. package/dist/lib/resource-profiles.js +3 -27
  460. package/dist/lib/resources/workflows.d.ts +1 -1
  461. package/dist/lib/resources.d.ts +4 -9
  462. package/dist/lib/resources.js +1 -1
  463. package/dist/lib/routine-context.d.ts +2 -5
  464. package/dist/lib/routine-context.js +2 -2
  465. package/dist/lib/routine-notify-owner.d.ts +8 -7
  466. package/dist/lib/routine-notify-owner.js +5 -5
  467. package/dist/lib/routine-process-cleanup.d.ts +2 -1
  468. package/dist/lib/routine-readiness.d.ts +0 -2
  469. package/dist/lib/routine-readiness.js +0 -7
  470. package/dist/lib/routines-project.d.ts +3 -4
  471. package/dist/lib/routines-project.js +1 -1
  472. package/dist/lib/rules/compile.d.ts +3 -25
  473. package/dist/lib/rules/compile.js +1 -1
  474. package/dist/lib/rules/compose.d.ts +3 -9
  475. package/dist/lib/rules/rules.d.ts +4 -15
  476. package/dist/lib/rules/rules.js +1 -64
  477. package/dist/lib/run-defaults.d.ts +1 -1
  478. package/dist/lib/run-notify.d.ts +2 -1
  479. package/dist/lib/run-trace-sync.d.ts +1 -1
  480. package/dist/lib/run-trace-sync.js +1 -1
  481. package/dist/lib/scheduler.d.ts +2 -1
  482. package/dist/lib/scheduling/routines.d.ts +9 -21
  483. package/dist/lib/scheduling/routines.js +3 -46
  484. package/dist/lib/secrets-client.d.ts +0 -17
  485. package/dist/lib/secrets-client.js +4 -26
  486. package/dist/lib/secrets-policy.d.ts +12 -17
  487. package/dist/lib/secrets-policy.js +5 -5
  488. package/dist/lib/secrets-types.d.ts +3 -2
  489. package/dist/lib/secrets-types.js +2 -1
  490. package/dist/lib/self-heal/checks/install-staging.js +1 -1
  491. package/dist/lib/self-heal/registry.d.ts +3 -2
  492. package/dist/lib/self-heal/types.d.ts +1 -1
  493. package/dist/lib/self-heal/types.js +1 -1
  494. package/dist/lib/self-update.d.ts +5 -5
  495. package/dist/lib/self-update.js +4 -4
  496. package/dist/lib/session/active.js +9 -3
  497. package/dist/lib/session/actor-sidecar.d.ts +3 -2
  498. package/dist/lib/session/artifacts.d.ts +0 -2
  499. package/dist/lib/session/artifacts.js +1 -1
  500. package/dist/lib/session/bash-command.d.ts +2 -7
  501. package/dist/lib/session/bundle.d.ts +4 -6
  502. package/dist/lib/session/bundle.js +1 -5
  503. package/dist/lib/session/cloud.d.ts +0 -4
  504. package/dist/lib/session/cloud.js +2 -15
  505. package/dist/lib/session/db.d.ts +2 -1
  506. package/dist/lib/session/db.js +39 -4
  507. package/dist/lib/session/detached.d.ts +2 -1
  508. package/dist/lib/session/detached.js +2 -2
  509. package/dist/lib/session/digest.d.ts +2 -2
  510. package/dist/lib/session/digest.js +1 -1
  511. package/dist/lib/session/discover.js +7 -2
  512. package/dist/lib/session/fork.d.ts +3 -2
  513. package/dist/lib/session/highlights.d.ts +6 -5
  514. package/dist/lib/session/hook-sessions.d.ts +12 -1
  515. package/dist/lib/session/hook-sessions.js +139 -6
  516. package/dist/lib/session/host-link.d.ts +2 -1
  517. package/dist/lib/session/inject.d.ts +1 -1
  518. package/dist/lib/session/inject.js +1 -1
  519. package/dist/lib/session/insights.d.ts +3 -15
  520. package/dist/lib/session/insights.js +2 -2
  521. package/dist/lib/session/local-tmux-attach.d.ts +2 -18
  522. package/dist/lib/session/local-tmux-attach.js +1 -1
  523. package/dist/lib/session/migrations.d.ts +0 -1
  524. package/dist/lib/session/migrations.js +1 -1
  525. package/dist/lib/session/mirror.d.ts +5 -8
  526. package/dist/lib/session/mirror.js +2 -2
  527. package/dist/lib/session/parse.d.ts +1 -32
  528. package/dist/lib/session/parse.js +4 -4
  529. package/dist/lib/session/pid-registry.d.ts +18 -5
  530. package/dist/lib/session/pid-registry.js +164 -17
  531. package/dist/lib/session/presence.d.ts +2 -1
  532. package/dist/lib/session/process-view.d.ts +25 -0
  533. package/dist/lib/session/process-view.js +176 -0
  534. package/dist/lib/session/projection.d.ts +13 -0
  535. package/dist/lib/session/projection.js +101 -0
  536. package/dist/lib/session/prompt.d.ts +3 -2
  537. package/dist/lib/session/prompt.js +38 -1
  538. package/dist/lib/session/recovery.d.ts +3 -2
  539. package/dist/lib/session/remote/peer-stream.d.ts +2 -5
  540. package/dist/lib/session/remote/peer-stream.js +2 -2
  541. package/dist/lib/session/remote/remote-bundle.d.ts +2 -1
  542. package/dist/lib/session/remote/remote-list.d.ts +5 -5
  543. package/dist/lib/session/remote/remote.d.ts +4 -3
  544. package/dist/lib/session/remote/watch.d.ts +10 -7
  545. package/dist/lib/session/remote/watch.js +10 -6
  546. package/dist/lib/session/remote-active.d.ts +2 -1
  547. package/dist/lib/session/render.d.ts +2 -2
  548. package/dist/lib/session/render.js +1 -1
  549. package/dist/lib/session/resume-owner.d.ts +1 -1
  550. package/dist/lib/session/resume-owner.js +1 -1
  551. package/dist/lib/session/run-names.d.ts +2 -1
  552. package/dist/lib/session/session-cache.d.ts +7 -26
  553. package/dist/lib/session/session-cache.js +17 -8
  554. package/dist/lib/session/share-html.d.ts +1 -21
  555. package/dist/lib/session/share-html.js +1 -1
  556. package/dist/lib/session/shell-programs.d.ts +2 -1
  557. package/dist/lib/session/state.d.ts +41 -8
  558. package/dist/lib/session/state.js +112 -11
  559. package/dist/lib/session/stream-render.d.ts +2 -1
  560. package/dist/lib/session/sync/agents.d.ts +0 -4
  561. package/dist/lib/session/sync/agents.js +0 -0
  562. package/dist/lib/session/sync/backend.d.ts +5 -5
  563. package/dist/lib/session/sync/managed-config.d.ts +0 -8
  564. package/dist/lib/session/sync/managed-key.d.ts +0 -2
  565. package/dist/lib/session/sync/managed-key.js +1 -1
  566. package/dist/lib/session/sync/r2.d.ts +4 -1
  567. package/dist/lib/session/sync/r2.js +4 -7
  568. package/dist/lib/session/sync/transcript-crypto.d.ts +2 -1
  569. package/dist/lib/session/tail.d.ts +2 -1
  570. package/dist/lib/session/team-filter.d.ts +1 -1
  571. package/dist/lib/session/testdata/pid-registry-namespace.d.ts +1 -0
  572. package/dist/lib/session/testdata/pid-registry-namespace.js +27 -0
  573. package/dist/lib/session/testdata/process-view-namespace.d.ts +1 -0
  574. package/dist/lib/session/testdata/process-view-namespace.js +56 -0
  575. package/dist/lib/session/testdata/process-view-private.d.ts +1 -0
  576. package/dist/lib/session/testdata/process-view-private.js +12 -0
  577. package/dist/lib/session/throughput.d.ts +2 -3
  578. package/dist/lib/session/throughput.js +1 -1
  579. package/dist/lib/session/timeline-pass.d.ts +3 -42
  580. package/dist/lib/session/timeline-pass.js +4 -4
  581. package/dist/lib/session/timeline.d.ts +3 -13
  582. package/dist/lib/session/timeline.js +3 -3
  583. package/dist/lib/session/tool-calls.d.ts +2 -2
  584. package/dist/lib/session/tool-calls.js +1 -1
  585. package/dist/lib/session/tool-index.d.ts +0 -8
  586. package/dist/lib/session/tool-index.js +2 -2
  587. package/dist/lib/session/tool-store.d.ts +2 -1
  588. package/dist/lib/session/trajectory-compare.d.ts +2 -1
  589. package/dist/lib/session/trajectory-lineage.d.ts +2 -1
  590. package/dist/lib/session/trajectory-text.d.ts +3 -2
  591. package/dist/lib/session/trajectory.d.ts +2 -1
  592. package/dist/lib/session/viewing-in.d.ts +2 -1
  593. package/dist/lib/settings-manifest.d.ts +2 -1
  594. package/dist/lib/share/delete.d.ts +5 -4
  595. package/dist/lib/share/html.d.ts +0 -2
  596. package/dist/lib/share/html.js +9 -9
  597. package/dist/lib/share/http-error.d.ts +3 -2
  598. package/dist/lib/share/og.d.ts +2 -1
  599. package/dist/lib/share/provision.d.ts +2 -2
  600. package/dist/lib/share/publish.d.ts +4 -13
  601. package/dist/lib/share/publish.js +2 -2
  602. package/dist/lib/shim-heal.d.ts +1 -5
  603. package/dist/lib/shim-heal.js +0 -6
  604. package/dist/lib/smart-launch.d.ts +4 -5
  605. package/dist/lib/smart-launch.js +1 -1
  606. package/dist/lib/snapshot.d.ts +3 -2
  607. package/dist/lib/ssh-exec.d.ts +5 -4
  608. package/dist/lib/ssh-tunnel.d.ts +3 -2
  609. package/dist/lib/staleness/checkers/permissions.d.ts +0 -2
  610. package/dist/lib/staleness/checkers/permissions.js +1 -1
  611. package/dist/lib/staleness/fingerprint.d.ts +0 -7
  612. package/dist/lib/staleness/fingerprint.js +1 -1
  613. package/dist/lib/staleness/prune.d.ts +3 -2
  614. package/dist/lib/staleness/registry.d.ts +1 -1
  615. package/dist/lib/staleness/writers/sources.d.ts +0 -8
  616. package/dist/lib/staleness/writers/sources.js +1 -1
  617. package/dist/lib/startup/command-registry.js +1 -1
  618. package/dist/lib/state.d.ts +1 -3
  619. package/dist/lib/state.js +1 -4
  620. package/dist/lib/subagents-registry.d.ts +4 -3
  621. package/dist/lib/subagents.d.ts +2 -1
  622. package/dist/lib/subagents.js +3 -2
  623. package/dist/lib/summarizer/pass.d.ts +3 -6
  624. package/dist/lib/summarizer/pass.js +2 -2
  625. package/dist/lib/summarizer/summarize.d.ts +4 -3
  626. package/dist/lib/sync-passphrase.d.ts +3 -2
  627. package/dist/lib/sync-status.d.ts +3 -16
  628. package/dist/lib/sync-status.js +2 -2
  629. package/dist/lib/sync-umbrella.d.ts +4 -3
  630. package/dist/lib/system-run-sync.d.ts +2 -1
  631. package/dist/lib/teams/agents.d.ts +2 -4
  632. package/dist/lib/teams/agents.js +1 -1
  633. package/dist/lib/teams/forEach.d.ts +3 -2
  634. package/dist/lib/teams/pr-watch.d.ts +4 -11
  635. package/dist/lib/teams/pr-watch.js +4 -4
  636. package/dist/lib/teams/registry.d.ts +2 -3
  637. package/dist/lib/teams/registry.js +1 -1
  638. package/dist/lib/teams/remoteWorktree.d.ts +0 -16
  639. package/dist/lib/teams/remoteWorktree.js +3 -3
  640. package/dist/lib/teams/scheduler.d.ts +6 -5
  641. package/dist/lib/teams/scheduler.js +1 -1
  642. package/dist/lib/teams/supervisor.d.ts +4 -3
  643. package/dist/lib/teams/worktree.d.ts +0 -9
  644. package/dist/lib/teams/worktree.js +0 -32
  645. package/dist/lib/term-client.d.ts +44 -0
  646. package/dist/lib/term-client.js +117 -0
  647. package/dist/lib/terminal/inject.d.ts +3 -16
  648. package/dist/lib/terminal/inject.js +1 -29
  649. package/dist/lib/terminal/resolve.d.ts +3 -9
  650. package/dist/lib/terminal/resolve.js +3 -7
  651. package/dist/lib/tmux/binary.d.ts +2 -1
  652. package/dist/lib/tmux/orphan-reap.d.ts +6 -7
  653. package/dist/lib/tmux/orphan-reap.js +1 -1
  654. package/dist/lib/tmux/session.d.ts +4 -3
  655. package/dist/lib/traces/classify.d.ts +3 -2
  656. package/dist/lib/traces/config.d.ts +0 -8
  657. package/dist/lib/traces/insights.d.ts +2 -1
  658. package/dist/lib/traces/phenotype.d.ts +3 -3
  659. package/dist/lib/traces/provision.d.ts +1 -3
  660. package/dist/lib/traces/provision.js +1 -1
  661. package/dist/lib/traces/schema2-build.d.ts +1 -1
  662. package/dist/lib/traces/schema2-danger.d.ts +2 -1
  663. package/dist/lib/traces/schema2.d.ts +5 -4
  664. package/dist/lib/traces/segments.d.ts +4 -20
  665. package/dist/lib/traces/segments.js +3 -3
  666. package/dist/lib/traces/sync.d.ts +2 -3
  667. package/dist/lib/traces/sync.js +1 -1
  668. package/dist/lib/triggers/handlers.d.ts +4 -13
  669. package/dist/lib/triggers/handlers.js +1 -1
  670. package/dist/lib/triggers/webhook.d.ts +5 -27
  671. package/dist/lib/triggers/webhook.js +4 -4
  672. package/dist/lib/types.d.ts +3 -3
  673. package/dist/lib/usage-refresh.d.ts +4 -10
  674. package/dist/lib/usage-refresh.js +3 -8
  675. package/dist/lib/verbs.d.ts +2 -1
  676. package/dist/lib/version-duplicates.d.ts +2 -3
  677. package/dist/lib/version-duplicates.js +3 -33
  678. package/dist/lib/version.d.ts +2 -1
  679. package/dist/lib/warn-unpushed.d.ts +2 -1
  680. package/dist/lib/watchdog/history.d.ts +3 -2
  681. package/dist/lib/watchdog/log.d.ts +0 -6
  682. package/dist/lib/watchdog/log.js +1 -1
  683. package/dist/lib/watchdog/rotate.d.ts +2 -26
  684. package/dist/lib/watchdog/rotate.js +4 -12
  685. package/dist/lib/watchdog/runner.d.ts +0 -7
  686. package/dist/lib/watchdog/runner.js +4 -4
  687. package/dist/lib/watchdog/service.d.ts +2 -2
  688. package/dist/lib/watchdog/service.js +1 -1
  689. package/dist/lib/watchdog/watchdog-agent.d.ts +2 -1
  690. package/dist/lib/watchdog/watchdog.d.ts +2 -1
  691. package/dist/lib/watchdog/watchdogTail.d.ts +2 -1
  692. package/dist/lib/workflows-registry.d.ts +3 -2
  693. package/dist/lib/workflows.d.ts +4 -7
  694. package/dist/lib/workflows.js +1 -1
  695. package/dist/lib/worktree/held.d.ts +4 -28
  696. package/dist/lib/worktree/held.js +3 -3
  697. package/package.json +2 -3
  698. package/scripts/postinstall.js +5 -4
  699. package/dist/commands/pty.d.ts +0 -20
  700. package/dist/commands/pty.js +0 -404
  701. package/dist/lib/config-machine-keys.d.ts +0 -14
  702. package/dist/lib/config-machine-keys.js +0 -21
  703. package/dist/lib/pty-client.d.ts +0 -49
  704. package/dist/lib/pty-client.js +0 -315
  705. package/dist/lib/pty-server.d.ts +0 -59
  706. package/dist/lib/pty-server.js +0 -653
@@ -71,17 +71,6 @@ export declare function parseClaude(filePath: string, opts?: ParseSessionOptions
71
71
  export declare function parseClaudeContent(content: string, opts?: ParseSessionOptions): SessionEvent[];
72
72
  /** Parse a Codex JSONL session file into normalized events. */
73
73
  export declare function parseCodex(filePath: string): SessionEvent[];
74
- /**
75
- * Extract target file path(s) from a Codex apply_patch envelope. The patch body
76
- * opens with `*** Begin Patch` and carries one or more file ops of the form
77
- * `*** Update File: <path>` / `*** Add File: <path>` / `*** Delete File: <path>`.
78
- * Returns every path in order (a multi-file patch emits multiple paths so
79
- * artifact discovery sees each file — RUSH-1410). Empty when unparseable.
80
- */
81
- export declare function applyPatchTargets(input: string): Array<{
82
- path: string;
83
- op: 'Add' | 'Update' | 'Delete';
84
- }>;
85
74
  export declare function applyPatchTargetPaths(input: string): string[];
86
75
  /**
87
76
  * Codex writes its turn TWICE in one rollout: the raw `response_item` records
@@ -119,14 +108,6 @@ export declare function parseGemini(filePath: string): SessionEvent[];
119
108
  * request step and a completion step that share the id).
120
109
  */
121
110
  export declare function parseAntigravity(dbPath: string): SessionEvent[];
122
- /**
123
- * Separator between a container file and the id it holds inside a *composite*
124
- * session `file_path`. Some harnesses keep every session in ONE file (OpenCode's
125
- * single `opencode.db`), so the index stores `<container>#<session-id>` rather
126
- * than one path per session — e.g.
127
- * `/home/u/.local/share/opencode/opencode.db#ses_02410a2c…`.
128
- */
129
- export declare const SESSION_FILE_PATH_SEP = "#";
130
111
  /**
131
112
  * Split a stored session `file_path` into its on-disk container and the optional
132
113
  * in-container fragment. For a plain per-session file the container is the path
@@ -179,7 +160,7 @@ export declare function sessionFilePathContainer(filePath: string): string;
179
160
  * session that committed / opened / merged a PR and to report a tool-failure
180
161
  * count the event stream cannot supply.
181
162
  */
182
- export interface GrokSessionSignals {
163
+ interface GrokSessionSignals {
183
164
  gitCommitCount: number;
184
165
  prCreatedCount: number;
185
166
  prMergedCount: number;
@@ -232,18 +213,6 @@ export declare function parseOpenCode(filePath: string): SessionEvent[];
232
213
  export declare function parseOpencodeCloud(filePath: string): SessionEvent[];
233
214
  /** Parse a Rush JSONL session file into normalized events. */
234
215
  export declare function parseRush(filePath: string): SessionEvent[];
235
- /**
236
- * Muse Code session.jsonl → normalized events.
237
- *
238
- * Muse records an append-only event log. We map:
239
- * - runtime.command_intake.received / turn_submit → user message
240
- * - assistant_message_committed → assistant message
241
- * - model_completed.usage → usage
242
- * - tool-related events when present
243
- */
244
- export declare function parseMuse(filePath: string): SessionEvent[];
245
- /** Parse a Hermes session JSON file into normalized events. */
246
- export declare function parseHermes(filePath: string): SessionEvent[];
247
216
  /** Parse a Kimi session state.json file by reading its agents/main/wire.jsonl. */
248
217
  export declare function parseKimi(filePath: string): SessionEvent[];
249
218
  /** Parse Cursor's Anthropic-shaped message JSONL transcript. */
@@ -609,7 +609,7 @@ export function parseCodex(filePath) {
609
609
  * Returns every path in order (a multi-file patch emits multiple paths so
610
610
  * artifact discovery sees each file — RUSH-1410). Empty when unparseable.
611
611
  */
612
- export function applyPatchTargets(input) {
612
+ function applyPatchTargets(input) {
613
613
  const targets = [];
614
614
  const re = /^\*\*\* (Update|Add|Delete) File: (.+)$/gm;
615
615
  for (const m of input.matchAll(re)) {
@@ -1391,7 +1391,7 @@ export function parseAntigravity(dbPath) {
1391
1391
  * than one path per session — e.g.
1392
1392
  * `/home/u/.local/share/opencode/opencode.db#ses_02410a2c…`.
1393
1393
  */
1394
- export const SESSION_FILE_PATH_SEP = '#';
1394
+ const SESSION_FILE_PATH_SEP = '#';
1395
1395
  /**
1396
1396
  * Split a stored session `file_path` into its on-disk container and the optional
1397
1397
  * in-container fragment. For a plain per-session file the container is the path
@@ -2086,7 +2086,7 @@ export function parseRush(filePath) {
2086
2086
  * - model_completed.usage → usage
2087
2087
  * - tool-related events when present
2088
2088
  */
2089
- export function parseMuse(filePath) {
2089
+ function parseMuse(filePath) {
2090
2090
  const content = safeReadSessionFile(filePath);
2091
2091
  const lines = content.split('\n').filter((l) => l.trim());
2092
2092
  const events = [];
@@ -2166,7 +2166,7 @@ export function parseMuse(filePath) {
2166
2166
  return events;
2167
2167
  }
2168
2168
  /** Parse a Hermes session JSON file into normalized events. */
2169
- export function parseHermes(filePath) {
2169
+ function parseHermes(filePath) {
2170
2170
  let session;
2171
2171
  try {
2172
2172
  session = JSON.parse(safeReadSessionFile(filePath));
@@ -49,7 +49,17 @@ export interface PidSessionEntry {
49
49
  */
50
50
  tmuxPane?: string;
51
51
  startedAtMs: number;
52
+ /** Kernel provenance, captured by the writer; absent on legacy records. */
53
+ processIdentity?: {
54
+ bootId?: string;
55
+ pidNamespace?: string;
56
+ initStartTicks?: string;
57
+ startTicks?: string;
58
+ startTime?: string;
59
+ };
52
60
  }
61
+ /** Read-only identity proof for exact joins. Unknown is never a positive match. */
62
+ export declare function pidSessionEntryMatchesLiveProcess(entry: PidSessionEntry): boolean | undefined;
53
63
  export declare function isSessionIdShape(value: string): boolean;
54
64
  export declare function extractSessionIdArg(args: string[]): string | undefined;
55
65
  /**
@@ -76,6 +86,8 @@ export declare function sessionIdFromLivePid(pid: number): string | undefined;
76
86
  export declare function writePidSessionEntry(entry: PidSessionEntry): void;
77
87
  /** Look up a live pid's recorded session. Returns undefined if absent/corrupt. */
78
88
  export declare function readPidSessionEntry(pid: number): PidSessionEntry | undefined;
89
+ /** Live consumers require identity proof; raw history is not a PID binding. */
90
+ export declare function readLivePidSessionEntry(pid: number): PidSessionEntry | undefined;
79
91
  /**
80
92
  * Every recorded launch, one entry per live-or-dead pid. Used to index launches
81
93
  * by their `tmuxPane` so the authoritative tmux source can attribute a pane it did
@@ -87,9 +99,10 @@ export declare function listPidSessionEntries(): PidSessionEntry[];
87
99
  /**
88
100
  * Remove entries whose pid is no longer alive. Best-effort housekeeping.
89
101
  *
90
- * `isAlive` receives the entry's recorded `startedAtMs` so it can reject a pid
91
- * that a newer process recycled (a "zombie" registry entry), not just one that
92
- * no longer exists. An unreadable/corrupt entry falls back to the pid-only
93
- * check.
102
+ * Linux deletion requires the writer's boot and PID namespace to match our own
103
+ * trustworthy proc view. ESRCH in another namespace says nothing about the
104
+ * recorded process. Legacy/corrupt/unreadable ownership is unknown, never dead.
105
+ * Kernel start ticks reject PID reuse without wall-clock heuristics. Other
106
+ * platforms retain the caller's start-time check after checking kernel liveness.
94
107
  */
95
- export declare function prunePidSessionRegistry(isAlive: (pid: number, startedAtMs?: number) => boolean): void;
108
+ export declare function prunePidSessionRegistry(isAlive?: (pid: number, startedAtMs?: number) => boolean | undefined): void;
@@ -19,7 +19,69 @@
19
19
  import fs from 'fs';
20
20
  import path from 'path';
21
21
  import { execFileSync } from 'child_process';
22
+ import { hostProcessView, writerProcessView } from './process-view.js';
22
23
  import { getTerminalsDir } from '../state.js';
24
+ import { atomicWriteFileSync, withFileLock } from '../fs-atomic.js';
25
+ function linuxStartTicks(pid) {
26
+ try {
27
+ const stat = fs.readFileSync(`/proc/${pid}/stat`, 'utf8');
28
+ // comm (field 2) may contain spaces or parentheses; starttime is field 22.
29
+ const value = stat.slice(stat.lastIndexOf(')') + 2).split(' ')[19];
30
+ return value && /^\d+$/.test(value) ? value : undefined;
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ }
36
+ function pidExists(pid) {
37
+ try {
38
+ process.kill(pid, 0);
39
+ return true;
40
+ }
41
+ catch (error) {
42
+ const code = error.code;
43
+ if (code === 'ESRCH')
44
+ return false;
45
+ if (code === 'EPERM')
46
+ return true;
47
+ return undefined;
48
+ }
49
+ }
50
+ function darwinStartTime(pid) {
51
+ try {
52
+ return execFileSync('ps', ['-p', String(pid), '-o', 'lstart='], { encoding: 'utf8', timeout: 2000, stdio: ['ignore', 'pipe', 'ignore'] }).trim() || undefined;
53
+ }
54
+ catch {
55
+ return undefined;
56
+ }
57
+ }
58
+ /** Read-only identity proof for exact joins. Unknown is never a positive match. */
59
+ export function pidSessionEntryMatchesLiveProcess(entry) {
60
+ if (!Number.isInteger(entry.pid) || entry.pid < 1)
61
+ return undefined;
62
+ if (process.platform === 'darwin') {
63
+ const exists = pidExists(entry.pid);
64
+ if (exists !== true)
65
+ return exists;
66
+ const start = darwinStartTime(entry.pid);
67
+ return start && entry.processIdentity?.startTime ? start === entry.processIdentity.startTime : undefined;
68
+ }
69
+ if (process.platform !== 'linux')
70
+ return undefined;
71
+ const scope = hostProcessView();
72
+ if (!scope || entry.processIdentity?.bootId !== scope.bootId
73
+ || entry.processIdentity?.pidNamespace !== scope.pidNamespace
74
+ || entry.processIdentity?.initStartTicks !== scope.initStartTicks)
75
+ return undefined;
76
+ const exists = pidExists(entry.pid);
77
+ if (exists !== true)
78
+ return exists;
79
+ const start = linuxStartTicks(entry.pid);
80
+ const recordedStart = entry.processIdentity?.startTicks;
81
+ if (!start || typeof recordedStart !== 'string' || !/^\d+$/.test(recordedStart))
82
+ return undefined;
83
+ return start === recordedStart;
84
+ }
23
85
  /**
24
86
  * Pull an explicit `--session-id <uuid>` (or `--session-id=<uuid>`) out of a
25
87
  * raw agent arg vector. The transparent shim forwards args untouched, but when
@@ -106,13 +168,46 @@ function pidRegistryDir() {
106
168
  function entryPath(pid) {
107
169
  return path.join(pidRegistryDir(), `${pid}.json`);
108
170
  }
171
+ // The deployed SessionStart hook reconstructs by-pid entries from an allowlist.
172
+ // Keep launcher ownership separately, bound to the immutable launch coordinates.
173
+ function ownershipPath(pid) {
174
+ return path.join(getTerminalsDir(), 'by-pid-ownership', `${pid}.json`);
175
+ }
176
+ function persistOwnership(entry) {
177
+ fs.mkdirSync(path.dirname(ownershipPath(entry.pid)), { recursive: true });
178
+ atomicWriteFileSync(ownershipPath(entry.pid), JSON.stringify(entry), 'utf8');
179
+ }
180
+ function restoreOwnership(entry) {
181
+ if (entry.processIdentity)
182
+ return entry;
183
+ try {
184
+ const owner = JSON.parse(fs.readFileSync(ownershipPath(entry.pid), 'utf8'));
185
+ if (owner.pid === entry.pid && owner.launchId === entry.launchId && owner.startedAtMs === entry.startedAtMs) {
186
+ return { ...entry, processIdentity: owner.processIdentity };
187
+ }
188
+ }
189
+ catch { /* legacy launch */ }
190
+ return entry;
191
+ }
109
192
  /** Record a launched agent process. Never throws — the registry is an optimization. */
110
193
  export function writePidSessionEntry(entry) {
111
- if (!entry.pid || entry.pid < 1)
194
+ if (!Number.isInteger(entry.pid) || entry.pid < 1)
112
195
  return;
113
196
  try {
197
+ const scope = process.platform === 'linux' ? writerProcessView() : undefined;
198
+ if (process.platform === 'linux' && !scope)
199
+ return;
114
200
  fs.mkdirSync(pidRegistryDir(), { recursive: true });
115
- fs.writeFileSync(entryPath(entry.pid), JSON.stringify(entry), 'utf8');
201
+ const processIdentity = scope?.bootId && scope.pidNamespace ? { bootId: scope.bootId, pidNamespace: scope.pidNamespace, initStartTicks: scope.initStartTicks, startTicks: linuxStartTicks(entry.pid) }
202
+ : process.platform === 'darwin' ? { startTime: darwinStartTime(entry.pid) } : undefined;
203
+ const file = entryPath(entry.pid);
204
+ withFileLock(file, () => {
205
+ // The host writer owns numeric PID slots. Old-boot and legacy records
206
+ // must not reserve a recycled slot; restricted namespaces never get here.
207
+ const owned = { ...entry, processIdentity };
208
+ persistOwnership(owned);
209
+ atomicWriteFileSync(file, JSON.stringify(owned), 'utf8');
210
+ }, { realpath: false, acquireTimeoutMs: 0 });
116
211
  }
117
212
  catch {
118
213
  /* degrade to the newest-jsonl heuristic */
@@ -129,8 +224,8 @@ export function readPidSessionEntry(pid) {
129
224
  }
130
225
  try {
131
226
  const parsed = JSON.parse(raw);
132
- if (parsed && typeof parsed === 'object' && typeof parsed.pid === 'number') {
133
- return parsed;
227
+ if (parsed && typeof parsed === 'object' && parsed.pid === pid) {
228
+ return restoreOwnership(parsed);
134
229
  }
135
230
  }
136
231
  catch {
@@ -138,6 +233,32 @@ export function readPidSessionEntry(pid) {
138
233
  }
139
234
  return undefined;
140
235
  }
236
+ /** Live consumers require identity proof; raw history is not a PID binding. */
237
+ export function readLivePidSessionEntry(pid) {
238
+ const entry = readPidSessionEntry(pid);
239
+ if (!entry || !hostProcessView())
240
+ return undefined;
241
+ if (process.platform === 'win32')
242
+ return pidExists(pid) === true ? entry : undefined;
243
+ if (!entry.processIdentity && pidExists(pid) === true) {
244
+ // Upgrade a native legacy launch only after the home namespace is proven,
245
+ // and the actual process start excludes a recycled PID. Hook timestamps may
246
+ // be later than process start, but cannot predate this process incarnation.
247
+ const start = darwinStartTime(pid);
248
+ const startMs = start ? Date.parse(start) : NaN;
249
+ if (Number.isFinite(startMs) && entry.startedAtMs >= startMs - 1000 && entry.startedAtMs <= Date.now()) {
250
+ const scope = hostProcessView();
251
+ entry.processIdentity = process.platform === 'linux'
252
+ ? { ...scope, startTicks: linuxStartTicks(pid) }
253
+ : { startTime: start };
254
+ try {
255
+ persistOwnership(entry);
256
+ }
257
+ catch { /* read remains useful */ }
258
+ }
259
+ }
260
+ return pidSessionEntryMatchesLiveProcess(entry) === true ? entry : undefined;
261
+ }
141
262
  /**
142
263
  * Every recorded launch, one entry per live-or-dead pid. Used to index launches
143
264
  * by their `tmuxPane` so the authoritative tmux source can attribute a pane it did
@@ -158,7 +279,7 @@ export function listPidSessionEntries() {
158
279
  try {
159
280
  const parsed = JSON.parse(fs.readFileSync(path.join(pidRegistryDir(), f), 'utf8'));
160
281
  if (parsed && typeof parsed === 'object' && typeof parsed.pid === 'number') {
161
- out.push(parsed);
282
+ out.push(restoreOwnership(parsed));
162
283
  }
163
284
  }
164
285
  catch {
@@ -170,10 +291,11 @@ export function listPidSessionEntries() {
170
291
  /**
171
292
  * Remove entries whose pid is no longer alive. Best-effort housekeeping.
172
293
  *
173
- * `isAlive` receives the entry's recorded `startedAtMs` so it can reject a pid
174
- * that a newer process recycled (a "zombie" registry entry), not just one that
175
- * no longer exists. An unreadable/corrupt entry falls back to the pid-only
176
- * check.
294
+ * Linux deletion requires the writer's boot and PID namespace to match our own
295
+ * trustworthy proc view. ESRCH in another namespace says nothing about the
296
+ * recorded process. Legacy/corrupt/unreadable ownership is unknown, never dead.
297
+ * Kernel start ticks reject PID reuse without wall-clock heuristics. Other
298
+ * platforms retain the caller's start-time check after checking kernel liveness.
177
299
  */
178
300
  export function prunePidSessionRegistry(isAlive) {
179
301
  let files;
@@ -183,23 +305,48 @@ export function prunePidSessionRegistry(isAlive) {
183
305
  catch {
184
306
  return;
185
307
  }
308
+ const scope = process.platform === 'linux' ? hostProcessView() : undefined;
186
309
  for (const f of files) {
187
310
  const pid = Number(f.slice(0, -'.json'.length));
188
- if (!Number.isInteger(pid))
311
+ if (!Number.isInteger(pid) || pid < 1)
189
312
  continue;
190
- let startedAtMs;
313
+ let raw;
314
+ let entry;
191
315
  try {
192
- const parsed = JSON.parse(fs.readFileSync(path.join(pidRegistryDir(), f), 'utf8'));
193
- if (typeof parsed?.startedAtMs === 'number')
194
- startedAtMs = parsed.startedAtMs;
316
+ raw = fs.readFileSync(path.join(pidRegistryDir(), f), 'utf8');
317
+ entry = restoreOwnership(JSON.parse(raw));
318
+ if (entry?.pid !== pid)
319
+ continue;
195
320
  }
196
321
  catch {
197
- /* unreadable/corrupt — fall back to the pid-only liveness check */
322
+ continue;
198
323
  }
199
- if (isAlive(pid, startedAtMs))
324
+ if (process.platform === 'linux' && (!scope
325
+ || entry.processIdentity?.bootId !== scope.bootId
326
+ || entry.processIdentity?.pidNamespace !== scope.pidNamespace
327
+ || entry.processIdentity?.initStartTicks !== scope.initStartTicks))
328
+ continue;
329
+ const exists = pidExists(pid);
330
+ if (exists === undefined)
200
331
  continue;
332
+ if (exists) {
333
+ if (process.platform === 'linux') {
334
+ const start = linuxStartTicks(pid);
335
+ const recordedStart = entry.processIdentity?.startTicks;
336
+ if (!start || typeof recordedStart !== 'string' || !/^\d+$/.test(recordedStart) || start === recordedStart)
337
+ continue;
338
+ }
339
+ else if (!isAlive || isAlive(pid, entry.startedAtMs) !== false)
340
+ continue;
341
+ }
201
342
  try {
202
- fs.unlinkSync(path.join(pidRegistryDir(), f));
343
+ const file = path.join(pidRegistryDir(), f);
344
+ // Share the writer's lock so comparison and deletion cannot remove a
345
+ // successor published after the liveness check.
346
+ withFileLock(file, () => {
347
+ if (fs.readFileSync(file, 'utf8') === raw)
348
+ fs.unlinkSync(file);
349
+ }, { realpath: false, acquireTimeoutMs: 0 });
203
350
  }
204
351
  catch {
205
352
  /* raced with another writer/pruner */
@@ -44,7 +44,7 @@ export declare function loadPresence(dir?: string): Record<string, PresenceRecor
44
44
  export declare function savePresence(map: Record<string, PresenceRecord>, dir?: string): void;
45
45
  /** The subset of an `ActiveSession` the presence adapter reads (structural, so
46
46
  * this module doesn't import the heavy active-session graph). */
47
- export interface ActiveSessionLike {
47
+ interface ActiveSessionLike {
48
48
  sessionId?: string;
49
49
  kind: string;
50
50
  /** 'terminal' (interactive) | 'headless' | 'teams' | 'cloud' | ... */
@@ -83,3 +83,4 @@ export declare function reconcilePresence(prev: Record<string, PresenceRecord>,
83
83
  next: Record<string, PresenceRecord>;
84
84
  transitions: PresenceTransition[];
85
85
  };
86
+ export {};
@@ -0,0 +1,25 @@
1
+ export interface HostProcessView {
2
+ bootId?: string;
3
+ pidNamespace?: string;
4
+ /** Namespace inodes can be reused within one boot; its init identifies the incarnation. */
5
+ initStartTicks?: string;
6
+ ownerPid?: number;
7
+ ownerStartTicks?: string;
8
+ }
9
+ /** Measure the calling process, never infer authority from a process name. */
10
+ export declare function currentProcessView(): HostProcessView | undefined;
11
+ /** Read-only ownership check. Observing a HOME never claims or migrates it. */
12
+ export declare function hostProcessView(): HostProcessView | undefined;
13
+ /** Explicit writers may enroll a fresh HOME in their measured namespace.
14
+ * Foreign ownership remains protected even when the prior writer is invisible.
15
+ * The initial host may enroll legacy state before daemon startup. */
16
+ export declare function writerProcessView(): HostProcessView | undefined;
17
+ /** Preflight BEFORE even the PID-keyed legacy lifecycle lock is inspected.
18
+ * The same decision is repeated under that lock before daemon state changes. */
19
+ export declare function daemonProcessViewAllowed(): boolean;
20
+ /** Called by the canonical daemon writer before lifecycle mutation.
21
+ * This is a writer statement, not an observer's guess about a numeric PID.
22
+ * Existing same-boot ownership cannot be taken over from another namespace. */
23
+ export declare function recordDaemonProcessView(): void;
24
+ export declare function requireHostProcessView(): void;
25
+ export declare function requireWriterProcessView(): void;
@@ -0,0 +1,176 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { execFileSync } from 'node:child_process';
4
+ import { getCacheDir, getTerminalsDir, getDaemonDir } from '../state.js';
5
+ import { atomicWriteFileSync, withFileLock } from '../fs-atomic.js';
6
+ // Linux UAPI PID_NS_INIT_INO (include/uapi/linux/nsfs.h; previously
7
+ // PROC_PID_INIT_INO in include/linux/proc_ns.h). This is a kernel-defined
8
+ // namespace identity, independent of PID 1's executable or command name.
9
+ function isInitialPidNamespace(view) {
10
+ return view.pidNamespace === 'pid:[4026531836]';
11
+ }
12
+ function sameProcessView(owner, view) {
13
+ return owner.bootId === view.bootId && owner.pidNamespace === view.pidNamespace
14
+ && owner.initStartTicks === view.initStartTicks;
15
+ }
16
+ /** Authenticate the legacy singleton with kernel socket credentials. A host
17
+ * daemon invisible in a nested namespace has peer PID 0, never a colliding PID.
18
+ * No socket/PID/command-name guess grants migration authority. */
19
+ function verifiedLegacyDaemon() {
20
+ try {
21
+ execFileSync('python3', ['-c', `import os,socket,struct,sys
22
+ s=socket.socket(socket.AF_UNIX,socket.SOCK_STREAM)
23
+ s.settimeout(0.2)
24
+ s.connect(sys.argv[1])
25
+ pid,uid,gid=struct.unpack('3i',s.getsockopt(socket.SOL_SOCKET,socket.SO_PEERCRED,12))
26
+ assert pid>0 and uid==os.getuid()
27
+ assert pid==int(open(sys.argv[2]).read().strip())
28
+ assert os.readlink('/proc/%d/ns/pid'%pid)==os.readlink('/proc/self/ns/pid')
29
+ `, path.join(getCacheDir(), 'helpers', 'browser', 'browser.sock'), path.join(getDaemonDir(), 'daemon.pid')], {
30
+ stdio: 'ignore', timeout: 1000,
31
+ });
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ function hasLegacyState() {
39
+ return [path.join(getTerminalsDir(), 'by-pid'), path.join(getCacheDir(), 'state', 'sessions')]
40
+ .some(dir => fs.existsSync(dir) && fs.readdirSync(dir).length > 0)
41
+ // Health/log output records attempted starts, not ownership. The ordinary
42
+ // start path writes health.json BEFORE spawning its first daemon.
43
+ || ['daemon.pid', 'daemon.lifetime', 'heartbeat.json'].some(file => fs.existsSync(path.join(getDaemonDir(), file)))
44
+ || fs.existsSync(path.join(getCacheDir(), 'helpers', 'browser', 'browser.sock'))
45
+ || ['.active-sessions.json', '.active-session-immutable.json'].some(file => fs.existsSync(path.join(getCacheDir(), file)));
46
+ }
47
+ /** Measure the calling process, never infer authority from a process name. */
48
+ export function currentProcessView() {
49
+ if (process.platform !== 'linux')
50
+ return {};
51
+ try {
52
+ if (Number(fs.readFileSync('/proc/self/stat', 'utf8').split(' ', 1)[0]) !== process.pid)
53
+ return undefined;
54
+ const bootId = fs.readFileSync('/proc/sys/kernel/random/boot_id', 'utf8').trim();
55
+ const pidNamespace = fs.readlinkSync('/proc/self/ns/pid');
56
+ // NSpid is relative to the procfs mount. Multiple coordinates mean this
57
+ // mount exposes an ancestor namespace, even if numeric PIDs happen to match.
58
+ const procPids = fs.readFileSync('/proc/self/status', 'utf8').match(/^NSpid:\s+([^\n]+)$/m)?.[1].trim().split(/\s+/);
59
+ if (procPids?.length !== 1 || Number(procPids[0]) !== process.pid)
60
+ return undefined;
61
+ const initStat = fs.readFileSync('/proc/1/stat', 'utf8');
62
+ const initStartTicks = initStat.slice(initStat.lastIndexOf(')') + 2).split(' ')[19];
63
+ const stat = fs.readFileSync('/proc/self/stat', 'utf8');
64
+ const ownerStartTicks = stat.slice(stat.lastIndexOf(')') + 2).split(' ')[19];
65
+ return bootId && pidNamespace && /^\d+$/.test(initStartTicks) && /^\d+$/.test(ownerStartTicks)
66
+ ? { bootId, pidNamespace, initStartTicks, ownerPid: process.pid, ownerStartTicks } : undefined;
67
+ }
68
+ catch {
69
+ return undefined;
70
+ }
71
+ }
72
+ /** Read-only ownership check. Observing a HOME never claims or migrates it. */
73
+ export function hostProcessView() {
74
+ const view = currentProcessView();
75
+ if (!view || process.platform !== 'linux')
76
+ return view;
77
+ try {
78
+ const owner = JSON.parse(fs.readFileSync(path.join(getTerminalsDir(), 'process-view.json'), 'utf8'));
79
+ return sameProcessView(owner, view) ? view : undefined;
80
+ }
81
+ catch (error) {
82
+ // The initial kernel namespace is authoritative before any daemon has
83
+ // enrolled this HOME. This observation itself must remain read-only.
84
+ return error.code === 'ENOENT' && isInitialPidNamespace(view) ? view : undefined;
85
+ }
86
+ }
87
+ /** Explicit writers may enroll a fresh HOME in their measured namespace.
88
+ * Foreign ownership remains protected even when the prior writer is invisible.
89
+ * The initial host may enroll legacy state before daemon startup. */
90
+ export function writerProcessView() {
91
+ const view = currentProcessView();
92
+ if (!view || process.platform !== 'linux')
93
+ return view;
94
+ const file = path.join(getTerminalsDir(), 'process-view.json');
95
+ try {
96
+ if (fs.existsSync(file)) {
97
+ const owner = JSON.parse(fs.readFileSync(file, 'utf8'));
98
+ return sameProcessView(owner, view) ? view : undefined;
99
+ }
100
+ // A foreign observer of legacy state must not even create a directory or
101
+ // claim lock. Repeat this preflight under the lock before enrollment.
102
+ if (hasLegacyState() && !isInitialPidNamespace(view))
103
+ return undefined;
104
+ fs.mkdirSync(getTerminalsDir(), { recursive: true });
105
+ return withFileLock(file, () => {
106
+ if (fs.existsSync(file)) {
107
+ const owner = JSON.parse(fs.readFileSync(file, 'utf8'));
108
+ return sameProcessView(owner, view) ? view : undefined;
109
+ }
110
+ // Unowned nonempty registry is not evidence this caller owns the host.
111
+ if (hasLegacyState() && !isInitialPidNamespace(view))
112
+ return undefined;
113
+ atomicWriteFileSync(file, JSON.stringify(view), 'utf8');
114
+ return view;
115
+ }, { realpath: false, acquireTimeoutMs: 0 });
116
+ }
117
+ catch {
118
+ return undefined;
119
+ }
120
+ }
121
+ /** Preflight BEFORE even the PID-keyed legacy lifecycle lock is inspected.
122
+ * The same decision is repeated under that lock before daemon state changes. */
123
+ export function daemonProcessViewAllowed() {
124
+ const view = currentProcessView();
125
+ if (!view)
126
+ return false;
127
+ if (process.platform !== 'linux')
128
+ return true;
129
+ try {
130
+ const file = path.join(getTerminalsDir(), 'process-view.json');
131
+ if (!fs.existsSync(file))
132
+ return !hasLegacyState() || isInitialPidNamespace(view) || verifiedLegacyDaemon();
133
+ const owner = JSON.parse(fs.readFileSync(file, 'utf8'));
134
+ if (sameProcessView(owner, view))
135
+ return true;
136
+ return typeof owner.bootId === 'string' && !!owner.bootId && owner.bootId !== view.bootId
137
+ && (isInitialPidNamespace(view) || verifiedLegacyDaemon());
138
+ }
139
+ catch {
140
+ return false;
141
+ }
142
+ }
143
+ /** Called by the canonical daemon writer before lifecycle mutation.
144
+ * This is a writer statement, not an observer's guess about a numeric PID.
145
+ * Existing same-boot ownership cannot be taken over from another namespace. */
146
+ export function recordDaemonProcessView() {
147
+ const view = currentProcessView();
148
+ if (!view)
149
+ throw new Error('Cannot record daemon ownership from an incoherent process namespace');
150
+ if (process.platform !== 'linux')
151
+ return;
152
+ const file = path.join(getTerminalsDir(), 'process-view.json');
153
+ fs.mkdirSync(getTerminalsDir(), { recursive: true });
154
+ withFileLock(file, () => {
155
+ if (fs.existsSync(file)) {
156
+ const owner = JSON.parse(fs.readFileSync(file, 'utf8'));
157
+ if (sameProcessView(owner, view))
158
+ return;
159
+ if (typeof owner.bootId !== 'string' || !owner.bootId || owner.bootId === view.bootId || (!isInitialPidNamespace(view) && !verifiedLegacyDaemon())) {
160
+ throw new Error('Another or unverified process namespace owns host session state; automatic reuse of a private-container HOME across namespaces is unsupported. Run in the owning namespace or use a fresh HOME.');
161
+ }
162
+ }
163
+ else if (hasLegacyState() && !isInitialPidNamespace(view) && !verifiedLegacyDaemon()) {
164
+ throw new Error('Legacy session state requires a verified live canonical daemon before namespace migration');
165
+ }
166
+ atomicWriteFileSync(file, JSON.stringify(view), 'utf8');
167
+ }, { realpath: false, acquireTimeoutMs: 0 });
168
+ }
169
+ export function requireHostProcessView() {
170
+ if (!hostProcessView())
171
+ throw new Error('Host session state is unavailable in this process namespace; read the host daemon snapshot or run sessions on the host.');
172
+ }
173
+ export function requireWriterProcessView() {
174
+ if (!writerProcessView())
175
+ throw new Error('Host session state is unavailable in this process namespace; run the writer in its owning namespace or use a fresh HOME. Automatic reuse of a private-container HOME across namespaces is unsupported.');
176
+ }
@@ -0,0 +1,13 @@
1
+ import type { SessionWatchEnvelope, SessionWatchRow } from './watch.js';
2
+ /** Device observations are not sessions: a launcher may observe a peer's run.
3
+ * Keep those observations separately and publish execution-owned state once. */
4
+ export declare class SessionProjection {
5
+ private readonly observations;
6
+ private projected;
7
+ private selected;
8
+ private sequence;
9
+ private readonly streamId;
10
+ /** Only the selected observation may publish execution-owned attention. */
11
+ rowForObservation(scope: string, rowKey: string): SessionWatchRow | undefined;
12
+ apply(event: SessionWatchEnvelope): SessionWatchEnvelope[];
13
+ }