@phnx-labs/agents-cli 1.22.113 → 1.22.115

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 (802) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/README.md +32 -113
  3. package/dist/browser.js +0 -0
  4. package/dist/cli/command-registry.d.ts +0 -60
  5. package/dist/cli/command-registry.js +57 -66
  6. package/dist/commands/accounts.d.ts +3 -77
  7. package/dist/commands/accounts.js +13 -366
  8. package/dist/commands/apply.d.ts +0 -4
  9. package/dist/commands/apply.js +3 -3
  10. package/dist/commands/audit.js +1 -1
  11. package/dist/commands/auth.js +0 -2
  12. package/dist/commands/browser-picker.d.ts +3 -6
  13. package/dist/commands/browser-picker.js +2 -2
  14. package/dist/commands/browser-sessions-picker.d.ts +2 -1
  15. package/dist/commands/browser.d.ts +53 -0
  16. package/dist/commands/browser.js +199 -9
  17. package/dist/commands/computer-sessions-picker.d.ts +2 -1
  18. package/dist/commands/computer.d.ts +14 -19
  19. package/dist/commands/computer.js +65 -10
  20. package/dist/commands/config.js +46 -2
  21. package/dist/commands/daemon.d.ts +0 -23
  22. package/dist/commands/daemon.js +1 -1
  23. package/dist/commands/detach-core.d.ts +2 -1
  24. package/dist/commands/detach.d.ts +0 -3
  25. package/dist/commands/detach.js +3 -3
  26. package/dist/commands/doctor.d.ts +2 -3
  27. package/dist/commands/doctor.js +0 -11
  28. package/dist/commands/events.d.ts +1 -3
  29. package/dist/commands/events.js +4 -7
  30. package/dist/commands/exec.d.ts +0 -1
  31. package/dist/commands/exec.js +2 -7
  32. package/dist/commands/feed-watch.js +52 -8
  33. package/dist/commands/feed.d.ts +3 -3
  34. package/dist/commands/feed.js +1 -1
  35. package/dist/commands/focus.d.ts +4 -4
  36. package/dist/commands/focus.js +1 -1
  37. package/dist/commands/go.d.ts +0 -17
  38. package/dist/commands/go.js +2 -19
  39. package/dist/commands/harness-hooks.d.ts +0 -7
  40. package/dist/commands/harness-hooks.js +1 -1
  41. package/dist/commands/harness-wizard.d.ts +2 -2
  42. package/dist/commands/harness.d.ts +3 -8
  43. package/dist/commands/harness.js +1 -1
  44. package/dist/commands/inspect.d.ts +2 -3
  45. package/dist/commands/inspect.js +1 -1
  46. package/dist/commands/logs.js +1 -1
  47. package/dist/commands/mcp.js +8 -83
  48. package/dist/commands/memory.js +4 -47
  49. package/dist/commands/message.d.ts +1 -1
  50. package/dist/commands/message.js +7 -7
  51. package/dist/commands/plugins.js +1 -93
  52. package/dist/commands/projects.d.ts +2 -18
  53. package/dist/commands/projects.js +89 -3
  54. package/dist/commands/repo.js +0 -44
  55. package/dist/commands/resource-view.d.ts +3 -2
  56. package/dist/commands/resume.d.ts +0 -1
  57. package/dist/commands/resume.js +5 -2
  58. package/dist/commands/routines.d.ts +1 -3
  59. package/dist/commands/routines.js +1 -1
  60. package/dist/commands/run-account-picker.d.ts +2 -1
  61. package/dist/commands/run-broadcast.d.ts +2 -1
  62. package/dist/commands/run-device-picker.d.ts +2 -1
  63. package/dist/commands/secrets-passthrough.d.ts +14 -0
  64. package/dist/commands/secrets-passthrough.js +23 -4
  65. package/dist/commands/send.d.ts +4 -4
  66. package/dist/commands/send.js +6 -51
  67. package/dist/commands/sessions-backfill.d.ts +2 -35
  68. package/dist/commands/sessions-backfill.js +1 -1
  69. package/dist/commands/sessions-backup-setup.js +1 -1
  70. package/dist/commands/sessions-bookmark.d.ts +0 -10
  71. package/dist/commands/sessions-bookmark.js +1 -1
  72. package/dist/commands/sessions-inject.d.ts +2 -3
  73. package/dist/commands/sessions-inject.js +8 -17
  74. package/dist/commands/sessions-picker-factory.d.ts +4 -14
  75. package/dist/commands/sessions-picker-factory.js +2 -2
  76. package/dist/commands/sessions-picker.d.ts +3 -9
  77. package/dist/commands/sessions-picker.js +2 -2
  78. package/dist/commands/sessions-resume.d.ts +2 -4
  79. package/dist/commands/sessions-resume.js +0 -6
  80. package/dist/commands/sessions-share.d.ts +5 -7
  81. package/dist/commands/sessions-share.js +98 -49
  82. package/dist/commands/sessions-stats.d.ts +2 -1
  83. package/dist/commands/sessions-stop.d.ts +0 -3
  84. package/dist/commands/sessions-stop.js +1 -1
  85. package/dist/commands/sessions-tail.d.ts +2 -1
  86. package/dist/commands/sessions-trace.d.ts +4 -6
  87. package/dist/commands/sessions-trace.js +1 -1
  88. package/dist/commands/sessions.d.ts +13 -104
  89. package/dist/commands/sessions.js +11 -18
  90. package/dist/commands/setup-browser.js +18 -2
  91. package/dist/commands/setup-computer.js +20 -6
  92. package/dist/commands/setup-mine.d.ts +0 -6
  93. package/dist/commands/setup-mine.js +1 -1
  94. package/dist/commands/setup-secrets.js +24 -4
  95. package/dist/commands/setup-terminal.d.ts +3 -0
  96. package/dist/commands/setup-terminal.js +22 -0
  97. package/dist/commands/setup.d.ts +3 -4
  98. package/dist/commands/setup.js +21 -11
  99. package/dist/commands/skills.js +0 -8
  100. package/dist/commands/ssh.d.ts +6 -0
  101. package/dist/commands/ssh.js +92 -233
  102. package/dist/commands/sync.js +14 -5
  103. package/dist/commands/teams-picker.d.ts +2 -5
  104. package/dist/commands/teams-picker.js +2 -2
  105. package/dist/commands/teams.d.ts +1 -7
  106. package/dist/commands/teams.js +2 -2
  107. package/dist/commands/tmux.d.ts +1 -1
  108. package/dist/commands/tmux.js +1 -1
  109. package/dist/commands/traces.js +1 -1
  110. package/dist/commands/upgrade.d.ts +2 -1
  111. package/dist/commands/utils.d.ts +1 -1
  112. package/dist/commands/utils.js +1 -1
  113. package/dist/lib/account-capabilities.d.ts +2 -1
  114. package/dist/lib/account-catalog.d.ts +4 -13
  115. package/dist/lib/account-catalog.js +1 -1
  116. package/dist/lib/account-registry.d.ts +3 -4
  117. package/dist/lib/account-registry.js +1 -1
  118. package/dist/lib/accounting/account-launch.d.ts +4 -3
  119. package/dist/lib/accounting/account-pool.d.ts +2 -1
  120. package/dist/lib/accounting/rotate.d.ts +3 -9
  121. package/dist/lib/accounting/rotate.js +2 -14
  122. package/dist/lib/accounting/usage-sync.d.ts +5 -4
  123. package/dist/lib/accounting/usage.d.ts +7 -31
  124. package/dist/lib/accounting/usage.js +4 -4
  125. package/dist/lib/accounts/add.d.ts +0 -5
  126. package/dist/lib/accounts/add.js +1 -7
  127. package/dist/lib/accounts/migrate.d.ts +8 -8
  128. package/dist/lib/accounts/migrate.js +1 -1
  129. package/dist/lib/acp/client.d.ts +3 -2
  130. package/dist/lib/acp/harnesses.d.ts +2 -2
  131. package/dist/lib/acp/harnesses.js +1 -1
  132. package/dist/lib/acp/run.d.ts +2 -1
  133. package/dist/lib/actor.d.ts +3 -2
  134. package/dist/lib/add-dir.d.ts +2 -17
  135. package/dist/lib/add-dir.js +2 -6
  136. package/dist/lib/address.d.ts +56 -0
  137. package/dist/lib/address.js +143 -0
  138. package/dist/lib/agent-spec/agents.d.ts +12 -28
  139. package/dist/lib/agent-spec/agents.js +2 -6
  140. package/dist/lib/agent-spec/primitives.d.ts +0 -7
  141. package/dist/lib/agent-spec/primitives.js +0 -6
  142. package/dist/lib/agent-spec/types.d.ts +2 -1
  143. package/dist/lib/analytics/dashboard.d.ts +1 -5
  144. package/dist/lib/analytics/dashboard.js +0 -2
  145. package/dist/lib/analytics/mix-commands.d.ts +0 -7
  146. package/dist/lib/analytics/mix-commands.js +3 -3
  147. package/dist/lib/analytics/recipes.d.ts +0 -12
  148. package/dist/lib/analytics/recipes.js +7 -31
  149. package/dist/lib/analytics/usage-db.d.ts +5 -32
  150. package/dist/lib/analytics/usage-db.js +1 -70
  151. package/dist/lib/answer-router.d.ts +7 -6
  152. package/dist/lib/answer-router.js +5 -11
  153. package/dist/lib/artifact-actions.d.ts +0 -4
  154. package/dist/lib/artifacts-client.d.ts +20 -0
  155. package/dist/lib/artifacts-client.js +46 -0
  156. package/dist/lib/ask-classifier.d.ts +3 -4
  157. package/dist/lib/ask-classifier.js +0 -7
  158. package/dist/lib/auth-health.d.ts +3 -46
  159. package/dist/lib/auth-health.js +3 -3
  160. package/dist/lib/auth-mint.d.ts +6 -6
  161. package/dist/lib/auth-mint.js +7 -7
  162. package/dist/lib/bench/runner.d.ts +2 -2
  163. package/dist/lib/bench/runner.js +1 -1
  164. package/dist/lib/bench/storage.d.ts +0 -1
  165. package/dist/lib/bench/storage.js +1 -1
  166. package/dist/lib/boot-profile.d.ts +0 -2
  167. package/dist/lib/boot-profile.js +0 -4
  168. package/dist/lib/brand.d.ts +0 -6
  169. package/dist/lib/brand.js +1 -1
  170. package/dist/lib/browser/arc-discovery.d.ts +4 -12
  171. package/dist/lib/browser/arc-discovery.js +1 -1
  172. package/dist/lib/browser/cdp.d.ts +1 -1
  173. package/dist/lib/browser/chrome.d.ts +2 -2
  174. package/dist/lib/browser/chrome.js +0 -4
  175. package/dist/lib/browser/chromium-discovery.d.ts +3 -2
  176. package/dist/lib/browser/drivers/arc.d.ts +3 -20
  177. package/dist/lib/browser/drivers/arc.js +2 -7
  178. package/dist/lib/browser/drivers/firefox.d.ts +2 -6
  179. package/dist/lib/browser/drivers/firefox.js +1 -1
  180. package/dist/lib/browser/drivers/local.d.ts +2 -1
  181. package/dist/lib/browser/drivers/ssh.d.ts +2 -3
  182. package/dist/lib/browser/drivers/ssh.js +0 -7
  183. package/dist/lib/browser/firefox-discovery.d.ts +4 -3
  184. package/dist/lib/browser/har.d.ts +8 -7
  185. package/dist/lib/browser/hygiene.d.ts +2 -3
  186. package/dist/lib/browser/hygiene.js +1 -1
  187. package/dist/lib/browser/ipc.d.ts +4 -3
  188. package/dist/lib/browser/ipc.js +1 -1
  189. package/dist/lib/browser/login-detection.d.ts +1 -8
  190. package/dist/lib/browser/registry.d.ts +2 -1
  191. package/dist/lib/browser/remote-control.d.ts +0 -7
  192. package/dist/lib/browser/remote-control.js +2 -2
  193. package/dist/lib/browser/resolve-target.d.ts +2 -6
  194. package/dist/lib/browser/resolve-target.js +3 -3
  195. package/dist/lib/browser/runtime-state.d.ts +59 -4
  196. package/dist/lib/browser/runtime-state.js +99 -18
  197. package/dist/lib/browser/service.d.ts +4 -4
  198. package/dist/lib/browser/service.js +21 -1
  199. package/dist/lib/browser/sessions-list.d.ts +0 -10
  200. package/dist/lib/browser/sessions-list.js +3 -3
  201. package/dist/lib/browser/stream.d.ts +2 -1
  202. package/dist/lib/browser/task-index.d.ts +4 -4
  203. package/dist/lib/browser/task-index.js +1 -1
  204. package/dist/lib/browser/types.d.ts +0 -20
  205. package/dist/lib/browser/types.js +1 -34
  206. package/dist/lib/browser/upload.d.ts +0 -27
  207. package/dist/lib/budget/ledger.d.ts +0 -2
  208. package/dist/lib/budget/ledger.js +1 -1
  209. package/dist/lib/budget/live-cloud.d.ts +2 -1
  210. package/dist/lib/budget/preflight.d.ts +3 -5
  211. package/dist/lib/budget/preflight.js +1 -1
  212. package/dist/lib/catchup.d.ts +2 -1
  213. package/dist/lib/channels/owner-forward.d.ts +5 -4
  214. package/dist/lib/channels/owner-sink.js +2 -2
  215. package/dist/lib/channels/providers/desktop.js +1 -1
  216. package/dist/lib/channels/providers/rush.d.ts +2 -1
  217. package/dist/lib/channels/registry.d.ts +1 -1
  218. package/dist/lib/channels/registry.js +1 -1
  219. package/dist/lib/channels/resolve.d.ts +3 -2
  220. package/dist/lib/channels/send.d.ts +5 -4
  221. package/dist/lib/cli-resources.d.ts +3 -9
  222. package/dist/lib/cli-resources.js +4 -2
  223. package/dist/lib/cloud/cursor.d.ts +1 -2
  224. package/dist/lib/cloud/cursor.js +1 -1
  225. package/dist/lib/cloud/dispatch.d.ts +2 -1
  226. package/dist/lib/cloud/dispatch.js +1 -1
  227. package/dist/lib/cloud/factory.d.ts +0 -2
  228. package/dist/lib/cloud/factory.js +1 -1
  229. package/dist/lib/cloud/rush.d.ts +3 -11
  230. package/dist/lib/cloud/rush.js +1 -1
  231. package/dist/lib/cloud/session-index.d.ts +2 -1
  232. package/dist/lib/cloud/types.d.ts +2 -1
  233. package/dist/lib/cloudflare/creds.d.ts +10 -0
  234. package/dist/lib/cloudflare/creds.js +46 -0
  235. package/dist/lib/cloudflare/provision.d.ts +35 -0
  236. package/dist/lib/cloudflare/provision.js +144 -0
  237. package/dist/lib/codex-policy.d.ts +2 -1
  238. package/dist/lib/commands.d.ts +7 -7
  239. package/dist/lib/commands.js +1 -1
  240. package/dist/lib/comms-render.d.ts +1 -1
  241. package/dist/lib/computer/context.d.ts +11 -3
  242. package/dist/lib/computer/context.js +2 -2
  243. package/dist/lib/computer/policy.d.ts +0 -12
  244. package/dist/lib/computer/policy.js +1 -1
  245. package/dist/lib/computer/sessions-list.d.ts +55 -0
  246. package/dist/lib/computer/sessions-list.js +168 -1
  247. package/dist/lib/computer-client.d.ts +3 -3
  248. package/dist/lib/computer-client.js +0 -1
  249. package/dist/lib/concurrency.d.ts +2 -1
  250. package/dist/lib/config-keys.d.ts +16 -3
  251. package/dist/lib/config-keys.js +47 -2
  252. package/dist/lib/convert.d.ts +0 -12
  253. package/dist/lib/convert.js +1 -12
  254. package/dist/lib/crabbox/cli.d.ts +6 -24
  255. package/dist/lib/crabbox/cli.js +2 -28
  256. package/dist/lib/crabbox/lease.d.ts +5 -6
  257. package/dist/lib/crabbox/lease.js +1 -1
  258. package/dist/lib/crabbox/progress.d.ts +2 -1
  259. package/dist/lib/crabbox/setup-copy.d.ts +2 -3
  260. package/dist/lib/crabbox/setup-copy.js +1 -1
  261. package/dist/lib/daemon/account-state-daemon-service.d.ts +1 -1
  262. package/dist/lib/daemon/attention-notify-service.d.ts +2 -1
  263. package/dist/lib/daemon/catchup-service.d.ts +2 -1
  264. package/dist/lib/daemon/daemon.d.ts +4 -4
  265. package/dist/lib/daemon/daemon.js +9 -2
  266. package/dist/lib/daemon/feed-stream-service.d.ts +23 -0
  267. package/dist/lib/daemon/feed-stream-service.js +40 -0
  268. package/dist/lib/daemon/harness-update-service.d.ts +2 -19
  269. package/dist/lib/daemon/harness-update-service.js +3 -3
  270. package/dist/lib/daemon/runner.d.ts +3 -3
  271. package/dist/lib/daemon/self-update-service.d.ts +1 -16
  272. package/dist/lib/daemon/self-update-service.js +6 -6
  273. package/dist/lib/daemon/state-dir-check-service.d.ts +2 -1
  274. package/dist/lib/daemon/supervisor.d.ts +3 -2
  275. package/dist/lib/daemon-services.d.ts +3 -2
  276. package/dist/lib/daemon-services.js +5 -0
  277. package/dist/lib/daemon-webhooks.d.ts +1 -1
  278. package/dist/lib/deeplink/register.d.ts +3 -13
  279. package/dist/lib/deeplink/register.js +3 -3
  280. package/dist/lib/deeplink/url.d.ts +3 -2
  281. package/dist/lib/device-config.d.ts +4 -15
  282. package/dist/lib/device-config.js +164 -8
  283. package/dist/lib/devices/connect.d.ts +51 -6
  284. package/dist/lib/devices/connect.js +169 -21
  285. package/dist/lib/devices/discovery-policy.d.ts +3 -2
  286. package/dist/lib/devices/doctor-findings.js +1 -1
  287. package/dist/lib/devices/doctor-overview-cache.d.ts +3 -2
  288. package/dist/lib/devices/fleet-divergence.d.ts +2 -1
  289. package/dist/lib/devices/fleet.d.ts +3 -4
  290. package/dist/lib/devices/fleet.js +1 -1
  291. package/dist/lib/devices/harness-inventory.d.ts +3 -2
  292. package/dist/lib/devices/health-report.d.ts +3 -2
  293. package/dist/lib/devices/health.d.ts +1 -8
  294. package/dist/lib/devices/health.js +1 -1
  295. package/dist/lib/devices/interactive-host.d.ts +0 -2
  296. package/dist/lib/devices/interactive-host.js +1 -1
  297. package/dist/lib/devices/known-hosts.d.ts +2 -20
  298. package/dist/lib/devices/known-hosts.js +2 -2
  299. package/dist/lib/devices/pool.d.ts +2 -1
  300. package/dist/lib/devices/resolve-target.d.ts +2 -2
  301. package/dist/lib/devices/rollout-verify.d.ts +3 -2
  302. package/dist/lib/devices/stats-cache.d.ts +3 -2
  303. package/dist/lib/devices/sync.d.ts +6 -5
  304. package/dist/lib/devices/worker-pick.d.ts +3 -12
  305. package/dist/lib/devices/worker-pick.js +1 -1
  306. package/dist/lib/diff-text.d.ts +2 -1
  307. package/dist/lib/doctor-diff.d.ts +2 -1
  308. package/dist/lib/drift-sync.d.ts +3 -2
  309. package/dist/lib/drift.d.ts +3 -3
  310. package/dist/lib/drift.js +1 -1
  311. package/dist/lib/event-families.d.ts +0 -6
  312. package/dist/lib/event-families.js +3 -3
  313. package/dist/lib/event-provenance.d.ts +2 -1
  314. package/dist/lib/events-ingest.d.ts +4 -3
  315. package/dist/lib/exec-account-home.d.ts +2 -4
  316. package/dist/lib/exec-account-home.js +1 -1
  317. package/dist/lib/exec-bounded.d.ts +3 -4
  318. package/dist/lib/exec-bounded.js +1 -1
  319. package/dist/lib/exec.d.ts +6 -18
  320. package/dist/lib/exec.js +1 -1
  321. package/dist/lib/factory/snapshot.d.ts +2 -2
  322. package/dist/lib/factory/snapshot.js +1 -1
  323. package/dist/lib/feed/activity-stream.d.ts +2 -5
  324. package/dist/lib/feed/activity-stream.js +2 -2
  325. package/dist/lib/feed/activity.d.ts +8 -33
  326. package/dist/lib/feed/activity.js +8 -8
  327. package/dist/lib/feed/answer.d.ts +3 -2
  328. package/dist/lib/feed/attention.js +5 -1
  329. package/dist/lib/feed/envelope.d.ts +79 -0
  330. package/dist/lib/feed/envelope.js +23 -0
  331. package/dist/lib/feed/events.d.ts +8 -47
  332. package/dist/lib/feed/events.js +9 -141
  333. package/dist/lib/feed/feed.d.ts +9 -42
  334. package/dist/lib/feed/feed.js +1 -60
  335. package/dist/lib/feed/hub-server.d.ts +86 -0
  336. package/dist/lib/feed/hub-server.js +334 -0
  337. package/dist/lib/feed/hub.d.ts +95 -0
  338. package/dist/lib/feed/hub.js +255 -0
  339. package/dist/lib/feed/pr-status.d.ts +0 -2
  340. package/dist/lib/feed/pr-status.js +1 -5
  341. package/dist/lib/feed/tool-activity.d.ts +108 -0
  342. package/dist/lib/feed/tool-activity.js +313 -0
  343. package/dist/lib/feed/tools.d.ts +198 -0
  344. package/dist/lib/feed/tools.js +265 -0
  345. package/dist/lib/feed/watch.d.ts +51 -52
  346. package/dist/lib/feed/watch.js +147 -17
  347. package/dist/lib/feed-broadcast.d.ts +5 -47
  348. package/dist/lib/feed-broadcast.js +9 -9
  349. package/dist/lib/feed-outcome.d.ts +3 -6
  350. package/dist/lib/feed-outcome.js +2 -2
  351. package/dist/lib/feed-policy.d.ts +5 -6
  352. package/dist/lib/feed-policy.js +2 -2
  353. package/dist/lib/feed-post.d.ts +3 -4
  354. package/dist/lib/feed-post.js +1 -1
  355. package/dist/lib/feed-ranking.d.ts +2 -2
  356. package/dist/lib/feed-ranking.js +1 -1
  357. package/dist/lib/fleet/apply.d.ts +5 -6
  358. package/dist/lib/fleet/apply.js +4 -4
  359. package/dist/lib/fleet/manifest.d.ts +2 -1
  360. package/dist/lib/fleet/remote-login.d.ts +18 -36
  361. package/dist/lib/fleet/remote-login.js +20 -19
  362. package/dist/lib/fleet/types.d.ts +0 -8
  363. package/dist/lib/fleet-cache.d.ts +1 -18
  364. package/dist/lib/fleet-cache.js +0 -5
  365. package/dist/lib/fleet-shared-repo-sync.d.ts +3 -3
  366. package/dist/lib/fleet-shared-repo-sync.js +1 -1
  367. package/dist/lib/fleet-shared-state.d.ts +3 -2
  368. package/dist/lib/format.d.ts +3 -2
  369. package/dist/lib/format.js +1 -1
  370. package/dist/lib/friction-heuristics.d.ts +2 -1
  371. package/dist/lib/fs-walk.d.ts +2 -1
  372. package/dist/lib/fuzzy.d.ts +2 -1
  373. package/dist/lib/gemini-settings.d.ts +0 -1
  374. package/dist/lib/gemini-settings.js +1 -1
  375. package/dist/lib/git.d.ts +7 -81
  376. package/dist/lib/git.js +2 -199
  377. package/dist/lib/github/gh-overload.d.ts +0 -4
  378. package/dist/lib/github/gh-overload.js +2 -2
  379. package/dist/lib/github/project-prs.d.ts +118 -0
  380. package/dist/lib/github/project-prs.js +173 -0
  381. package/dist/lib/github/rest.d.ts +2 -1
  382. package/dist/lib/harness/exec-config-version.d.ts +2 -1
  383. package/dist/lib/harness-auth-capabilities.d.ts +5 -4
  384. package/dist/lib/harness-connection-test.d.ts +2 -1
  385. package/dist/lib/heal.d.ts +3 -20
  386. package/dist/lib/heal.js +2 -39
  387. package/dist/lib/help.d.ts +3 -2
  388. package/dist/lib/helper-download.d.ts +0 -12
  389. package/dist/lib/helper-download.js +2 -2
  390. package/dist/lib/helper-versions.d.ts +2 -1
  391. package/dist/lib/helper-versions.js +1 -1
  392. package/dist/lib/hooks/install.d.ts +8 -49
  393. package/dist/lib/hooks/install.js +2 -96
  394. package/dist/lib/hooks/match.d.ts +2 -1
  395. package/dist/lib/hosts/credential-transport.d.ts +0 -2
  396. package/dist/lib/hosts/credential-transport.js +1 -1
  397. package/dist/lib/hosts/dispatch.d.ts +2 -24
  398. package/dist/lib/hosts/dispatch.js +2 -2
  399. package/dist/lib/hosts/logs.d.ts +2 -1
  400. package/dist/lib/hosts/passthrough.d.ts +1 -1
  401. package/dist/lib/hosts/passthrough.js +0 -1
  402. package/dist/lib/hosts/progress.d.ts +0 -5
  403. package/dist/lib/hosts/progress.js +1 -1
  404. package/dist/lib/hosts/ready.d.ts +3 -4
  405. package/dist/lib/hosts/ready.js +0 -8
  406. package/dist/lib/hosts/reconcile.d.ts +2 -8
  407. package/dist/lib/hosts/reconcile.js +1 -1
  408. package/dist/lib/hosts/reconnect.d.ts +4 -11
  409. package/dist/lib/hosts/reconnect.js +2 -2
  410. package/dist/lib/hosts/registry.d.ts +1 -1
  411. package/dist/lib/hosts/remote-cmd.d.ts +55 -4
  412. package/dist/lib/hosts/remote-cmd.js +125 -8
  413. package/dist/lib/hosts/remote-cmd.test-fixture.d.ts +2 -0
  414. package/dist/lib/hosts/remote-cmd.test-fixture.js +22 -0
  415. package/dist/lib/hosts/session-index.d.ts +3 -2
  416. package/dist/lib/hosts/ssh-config.d.ts +2 -3
  417. package/dist/lib/hosts/ssh-config.js +0 -10
  418. package/dist/lib/humans.d.ts +0 -2
  419. package/dist/lib/humans.js +2 -2
  420. package/dist/lib/import.d.ts +4 -3
  421. package/dist/lib/installations/installation-lock.d.ts +0 -2
  422. package/dist/lib/installations/installation-lock.js +2 -2
  423. package/dist/lib/installations/launch-gate.d.ts +0 -9
  424. package/dist/lib/installations/launch-gate.js +1 -1
  425. package/dist/lib/installations/migrate.d.ts +0 -11
  426. package/dist/lib/installations/migrate.js +1 -1
  427. package/dist/lib/installations/shims.d.ts +1 -1
  428. package/dist/lib/installations/shims.js +2 -2
  429. package/dist/lib/installations/update-runtime.js +1 -1
  430. package/dist/lib/linear-cache.d.ts +2 -1
  431. package/dist/lib/linux-userns.d.ts +2 -3
  432. package/dist/lib/linux-userns.js +0 -4
  433. package/dist/lib/loop.d.ts +2 -1
  434. package/dist/lib/mailbox-gc.d.ts +2 -1
  435. package/dist/lib/mailbox-target.d.ts +2 -1
  436. package/dist/lib/mailbox.d.ts +0 -6
  437. package/dist/lib/mailbox.js +1 -1
  438. package/dist/lib/manifest.d.ts +0 -14
  439. package/dist/lib/manifest.js +2 -2
  440. package/dist/lib/mcp-registry.d.ts +2 -1
  441. package/dist/lib/mcp.js +17 -11
  442. package/dist/lib/memory.d.ts +2 -13
  443. package/dist/lib/memory.js +4 -4
  444. package/dist/lib/menubar/download-menubar.d.ts +0 -2
  445. package/dist/lib/menubar/download-menubar.js +1 -5
  446. package/dist/lib/menubar/install-menubar.d.ts +3 -14
  447. package/dist/lib/menubar/install-menubar.js +3 -3
  448. package/dist/lib/menubar/migrate-prefs.d.ts +53 -0
  449. package/dist/lib/menubar/migrate-prefs.js +168 -0
  450. package/dist/lib/menubar/resolve-version.d.ts +1 -9
  451. package/dist/lib/menubar/resolve-version.js +4 -4
  452. package/dist/lib/menubar/snapshot.d.ts +24 -2
  453. package/dist/lib/menubar/snapshot.js +26 -0
  454. package/dist/lib/model-tier-overrides.d.ts +3 -2
  455. package/dist/lib/monitors/config.d.ts +0 -2
  456. package/dist/lib/monitors/config.js +0 -4
  457. package/dist/lib/monitors/engine.d.ts +1 -1
  458. package/dist/lib/monitors/remote.d.ts +3 -2
  459. package/dist/lib/monitors/sources/webhook.d.ts +2 -15
  460. package/dist/lib/monitors/sources/webhook.js +1 -38
  461. package/dist/lib/monitors/state.d.ts +4 -7
  462. package/dist/lib/monitors/state.js +2 -2
  463. package/dist/lib/notify.d.ts +1 -1
  464. package/dist/lib/notify.js +1 -1
  465. package/dist/lib/onepassword.d.ts +5 -14
  466. package/dist/lib/onepassword.js +0 -64
  467. package/dist/lib/open-url.d.ts +3 -2
  468. package/dist/lib/openclaw-keychain.d.ts +4 -17
  469. package/dist/lib/openclaw-keychain.js +3 -33
  470. package/dist/lib/operator.d.ts +2 -2
  471. package/dist/lib/operator.js +1 -1
  472. package/dist/lib/output/git-output.d.ts +4 -14
  473. package/dist/lib/output/git-output.js +1 -1
  474. package/dist/lib/owner-message.d.ts +3 -29
  475. package/dist/lib/owner-message.js +3 -3
  476. package/dist/lib/packages/output-home.d.ts +2 -4
  477. package/dist/lib/packages/output-home.js +2 -2
  478. package/dist/lib/perf/db.d.ts +0 -2
  479. package/dist/lib/perf/db.js +2 -7
  480. package/dist/lib/permissions-registry.d.ts +2 -3
  481. package/dist/lib/permissions-registry.js +0 -4
  482. package/dist/lib/permissions.d.ts +6 -16
  483. package/dist/lib/permissions.js +2 -15
  484. package/dist/lib/picker.d.ts +6 -5
  485. package/dist/lib/placement.d.ts +3 -6
  486. package/dist/lib/placement.js +0 -17
  487. package/dist/lib/platform/posixpath.d.ts +2 -1
  488. package/dist/lib/platform/winpath.d.ts +2 -1
  489. package/dist/lib/plugins/plugin-marketplace.d.ts +2 -2
  490. package/dist/lib/plugins/plugin-marketplace.js +1 -1
  491. package/dist/lib/pr-land-detach.d.ts +2 -1
  492. package/dist/lib/probe.d.ts +4 -1
  493. package/dist/lib/probe.js +5 -2
  494. package/dist/lib/profiles-presets.d.ts +2 -1
  495. package/dist/lib/profiles.d.ts +3 -9
  496. package/dist/lib/profiles.js +1 -9
  497. package/dist/lib/project-doctor.d.ts +2 -1
  498. package/dist/lib/project-launch.d.ts +2 -2
  499. package/dist/lib/project-probe.d.ts +4 -3
  500. package/dist/lib/project-pull.d.ts +2 -1
  501. package/dist/lib/project-resources.d.ts +2 -2
  502. package/dist/lib/project-resources.js +1 -1
  503. package/dist/lib/project-root.d.ts +2 -6
  504. package/dist/lib/project-root.js +1 -1
  505. package/dist/lib/project-schedule.d.ts +2 -1
  506. package/dist/lib/project-status.d.ts +2 -16
  507. package/dist/lib/project-status.js +3 -3
  508. package/dist/lib/pwsh.d.ts +33 -0
  509. package/dist/lib/pwsh.js +56 -0
  510. package/dist/lib/reconcile-and-repair.d.ts +5 -4
  511. package/dist/lib/redact.d.ts +15 -1
  512. package/dist/lib/redact.js +105 -3
  513. package/dist/lib/refresh-coordinator.d.ts +2 -1
  514. package/dist/lib/refresh.d.ts +9 -4
  515. package/dist/lib/refresh.js +92 -72
  516. package/dist/lib/remote-agents-json.d.ts +3 -2
  517. package/dist/lib/reserved-stores.d.ts +0 -2
  518. package/dist/lib/reserved-stores.js +3 -5
  519. package/dist/lib/resource-content-diff.d.ts +0 -2
  520. package/dist/lib/resource-content-diff.js +1 -1
  521. package/dist/lib/resource-patterns.d.ts +2 -1
  522. package/dist/lib/resource-profiles.d.ts +2 -8
  523. package/dist/lib/resource-profiles.js +3 -27
  524. package/dist/lib/resources/workflows.d.ts +1 -1
  525. package/dist/lib/resources.d.ts +4 -9
  526. package/dist/lib/resources.js +1 -1
  527. package/dist/lib/routine-context.d.ts +2 -5
  528. package/dist/lib/routine-context.js +2 -2
  529. package/dist/lib/routine-notify-owner.d.ts +8 -7
  530. package/dist/lib/routine-notify-owner.js +5 -5
  531. package/dist/lib/routine-process-cleanup.d.ts +2 -1
  532. package/dist/lib/routine-readiness.d.ts +0 -2
  533. package/dist/lib/routine-readiness.js +0 -7
  534. package/dist/lib/routines-project.d.ts +3 -4
  535. package/dist/lib/routines-project.js +1 -1
  536. package/dist/lib/rules/compile.d.ts +3 -25
  537. package/dist/lib/rules/compile.js +1 -1
  538. package/dist/lib/rules/compose.d.ts +3 -9
  539. package/dist/lib/rules/rules.d.ts +4 -15
  540. package/dist/lib/rules/rules.js +1 -64
  541. package/dist/lib/run-defaults.d.ts +1 -1
  542. package/dist/lib/run-notify.d.ts +2 -1
  543. package/dist/lib/run-trace-sync.d.ts +1 -1
  544. package/dist/lib/run-trace-sync.js +1 -1
  545. package/dist/lib/scheduler.d.ts +2 -1
  546. package/dist/lib/scheduling/routines.d.ts +9 -21
  547. package/dist/lib/scheduling/routines.js +3 -46
  548. package/dist/lib/secrets-cli.d.ts +11 -0
  549. package/dist/lib/secrets-cli.js +30 -0
  550. package/dist/lib/secrets-client.d.ts +0 -17
  551. package/dist/lib/secrets-client.js +7 -28
  552. package/dist/lib/secrets-policy.d.ts +12 -17
  553. package/dist/lib/secrets-policy.js +5 -5
  554. package/dist/lib/secrets-types.d.ts +3 -2
  555. package/dist/lib/secrets-types.js +2 -1
  556. package/dist/lib/self-heal/checks/install-staging.js +1 -1
  557. package/dist/lib/self-heal/registry.d.ts +3 -2
  558. package/dist/lib/self-heal/types.d.ts +1 -1
  559. package/dist/lib/self-heal/types.js +1 -1
  560. package/dist/lib/self-update.d.ts +5 -5
  561. package/dist/lib/self-update.js +4 -4
  562. package/dist/lib/session/actor-sidecar.d.ts +3 -2
  563. package/dist/lib/session/artifacts.d.ts +0 -2
  564. package/dist/lib/session/artifacts.js +1 -1
  565. package/dist/lib/session/bash-command.d.ts +2 -7
  566. package/dist/lib/session/bundle.d.ts +4 -6
  567. package/dist/lib/session/bundle.js +1 -5
  568. package/dist/lib/session/cloud.d.ts +0 -4
  569. package/dist/lib/session/cloud.js +2 -15
  570. package/dist/lib/session/detached.d.ts +9 -1
  571. package/dist/lib/session/detached.js +31 -2
  572. package/dist/lib/session/digest.d.ts +2 -2
  573. package/dist/lib/session/digest.js +1 -1
  574. package/dist/lib/session/fork.d.ts +3 -2
  575. package/dist/lib/session/highlights.d.ts +6 -5
  576. package/dist/lib/session/hook-sessions.d.ts +2 -1
  577. package/dist/lib/session/host-link.d.ts +2 -1
  578. package/dist/lib/session/inject.d.ts +1 -1
  579. package/dist/lib/session/inject.js +1 -1
  580. package/dist/lib/session/insights.d.ts +3 -15
  581. package/dist/lib/session/insights.js +2 -2
  582. package/dist/lib/session/local-tmux-attach.d.ts +2 -18
  583. package/dist/lib/session/local-tmux-attach.js +1 -1
  584. package/dist/lib/session/migrations.d.ts +0 -1
  585. package/dist/lib/session/migrations.js +1 -1
  586. package/dist/lib/session/mirror.d.ts +5 -8
  587. package/dist/lib/session/mirror.js +2 -2
  588. package/dist/lib/session/parse.d.ts +1 -32
  589. package/dist/lib/session/parse.js +4 -4
  590. package/dist/lib/session/presence.d.ts +2 -1
  591. package/dist/lib/session/prompt.d.ts +3 -2
  592. package/dist/lib/session/prompt.js +38 -1
  593. package/dist/lib/session/recovery.d.ts +3 -2
  594. package/dist/lib/session/remote/peer-stream.d.ts +26 -7
  595. package/dist/lib/session/remote/peer-stream.js +35 -8
  596. package/dist/lib/session/remote/remote-bundle.d.ts +2 -1
  597. package/dist/lib/session/remote/remote-list.d.ts +5 -5
  598. package/dist/lib/session/remote/remote.d.ts +4 -3
  599. package/dist/lib/session/remote/watch.d.ts +2 -7
  600. package/dist/lib/session/remote/watch.js +3 -3
  601. package/dist/lib/session/remote-active.d.ts +2 -1
  602. package/dist/lib/session/render.d.ts +2 -2
  603. package/dist/lib/session/render.js +1 -1
  604. package/dist/lib/session/resume-owner.d.ts +1 -1
  605. package/dist/lib/session/resume-owner.js +1 -1
  606. package/dist/lib/session/run-names.d.ts +2 -1
  607. package/dist/lib/session/session-cache.d.ts +7 -26
  608. package/dist/lib/session/session-cache.js +2 -8
  609. package/dist/lib/session/share-html.d.ts +1 -21
  610. package/dist/lib/session/share-html.js +1 -1
  611. package/dist/lib/session/shell-programs.d.ts +2 -1
  612. package/dist/lib/session/state.d.ts +41 -8
  613. package/dist/lib/session/state.js +112 -11
  614. package/dist/lib/session/stream-render.d.ts +2 -1
  615. package/dist/lib/session/sync/agents.d.ts +0 -4
  616. package/dist/lib/session/sync/agents.js +0 -0
  617. package/dist/lib/session/sync/backend.d.ts +8 -8
  618. package/dist/lib/session/sync/backend.js +3 -3
  619. package/dist/lib/session/sync/managed-config.d.ts +0 -8
  620. package/dist/lib/session/sync/managed-key.d.ts +0 -2
  621. package/dist/lib/session/sync/managed-key.js +1 -1
  622. package/dist/lib/session/sync/provision.d.ts +1 -1
  623. package/dist/lib/session/sync/provision.js +2 -2
  624. package/dist/lib/session/sync/r2.d.ts +4 -1
  625. package/dist/lib/session/sync/r2.js +4 -7
  626. package/dist/lib/session/sync/transcript-crypto.d.ts +2 -1
  627. package/dist/lib/session/tail.d.ts +2 -1
  628. package/dist/lib/session/team-filter.d.ts +1 -1
  629. package/dist/lib/session/throughput.d.ts +2 -3
  630. package/dist/lib/session/throughput.js +1 -1
  631. package/dist/lib/session/timeline-pass.d.ts +3 -42
  632. package/dist/lib/session/timeline-pass.js +4 -4
  633. package/dist/lib/session/timeline.d.ts +3 -13
  634. package/dist/lib/session/timeline.js +3 -3
  635. package/dist/lib/session/tool-calls.d.ts +2 -2
  636. package/dist/lib/session/tool-calls.js +1 -1
  637. package/dist/lib/session/tool-index.d.ts +0 -8
  638. package/dist/lib/session/tool-index.js +2 -2
  639. package/dist/lib/session/tool-store.d.ts +2 -1
  640. package/dist/lib/session/trajectory-compare.d.ts +2 -1
  641. package/dist/lib/session/trajectory-lineage.d.ts +2 -1
  642. package/dist/lib/session/trajectory-text.d.ts +3 -2
  643. package/dist/lib/session/trajectory.d.ts +2 -1
  644. package/dist/lib/session/viewing-in.d.ts +2 -1
  645. package/dist/lib/sessions-client.js +0 -3
  646. package/dist/lib/settings-manifest.d.ts +2 -1
  647. package/dist/lib/setup-tool-install.d.ts +3 -0
  648. package/dist/lib/setup-tool-install.js +26 -0
  649. package/dist/lib/setup-tool-status.d.ts +22 -0
  650. package/dist/lib/setup-tool-status.js +215 -0
  651. package/dist/lib/share-runtime.d.ts +11 -0
  652. package/dist/lib/share-runtime.js +63 -0
  653. package/dist/lib/shim-heal.d.ts +1 -5
  654. package/dist/lib/shim-heal.js +0 -6
  655. package/dist/lib/smart-launch.d.ts +5 -10
  656. package/dist/lib/smart-launch.js +4 -12
  657. package/dist/lib/snapshot.d.ts +3 -2
  658. package/dist/lib/ssh-exec.d.ts +49 -4
  659. package/dist/lib/ssh-exec.js +119 -0
  660. package/dist/lib/ssh-tunnel.d.ts +3 -2
  661. package/dist/lib/staleness/checkers/permissions.d.ts +0 -2
  662. package/dist/lib/staleness/checkers/permissions.js +1 -1
  663. package/dist/lib/staleness/fingerprint.d.ts +0 -7
  664. package/dist/lib/staleness/fingerprint.js +1 -1
  665. package/dist/lib/staleness/prune.d.ts +3 -2
  666. package/dist/lib/staleness/registry.d.ts +1 -1
  667. package/dist/lib/staleness/writers/sources.d.ts +0 -8
  668. package/dist/lib/staleness/writers/sources.js +1 -1
  669. package/dist/lib/startup/command-registry.d.ts +6 -4
  670. package/dist/lib/startup/command-registry.js +11 -8
  671. package/dist/lib/state.d.ts +1 -3
  672. package/dist/lib/state.js +3 -6
  673. package/dist/lib/storage/selection.d.ts +2 -2
  674. package/dist/lib/storage/selection.js +2 -2
  675. package/dist/lib/subagents-registry.d.ts +4 -3
  676. package/dist/lib/subagents.d.ts +2 -1
  677. package/dist/lib/subagents.js +3 -2
  678. package/dist/lib/summarizer/pass.d.ts +3 -6
  679. package/dist/lib/summarizer/pass.js +2 -2
  680. package/dist/lib/summarizer/summarize.d.ts +4 -3
  681. package/dist/lib/sync-passphrase.d.ts +3 -2
  682. package/dist/lib/sync-status.d.ts +3 -16
  683. package/dist/lib/sync-status.js +2 -2
  684. package/dist/lib/sync-umbrella.d.ts +9 -3
  685. package/dist/lib/sync-umbrella.js +18 -10
  686. package/dist/lib/system-run-sync.d.ts +2 -1
  687. package/dist/lib/teams/agents.d.ts +2 -4
  688. package/dist/lib/teams/agents.js +1 -1
  689. package/dist/lib/teams/forEach.d.ts +3 -2
  690. package/dist/lib/teams/pr-watch.d.ts +4 -11
  691. package/dist/lib/teams/pr-watch.js +4 -4
  692. package/dist/lib/teams/registry.d.ts +2 -3
  693. package/dist/lib/teams/registry.js +1 -1
  694. package/dist/lib/teams/remoteWorktree.d.ts +0 -16
  695. package/dist/lib/teams/remoteWorktree.js +3 -3
  696. package/dist/lib/teams/scheduler.d.ts +6 -5
  697. package/dist/lib/teams/scheduler.js +1 -1
  698. package/dist/lib/teams/supervisor.d.ts +4 -3
  699. package/dist/lib/teams/worktree.d.ts +0 -9
  700. package/dist/lib/teams/worktree.js +0 -32
  701. package/dist/lib/term-client.d.ts +44 -0
  702. package/dist/lib/term-client.js +117 -0
  703. package/dist/lib/terminal/inject.d.ts +3 -16
  704. package/dist/lib/terminal/inject.js +1 -29
  705. package/dist/lib/terminal/resolve.d.ts +3 -9
  706. package/dist/lib/terminal/resolve.js +3 -7
  707. package/dist/lib/tmux/binary.d.ts +2 -1
  708. package/dist/lib/tmux/orphan-reap.d.ts +6 -7
  709. package/dist/lib/tmux/orphan-reap.js +1 -1
  710. package/dist/lib/tmux/session.d.ts +4 -3
  711. package/dist/lib/traces/backend.d.ts +1 -2
  712. package/dist/lib/traces/backend.js +1 -2
  713. package/dist/lib/traces/classify.d.ts +3 -2
  714. package/dist/lib/traces/config.d.ts +0 -8
  715. package/dist/lib/traces/insights.d.ts +2 -1
  716. package/dist/lib/traces/phenotype.d.ts +3 -3
  717. package/dist/lib/traces/provision.d.ts +2 -4
  718. package/dist/lib/traces/provision.js +3 -3
  719. package/dist/lib/traces/schema2-build.d.ts +1 -1
  720. package/dist/lib/traces/schema2-danger.d.ts +2 -1
  721. package/dist/lib/traces/schema2.d.ts +5 -4
  722. package/dist/lib/traces/segments.d.ts +4 -20
  723. package/dist/lib/traces/segments.js +3 -3
  724. package/dist/lib/traces/sync.d.ts +2 -3
  725. package/dist/lib/traces/sync.js +1 -1
  726. package/dist/lib/triggers/handlers.d.ts +4 -13
  727. package/dist/lib/triggers/handlers.js +1 -1
  728. package/dist/lib/triggers/webhook.d.ts +5 -27
  729. package/dist/lib/triggers/webhook.js +4 -4
  730. package/dist/lib/types.d.ts +11 -9
  731. package/dist/lib/usage-refresh.d.ts +4 -10
  732. package/dist/lib/usage-refresh.js +3 -8
  733. package/dist/lib/verbs.d.ts +2 -1
  734. package/dist/lib/version-duplicates.d.ts +2 -3
  735. package/dist/lib/version-duplicates.js +3 -33
  736. package/dist/lib/version.d.ts +2 -1
  737. package/dist/lib/warn-unpushed.d.ts +2 -1
  738. package/dist/lib/watchdog/history.d.ts +3 -2
  739. package/dist/lib/watchdog/log.d.ts +0 -6
  740. package/dist/lib/watchdog/log.js +1 -1
  741. package/dist/lib/watchdog/rotate.d.ts +2 -26
  742. package/dist/lib/watchdog/rotate.js +4 -12
  743. package/dist/lib/watchdog/runner.d.ts +0 -7
  744. package/dist/lib/watchdog/runner.js +4 -4
  745. package/dist/lib/watchdog/service.d.ts +2 -2
  746. package/dist/lib/watchdog/service.js +1 -1
  747. package/dist/lib/watchdog/watchdog-agent.d.ts +2 -1
  748. package/dist/lib/watchdog/watchdog.d.ts +2 -1
  749. package/dist/lib/watchdog/watchdogTail.d.ts +2 -1
  750. package/dist/lib/workflows-registry.d.ts +3 -2
  751. package/dist/lib/workflows.d.ts +4 -7
  752. package/dist/lib/workflows.js +1 -1
  753. package/dist/lib/worktree/held.d.ts +4 -28
  754. package/dist/lib/worktree/held.js +3 -3
  755. package/package.json +3 -5
  756. package/scripts/postinstall.js +5 -4
  757. package/dist/commands/artifacts-setup.d.ts +0 -53
  758. package/dist/commands/artifacts-setup.js +0 -161
  759. package/dist/commands/artifacts.d.ts +0 -18
  760. package/dist/commands/artifacts.js +0 -58
  761. package/dist/commands/attach.d.ts +0 -12
  762. package/dist/commands/attach.js +0 -86
  763. package/dist/commands/auth-mint.d.ts +0 -12
  764. package/dist/commands/auth-mint.js +0 -108
  765. package/dist/commands/pty.d.ts +0 -20
  766. package/dist/commands/pty.js +0 -404
  767. package/dist/commands/reconnect.d.ts +0 -46
  768. package/dist/commands/reconnect.js +0 -115
  769. package/dist/commands/share.d.ts +0 -293
  770. package/dist/commands/share.js +0 -1424
  771. package/dist/lib/config-machine-keys.d.ts +0 -14
  772. package/dist/lib/config-machine-keys.js +0 -21
  773. package/dist/lib/pty-client.d.ts +0 -49
  774. package/dist/lib/pty-client.js +0 -315
  775. package/dist/lib/pty-server.d.ts +0 -59
  776. package/dist/lib/pty-server.js +0 -653
  777. package/dist/lib/share/analytics.d.ts +0 -13
  778. package/dist/lib/share/analytics.js +0 -45
  779. package/dist/lib/share/backend.d.ts +0 -120
  780. package/dist/lib/share/backend.js +0 -176
  781. package/dist/lib/share/capture.d.ts +0 -31
  782. package/dist/lib/share/capture.js +0 -174
  783. package/dist/lib/share/config.d.ts +0 -72
  784. package/dist/lib/share/config.js +0 -211
  785. package/dist/lib/share/delete.d.ts +0 -122
  786. package/dist/lib/share/delete.js +0 -173
  787. package/dist/lib/share/html.d.ts +0 -22
  788. package/dist/lib/share/html.js +0 -88
  789. package/dist/lib/share/http-error.d.ts +0 -52
  790. package/dist/lib/share/http-error.js +0 -65
  791. package/dist/lib/share/og.d.ts +0 -25
  792. package/dist/lib/share/og.js +0 -84
  793. package/dist/lib/share/provision.d.ts +0 -127
  794. package/dist/lib/share/provision.js +0 -285
  795. package/dist/lib/share/publish.d.ts +0 -388
  796. package/dist/lib/share/publish.js +0 -818
  797. package/dist/lib/share/worker-template.d.ts +0 -27
  798. package/dist/lib/share/worker-template.js +0 -2424
  799. package/dist/lib/storage/index.d.ts +0 -14
  800. package/dist/lib/storage/index.js +0 -14
  801. package/dist/lib/storage/visibility.d.ts +0 -82
  802. package/dist/lib/storage/visibility.js +0 -99
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Canonical tool activity on the feed stream — browser tasks and computer runs
3
+ * projected into one row contract, alongside the agent and attention rows.
4
+ *
5
+ * WHY A PROJECTION AND NOT A NEW STORE. Both sources already exist and already
6
+ * have an owner: `agents browser sessions` groups a profile's captures into
7
+ * task-first rows (`browser/sessions-list.ts`), and `agents computer sessions`
8
+ * groups `computer.action` ledger entries into run rows
9
+ * (`computer/sessions-list.ts`). A menu-bar or Fleet view that wanted the same
10
+ * information had only one way to get it: shell out to those two commands, per
11
+ * tool, per device, on a timer. That is the per-tool polling this module
12
+ * removes — the rows ride the ONE stream `agents feed watch --json` already
13
+ * holds open, so a consumer switching its All/Agents/Browser/Computer filter
14
+ * spawns zero commands.
15
+ *
16
+ * WHAT IS DELIBERATELY DIFFERENT BETWEEN THE TWO KINDS. A browser task is a
17
+ * LIVE resource: it is bound in the task index while it exists, it can be
18
+ * driven, and it can be closed (`agents browser done --task <name>`). A
19
+ * computer run is a LEDGER ENTRY: the actions already happened, the CLI process
20
+ * that performed them has exited, and there is nothing to stop. So
21
+ * {@link ComputerToolRow} pins `live: false` and carries no close/stop command
22
+ * at all — inventing one would offer an operator a control that cannot work.
23
+ *
24
+ * PRIVACY. Rows carry capture PATHS and names, never contents, and a task URL
25
+ * is redacted ({@link redactToolUrl}) before it leaves this process: userinfo
26
+ * is stripped and credential-shaped query parameters are replaced. The feed is
27
+ * read by the menu bar, the extension, and any `--json` consumer; a bearer
28
+ * token in a `?access_token=` is exactly the value that must not ride it.
29
+ */
30
+ import { createHash } from 'node:crypto';
31
+ import { normalizeHost } from '../machine-id.js';
32
+ import { sessionHeadline } from '../session/title.js';
33
+ /** Newest captures retained per row. A task with hundreds of screenshots must
34
+ * not turn one stream envelope into a megabyte. */
35
+ export const TOOL_CAPTURE_LIMIT = 20;
36
+ /** Newest actions retained per computer row, for the same reason. */
37
+ export const TOOL_ACTION_LIMIT = 50;
38
+ /** Stable identity for one tool row within one device scope. */
39
+ export function toolRowKey(scope, kind, identity) {
40
+ return createHash('sha256').update(`${scope}\0${kind}\0${identity}`).digest('base64url').slice(0, 22);
41
+ }
42
+ /** Query parameters whose value is a credential, not a locator. */
43
+ const CREDENTIAL_PARAM = /(token|secret|password|passwd|pwd|api[-_]?key|auth|session|signature|sig|code)/i;
44
+ const REDACTED = '<redacted>';
45
+ /**
46
+ * A task URL safe to publish: userinfo removed and credential-shaped query
47
+ * parameters replaced. A string that does not parse as a URL is dropped
48
+ * entirely rather than published unexamined — it cannot be redacted safely.
49
+ */
50
+ export function redactToolUrl(raw) {
51
+ if (!raw)
52
+ return undefined;
53
+ let url;
54
+ try {
55
+ url = new URL(raw);
56
+ }
57
+ catch {
58
+ return undefined;
59
+ }
60
+ url.username = '';
61
+ url.password = '';
62
+ for (const key of [...url.searchParams.keys()]) {
63
+ if (CREDENTIAL_PARAM.test(key))
64
+ url.searchParams.set(key, REDACTED);
65
+ }
66
+ // A fragment is where OAuth implicit flows put the token, and nothing on a
67
+ // status row needs it.
68
+ if (url.hash)
69
+ url.hash = '';
70
+ return url.toString();
71
+ }
72
+ /**
73
+ * The owning agent session, or nothing.
74
+ *
75
+ * `sessionId` is passed in as the EFFECTIVE identity rather than read off the
76
+ * capture row: a task's session is recorded in the live task record and in the
77
+ * device binding as well as in the durable capture history, and a row assembled
78
+ * from only one of those had an owner on some paths and not others. Resolving the
79
+ * effective id first is what makes the owner link consistent for one task however
80
+ * its row was assembled.
81
+ *
82
+ * Returns undefined when no id is known. `recordBrowserSession`/`emit` are
83
+ * pre-existing no-ops for some paths, so closed history genuinely lacks an owner
84
+ * sometimes — and an invented link would be worse than an absent one.
85
+ */
86
+ function ownerOf(sessionId, linkedSession, scope) {
87
+ if (!sessionId)
88
+ return undefined;
89
+ const session = linkedSession ?? undefined;
90
+ // One headline ladder for the whole CLI (SES-14c): a row's own `label`, then the
91
+ // daemon-generated title, then the first-prompt topic. Re-deriving it here would
92
+ // silently drop the generated-title rung and show a different name for the same
93
+ // session than `agents sessions` does.
94
+ const label = session ? sessionHeadline(session) : undefined;
95
+ return {
96
+ sessionId,
97
+ device: normalizeHost(session?.machine ?? scope),
98
+ ...(label ? { label } : {}),
99
+ ...(session?.agent ? { agent: session.agent } : {}),
100
+ };
101
+ }
102
+ /** A machine name, or undefined for the `unknown` not-identified sentinel. */
103
+ function knownMachine(machine) {
104
+ return machine && machine !== 'unknown' ? machine : undefined;
105
+ }
106
+ function countBy(items, key) {
107
+ const counts = {};
108
+ for (const item of items)
109
+ counts[key(item)] = (counts[key(item)] ?? 0) + 1;
110
+ return counts;
111
+ }
112
+ /**
113
+ * A browser task the task index binds but that has produced no capture yet.
114
+ *
115
+ * `buildBrowserSessionRows` derives its rows from captures on disk, so a task
116
+ * that was just opened — bound, live, drivable, closable — had no row at all
117
+ * until its first screenshot landed. That is the window an operator most wants
118
+ * to see, and it is exactly when a Sessions pane showed nothing. This
119
+ * synthesizes the zero-capture row so it goes through the SAME projection rather
120
+ * than a second parallel one.
121
+ */
122
+ export function boundBrowserRow(task, binding) {
123
+ return {
124
+ kind: 'task', task, profile: binding.profile ?? '',
125
+ linkStatus: 'unlinked', artifacts: [],
126
+ counts: { screenshot: 0, pdf: 0, recording: 0, download: 0 },
127
+ latestMtimeMs: 0,
128
+ };
129
+ }
130
+ /**
131
+ * One browser task (or a profile's downloads bucket) as a tool row. Pure: the
132
+ * liveness verdict is passed in, because only the machine running the browser
133
+ * daemon holds the task index that answers it.
134
+ */
135
+ export function projectBrowserToolRow(scope, row, binding, live) {
136
+ const host = normalizeHost(scope);
137
+ // Live means the task still EXISTS: either this host's browser holds a live
138
+ // record for it, or the task index still routes it (which is the case for a
139
+ // task whose browser runs on another device).
140
+ const isLive = Boolean(row.task) && (live !== undefined || binding !== undefined);
141
+ const captures = row.artifacts.slice(0, TOOL_CAPTURE_LIMIT).map((artifact) => ({
142
+ kind: artifact.kind, name: artifact.name, path: artifact.path, host, bytes: artifact.bytes, atMs: artifact.mtimeMs,
143
+ }));
144
+ const oldest = row.artifacts.length > 0 ? row.artifacts[row.artifacts.length - 1].mtimeMs : row.latestMtimeMs;
145
+ const url = redactToolUrl(binding?.url);
146
+ // One effective identity for the row AND its owner link, resolved before either
147
+ // is built: durable capture history first (it survives the task), then the live
148
+ // record, then the device binding.
149
+ const sessionId = row.sessionId ?? live?.sessionId ?? binding?.sessionId;
150
+ const launchId = row.launchId ?? live?.launchId ?? binding?.launchId;
151
+ const owner = ownerOf(sessionId, row.linkedSession, host);
152
+ // Tabs are only knowable from a LIVE task record on THIS host; a row projected
153
+ // from captures alone, or from a binding pointing at another device, genuinely
154
+ // does not know them and says so by omitting the field.
155
+ const tabs = live?.tabs;
156
+ const showTab = tabs?.find((tab) => tab.current && !tab.borrowed)?.id
157
+ ?? tabs?.find((tab) => !tab.borrowed)?.id;
158
+ const startedAtMs = live?.startedAtMs ?? binding?.createdAt ?? oldest;
159
+ // A task with no captures has no capture mtime to sort by. `lastActionAt` is
160
+ // refreshed by every task-scoped action, so it is the honest freshness key;
161
+ // its own start is the fallback. Reporting 0 would sort a brand-new live task
162
+ // to the very bottom of a newest-first list.
163
+ const updatedAtMs = Math.max(row.latestMtimeMs, live?.lastActionAtMs ?? 0) || startedAtMs;
164
+ return {
165
+ kind: 'browser',
166
+ // Keyed on the TASK, never on the profile. A task with no captures yet is
167
+ // discovered from the task index, where the profile may not be recorded, so
168
+ // folding the profile into the identity would give the same task two
169
+ // different keys and render it twice the moment its first capture landed.
170
+ // Task names are unique within a machine's task index, which is the scope
171
+ // this key is already qualified by. The downloads bucket has no task, so it
172
+ // keys on its profile — one such row per profile, which is what it is.
173
+ rowKey: toolRowKey(host, 'browser', row.task ? `task\0${row.task}` : `downloads\0${row.profile}`),
174
+ scope: host,
175
+ device: normalizeHost(binding?.device ?? host),
176
+ live: isLive,
177
+ ...(row.task ? { task: row.task } : {}),
178
+ ...(sessionId ? { sessionId } : {}),
179
+ ...(launchId ? { launchId } : {}),
180
+ ...(row.linkedSession?.agent ? { agent: row.linkedSession.agent } : {}),
181
+ ...(owner ? { owner } : {}),
182
+ linkStatus: row.linkedSession ? 'linked' : sessionId ? 'unresolved' : 'unlinked',
183
+ startedAtMs,
184
+ updatedAtMs,
185
+ captures,
186
+ captureCounts: countBy(row.artifacts, (artifact) => artifact.kind),
187
+ profile: row.profile || live?.profile || '',
188
+ ...(url ? { url } : {}),
189
+ ...(tabs ? { tabs } : {}),
190
+ // `runOn` is the OBSERVING host, not `device`: the binding that resolves the
191
+ // task's device lives here, and passing `--device` to a later verb is
192
+ // refused outright. See {@link ToolCommand}.
193
+ ...(isLive && showTab ? { showCommand: { command: 'agents', args: ['browser', 'tab', 'focus', showTab, '--task', row.task], runOn: host } } : {}),
194
+ ...(isLive ? { closeCommand: { command: 'agents', args: ['browser', 'done', '--task', row.task], runOn: host } } : {}),
195
+ };
196
+ }
197
+ /**
198
+ * One computer run as a tool row. `live` is pinned false and no close/stop
199
+ * command is produced: the emitting CLI process is already gone.
200
+ */
201
+ export function projectComputerToolRow(scope, row) {
202
+ const host = normalizeHost(scope);
203
+ const owner = ownerOf(row.sessionId, row.linkedSession, host);
204
+ const agent = row.agent ?? row.linkedSession?.agent;
205
+ // Captures come ONLY from a `capture` the producer recorded after the file was
206
+ // written. A screenshot action from before the producer carried that field has
207
+ // no path to report, and this deliberately reports none rather than guessing one
208
+ // from an output flag — a fabricated path is worse than an honest absence.
209
+ //
210
+ // `host` is the INVOKING machine, never `remoteHost`. The engine's helper RPC
211
+ // returns the image as base64 and the invoking process resolves `--out` and
212
+ // writes the file locally, so even a remote-desktop run leaves its screenshot
213
+ // on the box that ran the command. Naming the driven host would send a consumer
214
+ // looking for the file on a machine it was never written to.
215
+ const captures = [];
216
+ const captureCounts = {};
217
+ for (const action of row.actions) {
218
+ if (!action.capture)
219
+ continue;
220
+ captureCounts[action.capture.kind] = (captureCounts[action.capture.kind] ?? 0) + 1;
221
+ if (captures.length >= TOOL_CAPTURE_LIMIT)
222
+ continue;
223
+ captures.push({
224
+ kind: action.capture.kind, name: action.capture.name, path: action.capture.path,
225
+ host,
226
+ ...(action.capture.bytes !== undefined ? { bytes: action.capture.bytes } : {}),
227
+ atMs: action.tsMs,
228
+ });
229
+ }
230
+ const actions = row.actions.slice(0, TOOL_ACTION_LIMIT).map((action) => ({
231
+ verb: action.verb, atMs: action.tsMs,
232
+ ...(action.host ? { host: action.host } : {}),
233
+ ...(action.bundle ? { bundle: action.bundle } : {}),
234
+ }));
235
+ return {
236
+ kind: 'computer',
237
+ rowKey: toolRowKey(host, 'computer', row.invocationId ?? `${row.machine}\0${row.pid ?? ''}\0${row.startMs}`),
238
+ scope: host,
239
+ // `groupIntoComputerRuns` writes the literal 'unknown' when no record in the
240
+ // run identified a machine, which is a sentinel for "not identified" and not a
241
+ // device name. Publishing it made a locally-run action unaddressable and made
242
+ // it disappear under a device filter, so it resolves to the observing host —
243
+ // which is the machine whose ledger the run was read from.
244
+ device: normalizeHost(row.remoteHost ?? knownMachine(row.machine) ?? host),
245
+ live: false,
246
+ ...(row.task ? { task: row.task } : {}),
247
+ ...(row.sessionId ? { sessionId: row.sessionId } : {}),
248
+ ...(row.launchId ? { launchId: row.launchId } : {}),
249
+ ...(agent ? { agent } : {}),
250
+ ...(owner ? { owner } : {}),
251
+ linkStatus: row.linkStatus,
252
+ startedAtMs: row.startMs,
253
+ updatedAtMs: row.endMs,
254
+ captures,
255
+ captureCounts,
256
+ ...(row.bundle ? { bundle: row.bundle } : {}),
257
+ actions,
258
+ actionCounts: { ...row.counts },
259
+ ...(row.recoveredActionCount !== undefined ? { recoveredActionCount: row.recoveredActionCount } : {}),
260
+ };
261
+ }
262
+ /** Newest first across both kinds — the order a consumer renders. */
263
+ export function sortToolRows(rows) {
264
+ return [...rows].sort((a, b) => b.updatedAtMs - a.updatedAtMs);
265
+ }
@@ -1,64 +1,30 @@
1
- import { type SessionWatchEnvelope, type SessionWatchRow, type SessionWatchScopeStatus, type WatchLocalOptions } from '../session/watch.js';
2
- import { type AttentionItem } from './attention.js';
3
- import { type ActivityEvent } from './activity.js';
1
+ import { type SessionWatchEnvelope, type WatchLocalOptions } from '../session/watch.js';
2
+ import { watchToolActivity } from './tool-activity.js';
3
+ import { type ToolRow } from './tools.js';
4
+ import { FeedWatchState, type FeedWatchEnvelope } from './envelope.js';
5
+ import { FeedHub } from './hub.js';
6
+ import { getCachedToolSetup, subscribeToolSetup, type ToolSetupRow } from '../setup-tool-status.js';
4
7
  import type { GhExec } from '../github/pr-mergeable.js';
