@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
@@ -24,6 +24,7 @@
24
24
  * through to a live gather.
25
25
  */
26
26
  import * as fs from 'fs';
27
+ import { writerProcessView, requireWriterProcessView } from './process-view.js';
27
28
  import * as path from 'path';
28
29
  import { createMemoryCache } from '../memory-cache.js';
29
30
  import { getCacheDir } from '../state.js';
@@ -130,12 +131,6 @@ export function setImmutableMemoPathForTest(p) {
130
131
  immutablePathOverride = p;
131
132
  return prev;
132
133
  }
133
- /** Test seam: redirect the append-only live-state journal. */
134
- export function setActiveSessionsJournalPathForTest(p) {
135
- const prev = journalPathOverride;
136
- journalPathOverride = p;
137
- return prev;
138
- }
139
134
  /** Test seam: redirect the reader-presence file. Returns the previous override. */
140
135
  export function setActiveSessionsReaderPresencePathForTest(p) {
141
136
  const prev = readerPresencePathOverride;
@@ -193,7 +188,7 @@ export function isActiveSessionsJournalReaderRecent(nowMs = Date.now(), idleWind
193
188
  }
194
189
  }
195
190
  /** Default poll cadence for {@link watchActiveSessionsReaderPresence}. */
196
- export const ACTIVE_SESSIONS_READER_TRANSITION_POLL_MS = 1_000;
191
+ const ACTIVE_SESSIONS_READER_TRANSITION_POLL_MS = 1_000;
197
192
  /**
198
193
  * Watch for a reader going from absent/idle to present and fire `onConnect`
199
194
  * out of band, instead of waiting for the next scheduled warm tick (RUSH-2484).
@@ -248,6 +243,7 @@ export function readActiveSessionsCache(scope) {
248
243
  * so a local warm never drops a fleet snapshot a reader just wrote.
249
244
  */