5
- export declare const FEED_WATCH_VERSION: 1;
6
- type Base = {
7
- v: 1;
8
- type: string;
9
- streamId: string;
10
- sequence: number;
11
- scope: string;
12
- };
13
- export type FeedWatchEnvelope = Base & {
14
- type: 'reset';
15
- capturedAt: number;
16
- agents: SessionWatchRow[];
17
- attention: AttentionItem[];
18
- } | Base & {
19
- type: 'agent.upsert';
20
- rowKey: string;
21
- agent: SessionWatchRow;
22
- } | Base & {
23
- type: 'agent.remove';
24
- rowKey: string;
25
- } | Base & {
26
- type: 'attention.upsert';
27
- rowKey: string;
28
- attention: AttentionItem;
29
- } | Base & {
30
- type: 'attention.remove';
31
- rowKey: string;
32
- } | Base & {
33
- type: 'activity.append';
34
- event: ActivityEvent;
35
- } | Base & {
36
- type: 'scope';
37
- capturedAt: number;
38
- status: SessionWatchScopeStatus;
39
- reason?: string;
40
- } | Base & {
41
- type: 'heartbeat';
42
- capturedAt: number;
43
- };
44
- type FeedWatchPayload = FeedWatchEnvelope extends infer Envelope ? Envelope extends FeedWatchEnvelope ? Omit<Envelope, 'v' | 'streamId' | 'sequence'> : never : never;
45
- export declare class FeedWatchState {
46
- readonly streamId: string;
47
- private sequence;
48
- constructor(streamId?: `${string}-${string}-${string}-${string}-${string}`);
49
- emit(event: FeedWatchPayload): FeedWatchEnvelope;
50
- }
8
+ export { FeedWatchState, type FeedWatchEnvelope, type FeedWatchPayload } from './envelope.js';
51
9
  /** Reuse session ownership reconciliation for the combined operator stream. */
52
10
  export declare class FeedSessionProjection {
53
11
  private readonly state;
54
12
  private readonly sessions;
55
13
  private readonly observations;
56
14
  private projectedAttention;
15
+ /**
16
+ * Tool rows per observing scope. A reset replaces one scope's rows and must
17
+ * not touch another's — the same per-scope rule the agent rows follow, and
18
+ * the reason a peer reconnecting cannot erase the local machine's tasks.
19
+ */
20
+ private readonly toolsByScope;
21
+ /** Whole-set per scope; see the `setup.snapshot` docblock in `envelope.ts`. */
22
+ private readonly setupByScope;
57
23
  constructor(state?: FeedWatchState);
58
24
  apply(event: FeedWatchEnvelope): FeedWatchEnvelope[];
59
25
  }
60
- export declare function projectSessionEnvelope(event: SessionWatchEnvelope, state: FeedWatchState, gh?: GhExec): Promise<FeedWatchEnvelope[]>;
61
- export interface WatchLocalFeedOptions {
26
+ export declare function projectSessionEnvelope(event: SessionWatchEnvelope, state: FeedWatchState, gh?: GhExec, tools?: ToolRow[], setup?: ToolSetupRow[]): Promise<FeedWatchEnvelope[]>;
27
+ interface WatchLocalFeedOptions {
62
28
  scope: string;
63
29
  signal: AbortSignal;
64
30
  emit: (event: FeedWatchEnvelope) => void;
@@ -70,11 +36,44 @@ export interface WatchLocalFeedOptions {
70
36
  sessions?: Pick<WatchLocalOptions, 'readCache' | 'readPrevious' | 'journalPath' | 'journalPollMs' | 'heartbeatMs'>;
71
37
  /** The `gh` runner behind PR status; a test passes a recorded table. */
72
38
  gh?: GhExec;
39
+ /** Tool-activity inputs, forwarded verbatim to {@link watchToolActivity}. */
40
+ tools?: Pick<Parameters<typeof watchToolActivity>[0], 'sweepMs' | 'roots' | 'sources'>;
41
+ /**
42
+ * Tool-setup readers. The setup teammate owns DETECTION
43
+ * (`lib/setup-tool-status.ts`); this stream only publishes what its cache
44
+ * already holds, and never triggers a probe of its own.
45
+ */
46
+ setup?: {
47
+ read?: typeof getCachedToolSetup;
48
+ subscribe?: typeof subscribeToolSetup;
49
+ };
73
50
  }
74
51
  export declare function watchLocalFeed(options: WatchLocalFeedOptions): Promise<void>;
52
+ /**
53
+ * The one ingress for an envelope produced by ANOTHER agents-cli.
54
+ *
55
+ * `tools` was added to the `reset` payload within protocol v1, so a peer on an
56
+ * older CLI is a correct v1 producer that simply reports no tool rows — which is
57
+ * true of it, not a data defect to paper over. Normalizing HERE, at the single
58
+ * place a foreign envelope enters, is what keeps every consumer downstream able
59
+ * to treat the field as present instead of each re-checking it. A mixed-version
60
+ * fleet is the normal state during a rollout, so an absent field must not take
61
+ * the whole fan-out down.
62
+ */
63
+ export declare function normalizePeerEnvelope(event: FeedWatchEnvelope): FeedWatchEnvelope;
64
+ /** The shared local collector, constructed on first use. Exposed for tests. */
65
+ export declare function sharedLocalFeedHub(): FeedHub;
66
+ /** Reset the shared collector. Tests only — it must not leak across cases. */
67
+ export declare function resetSharedLocalFeedHub(): Promise<void>;
68
+ /**
69
+ * Subscribe to this machine's rows through the shared collector, until abort.
70
+ */
71
+ export declare function subscribeSharedLocalFeed(options: {
72
+ signal: AbortSignal;
73
+ emit: (event: FeedWatchEnvelope) => void;
74
+ }): Promise<void>;
75
75
  export declare function watchFleetFeed(options: {
76
76
  signal: AbortSignal;
77
77
  emit: (event: FeedWatchEnvelope) => void;
78
78
  reconnectMs?: number;
79
79
  }): Promise<void>;
80
- export {};
@@ -1,5 +1,4 @@
1
1
  import { SessionProjection } from '../session/projection.js';
2
- import { randomUUID } from 'node:crypto';
3
2
  import * as fs from 'node:fs';
4
3
  import * as path from 'node:path';
5
4
  import { loadDevices, isDialableDevice } from '../devices/registry.js';
@@ -12,22 +11,26 @@ import { watchLocalSessions } from '../session/watch.js';
12
11
  import { readBlock, readResolution, blockIdForSession } from './feed.js';
13
12
  import { reconcileAttention } from './attention.js';
14
13
  import { ActivityStream } from './activity-stream.js';
14
+ import { collectToolRows, watchToolActivity } from './tool-activity.js';
15
+ import { FeedWatchState } from './envelope.js';
16
+ import { FeedHub } from './hub.js';
17
+ import { getCachedToolSetup, subscribeToolSetup } from '../setup-tool-status.js';
15
18
  import { PR_STATUS_TTL_MS, readPullRequestStatus, withPullRequestStatus } from './pr-status.js';
16
- export const FEED_WATCH_VERSION = 1;
17
- export class FeedWatchState {
18
- streamId;
19
- sequence = 0;
20
- constructor(streamId = randomUUID()) { this.streamId = streamId; }
21
- emit(event) {
22
- return { v: 1, streamId: this.streamId, sequence: ++this.sequence, ...event };
23
- }
24
- }
19
+ export { FeedWatchState } from './envelope.js';
25
20
  /** Reuse session ownership reconciliation for the combined operator stream. */
26
21
  export class FeedSessionProjection {
27
22
  state;
28
23
  sessions = new SessionProjection();
29
24
  observations = new Map();
30
25
  projectedAttention = new Map();
26
+ /**
27
+ * Tool rows per observing scope. A reset replaces one scope's rows and must
28
+ * not touch another's — the same per-scope rule the agent rows follow, and
29
+ * the reason a peer reconnecting cannot erase the local machine's tasks.
30
+ */
31
+ toolsByScope = new Map();
32
+ /** Whole-set per scope; see the `setup.snapshot` docblock in `envelope.ts`. */
33
+ setupByScope = new Map();
31
34
  constructor(state = new FeedWatchState()) {
32
35
  this.state = state;
33
36
  }
@@ -44,6 +47,8 @@ export class FeedSessionProjection {
44
47
  attention.set(row.rowKey, item);
45
48
  }
46
49
  this.observations.set(scope, attention);
50
+ this.toolsByScope.set(scope, new Map(event.tools.map((tool) => [tool.rowKey, tool])));
51
+ this.setupByScope.set(scope, event.setup);
47
52
  }
48
53
  else if (event.type === 'agent.upsert') {
49
54
  sessionEvent = { ...base, type: 'upsert', rowKey: event.rowKey, row: event.agent };
@@ -60,6 +65,20 @@ export class FeedSessionProjection {
60
65
  else if (event.type === 'attention.remove') {
61
66
  this.observations.get(scope)?.delete(event.rowKey);
62
67
  }
68
+ else if (event.type === 'tool.upsert') {
69
+ if (!this.toolsByScope.has(scope))
70
+ this.toolsByScope.set(scope, new Map());
71
+ this.toolsByScope.get(scope).set(event.rowKey, event.tool);
72
+ return [this.state.emit({ type: 'tool.upsert', scope, rowKey: event.rowKey, tool: event.tool })];
73
+ }
74
+ else if (event.type === 'tool.remove') {
75
+ this.toolsByScope.get(scope)?.delete(event.rowKey);
76
+ return [this.state.emit({ type: 'tool.remove', scope, rowKey: event.rowKey })];
77
+ }
78
+ else if (event.type === 'setup.snapshot') {
79
+ this.setupByScope.set(scope, event.setup);
80
+ return [this.state.emit({ type: 'setup.snapshot', scope, capturedAt: event.capturedAt, setup: event.setup })];
81
+ }
63
82
  else {
64
83
  const { v: _v, streamId: _streamId, sequence: _sequence, ...payload } = event;
65
84
  return [this.state.emit(payload)];
@@ -78,7 +97,9 @@ export class FeedSessionProjection {
78
97
  if (rowEvent.type === 'reset') {
79
98
  resetScopes.add(rowEvent.scope);
80
99
  result.push(this.state.emit({ type: 'reset', scope: rowEvent.scope, capturedAt: rowEvent.capturedAt, agents: rowEvent.rows,
81
- attention: [...next.values()].filter(value => value.scope === rowEvent.scope).map(value => value.item) }));
100
+ attention: [...next.values()].filter(value => value.scope === rowEvent.scope).map(value => value.item),
101
+ tools: [...(this.toolsByScope.get(rowEvent.scope)?.values() ?? [])],
102
+ setup: this.setupByScope.get(rowEvent.scope) ?? [] }));
82
103
  }
83
104
  else if (rowEvent.type === 'upsert') {
84
105
  result.push(this.state.emit({ type: 'agent.upsert', scope: rowEvent.scope, rowKey: rowEvent.rowKey, agent: rowEvent.row }));
@@ -137,11 +158,11 @@ async function projectAgent(agent, gh) {
137
158
  const pullRequest = await pullRequestFor(agent, gh);
138
159
  return { agent: withPullRequestStatus(agent, pullRequest), attention: attentionFor(agent, pullRequest) };
139
160
  }
140
- export async function projectSessionEnvelope(event, state, gh) {
161
+ export async function projectSessionEnvelope(event, state, gh, tools = [], setup = []) {
141
162
  if (event.type === 'reset') {
142
163
  const projected = await Promise.all(event.rows.map((row) => projectAgent(row, gh)));
143
164
  const attention = projected.map((p) => p.attention).filter((item) => item !== undefined);
144
- return [state.emit({ type: 'reset', capturedAt: event.capturedAt, scope: event.scope, agents: projected.map((p) => p.agent), attention })];
165
+ return [state.emit({ type: 'reset', capturedAt: event.capturedAt, scope: event.scope, agents: projected.map((p) => p.agent), attention, tools, setup })];
145
166
  }
146
167
  if (event.type === 'upsert') {
147
168
  const { agent, attention } = await projectAgent(event.row, gh);
@@ -199,6 +220,23 @@ export async function watchLocalFeed(options) {
199
220
  // dropping it from a window the caller believes was covered.
200
221
  const activity = new ActivityStream();
201
222
  let activityCursor = Date.now();
223
+ // The tool rows as this machine last projected them. Held here rather than
224
+ // re-collected per reset: a session-watch reconnect emits a fresh reset, and
225
+ // re-reading the browser tree and the ledger for it would reintroduce exactly
226
+ // the per-render cost `tool-activity.ts` exists to remove.
227
+ let toolRows = collectToolRows(options.scope, options.tools?.sources).rows;
228
+ // Setup rows come from the setup teammate's cache, never from a probe here:
229
+ // `getCachedToolSetup` reads metadata plus the last EXPLICIT health check, so
230
+ // publishing it costs no subprocess and cannot unlock a secret store.
231
+ const readSetup = options.setup?.read ?? getCachedToolSetup;
232
+ let setupRows = (() => {
233
+ try {
234
+ return readSetup();
235
+ }
236
+ catch {
237
+ return [];
238
+ }
239
+ })();
202
240
  const agents = new Map();
203
241
  const attention = new Map();
204
242
  // The PR status last projected onto each row, so a merge or a check verdict
@@ -246,7 +284,30 @@ export async function watchLocalFeed(options) {
246
284
  await reconcileRows();
247
285
  });
248
286
  }, options.activityPollMs ?? 500);
249
- const stopActivity = () => { clearInterval(activityTimer); stopAttentionWatch(); activity.close(); };
287
+ const toolWatch = watchToolActivity({
288
+ ...options.tools, scope: options.scope, signal: options.signal, initial: toolRows,
289
+ onDiff: (diff) => {
290
+ for (const tool of diff.upserts) {
291
+ toolRows = [...toolRows.filter((row) => row.rowKey !== tool.rowKey), tool];
292
+ options.emit(state.emit({ type: 'tool.upsert', scope: options.scope, rowKey: tool.rowKey, tool }));
293
+ }
294
+ for (const rowKey of diff.removes) {
295
+ toolRows = toolRows.filter((row) => row.rowKey !== rowKey);
296
+ options.emit(state.emit({ type: 'tool.remove', scope: options.scope, rowKey }));
297
+ }
298
+ },
299
+ });
300
+ // The setup cache is file-backed and notifies on change, so a Settings pane
301
+ // costs no polling: `subscribeToolSetup` is the invalidation the setup side
302
+ // publishes for exactly this consumer.
303
+ const stopSetupWatch = (options.setup?.subscribe ?? subscribeToolSetup)((rows) => {
304
+ const next = JSON.stringify(rows);
305
+ if (next === JSON.stringify(setupRows))
306
+ return;
307
+ setupRows = rows;
308
+ options.emit(state.emit({ type: 'setup.snapshot', scope: options.scope, capturedAt: Date.now(), setup: rows }));
309
+ });
310
+ const stopActivity = () => { clearInterval(activityTimer); stopAttentionWatch(); activity.close(); toolWatch.stop(); stopSetupWatch(); };
250
311
  options.signal.addEventListener('abort', stopActivity, { once: true });
251
312
  try {
252
313
  await watchLocalSessions({ ...options.sessions, scope: options.scope, signal: options.signal, emit: (event) => {
@@ -262,7 +323,7 @@ export async function watchLocalFeed(options) {
262
323
  attention.delete(event.rowKey);
263
324
  prStatus.delete(event.rowKey);
264
325
  }
265
- pending = pending.then(() => projectSessionEnvelope(event, state, options.gh)).then((events) => {
326
+ pending = pending.then(() => projectSessionEnvelope(event, state, options.gh, toolRows, setupRows)).then((events) => {
266
327
  for (const projected of events) {
267
328
  if (projected.type === 'reset') {
268
329
  attention.clear();
@@ -302,6 +363,75 @@ function remoteFeedWatchCommand(os) {
302
363
  ? buildWindowsAgentsCommand({ args })
303
364
  : `bash -lc ${shellQuote(`agents ${args.map(shellQuote).join(' ')}`)}`;
304
365
  }
366
+ /**
367
+ * The one ingress for an envelope produced by ANOTHER agents-cli.
368
+ *
369
+ * `tools` was added to the `reset` payload within protocol v1, so a peer on an
370
+ * older CLI is a correct v1 producer that simply reports no tool rows — which is
371
+ * true of it, not a data defect to paper over. Normalizing HERE, at the single
372
+ * place a foreign envelope enters, is what keeps every consumer downstream able
373
+ * to treat the field as present instead of each re-checking it. A mixed-version
374
+ * fleet is the normal state during a rollout, so an absent field must not take
375
+ * the whole fan-out down.
376
+ */
377
+ export function normalizePeerEnvelope(event) {
378
+ if (event.type !== 'reset')
379
+ return event;
380
+ if (Array.isArray(event.tools) && Array.isArray(event.setup))
381
+ return event;
382
+ return { ...event, tools: event.tools ?? [], setup: event.setup ?? [] };
383
+ }
384
+ /**
385
+ * The process-wide local collector, shared by refcount.
386
+ *
387
+ * `watchLocalFeed` is cheap per tick but NOT free to duplicate: each call builds
388
+ * its own `ActivityStream` cursor set over the activity directory, its own
389
+ * recursive tool watchers, its own feed/resolution watchers and its own
390
+ * setup subscription. Two callers in one process paid all of that twice and
391
+ * produced identical envelopes — and there are genuinely two callers on a daemon
392
+ * box: the fleet fan-out (which watches the local scope alongside every peer)
393
+ * and anything else that wants this machine's rows.
394
+ *
395
+ * One {@link FeedHub} over `watchLocalFeed` collapses them: the watcher starts on
396
+ * the first subscriber, stops on the last, and a late subscriber is caught up
397
+ * from held state instead of constructing a second cursor set.
398
+ *
399
+ * This is deliberately PROCESS-wide and not machine-wide. Making `feed watch
400
+ * --json --local` attach to the daemon instead would be the machine-wide
401
+ * version, and it would put a daemon dependency on the one command the fleet
402
+ * fan-out runs over ssh on every peer — a peer with a sick daemon would drop off
403
+ * the fleet stream entirely rather than degrade. The cross-process sharing that
404
+ * matters is the FLEET stream, which is what the daemon hub serves.
405
+ */
406
+ let sharedLocal = null;
407
+ /** The shared local collector, constructed on first use. Exposed for tests. */
408
+ export function sharedLocalFeedHub() {
409
+ return sharedLocal ??= new FeedHub({
410
+ watch: (hubOptions) => watchLocalFeed({
411
+ scope: machineId(), signal: hubOptions.signal, emit: hubOptions.emit,
412
+ }),
413
+ });
414
+ }
415
+ /** Reset the shared collector. Tests only — it must not leak across cases. */
416
+ export async function resetSharedLocalFeedHub() {
417
+ const hub = sharedLocal;
418
+ sharedLocal = null;
419
+ await hub?.close();
420
+ }
421
+ /**
422
+ * Subscribe to this machine's rows through the shared collector, until abort.
423
+ */
424
+ export function subscribeSharedLocalFeed(options) {
425
+ const detach = sharedLocalFeedHub().subscribe(options.emit);
426
+ return new Promise((resolve) => {
427
+ if (options.signal.aborted) {
428
+ detach();
429
+ resolve();
430
+ return;
431
+ }
432
+ options.signal.addEventListener('abort', () => { detach(); resolve(); }, { once: true });
433
+ });
434
+ }
305
435
  export async function watchFleetFeed(options) {
306
436
  const coordinator = new FeedWatchState();
307
437
  const projection = new FeedSessionProjection(coordinator);
@@ -309,7 +439,7 @@ export async function watchFleetFeed(options) {
309
439
  for (const projected of projection.apply(event))
310
440
  options.emit(projected);
311
441
  };
312
- const local = watchLocalFeed({ scope: machineId(), signal: options.signal, emit: forward });
442
+ const local = subscribeSharedLocalFeed({ signal: options.signal, emit: forward });
313
443
  let devices;
314
444
  try {
315
445
  devices = await loadDevices();
@@ -332,7 +462,7 @@ export async function watchFleetFeed(options) {
332
462
  const event = JSON.parse(line);
333
463
  if (event.v !== 1)
334
464
  return false;
335
- forward(event);
465
+ forward(normalizePeerEnvelope(event));
336
466
  return true;
337
467
  }
338
468
  catch {