250
245
  export function writeActiveSessionsCache(scope, sessions, opts = {}) {
246
+ requireWriterProcessView();
251
247
  const snap = {
252
248
  version: 1,
253
249
  scope,
@@ -412,6 +408,7 @@ export function assertNoLiveStatusFields(fields) {
412
408
  * refill identity fields without re-deriving them.
413
409
  */
414
410
  export function updateImmutableMemos(sessions, nowMs = Date.now()) {
411
+ requireWriterProcessView();
415
412
  for (const s of sessions) {
416
413
  if (!s.sessionId)
417
414
  continue;
@@ -436,7 +433,7 @@ export function updateImmutableMemos(sessions, nowMs = Date.now()) {
436
433
  * non-stream ActiveSession consumer is unaffected. Best-effort: a DB error leaves
437
434
  * the row untouched.
438
435
  */
439
- export function mergeSessionSummary(s) {
436
+ function mergeSessionSummary(s) {
440
437
  if (!s.sessionId)
441
438
  return s;
442
439
  try {
@@ -534,6 +531,12 @@ export async function loadLocalActiveSessions(opts = {}) {
534
531
  const maxAge = opts.maxAgeMs ?? DEFAULT_ACTIVE_CACHE_MAX_AGE_MS;
535
532
  const readCache = opts.readCache ?? readActiveSessionsCache;
536
533
  const writeCache = opts.writeCache ?? writeActiveSessionsCache;
534
+ if (!writerProcessView()) {
535
+ const cached = readCache('local');
536
+ if (cached)
537
+ return { sessions: cached.sessions, servedFromCache: true, capturedAt: cached.capturedAt };
538
+ requireWriterProcessView();
539
+ }
537
540
  if (!opts.forceRefresh) {
538
541
  const cached = readCache('local');
539
542
  if (cached && isActiveSnapshotFresh(cached.capturedAt, now, maxAge)) {
@@ -570,6 +573,12 @@ export async function loadFleetActiveSessions(opts) {
570
573
  const maxAge = opts.maxAgeMs ?? DEFAULT_ACTIVE_CACHE_MAX_AGE_MS;
571
574
  const readCache = opts.readCache ?? readActiveSessionsCache;
572
575
  const writeCache = opts.writeCache ?? writeActiveSessionsCache;
576
+ if (!writerProcessView()) {
577
+ const cached = readCache('fleet');
578
+ if (cached)
579
+ return { sessions: cached.sessions, remoteDeviceCount: cached.remoteDeviceCount ?? 0, servedFromCache: true, capturedAt: cached.capturedAt };
580
+ requireWriterProcessView();
581
+ }
573
582
  if (!opts.forceRefresh) {
574
583
  const cached = readCache('fleet');
575
584
  if (cached && isActiveSnapshotFresh(cached.capturedAt, now, maxAge)) {
@@ -1,5 +1,5 @@
1
1
  import type { SessionMeta } from './types.js';
2
- export interface SessionHtmlOptions {
2
+ interface SessionHtmlOptions {
3
3
  /** Whether the Markdown was rendered with redaction on — shown in the footer. */
4
4
  redacted?: boolean;
5
5
  }
@@ -9,26 +9,6 @@ interface Chip {
9
9
  value: string;
10
10
  }
11
11
  export declare function escapeHtml(text: string): string;
12
- /**
13
- * Lift every folded reasoning block out of the Markdown, leaving a sentinel.
14
- *
15
- * `renderer.html` escapes raw HTML unconditionally — the transcript body is model
16
- * and tool output, so nothing in it may round-trip as markup. That also escaped
17
- * the `<details>` wrapper `--reasoning fold` emits, which is why the disclosure
18
- * element has to be reconstructed here instead of allowlisted through.
19
- *
20
- * Allowlisting was tried twice and is the wrong shape: marked hands the same
21
- * markup over as several different raw strings depending on context (a whole-token
22
- * gate passed the opening tag and escaped the closing one in a real document), and
23
- * a bare `<details>` in ordinary prose is a complete INLINE html token — so prose
24
- * that merely mentions the tag would emit a live, unclosed element that swallows
25
- * every later turn into it. Reconstructing both ends here makes the pairing
26
- * structural: it cannot be unbalanced by anything the transcript contains.
27
- */
28
- export declare function liftFoldBlocks(markdown: string): {
29
- text: string;
30
- blocks: string[];
31
- };
32
12
  /** Human duration — "13 minutes", never "12m 49s". */
33
13
  export declare function formatDuration(ms: number): string;
34
14
  /**
@@ -75,7 +75,7 @@ const FOLD_BLOCK = /<details>\n<summary>Reasoning<\/summary>\n\n([\s\S]*?)\n\n<\
75
75
  * every later turn into it. Reconstructing both ends here makes the pairing
76
76
  * structural: it cannot be unbalanced by anything the transcript contains.
77
77
  */
78
- export function liftFoldBlocks(markdown) {
78
+ function liftFoldBlocks(markdown) {
79
79
  const blocks = [];
80
80
  // A transcript that literally contains the sentinel must not be able to forge a
81
81
  // disclosure element, so break any occurrence before inserting our own.
@@ -1,5 +1,5 @@
1
1
  import { type Word } from 'unbash';
2
- export interface ShellProgramExtraction {
2
+ interface ShellProgramExtraction {
3
3
  programs: string[];
4
4
  occurrences: ShellProgramOccurrence[];
5
5
  diagnostics: string[];
@@ -30,3 +30,4 @@ export declare function isShellExecTool(tool: string | undefined): boolean;
30
30
  export declare function staticShellWord(word: Word | undefined): string | undefined;
31
31
  /** Parse Bash without executing it and return every statically identifiable program. */
32
32
  export declare function extractShellPrograms(source: string, depth?: number): ShellProgramExtraction;
33
+ export {};
@@ -49,9 +49,22 @@ export interface QuestionOption {
49
49
  * {@link AwaitingReason}; `options` is present when the agent offered discrete choices.
50
50
  */
51
51
  export interface StructuredQuestion {
52
+ /**
53
+ * The question itself — the trailing ask, not the whole message. For a prose
54
+ * question this is the extracted trailing question block (see
55
+ * {@link extractProseQuestion}); for a structured harness question it is the
56
+ * agent-supplied question text, unchanged.
57
+ */
52
58
  text: string;
53
59
  reason: AwaitingReason;
54
60
  options?: QuestionOption[];
61
+ /**
62
+ * Optional preceding prose for a prose question — the report/explanation that
63
+ * came BEFORE the trailing ask, with its Markdown and newlines preserved so a
64
+ * consumer can render it as context under the question. Absent for a structured
65
+ * harness question and when a prose question carries no preceding context.
66
+ */
67
+ context?: string;
55
68
  }
56
69
  export interface DetectedPr {
57
70
  url: string;
@@ -139,7 +152,7 @@ export interface SessionState {
139
152
  /** Displayable files/screenshots attached to the session prompt. */
140
153
  attachments?: SessionAttachment[];
141
154
  }
142
- export interface StateContext {
155
+ interface StateContext {
143
156
  /** Session file mtime; drives running-vs-stale. */
144
157
  mtimeMs?: number;
145
158
  cwd?: string;
@@ -196,13 +209,6 @@ export declare function isTicketCreateTool(name?: string, command?: string): boo
196
209
  * take `#<number>`. Returns undefined when neither shape is present.
197
210
  */
198
211
  export declare function extractCreatedTicket(text?: string): string | undefined;
199
- /**
200
- * Pull the plan markdown out of an `ExitPlanMode` tool_use event's args. The
201
- * Claude tool schema is `{ plan: string }`; the transcript parser already
202
- * lifts `input` onto `event.args`. Returns undefined for a missing/empty plan
203
- * so consumers can rely on `plan?: string` truthiness.
204
- */
205
- export declare function extractPlanText(args?: Record<string, any>): string | undefined;
206
212
  /**
207
213
  * Structured question from a Claude `AskUserQuestion` tool call. Its input is
208
214
  * `{ questions: [{ question, header, options: [{label, description}] }] }` and the
@@ -212,6 +218,33 @@ export declare function extractPlanText(args?: Record<string, any>): string | un
212
218
  * 1-based selection digit as `key`.
213
219
  */
214
220
  export declare function structuredQuestionFromAsk(args?: Record<string, any>): StructuredQuestion | undefined;
221
+ /** The separated question the CLI shows: the trailing ask + optional preceding context. */
222
+ export interface ProseQuestion {
223
+ /** The trailing ask, with its original Markdown and line breaks. */
224
+ text: string;
225
+ /** The preceding report/explanation, Markdown + newlines preserved; absent when none. */
226
+ context?: string;
227
+ }
228
+ /**
229
+ * Split a run of prose into its trailing QUESTION and the CONTEXT before it,
230
+ * instead of flattening a whole report into one line (the old `oneLine(content)`
231
+ * that copied a merged report and lost its Markdown). Returns undefined when the
232
+ * text has no real trailing ask.
233
+ *
234
+ * Rules, each pinned by a test:
235
+ * - The ask must be TRAILING: the last eligible non-empty line is the question,
236
+ * or the search stops (a report line after the question means it isn't the ask).
237
+ * - A `?` that lives ONLY inside a fenced code block, an inline `code` span, or a
238
+ * `>` blockquote does NOT count — those lines are ineligible to end the ask
239
+ * (they still ride along in `context`).
240
+ * - Multiple/multiline related asks are kept together (a contiguous run of
241
+ * question / list-item / `:`-lead-in lines), never dropped.
242
+ * - When the ask shares ONE line with preceding prose, the leading non-question
243
+ * sentences peel into `context` and only the trailing question sentence(s) stay
244
+ * in `text`.
245
+ * - Both fields preserve newlines and Markdown.
246
+ */
247
+ export declare function extractProseQuestion(raw: string): ProseQuestion | undefined;
215
248
  /**
216
249
  * Infer live activity + a preview from a chronological event slice. `pr` /
217
250
  * `ticket` / `worktree` are attached by `inferSessionState`; this focuses on the
@@ -15,6 +15,7 @@
15
15
  * shape + mtime — same function, driven off the normalized events.
16
16
  */
17
17
  import * as path from 'path';
18
+ import { Lexer } from 'marked';
18
19
  import { isCompletedTodoStatus, SNAPSHOT_TODO_TOOLS, summarizeToolUse } from './parse.js';
19
20
  import { isShellExecTool } from './shell-programs.js';
20
21
  import { classifyFileChanges } from './digest.js';
@@ -367,7 +368,7 @@ export function extractCreatedTicket(text) {
367
368
  * lifts `input` onto `event.args`. Returns undefined for a missing/empty plan
368
369
  * so consumers can rely on `plan?: string` truthiness.
369
370
  */
370
- export function extractPlanText(args) {
371
+ function extractPlanText(args) {
371
372
  const plan = args?.plan;
372
373
  if (typeof plan !== 'string')
373
374
  return undefined;
@@ -432,13 +433,110 @@ function eventStampMs(e, mtimeMs) {
432
433
  return ms;
433
434
  }
434
435
  /** Does an assistant message read as a question directed at the user? */
435
- function looksLikeQuestion(text) {
436
- const t = text.trim();
437
- if (!t)
438
- return false;
439
- // Only weigh the final line — a long answer that ends with a question is a question.
440
- const lastLine = t.split('\n').filter(Boolean).pop() ?? t;
441
- return QUESTION_TRAILING.test(lastLine) || QUESTION_PHRASE.test(lastLine);
436
+ /** Strip inline-code spans so a `?` living only inside `code` never reads as a question. */
437
+ function stripInlineCode(s) {
438
+ return s.replace(/`[^`]*`/g, '');
439
+ }
440
+ /** Whether one line's prose ENDS an ask (trailing '?' or an interrogative phrase). */
441
+ function lineIsQuestion(line) {
442
+ const probe = stripInlineCode(line.trim());
443
+ return QUESTION_TRAILING.test(probe) || QUESTION_PHRASE.test(probe);
444
+ }
445
+ /**
446
+ * Split a run of prose into its trailing QUESTION and the CONTEXT before it,
447
+ * instead of flattening a whole report into one line (the old `oneLine(content)`
448
+ * that copied a merged report and lost its Markdown). Returns undefined when the
449
+ * text has no real trailing ask.
450
+ *
451
+ * Rules, each pinned by a test:
452
+ * - The ask must be TRAILING: the last eligible non-empty line is the question,
453
+ * or the search stops (a report line after the question means it isn't the ask).
454
+ * - A `?` that lives ONLY inside a fenced code block, an inline `code` span, or a
455
+ * `>` blockquote does NOT count — those lines are ineligible to end the ask
456
+ * (they still ride along in `context`).
457
+ * - Multiple/multiline related asks are kept together (a contiguous run of
458
+ * question / list-item / `:`-lead-in lines), never dropped.
459
+ * - When the ask shares ONE line with preceding prose, the leading non-question
460
+ * sentences peel into `context` and only the trailing question sentence(s) stay
461
+ * in `text`.
462
+ * - Both fields preserve newlines and Markdown.
463
+ */
464
+ export function extractProseQuestion(raw) {
465
+ const content = (raw ?? '').replace(/\r\n/g, '\n');
466
+ if (!content.trim())
467
+ return undefined;
468
+ const lines = content.split('\n');
469
+ // Mark lines that may NOT end the ask: fenced-code (delimiters + body) and
470
+ // blockquotes. They remain part of context; they just can't BE the question.
471
+ const eligible = [];
472
+ let fence;
473
+ for (const line of lines) {
474
+ const t = line.trim();
475
+ const delimiter = /^(`{3,}|~{3,})(.*)$/.exec(t);
476
+ if (fence) {
477
+ if (delimiter && delimiter[1][0] === fence.marker && delimiter[1].length >= fence.length && !delimiter[2].trim())
478
+ fence = undefined;
479
+ eligible.push(false);
480
+ continue;
481
+ }
482
+ if (delimiter) {
483
+ fence = { marker: delimiter[1][0], length: delimiter[1].length };
484
+ eligible.push(false);
485
+ continue;
486
+ }
487
+ eligible.push(!/^>/.test(t)); // blockquote line is ineligible
488
+ }
489
+ // The trailing ask: the last eligible non-empty line must itself be a question.
490
+ let qEnd = -1;
491
+ for (let i = lines.length - 1; i >= 0; i--) {
492
+ if (!eligible[i] || !lines[i].trim())
493
+ continue;
494
+ if (lineIsQuestion(lines[i]))
495
+ qEnd = i;
496
+ break; // first eligible non-empty line from the end decides it
497
+ }
498
+ if (qEnd === -1)
499
+ return undefined;
500
+ // Expand upward over contiguous eligible non-empty ask/lead-in lines so a
501
+ // multi-line ask ("Questions:\n- A?\n- B?") stays whole.
502
+ let blockStart = qEnd;
503
+ for (let i = qEnd - 1; i >= 0; i--) {
504
+ if (!eligible[i])
505
+ break;
506
+ if (!lines[i].trim())
507
+ break; // blank line ends the paragraph/block
508
+ blockStart = i;
509
+ }
510
+ const contextAbove = lines.slice(0, blockStart).join('\n').trim();
511
+ let block = lines.slice(blockStart, qEnd + 1).join('\n').trim();
512
+ // Only plain text can contribute a sentence boundary. Code, links and other
513
+ // inline Markdown remain whole, even when their content contains punctuation.
514
+ let inlineContext = '';
515
+ if (!/^\s*(?:[-*]|\d+[.)])\s/m.test(block)) {
516
+ const boundaries = [];
517
+ let offset = 0;
518
+ for (const token of Lexer.lexInline(block)) {
519
+ if (token.type === 'text') {
520
+ for (const match of token.raw.matchAll(/(?<=[.!?])\s+/g))
521
+ boundaries.push(offset + match.index + match[0].length);
522
+ }
523
+ offset += token.raw.length;
524
+ }
525
+ const starts = [0, ...boundaries];
526
+ const sentences = starts.map((start, i) => block.slice(start, starts[i + 1] ?? block.length));
527
+ let firstQ = sentences.length - 1;
528
+ for (let i = sentences.length - 1; i >= 0; i--) {
529
+ if (lineIsQuestion(sentences[i]))
530
+ firstQ = i;
531
+ else
532
+ break;
533
+ }
534
+ inlineContext = sentences.slice(0, firstQ).join('').trim();
535
+ block = sentences.slice(firstQ).join('').trim();
536
+ }
537
+ const trailingContext = lines.slice(qEnd + 1).join('\n').trim();
538
+ const context = [contextAbove, inlineContext, trailingContext].filter(Boolean).join('\n\n').trim() || undefined;
539
+ return { text: block, context };
442
540
  }
443
541
  /** Human-readable one-liner for the latest event (message text or tool action). */
444
542
  function describeEvent(e) {
@@ -559,9 +657,12 @@ export function inferActivity(events, ctx = {}) {
559
657
  // kept the question forever).
560
658
  const askedAtMs = eventStampMs(last, ctx.mtimeMs) ?? ctx.mtimeMs;
561
659
  const questionFresh = askedAtMs != null && nowMs - askedAtMs < PROSE_QUESTION_FRESH_MS;
562
- if (questionFresh && looksLikeQuestion(last.content ?? '')) {
563
- const text = oneLine(last.content ?? '');
564
- return { ...base, activity: 'waiting_input', awaitingReason: 'question', question: { text, reason: 'question' } };
660
+ const prose = questionFresh ? extractProseQuestion(last.content ?? '') : undefined;
661
+ if (prose) {
662
+ const question = { text: prose.text, reason: 'question' };
663
+ if (prose.context)
664
+ question.context = prose.context;
665
+ return { ...base, activity: 'waiting_input', awaitingReason: 'question', question };
565
666
  }
566
667
  return { ...base, activity: 'idle' };
567
668
  }
@@ -1,3 +1,4 @@
1
1
  import type { SessionAgentId } from './types.js';
2
- export type StreamLineRenderer = (line: string) => string | null;
2
+ type StreamLineRenderer = (line: string) => string | null;
3
3
  export declare function makeStreamRenderer(agent: SessionAgentId, cwd?: string): StreamLineRenderer;
4
+ export {};
@@ -67,8 +67,6 @@ export declare const SYNC_AGENTS: SyncAgentSpec[];
67
67
  * by session id so a session present in multiple version homes is uploaded once.
68
68
  */
69
69
  export declare function listLocalTranscripts(spec: SyncAgentSpec): LocalTranscript[];
70
- /** Session ids this machine holds locally (live home), used to skip mirror writes. */
71
- export declare function localSessionIds(spec: SyncAgentSpec): Set<string>;
72
70
  /**
73
71
  * Absolute mirror path for a remote machine's transcript — lands in a scan root.
74
72
  *
@@ -90,7 +88,5 @@ export declare function mirrorPath(spec: SyncAgentSpec, machine: string, relKey:
90
88
  * one object per constituent file of the session directory.
91
89
  */
92
90
  export declare function objectKey(machine: string, agentId: string, sessionId: string, relKey?: string): string;
93
- /** R2 object key for a machine's manifest. */
94
- export declare function manifestKey(machine: string): string;
95
91
  /** Prefix under which all machine manifests live (for discovery). */
96
92
  export declare const SESSIONS_PREFIX = "sessions/";
Binary file
@@ -24,10 +24,9 @@
24
24
  */
25
25
  import { type PhoenixSession } from '../../identity/client.js';
26
26
  import { type R2Config } from './config.js';
27
- export type SessionsBackendKind = 'managed' | 'byo';
28
27
  /** Env var that forces the BYO path. Value must be exactly `byo`. */
29
28
  export declare const SESSIONS_BACKEND_ENV = "AGENTS_SESSIONS_BACKEND";
30
- export interface ManagedSessionsBackend {
29
+ interface ManagedSessionsBackend {
31
30
  kind: 'managed';
32
31
  /** Public base URL of the managed sessions Worker, no trailing slash. */
33
32
  baseUrl: string;
@@ -36,13 +35,13 @@ export interface ManagedSessionsBackend {
36
35
  /** Phoenix userId — the object-store namespace prefix (path segment 0). */
37
36
  userId: string;
38
37
  }
39
- export interface ByoSessionsBackend {
38
+ interface ByoSessionsBackend {
40
39
  kind: 'byo';
41
40
  /** The resolved r2.backups credentials for the S3-compatible client. */
42
41
  r2: R2Config;
43
42
  }
44
- export type SessionsBackend = ManagedSessionsBackend | ByoSessionsBackend;
45
- export interface ResolveSessionsBackendOpts {
43
+ type SessionsBackend = ManagedSessionsBackend | ByoSessionsBackend;
44
+ interface ResolveSessionsBackendOpts {
46
45
  /** Force the BYO r2.backups path even when signed in. */
47
46
  byo?: boolean;
48
47
  /** DI seam — a static write token selects BYO (tests / self-host). */
@@ -59,3 +58,4 @@ export declare function shouldUseManagedSessions(opts?: ResolveSessionsBackendOp
59
58
  * lives here, not in the shared policy.
60
59
  */
61
60
  export declare function resolveSessionsBackend(opts?: ResolveSessionsBackendOpts): SessionsBackend;
61
+ export {};
@@ -17,13 +17,5 @@ export declare const DEFAULT_SESSIONS_DOMAIN = "sessions.agents-cli.sh";
17
17
  export declare const DEFAULT_SESSIONS_WORKER_NAME = "agents-sessions";
18
18
  /** R2 bucket name backing the managed sessions Worker. */
19
19
  export declare const DEFAULT_SESSIONS_BUCKET_NAME = "agents-sessions";
20
- /** Isolated Cloudflare resources for the managed session-backup store. */
21
- export interface SessionsConfig {
22
- baseUrl: string;
23
- accountId: string;
24
- workerName: string;
25
- bucketName: string;
26
- domain?: string;
27
- }
28
20
  /** Public base URL of the managed sessions Worker, no trailing slash. */
29
21
  export declare function managedSessionsBaseUrl(): string;
@@ -31,8 +31,6 @@ export declare const ESCROW_REL_KEY = "__key/backup-dek";
31
31
  export declare function backupKeyCachePath(): string;
32
32
  /** The DEK cached locally for this Phoenix user, or null. */
33
33
  export declare function readCachedBackupKey(userId: string): Buffer | null;
34
- /** Persist a DEK (base64) for this Phoenix user in the local 0600 cache. */
35
- export declare function cacheBackupKey(userId: string, b64: string): void;
36
34
  /**
37
35
  * Resolve the managed backup DEK for `userId`, minting + escrowing one on first
38
36
  * use. NEVER returns null — the managed path must not upload plaintext.
@@ -66,7 +66,7 @@ export function readCachedBackupKey(userId) {
66
66
  return decodeDek(readCache()[userId]);
67
67
  }
68
68
  /** Persist a DEK (base64) for this Phoenix user in the local 0600 cache. */
69
- export function cacheBackupKey(userId, b64) {
69
+ function cacheBackupKey(userId, b64) {
70
70
  const file = backupKeyCachePath();
71
71
  fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
72
72
  ensureLockTarget(file, '{}', 0o700);
@@ -10,7 +10,7 @@
10
10
  * Linux-only; rclone-mount needs macFUSE).
11
11
  */
12
12
  import type { R2Config } from './config.js';
13
- export interface HeadResult {
13
+ interface HeadResult {
14
14
  size: number;
15
15
  etag: string;
16
16
  }
@@ -35,3 +35,6 @@ export declare class R2Client {
35
35
  * {@link SessionsBackupClient} interface (managed lists with no prefix). */
36
36
  list(prefix?: string): Promise<string[]>;
37
37
  }
38
+ /** Single pass: sequential replaces would double-decode `&amp;lt;` into `<`. */
39
+ export declare function decodeXml(s: string): string;
40
+ export {};
@@ -108,13 +108,10 @@ export class R2Client {
108
108
  return keys;
109
109
  }
110
110
  }
111
- function decodeXml(s) {
112
- return s
113
- .replace(/&amp;/g, '&')
114
- .replace(/&lt;/g, '<')
115
- .replace(/&gt;/g, '>')
116
- .replace(/&quot;/g, '"')
117
- .replace(/&apos;/g, "'");
111
+ const XML_ENTITIES = { '&amp;': '&', '&lt;': '<', '&gt;': '>', '&quot;': '"', '&apos;': "'" };
112
+ /** Single pass: sequential replaces would double-decode `&amp;lt;` into `<`. */
113
+ export function decodeXml(s) {
114
+ return s.replace(/&(?:amp|lt|gt|quot|apos);/g, (entity) => XML_ENTITIES[entity] ?? entity);
118
115
  }
119
116
  async function safeText(res) {
120
117
  try {
@@ -25,7 +25,7 @@
25
25
  */
26
26
  import type { R2Config } from './config.js';
27
27
  /** Serialized envelope stored as the R2 object body when encryption is on. */
28
- export interface TranscriptEnvelope {
28
+ interface TranscriptEnvelope {
29
29
  /** Envelope format version. */
30
30
  v: 1;
31
31
  alg: 'aes-256-gcm';
@@ -75,3 +75,4 @@ export declare function decryptEnvelope(envelope: TranscriptEnvelope, key: Buffe
75
75
  * - Plaintext body → returned verbatim (legacy/unencrypted object).
76
76
  */
77
77
  export declare function decryptTranscriptBody(body: string, key: Buffer | null): string;
78
+ export {};
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import type { SessionAgentId, SessionEvent } from './types.js';
11
11
  /** A tail read: the last few normalized events plus the raw text they came from. */
12
- export interface SessionTail {
12
+ interface SessionTail {
13
13
  events: SessionEvent[];
14
14
  /** The raw JSONL chunk (leading partial line dropped), for content-level math. */
15
15
  content: string;
@@ -35,3 +35,4 @@ export declare function readSessionTailWithRaw(filePath: string, agent: SessionA
35
35
  * wrapper over {@link readSessionTailWithRaw} for callers that only need events.
36
36
  */
37
37
  export declare function readSessionTail(filePath: string, agent: SessionAgentId, maxBytes?: number, maxEvents?: number): SessionEvent[];
38
+ export {};
@@ -40,7 +40,7 @@ export declare function _resetTeamOriginIndex(): void;
40
40
  */
41
41
  export declare function enrichTeamOrigins(sessions: SessionMeta[]): SessionMeta[];
42
42
  /** Result of splitting sessions into visible and hidden (team-origin) groups. */
43
- export interface FilterResult {
43
+ interface FilterResult {
44
44
  visible: SessionMeta[];
45
45
  hiddenCount: number;
46
46
  }
@@ -0,0 +1,27 @@
1
+ import assert from 'node:assert/strict';
2
+ import fs from 'node:fs';
3
+ import { prunePidSessionRegistry, readPidSessionEntry, writePidSessionEntry } from '../pid-registry.js';
4
+ import { getActiveSessions } from '../active.js';
5
+ import { loadLocalActiveSessions, loadFleetActiveSessions, writeActiveSessionsCache, updateImmutableMemos, readActiveSessionsCache } from '../session-cache.js';
6
+ // Invoked only by the isolated-HOME test fork, inside a real unshare namespace.
7
+ const hostPid = Number(process.argv[2]);
8
+ // Names convey no authority: this is PID 1 with its own procfs in one variant.
9
+ fs.writeFileSync('/proc/self/comm', 'init');
10
+ assert.equal(readPidSessionEntry(hostPid)?.sessionId, 'host-session');
11
+ assert.throws(() => process.kill(hostPid, 0), { code: 'ESRCH' });
12
+ writePidSessionEntry({ pid: hostPid, agent: 'codex', sessionId: 'namespace-collision', startedAtMs: Date.now() });
13
+ assert.equal(readPidSessionEntry(hostPid)?.sessionId, 'host-session');
14
+ prunePidSessionRegistry(() => false);
15
+ assert.equal(readPidSessionEntry(hostPid)?.sessionId, 'host-session');
16
+ const local = await loadLocalActiveSessions({ forceRefresh: true, gather: async () => { throw new Error('partial gather must never run'); } });
17
+ assert.equal(local.sessions[0].sessionId, 'host-session');
18
+ assert.equal(local.capturedAt, 1);
19
+ assert.equal(local.servedFromCache, true);
20
+ const fleet = await loadFleetActiveSessions({ forceRefresh: true, gather: async () => { throw new Error('partial fleet gather must never run'); } });
21
+ assert.equal(fleet.remoteDeviceCount, 2);
22
+ assert.equal(fleet.capturedAt, 1);
23
+ assert.equal((await getActiveSessions())[0].sessionId, 'host-session');
24
+ assert.throws(() => writeActiveSessionsCache('local', []), /process namespace/);
25
+ assert.throws(() => updateImmutableMemos([]), /process namespace/);
26
+ assert.equal(readActiveSessionsCache('local')?.capturedAt, 1);
27
+ console.log('host pid: ESRCH; overwrite: refused; registry and snapshots: retained');
@@ -0,0 +1,56 @@
1
+ import fs from 'node:fs';
2
+ import { spawnSync } from 'node:child_process';
3
+ import { getTerminalsDir } from '../../state.js';
4
+ import { hostProcessView, requireWriterProcessView, recordDaemonProcessView } from '../process-view.js';
5
+ const mode = process.argv[2];
6
+ try {
7
+ if (mode === 'hook-first') {
8
+ const hook = process.env.AGENTS_SESSION_IDENTITY_TEST_HOOK;
9
+ const child = hook
10
+ ? spawnSync('bash', [hook], { input: JSON.stringify({ session_id: 'init-hook', cwd: process.cwd() }), encoding: 'utf8', env: process.env })
11
+ : spawnSync('bun', [import.meta.filename, 'once'], { encoding: 'utf8', env: process.env });
12
+ if (child.status !== 0)
13
+ throw new Error(child.stderr);
14
+ if (!fs.existsSync(`${getTerminalsDir()}/process-view.json`))
15
+ throw new Error('child did not enroll its namespace');
16
+ }
17
+ if (mode === 'daemon')
18
+ recordDaemonProcessView();
19
+ if (mode === 'read') {
20
+ console.log(hostProcessView() ? 'owned' : 'unowned');
21
+ process.exit(0);
22
+ }
23
+ if (mode === 'publish' || mode === 'snapshot') {
24
+ const { loadLocalActiveSessions, loadFleetActiveSessions, writeActiveSessionsCache } = await import('../session-cache.js');
25
+ if (mode === 'publish') {
26
+ writeActiveSessionsCache('local', [], { capturedAt: 1 });
27
+ writeActiveSessionsCache('fleet', [], { capturedAt: 1 });
28
+ }
29
+ else {
30
+ const gather = async () => { throw new Error('foreign observer gathered'); };
31
+ const local = await loadLocalActiveSessions({ forceRefresh: true, gather });
32
+ const fleet = await loadFleetActiveSessions({ forceRefresh: true, gather });
33
+ if (!local.servedFromCache || !fleet.servedFromCache || local.capturedAt !== 1 || fleet.capturedAt !== 1)
34
+ throw new Error('foreign snapshot changed');
35
+ console.log('observed');
36
+ process.exit(0);
37
+ }
38
+ }
39
+ if (mode === 'sessions') {
40
+ const { loadLocalActiveSessions } = await import('../session-cache.js');
41
+ const result = await loadLocalActiveSessions({ forceRefresh: true });
42
+ if (result.servedFromCache || !Array.isArray(result.sessions))
43
+ throw new Error('cold discovery did not run');
44
+ }
45
+ requireWriterProcessView();
46
+ console.log('owned');
47
+ if (mode === 'hold' || mode === 'hook-first') {
48
+ process.on('SIGTERM', () => process.exit(0));
49
+ setInterval(() => { }, 1000);
50
+ }
51
+ }
52
+ catch (error) {
53
+ console.error(error.message);
54
+ console.log('denied');
55
+ process.exitCode = 2;
56
+ }
@@ -0,0 +1,12 @@
1
+ import assert from 'node:assert/strict';
2
+ import fs from 'node:fs';
3
+ import { writePidSessionEntry, readLivePidSessionEntry } from '../pid-registry.js';
4
+ import { writeActiveSessionsCache, readActiveSessionsCache } from '../session-cache.js';
5
+ // A container owns its private home regardless of the name of PID 1.
6
+ assert.equal(process.pid, 1);
7
+ fs.writeFileSync('/proc/self/comm', process.argv[2]);
8
+ writePidSessionEntry({ pid: process.pid, agent: 'codex', sessionId: 'private-home', startedAtMs: Date.now() });
9
+ assert.equal(readLivePidSessionEntry(process.pid)?.sessionId, 'private-home');
10
+ writeActiveSessionsCache('local', [{ context: 'headless', kind: 'codex', sessionId: 'private-home', status: 'running' }]);
11
+ assert.equal(readActiveSessionsCache('local')?.sessions[0]?.sessionId, 'private-home');
12
+ console.log('private home: registry and snapshot published');