@phnx-labs/agents-cli 1.22.34 → 1.22.37

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 (493) hide show
  1. package/CHANGELOG.md +672 -2
  2. package/README.md +82 -35
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.d.ts +15 -0
  5. package/dist/bootstrap.js +1211 -0
  6. package/dist/commands/accounts.d.ts +4 -11
  7. package/dist/commands/accounts.js +159 -27
  8. package/dist/commands/attach.js +17 -4
  9. package/dist/commands/audit.d.ts +8 -8
  10. package/dist/commands/audit.js +57 -47
  11. package/dist/commands/browser.js +15 -11
  12. package/dist/commands/cloud.js +1 -1
  13. package/dist/commands/commands.js +0 -11
  14. package/dist/commands/computer-actions.js +33 -0
  15. package/dist/commands/computer-sessions-picker.d.ts +21 -0
  16. package/dist/commands/computer-sessions-picker.js +141 -0
  17. package/dist/commands/computer.d.ts +16 -0
  18. package/dist/commands/computer.js +37 -0
  19. package/dist/commands/config.d.ts +17 -0
  20. package/dist/commands/config.js +401 -0
  21. package/dist/commands/cp.d.ts +84 -0
  22. package/dist/commands/cp.js +231 -0
  23. package/dist/commands/daemon.js +243 -14
  24. package/dist/commands/detach-core.d.ts +1 -1
  25. package/dist/commands/detach-core.js +12 -2
  26. package/dist/commands/detach.js +1 -1
  27. package/dist/commands/doctor.js +64 -5
  28. package/dist/commands/events.d.ts +24 -12
  29. package/dist/commands/events.js +144 -28
  30. package/dist/commands/exec.js +85 -41
  31. package/dist/commands/feed.d.ts +1 -1
  32. package/dist/commands/feed.js +16 -8
  33. package/dist/commands/focus.d.ts +33 -1
  34. package/dist/commands/focus.js +177 -17
  35. package/dist/commands/funnel.d.ts +1 -1
  36. package/dist/commands/go.js +9 -8
  37. package/dist/commands/harness-wizard.d.ts +1 -0
  38. package/dist/commands/harness-wizard.js +18 -20
  39. package/dist/commands/harness.d.ts +2 -0
  40. package/dist/commands/harness.js +59 -26
  41. package/dist/commands/hooks.js +0 -11
  42. package/dist/commands/inspect.d.ts +94 -1
  43. package/dist/commands/inspect.js +866 -40
  44. package/dist/commands/lease.d.ts +4 -4
  45. package/dist/commands/lease.js +6 -6
  46. package/dist/commands/login.js +0 -13
  47. package/dist/commands/logs.d.ts +2 -2
  48. package/dist/commands/logs.js +2 -2
  49. package/dist/commands/mcp.js +7 -2
  50. package/dist/commands/memory.js +7 -2
  51. package/dist/commands/message.d.ts +1 -1
  52. package/dist/commands/message.js +37 -6
  53. package/dist/commands/models.js +4 -0
  54. package/dist/commands/monitors.d.ts +0 -1
  55. package/dist/commands/monitors.js +199 -16
  56. package/dist/commands/open.d.ts +18 -0
  57. package/dist/commands/open.js +57 -0
  58. package/dist/commands/packages.js +2 -107
  59. package/dist/commands/plugins.js +6 -3
  60. package/dist/commands/profiles.d.ts +1 -0
  61. package/dist/commands/profiles.js +16 -160
  62. package/dist/commands/projects.d.ts +28 -0
  63. package/dist/commands/projects.js +125 -5
  64. package/dist/commands/reconnect.js +9 -3
  65. package/dist/commands/repo.js +42 -1
  66. package/dist/commands/resource-view.d.ts +17 -0
  67. package/dist/commands/resource-view.js +36 -14
  68. package/dist/commands/resume.js +9 -2
  69. package/dist/commands/routines.d.ts +0 -2
  70. package/dist/commands/routines.js +473 -289
  71. package/dist/commands/secrets.js +52 -9
  72. package/dist/commands/sessions-export.d.ts +47 -0
  73. package/dist/commands/sessions-export.js +116 -6
  74. package/dist/commands/sessions-import.d.ts +17 -0
  75. package/dist/commands/sessions-import.js +114 -6
  76. package/dist/commands/sessions-migrate.d.ts +27 -0
  77. package/dist/commands/sessions-migrate.js +50 -9
  78. package/dist/commands/sessions-picker.js +23 -4
  79. package/dist/commands/sessions-resume.d.ts +5 -3
  80. package/dist/commands/sessions-resume.js +30 -8
  81. package/dist/commands/sessions-watch.d.ts +2 -0
  82. package/dist/commands/sessions-watch.js +53 -0
  83. package/dist/commands/sessions.d.ts +66 -3
  84. package/dist/commands/sessions.js +298 -47
  85. package/dist/commands/set.d.ts +1 -1
  86. package/dist/commands/set.js +2 -2
  87. package/dist/commands/setup-browser.js +2 -2
  88. package/dist/commands/setup-mine.js +0 -1
  89. package/dist/commands/setup-preferences.js +1 -1
  90. package/dist/commands/setup-share.js +34 -4
  91. package/dist/commands/setup.d.ts +5 -0
  92. package/dist/commands/setup.js +26 -0
  93. package/dist/commands/share.d.ts +85 -0
  94. package/dist/commands/share.js +379 -8
  95. package/dist/commands/skills.js +0 -11
  96. package/dist/commands/snapshot.js +1 -1
  97. package/dist/commands/ssh.d.ts +18 -0
  98. package/dist/commands/ssh.js +549 -210
  99. package/dist/commands/sync.d.ts +5 -0
  100. package/dist/commands/sync.js +212 -32
  101. package/dist/commands/teams.d.ts +13 -0
  102. package/dist/commands/teams.js +187 -30
  103. package/dist/commands/tickets.d.ts +2 -0
  104. package/dist/commands/tickets.js +43 -0
  105. package/dist/commands/update.js +2 -4
  106. package/dist/commands/usage.js +5 -3
  107. package/dist/commands/versions.js +11 -5
  108. package/dist/commands/view.js +15 -7
  109. package/dist/commands/webhook.d.ts +2 -2
  110. package/dist/commands/webhook.js +7 -7
  111. package/dist/index.d.ts +18 -2
  112. package/dist/index.js +53 -1264
  113. package/dist/lib/account-catalog.d.ts +18 -0
  114. package/dist/lib/account-catalog.js +38 -0
  115. package/dist/lib/account-provider-registry.d.ts +18 -0
  116. package/dist/lib/account-provider-registry.js +59 -0
  117. package/dist/lib/account-registry.d.ts +40 -0
  118. package/dist/lib/account-registry.js +239 -0
  119. package/dist/lib/account-schema.d.ts +44 -0
  120. package/dist/lib/account-schema.js +91 -0
  121. package/dist/lib/account-state-service.d.ts +21 -0
  122. package/dist/lib/account-state-service.js +60 -0
  123. package/dist/lib/activity.d.ts +1 -1
  124. package/dist/lib/activity.js +8 -1
  125. package/dist/lib/add-dir.d.ts +80 -0
  126. package/dist/lib/add-dir.js +241 -0
  127. package/dist/lib/agent-cli-commands.d.ts +11 -0
  128. package/dist/lib/agent-cli-commands.js +30 -0
  129. package/dist/lib/agents.js +44 -36
  130. package/dist/lib/answer-router.js +1 -1
  131. package/dist/lib/audit/log.d.ts +10 -27
  132. package/dist/lib/audit/log.js +20 -33
  133. package/dist/lib/auth-health.d.ts +9 -2
  134. package/dist/lib/auth-health.js +42 -9
  135. package/dist/lib/auto-pull-worker.js +7 -3
  136. package/dist/lib/auto-pull.d.ts +44 -3
  137. package/dist/lib/auto-pull.js +88 -5
  138. package/dist/lib/binary-shadow.d.ts +28 -0
  139. package/dist/lib/binary-shadow.js +121 -0
  140. package/dist/lib/brand.js +9 -3
  141. package/dist/lib/browser/ipc.d.ts +30 -0
  142. package/dist/lib/browser/ipc.js +81 -4
  143. package/dist/lib/browser/profiles.d.ts +3 -2
  144. package/dist/lib/browser/profiles.js +65 -22
  145. package/dist/lib/browser/service.d.ts +4 -0
  146. package/dist/lib/browser/service.js +30 -3
  147. package/dist/lib/browser/sessions-list.d.ts +22 -2
  148. package/dist/lib/browser/sessions-list.js +54 -6
  149. package/dist/lib/browser/stream.d.ts +2 -0
  150. package/dist/lib/browser/stream.js +1 -0
  151. package/dist/lib/browser/types.d.ts +19 -0
  152. package/dist/lib/byok-usage.d.ts +9 -2
  153. package/dist/lib/byok-usage.js +133 -31
  154. package/dist/lib/cli-entry.d.ts +11 -0
  155. package/dist/lib/cli-entry.js +46 -0
  156. package/dist/lib/cloud/host.d.ts +1 -1
  157. package/dist/lib/cloud/host.js +2 -2
  158. package/dist/lib/cloud/registry.js +1 -1
  159. package/dist/lib/cloud/types.d.ts +1 -1
  160. package/dist/lib/codex-policy.d.ts +9 -1
  161. package/dist/lib/codex-policy.js +17 -2
  162. package/dist/lib/commands.d.ts +2 -0
  163. package/dist/lib/commands.js +2 -0
  164. package/dist/lib/computer/sessions-list.d.ts +150 -0
  165. package/dist/lib/computer/sessions-list.js +363 -0
  166. package/dist/lib/config-keys.d.ts +86 -0
  167. package/dist/lib/config-keys.js +193 -0
  168. package/dist/lib/config-machine-keys.d.ts +12 -0
  169. package/dist/lib/config-machine-keys.js +17 -0
  170. package/dist/lib/config-transfer.js +3 -4
  171. package/dist/lib/crabbox/cli.d.ts +2 -2
  172. package/dist/lib/crabbox/cli.js +3 -3
  173. package/dist/lib/daemon-health.d.ts +22 -0
  174. package/dist/lib/daemon-health.js +33 -3
  175. package/dist/lib/daemon-services.d.ts +50 -0
  176. package/dist/lib/daemon-services.js +147 -0
  177. package/dist/lib/daemon-ticks.d.ts +35 -66
  178. package/dist/lib/daemon-ticks.js +77 -159
  179. package/dist/lib/daemon.d.ts +72 -4
  180. package/dist/lib/daemon.js +792 -202
  181. package/dist/lib/deeplink/register.d.ts +49 -0
  182. package/dist/lib/deeplink/register.js +253 -0
  183. package/dist/lib/deeplink/url.d.ts +34 -0
  184. package/dist/lib/deeplink/url.js +78 -0
  185. package/dist/lib/device-config.d.ts +124 -29
  186. package/dist/lib/device-config.js +346 -141
  187. package/dist/lib/devices/config-migration.d.ts +42 -0
  188. package/dist/lib/devices/config-migration.js +203 -0
  189. package/dist/lib/devices/connect.js +14 -7
  190. package/dist/lib/devices/doctor-findings.d.ts +4 -1
  191. package/dist/lib/devices/doctor-findings.js +20 -1
  192. package/dist/lib/devices/harness-inventory.d.ts +11 -2
  193. package/dist/lib/devices/harness-inventory.js +0 -0
  194. package/dist/lib/devices/health.d.ts +1 -1
  195. package/dist/lib/devices/health.js +1 -1
  196. package/dist/lib/devices/pending.d.ts +22 -1
  197. package/dist/lib/devices/pending.js +67 -2
  198. package/dist/lib/devices/registry.d.ts +0 -25
  199. package/dist/lib/devices/registry.js +2 -83
  200. package/dist/lib/devices/resolve-profile.d.ts +20 -0
  201. package/dist/lib/devices/resolve-profile.js +44 -0
  202. package/dist/lib/devices/rollout-verify.d.ts +101 -0
  203. package/dist/lib/devices/rollout-verify.js +193 -0
  204. package/dist/lib/devices/ssh-config.js +10 -6
  205. package/dist/lib/event-families.d.ts +28 -0
  206. package/dist/lib/event-families.js +159 -0
  207. package/dist/lib/event-stream.d.ts +9 -1
  208. package/dist/lib/event-stream.js +26 -9
  209. package/dist/lib/events.d.ts +9 -1
  210. package/dist/lib/events.js +21 -6
  211. package/dist/lib/exec.d.ts +30 -0
  212. package/dist/lib/exec.js +220 -122
  213. package/dist/lib/feed-broadcast.d.ts +25 -0
  214. package/dist/lib/feed-broadcast.js +33 -0
  215. package/dist/lib/feed.d.ts +1 -1
  216. package/dist/lib/feed.js +12 -2
  217. package/dist/lib/fleet/capture.js +15 -0
  218. package/dist/lib/fleet/manifest.js +9 -0
  219. package/dist/lib/fleet/types.d.ts +9 -0
  220. package/dist/lib/fleet-status.js +10 -8
  221. package/dist/lib/git.d.ts +20 -6
  222. package/dist/lib/git.js +121 -17
  223. package/dist/lib/hosts/dispatch.d.ts +8 -3
  224. package/dist/lib/hosts/dispatch.js +29 -3
  225. package/dist/lib/hosts/logs.d.ts +2 -2
  226. package/dist/lib/hosts/logs.js +2 -2
  227. package/dist/lib/hosts/option.js +1 -1
  228. package/dist/lib/hosts/passthrough.d.ts +2 -3
  229. package/dist/lib/hosts/passthrough.js +10 -24
  230. package/dist/lib/hosts/progress.js +2 -2
  231. package/dist/lib/hosts/providers/devices.d.ts +3 -3
  232. package/dist/lib/hosts/providers/devices.js +18 -12
  233. package/dist/lib/hosts/ready.d.ts +5 -1
  234. package/dist/lib/hosts/ready.js +9 -3
  235. package/dist/lib/hosts/reconcile.d.ts +2 -2
  236. package/dist/lib/hosts/reconcile.js +2 -2
  237. package/dist/lib/hosts/registry.js +14 -9
  238. package/dist/lib/hosts/remote-cmd.js +1 -1
  239. package/dist/lib/hosts/remote-os.d.ts +9 -6
  240. package/dist/lib/hosts/remote-os.js +13 -6
  241. package/dist/lib/hosts/routing-flag.d.ts +23 -0
  242. package/dist/lib/hosts/routing-flag.js +41 -0
  243. package/dist/lib/hosts/run-target.js +1 -1
  244. package/dist/lib/hosts/session-index.js +1 -1
  245. package/dist/lib/hosts/tasks.d.ts +6 -6
  246. package/dist/lib/hosts/tasks.js +4 -4
  247. package/dist/lib/hosts/types.js +1 -2
  248. package/dist/lib/installations/resolve.js +2 -8
  249. package/dist/lib/isolation-boundary-report.js +0 -1
  250. package/dist/lib/linear-cache.d.ts +7 -0
  251. package/dist/lib/linear-cache.js +31 -4
  252. package/dist/lib/linear-project-counts.d.ts +1 -1
  253. package/dist/lib/linear-project-counts.js +2 -3
  254. package/dist/lib/linear-projects.js +1 -1
  255. package/dist/lib/loop.d.ts +2 -2
  256. package/dist/lib/loop.js +1 -1
  257. package/dist/lib/mailbox-target.d.ts +1 -1
  258. package/dist/lib/mailbox-target.js +1 -1
  259. package/dist/lib/manifest.js +7 -4
  260. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  261. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  262. package/dist/lib/menubar/snapshot.d.ts +3 -2
  263. package/dist/lib/menubar/snapshot.js +6 -2
  264. package/dist/lib/migrate-fold.d.ts +33 -0
  265. package/dist/lib/migrate-fold.js +130 -0
  266. package/dist/lib/migrate.d.ts +34 -34
  267. package/dist/lib/migrate.js +106 -128
  268. package/dist/lib/model-tier-overrides.d.ts +1 -1
  269. package/dist/lib/model-tier-overrides.js +15 -2
  270. package/dist/lib/monitors/config.d.ts +17 -3
  271. package/dist/lib/monitors/config.js +52 -18
  272. package/dist/lib/monitors/engine.d.ts +32 -1
  273. package/dist/lib/monitors/engine.js +94 -11
  274. package/dist/lib/monitors/fingerprint.d.ts +46 -0
  275. package/dist/lib/monitors/fingerprint.js +100 -0
  276. package/dist/lib/monitors/remote.d.ts +47 -0
  277. package/dist/lib/monitors/remote.js +81 -0
  278. package/dist/lib/monitors/state.d.ts +39 -0
  279. package/dist/lib/monitors/state.js +56 -0
  280. package/dist/lib/onepassword.d.ts +17 -0
  281. package/dist/lib/onepassword.js +52 -22
  282. package/dist/lib/open-url.js +1 -1
  283. package/dist/lib/picker.d.ts +14 -2
  284. package/dist/lib/picker.js +35 -13
  285. package/dist/lib/placement.d.ts +1 -1
  286. package/dist/lib/placement.js +1 -1
  287. package/dist/lib/pr-land-detach.d.ts +32 -0
  288. package/dist/lib/pr-land-detach.js +79 -0
  289. package/dist/lib/profiles-presets.js +13 -0
  290. package/dist/lib/profiles.d.ts +2 -0
  291. package/dist/lib/profiles.js +44 -1
  292. package/dist/lib/project-focus.d.ts +1 -1
  293. package/dist/lib/project-focus.js +1 -1
  294. package/dist/lib/project-key.d.ts +17 -0
  295. package/dist/lib/project-key.js +26 -0
  296. package/dist/lib/project-probe.d.ts +4 -1
  297. package/dist/lib/project-probe.js +5 -4
  298. package/dist/lib/project-resources.js +2 -18
  299. package/dist/lib/project-root.d.ts +16 -0
  300. package/dist/lib/project-root.js +20 -2
  301. package/dist/lib/projects.d.ts +20 -1
  302. package/dist/lib/projects.js +78 -1
  303. package/dist/lib/refresh-coordinator.d.ts +24 -0
  304. package/dist/lib/refresh-coordinator.js +52 -0
  305. package/dist/lib/registry.d.ts +2 -2
  306. package/dist/lib/registry.js +1 -1
  307. package/dist/lib/resource-aliases.d.ts +13 -0
  308. package/dist/lib/resource-aliases.js +26 -0
  309. package/dist/lib/resources/types.d.ts +1 -1
  310. package/dist/lib/resources.d.ts +16 -0
  311. package/dist/lib/resources.js +66 -10
  312. package/dist/lib/rotate.d.ts +3 -4
  313. package/dist/lib/rotate.js +4 -5
  314. package/dist/lib/routine-activation.d.ts +22 -2
  315. package/dist/lib/routine-activation.js +63 -16
  316. package/dist/lib/routine-context.d.ts +9 -2
  317. package/dist/lib/routine-context.js +21 -6
  318. package/dist/lib/routines-project.d.ts +58 -48
  319. package/dist/lib/routines-project.js +190 -159
  320. package/dist/lib/routines.d.ts +41 -6
  321. package/dist/lib/routines.js +92 -34
  322. package/dist/lib/run-defaults.d.ts +5 -0
  323. package/dist/lib/run-defaults.js +11 -1
  324. package/dist/lib/runner.d.ts +10 -8
  325. package/dist/lib/runner.js +122 -39
  326. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  327. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  328. package/dist/lib/secrets/agent.d.ts +10 -3
  329. package/dist/lib/secrets/agent.js +43 -8
  330. package/dist/lib/secrets/bundles.d.ts +1 -0
  331. package/dist/lib/secrets/bundles.js +92 -80
  332. package/dist/lib/secrets/index.js +32 -9
  333. package/dist/lib/secrets/install-helper.d.ts +4 -4
  334. package/dist/lib/secrets/install-helper.js +4 -4
  335. package/dist/lib/secrets/push.d.ts +40 -6
  336. package/dist/lib/secrets/push.js +58 -11
  337. package/dist/lib/secrets/read-backoff.d.ts +1 -1
  338. package/dist/lib/secrets/read-backoff.js +1 -1
  339. package/dist/lib/secrets/remote.d.ts +24 -0
  340. package/dist/lib/secrets/remote.js +54 -4
  341. package/dist/lib/self-update.d.ts +108 -0
  342. package/dist/lib/self-update.js +276 -1
  343. package/dist/lib/session/active.d.ts +89 -5
  344. package/dist/lib/session/active.js +165 -10
  345. package/dist/lib/session/actor-sidecar.d.ts +1 -1
  346. package/dist/lib/session/actor-sidecar.js +2 -1
  347. package/dist/lib/session/db.d.ts +176 -2
  348. package/dist/lib/session/db.js +484 -17
  349. package/dist/lib/session/discover.js +27 -4
  350. package/dist/lib/session/hook-sessions.js +2 -2
  351. package/dist/lib/session/host-link.d.ts +2 -2
  352. package/dist/lib/session/host-link.js +2 -2
  353. package/dist/lib/session/pid-registry.d.ts +21 -0
  354. package/dist/lib/session/pid-registry.js +57 -0
  355. package/dist/lib/session/remote-active.js +15 -1
  356. package/dist/lib/session/remote.js +2 -2
  357. package/dist/lib/session/session-cache.d.ts +14 -7
  358. package/dist/lib/session/session-cache.js +51 -9
  359. package/dist/lib/session/state.d.ts +2 -2
  360. package/dist/lib/session/state.js +1 -1
  361. package/dist/lib/session/sync/config.d.ts +10 -10
  362. package/dist/lib/session/sync/config.js +10 -10
  363. package/dist/lib/session/sync/r2.d.ts +34 -0
  364. package/dist/lib/session/sync/r2.js +123 -0
  365. package/dist/lib/session/throughput.d.ts +1 -1
  366. package/dist/lib/session/throughput.js +1 -1
  367. package/dist/lib/session/types.d.ts +23 -1
  368. package/dist/lib/session/types.js +15 -0
  369. package/dist/lib/session/viewing-in.d.ts +1 -1
  370. package/dist/lib/session/viewing-in.js +1 -1
  371. package/dist/lib/session/watch.d.ts +101 -0
  372. package/dist/lib/session/watch.js +242 -0
  373. package/dist/lib/share/config.d.ts +4 -0
  374. package/dist/lib/share/config.js +1 -0
  375. package/dist/lib/share/delete.d.ts +93 -0
  376. package/dist/lib/share/delete.js +127 -0
  377. package/dist/lib/share/provision.d.ts +38 -0
  378. package/dist/lib/share/provision.js +50 -0
  379. package/dist/lib/share/publish.d.ts +40 -1
  380. package/dist/lib/share/publish.js +116 -3
  381. package/dist/lib/share/worker-template.js +71 -6
  382. package/dist/lib/shims.d.ts +17 -3
  383. package/dist/lib/shims.js +136 -27
  384. package/dist/lib/signin-badge.js +3 -2
  385. package/dist/lib/skills.js +2 -0
  386. package/dist/lib/smart-launch.d.ts +8 -8
  387. package/dist/lib/smart-launch.js +80 -59
  388. package/dist/lib/ssh-exec.d.ts +1 -1
  389. package/dist/lib/ssh-exec.js +1 -1
  390. package/dist/lib/staleness/prune.d.ts +88 -0
  391. package/dist/lib/staleness/prune.js +69 -0
  392. package/dist/lib/staleness/registry.d.ts +1 -1
  393. package/dist/lib/staleness/writers/commands.js +34 -2
  394. package/dist/lib/staleness/writers/hooks.js +16 -0
  395. package/dist/lib/staleness/writers/kinds.d.ts +6 -0
  396. package/dist/lib/staleness/writers/skills.js +19 -0
  397. package/dist/lib/staleness/writers/subagents.d.ts +2 -3
  398. package/dist/lib/staleness/writers/subagents.js +0 -4
  399. package/dist/lib/staleness/writers/types.d.ts +32 -0
  400. package/dist/lib/startup/command-registry.d.ts +6 -12
  401. package/dist/lib/startup/command-registry.js +14 -31
  402. package/dist/lib/startup/dev-build.d.ts +10 -0
  403. package/dist/lib/startup/dev-build.js +13 -1
  404. package/dist/lib/startup/spellcheck.d.ts +18 -0
  405. package/dist/lib/startup/spellcheck.js +45 -0
  406. package/dist/lib/state.d.ts +36 -9
  407. package/dist/lib/state.js +96 -46
  408. package/dist/lib/subagents-registry.d.ts +0 -7
  409. package/dist/lib/subagents-registry.js +38 -65
  410. package/dist/lib/subagents.d.ts +0 -33
  411. package/dist/lib/subagents.js +0 -75
  412. package/dist/lib/sync-umbrella.js +1 -1
  413. package/dist/lib/teams/agents.d.ts +41 -1
  414. package/dist/lib/teams/agents.js +187 -9
  415. package/dist/lib/teams/api.d.ts +11 -1
  416. package/dist/lib/teams/api.js +11 -2
  417. package/dist/lib/teams/delivery.d.ts +41 -0
  418. package/dist/lib/teams/delivery.js +60 -0
  419. package/dist/lib/teams/registry.d.ts +14 -0
  420. package/dist/lib/teams/registry.js +51 -1
  421. package/dist/lib/teams/remoteWorktree.d.ts +19 -0
  422. package/dist/lib/teams/remoteWorktree.js +29 -0
  423. package/dist/lib/teams/scheduler.d.ts +1 -1
  424. package/dist/lib/teams/scheduler.js +1 -1
  425. package/dist/lib/teams/worktree.d.ts +24 -0
  426. package/dist/lib/teams/worktree.js +42 -0
  427. package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
  428. package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
  429. package/dist/lib/terminal/engine.d.ts +4 -0
  430. package/dist/lib/terminal/engine.js +8 -2
  431. package/dist/lib/terminal/types.d.ts +21 -2
  432. package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
  433. package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
  434. package/dist/lib/tickets/list.d.ts +53 -0
  435. package/dist/lib/tickets/list.js +153 -0
  436. package/dist/lib/tmux/orphan-reap.d.ts +320 -0
  437. package/dist/lib/tmux/orphan-reap.js +644 -0
  438. package/dist/lib/tmux/session.d.ts +68 -3
  439. package/dist/lib/tmux/session.js +95 -5
  440. package/dist/lib/triggers/handlers.d.ts +20 -0
  441. package/dist/lib/triggers/handlers.js +6 -1
  442. package/dist/lib/types.d.ts +46 -34
  443. package/dist/lib/usage-fleet.d.ts +32 -0
  444. package/dist/lib/usage-fleet.js +125 -0
  445. package/dist/lib/usage-refresh.d.ts +3 -3
  446. package/dist/lib/usage-refresh.js +19 -16
  447. package/dist/lib/usage.d.ts +51 -47
  448. package/dist/lib/usage.js +145 -153
  449. package/dist/lib/version-duplicates.js +2 -2
  450. package/dist/lib/versions.d.ts +56 -13
  451. package/dist/lib/versions.js +195 -45
  452. package/dist/lib/watchdog/log.d.ts +1 -1
  453. package/dist/lib/watchdog/log.js +3 -3
  454. package/dist/lib/watchdog/rotate.d.ts +6 -6
  455. package/dist/lib/watchdog/rotate.js +6 -6
  456. package/dist/lib/workflows.d.ts +1 -1
  457. package/dist/lib/yaml-io.d.ts +47 -0
  458. package/dist/lib/yaml-io.js +55 -0
  459. package/package.json +2 -1
  460. package/scripts/install-helper.js +2 -2
  461. package/scripts/postinstall.js +23 -20
  462. package/dist/commands/defaults.d.ts +0 -7
  463. package/dist/commands/defaults.js +0 -107
  464. package/dist/commands/export.d.ts +0 -11
  465. package/dist/commands/export.js +0 -215
  466. package/dist/commands/helper.d.ts +0 -12
  467. package/dist/commands/helper.js +0 -87
  468. package/dist/commands/hosts.d.ts +0 -11
  469. package/dist/commands/hosts.js +0 -330
  470. package/dist/commands/lock.d.ts +0 -12
  471. package/dist/commands/lock.js +0 -70
  472. package/dist/commands/pull.d.ts +0 -17
  473. package/dist/commands/pull.js +0 -39
  474. package/dist/commands/push.d.ts +0 -14
  475. package/dist/commands/push.js +0 -30
  476. package/dist/commands/wallet.d.ts +0 -20
  477. package/dist/commands/wallet.js +0 -216
  478. package/dist/commands/worktree.d.ts +0 -19
  479. package/dist/commands/worktree.js +0 -272
  480. package/dist/lib/account-labels.d.ts +0 -24
  481. package/dist/lib/account-labels.js +0 -72
  482. package/dist/lib/auto-dispatch-linear.d.ts +0 -18
  483. package/dist/lib/auto-dispatch-linear.js +0 -107
  484. package/dist/lib/auto-dispatch-provider.d.ts +0 -10
  485. package/dist/lib/auto-dispatch-provider.js +0 -30
  486. package/dist/lib/auto-dispatch.d.ts +0 -93
  487. package/dist/lib/auto-dispatch.js +0 -128
  488. package/dist/lib/export.d.ts +0 -72
  489. package/dist/lib/export.js +0 -269
  490. package/dist/lib/lock.d.ts +0 -93
  491. package/dist/lib/lock.js +0 -207
  492. package/dist/lib/wallet/index.d.ts +0 -78
  493. package/dist/lib/wallet/index.js +0 -253
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Event stream families — sessions-style --include / --exclude for the unified
3
+ * event reader. One vocabulary maps onto existing filters (includeActivity,
4
+ * eventTypes, level) so the engine stays single-path.
5
+ */
6
+ export const EVENT_FAMILIES = [
7
+ 'ops',
8
+ 'activity',
9
+ 'commands',
10
+ 'runs',
11
+ 'security',
12
+ ];
13
+ const FAMILY_SET = new Set(EVENT_FAMILIES);
14
+ export function isEventFamily(value) {
15
+ return FAMILY_SET.has(value);
16
+ }
17
+ /**
18
+ * Parse a comma-separated family list. Throws on unknown names or empty list
19
+ * after split (same discipline as sessions role lists).
20
+ */
21
+ export function parseFamilyList(raw, flagName) {
22
+ const parts = raw.split(',').map((s) => s.trim()).filter(Boolean);
23
+ if (parts.length === 0) {
24
+ throw new Error(`${flagName} requires at least one family: ${EVENT_FAMILIES.join(', ')}`);
25
+ }
26
+ const out = [];
27
+ for (const p of parts) {
28
+ if (!isEventFamily(p)) {
29
+ throw new Error(`Unknown family ${JSON.stringify(p)} in ${flagName}. Use: ${EVENT_FAMILIES.join(', ')}`);
30
+ }
31
+ if (!out.includes(p))
32
+ out.push(p);
33
+ }
34
+ return out;
35
+ }
36
+ /** Command-churn event kinds. */
37
+ export const COMMAND_EVENT_TYPES = ['command.start', 'command.end'];
38
+ /** Run-dispatch outcome kinds (replaces the separate audit/log.jsonl product). */
39
+ export const RUN_EVENT_TYPES = ['run.dispatched', 'agent.run.end'];
40
+ /**
41
+ * Fold family include/exclude into a UnifiedQuery.
42
+ * Precedence: family narrows sources/types; field filters (module, event, …)
43
+ * still apply on top.
44
+ *
45
+ * --include and --exclude are mutually exclusive at the CLI layer; this
46
+ * function accepts only one of includeFamilies / excludeFamilies.
47
+ */
48
+ export function applyFamilies(q) {
49
+ const include = q.includeFamilies;
50
+ const exclude = q.excludeFamilies;
51
+ if (include?.length && exclude?.length) {
52
+ throw new Error('--include and --exclude are mutually exclusive');
53
+ }
54
+ if (!include?.length && !exclude?.length)
55
+ return q;
56
+ if (include?.length)
57
+ return applyInclude(q, include);
58
+ return applyExclude(q, exclude);
59
+ }
60
+ function applyInclude(q, families) {
61
+ const has = (f) => families.includes(f);
62
+ const typeSets = [];
63
+ let level = q.level;
64
+ let includeActivity = false;
65
+ let forceModule;
66
+ // Source selection — multi-family include is a UNION of each family's rows.
67
+ if (has('activity'))
68
+ includeActivity = true;
69
+ if (has('ops') || has('commands') || has('runs') || has('security')) {
70
+ // ops path open (includeActivity stays true when activity is also listed)
71
+ }
72
+ else if (has('activity')) {
73
+ // activity-only
74
+ forceModule = q.module ?? 'activity';
75
+ includeActivity = true;
76
+ }
77
+ // Default when include lists only type-scoping / ops / security: activity off
78
+ // unless activity is listed.
79
+ if (!has('activity') && (has('ops') || has('commands') || has('runs') || has('security'))) {
80
+ includeActivity = false;
81
+ }
82
+ // include ops + activity explicitly
83
+ if (has('ops') && has('activity'))
84
+ includeActivity = true;
85
+ if (has('commands'))
86
+ typeSets.push([...COMMAND_EVENT_TYPES]);
87
+ if (has('runs'))
88
+ typeSets.push([...RUN_EVENT_TYPES]);
89
+ if (has('security')) {
90
+ if (!level)
91
+ level = 'audit';
92
+ // security without activity stays ops-only
93
+ if (!has('activity'))
94
+ includeActivity = false;
95
+ }
96
+ // Type-scoped families (commands / runs) only restrict eventTypes when no
97
+ // broader ops-side family is in the include list. ops and security already
98
+ // cover those kinds; AND-ing a type filter would shrink the union (e.g.
99
+ // --include security,runs would drop secrets.get and keep only run.dispatched).
100
+ const broadOps = has('ops') || has('security');
101
+ let eventTypes = q.eventTypes ? [...q.eventTypes] : undefined;
102
+ if (typeSets.length > 0 && !broadOps) {
103
+ const union = new Set();
104
+ for (const set of typeSets)
105
+ for (const t of set)
106
+ union.add(t);
107
+ if (eventTypes?.length) {
108
+ // Intersect with --event; empty means no match (never silently widen).
109
+ const allowed = new Set(eventTypes);
110
+ eventTypes = [...union].filter((t) => allowed.has(t));
111
+ }
112
+ else {
113
+ eventTypes = [...union];
114
+ }
115
+ }
116
+ return {
117
+ ...q,
118
+ includeActivity,
119
+ ...(forceModule != null ? { module: forceModule } : {}),
120
+ ...(level ? { level } : {}),
121
+ ...(eventTypes ? { eventTypes } : {}),
122
+ };
123
+ }
124
+ function applyExclude(q, families) {
125
+ const has = (f) => families.includes(f);
126
+ let includeActivity = q.includeActivity !== false;
127
+ const excludeEventTypes = [...(q.excludeEventTypes ?? [])];
128
+ let excludeLevel = q.excludeLevel;
129
+ let forceModule;
130
+ // Exclude ops first (→ activity-only), then activity (may clear the reopen).
131
+ // --exclude ops,activity must not re-open activity after both sources are out.
132
+ if (has('ops')) {
133
+ forceModule = q.module ?? 'activity';
134
+ includeActivity = true;
135
+ }
136
+ if (has('activity'))
137
+ includeActivity = false;
138
+ if (has('commands')) {
139
+ for (const t of COMMAND_EVENT_TYPES) {
140
+ if (!excludeEventTypes.includes(t))
141
+ excludeEventTypes.push(t);
142
+ }
143
+ }
144
+ if (has('runs')) {
145
+ for (const t of RUN_EVENT_TYPES) {
146
+ if (!excludeEventTypes.includes(t))
147
+ excludeEventTypes.push(t);
148
+ }
149
+ }
150
+ if (has('security'))
151
+ excludeLevel = 'audit';
152
+ return {
153
+ ...q,
154
+ includeActivity,
155
+ ...(forceModule != null ? { module: forceModule } : {}),
156
+ ...(excludeEventTypes.length ? { excludeEventTypes } : {}),
157
+ ...(excludeLevel ? { excludeLevel } : {}),
158
+ };
159
+ }
@@ -12,11 +12,16 @@
12
12
  * single READ surface that merges them; nothing here writes.
13
13
  */
14
14
  import { type EventRecord, type EventType, type EventLevel } from './events.js';
15
+ import { type EventFamily } from './event-families.js';
15
16
  export interface UnifiedQuery {
16
17
  startDate?: Date;
17
18
  endDate?: Date;
18
19
  eventTypes?: EventType[];
20
+ /** Drop these event kinds after read (used by --exclude commands / runs). */
21
+ excludeEventTypes?: EventType[];
19
22
  level?: EventLevel;
23
+ /** Drop this level (used by --exclude security). */
24
+ excludeLevel?: EventLevel;
20
25
  agent?: string;
21
26
  /** Only events stamped with this session id (payload `sessionId`, the provenance floor). */
22
27
  sessionId?: string;
@@ -31,6 +36,9 @@ export interface UnifiedQuery {
31
36
  includeActivity?: boolean;
32
37
  /** Override the activity dir (tests). */
33
38
  activityRoot?: string;
39
+ /** Sessions-style family filters (resolved via applyFamilies). */
40
+ includeFamilies?: EventFamily[];
41
+ excludeFamilies?: EventFamily[];
34
42
  }
35
43
  /**
36
44
  * Read a unified, newest-first event stream. Operational events come from
@@ -40,4 +48,4 @@ export interface UnifiedQuery {
40
48
  * eventTypes for activity, eventTypes/module/bundle for ops — so the top-N is
41
49
  * exact for those filters).
42
50
  */
43
- export declare function readUnifiedEvents(q?: UnifiedQuery): EventRecord[];
51
+ export declare function readUnifiedEvents(raw?: UnifiedQuery): EventRecord[];
@@ -13,6 +13,7 @@
13
13
  */
14
14
  import { query, levelFor } from './events.js';
15
15
  import { readActivityAsEventRecords } from './activity.js';
16
+ import { applyFamilies } from './event-families.js';
16
17
  /** Apply the same filters query() applies, to an activity-derived record. */
17
18
  function matches(r, q) {
18
19
  const ms = Date.parse(r.ts);
@@ -25,7 +26,12 @@ function matches(r, q) {
25
26
  return false;
26
27
  if (q.eventTypes && !q.eventTypes.includes(r.event))
27
28
  return false;
28
- if (q.level && (r.level ?? levelFor(r.event)) !== q.level)
29
+ if (q.excludeEventTypes?.includes(r.event))
30
+ return false;
31
+ const lvl = r.level ?? levelFor(r.event);
32
+ if (q.level && lvl !== q.level)
33
+ return false;
34
+ if (q.excludeLevel && lvl === q.excludeLevel)
29
35
  return false;
30
36
  if (q.agent && r.agent !== q.agent)
31
37
  return false;
@@ -50,9 +56,18 @@ function matches(r, q) {
50
56
  * eventTypes for activity, eventTypes/module/bundle for ops — so the top-N is
51
57
  * exact for those filters).
52
58
  */
53
- export function readUnifiedEvents(q = {}) {
59
+ export function readUnifiedEvents(raw = {}) {
60
+ const q = applyFamilies(raw);
54
61
  // `bundle` is filtered inside query()'s scan (before its limit cutoff) so a
55
62
  // matching-bundle record older than the newest-`limit` window is not dropped.
63
+ // Over-fetch when we will post-filter excludeEventTypes / excludeLevel so the
64
+ // top-N is still meaningful after drops.
65
+ const needsPost = Boolean(q.excludeEventTypes?.length || q.excludeLevel);
66
+ const fetchLimit = q.limit === undefined
67
+ ? undefined
68
+ : needsPost
69
+ ? Math.min(q.limit * 4, q.limit + 500)
70
+ : q.limit;
56
71
  const ops = query({
57
72
  startDate: q.startDate,
58
73
  endDate: q.endDate,
@@ -64,14 +79,16 @@ export function readUnifiedEvents(q = {}) {
64
79
  command: q.command,
65
80
  module: q.module,
66
81
  bundle: q.bundle,
67
- limit: q.limit,
68
- });
69
- if (q.includeActivity === false)
70
- return ops;
82
+ limit: fetchLimit,
83
+ }).filter((r) => matches(r, q));
84
+ if (q.includeActivity === false) {
85
+ return typeof q.limit === 'number' ? ops.slice(0, q.limit) : ops;
86
+ }
71
87
  // Activity events always stamp module: 'activity'. A non-activity module
72
88
  // filter can never match them — skip the activity scan entirely.
73
- if (q.module != null && q.module !== 'activity')
74
- return ops;
89
+ if (q.module != null && q.module !== 'activity') {
90
+ return typeof q.limit === 'number' ? ops.slice(0, q.limit) : ops;
91
+ }
75
92
  // Push eventTypes into the activity reader so `limit` is applied AFTER the
76
93
  // event-type filter (readRecentActivity already does this for `events`).
77
94
  // Without this, a rare match older than the newest-`limit` window of routine
@@ -80,7 +97,7 @@ export function readUnifiedEvents(q = {}) {
80
97
  // run via matches() for fields activity.ts does not pre-filter.
81
98
  const acts = readActivityAsEventRecords({
82
99
  sinceMs: q.startDate?.getTime(),
83
- limit: q.limit,
100
+ limit: fetchLimit,
84
101
  root: q.activityRoot,
85
102
  events: q.eventTypes,
86
103
  }).filter((r) => matches(r, q));
@@ -13,7 +13,7 @@
13
13
  */
14
14
  import type { ActorKind } from './actor.js';
15
15
  export type EventLevel = 'audit' | 'warn' | 'info' | 'debug';
16
- export type EventType = 'agent.run.start' | 'agent.run.end' | 'agent.spawn.start' | 'agent.spawn.end' | 'version.install' | 'version.switch' | 'version.remove' | 'skill.install' | 'skill.remove' | 'browser.launch' | 'browser.close' | 'browser.navigate' | 'browser.screenshot' | 'computer.action' | 'secrets.get' | 'secrets.unlocked' | 'secrets.create' | 'secrets.import' | 'secrets.export' | 'secrets.view' | 'secrets.lease-denied' | 'secrets.lease-expire' | 'secrets.set' | 'secrets.delete' | 'secrets.rename' | 'cloud.dispatch' | 'cloud.complete' | 'cloud.cancel' | 'cloud.message' | 'teams.create' | 'teams.add' | 'teams.start' | 'teams.complete' | 'teams.disband' | 'hook.fire' | 'hook.complete' | 'hook.error' | 'mcp.add' | 'mcp.remove' | 'mcp.register' | 'resource.sync' | 'rotation.resolved' | 'command.start' | 'command.end' | 'perf.timing' | 'session.start' | 'session.end' | 'webhook.received' | 'webhook.authorized' | 'webhook.rejected' | 'webhook.matched' | 'webhook.fired' | 'webhook.handler.start' | 'webhook.handler.end' | 'plan.created' | 'pr.opened' | 'pr.merged' | 'worktree.created' | 'worktree.removed' | 'commit.created' | 'pushed' | 'subagent.spawned' | 'artifact.created' | 'task.completed' | 'checklist.created' | 'status.posted' | 'file.edited' | 'factory.command' | 'factory.action' | 'factory.uri' | 'factory.launch' | 'friction' | 'error' | 'warn' | 'info' | 'debug';
16
+ export type EventType = 'agent.run.start' | 'agent.run.end' | 'agent.spawn.start' | 'agent.spawn.end' | 'run.dispatched' | 'daemon.start' | 'daemon.stop' | 'daemon.error' | 'daemon.info' | 'routine.start' | 'routine.end' | 'watchdog.action' | 'version.install' | 'version.switch' | 'version.remove' | 'skill.install' | 'skill.remove' | 'browser.launch' | 'browser.close' | 'browser.navigate' | 'browser.screenshot' | 'computer.action' | 'secrets.get' | 'secrets.unlocked' | 'secrets.create' | 'secrets.import' | 'secrets.export' | 'secrets.view' | 'secrets.lease-denied' | 'secrets.lease-expire' | 'secrets.set' | 'secrets.delete' | 'secrets.rename' | 'cloud.dispatch' | 'cloud.complete' | 'cloud.cancel' | 'cloud.message' | 'teams.create' | 'teams.add' | 'teams.start' | 'teams.complete' | 'teams.disband' | 'hook.fire' | 'hook.complete' | 'hook.error' | 'mcp.add' | 'mcp.remove' | 'mcp.register' | 'resource.sync' | 'rotation.resolved' | 'command.start' | 'command.end' | 'perf.timing' | 'session.start' | 'session.end' | 'webhook.received' | 'webhook.authorized' | 'webhook.rejected' | 'webhook.matched' | 'webhook.fired' | 'webhook.handler.start' | 'webhook.handler.end' | 'plan.created' | 'pr.opened' | 'pr.merged' | 'worktree.created' | 'worktree.removed' | 'commit.created' | 'pushed' | 'subagent.spawned' | 'artifact.created' | 'task.completed' | 'checklist.created' | 'status.posted' | 'file.edited' | 'factory.command' | 'factory.action' | 'factory.uri' | 'factory.launch' | 'friction' | 'error' | 'warn' | 'info' | 'debug';
17
17
  /** Every known event kind. Derived from {@link EVENT_TYPE_TABLE}, never hand-listed. */
18
18
  export declare const EVENT_TYPES: readonly EventType[];
19
19
  /** Runtime guard for an event kind arriving from outside this process. */
@@ -135,6 +135,14 @@ export declare function emit(event: EventType, payload?: EventPayload, overrides
135
135
  * done({ exitCode: 0 }); // emits agent.run.end with durationMs
136
136
  */
137
137
  export declare function emitStart(startEvent: EventType, payload?: EventPayload): (endPayload?: EventPayload) => void;
138
+ export declare function emitRoutineEnd(meta: {
139
+ jobName: string;
140
+ runId?: string;
141
+ status: string;
142
+ duration?: number;
143
+ exitCode?: number | null;
144
+ detail?: string;
145
+ }): void;
138
146
  /**
139
147
  * Measure execution time of a synchronous function.
140
148
  * Emits a perf.timing event with the duration.
@@ -109,6 +109,10 @@ const FILE_MODE = 0o600;
109
109
  */
110
110
  const EVENT_TYPE_TABLE = {
111
111
  'agent.run.start': true, 'agent.run.end': true, 'agent.spawn.start': true, 'agent.spawn.end': true,
112
+ 'run.dispatched': true,
113
+ 'daemon.start': true, 'daemon.stop': true, 'daemon.error': true, 'daemon.info': true,
114
+ 'routine.start': true, 'routine.end': true,
115
+ 'watchdog.action': true,
112
116
  'version.install': true, 'version.switch': true, 'version.remove': true,
113
117
  'skill.install': true, 'skill.remove': true,
114
118
  'browser.launch': true, 'browser.close': true, 'browser.navigate': true, 'browser.screenshot': true,
@@ -141,6 +145,7 @@ export function isEventType(value) {
141
145
  }
142
146
  const AUDIT_EVENTS = new Set([
143
147
  'command.start', 'command.end',
148
+ 'run.dispatched',
144
149
  'secrets.get', 'secrets.unlocked', 'secrets.create', 'secrets.import', 'secrets.export', 'secrets.view', 'secrets.lease-denied', 'secrets.lease-expire',
145
150
  'secrets.set', 'secrets.delete', 'secrets.rename',
146
151
  'teams.create', 'teams.add', 'teams.start', 'teams.complete', 'teams.disband',
@@ -150,6 +155,10 @@ const AUDIT_EVENTS = new Set([
150
155
  'mcp.add', 'mcp.remove', 'mcp.register',
151
156
  'rotation.resolved',
152
157
  'session.start', 'session.end',
158
+ // Daemon lifecycle (always-on process start/stop/error is audit-relevant).
159
+ // browser.* / computer.action stay info — they are already on the event stream;
160
+ // elevating them to audit would flood the security lane (see events.test.ts).
161
+ 'daemon.start', 'daemon.stop', 'daemon.error',
153
162
  // An external process reaching into the user's editor (the CLI's
154
163
  // vscodium-agent backend driving `/spawn` / `/inject` / `/focus`) is a
155
164
  // "who reached in from outside" fact, which is what the audit lane answers.
@@ -528,15 +537,21 @@ let _chmoddedPath;
528
537
  export function emitStart(startEvent, payload = {}) {
529
538
  const startTime = Date.now();
530
539
  emit(startEvent, payload);
531
- const endEvent = startEvent.replace('.start', '.end');
532
540
  return (endPayload = {}) => {
533
- emit(endEvent, {
534
- ...payload,
535
- ...endPayload,
536
- durationMs: Date.now() - startTime,
537
- });
541
+ emit(startEvent.replace('.start', '.end'), { ...payload, ...endPayload, durationMs: Date.now() - startTime });
538
542
  };
539
543
  }
544
+ export function emitRoutineEnd(meta) {
545
+ emit('routine.end', {
546
+ module: 'routine',
547
+ name: meta.jobName,
548
+ status: meta.status,
549
+ ...(meta.runId ? { runId: meta.runId } : {}),
550
+ ...(meta.duration != null ? { durationMs: meta.duration } : {}),
551
+ ...(meta.exitCode != null ? { exitCode: meta.exitCode } : {}),
552
+ ...(meta.detail ? { detail: meta.detail } : {}),
553
+ });
554
+ }
540
555
  // ─── Timing Utilities ─────────────────────────────────────────────────────────
541
556
  /**
542
557
  * Measure execution time of a synchronous function.
@@ -353,6 +353,29 @@ export declare function execShimPassthrough(agent: AgentId, rawArgs: string[], c
353
353
  * `[detached]` with no explanation.
354
354
  */
355
355
  export declare function shouldRecapDeadPane(status: number | undefined, interactive: boolean): boolean;
356
+ /**
357
+ * The exit code a tmux-wrapped run resolves with (RUSH-2185 / EXEC-23b).
358
+ *
359
+ * Three inputs, one rule: report success ONLY for an outcome tmux actually told
360
+ * us about. A clean user detach (`knownAlive`) is 0; a dead pane reports the
361
+ * status tmux read off it; everything else — pane unreadable because the server
362
+ * or session went away, or dead with no status — is UNKNOWN and resolves to
363
+ * {@link UNKNOWN_OUTCOME_EXIT_CODE}, never 0.
364
+ *
365
+ * Why this is not `status ?? 0`: an interactive run whose tmux server died mid-
366
+ * work landed on exactly those unknown branches and returned 0, so `agents run`
367
+ * printed a failure banner while handing its caller a success code. The same
368
+ * "1 if unknown" rule already governs the `--host` follow path
369
+ * (`docs/specifications.md` §Agent execution, exit-code table).
370
+ *
371
+ * @param pane What `paneExitStatus` read back for the agent pane.
372
+ * @param knownAlive Positive proof the pane is still alive (see
373
+ * {@link isPaneKnownAliveFromQueryResult}) — a clean detach.
374
+ */
375
+ export declare function tmuxRunExitCode(pane: {
376
+ dead: boolean;
377
+ status?: number;
378
+ }, knownAlive: boolean): number;
356
379
  /**
357
380
  * True only when a `display-message #{pane_dead}` tmux query explicitly returned
358
381
  * "0" (pane alive). Used to distinguish "pane alive" from "query failed" in
@@ -439,6 +462,13 @@ export declare function writeTmuxEnvFile(env: NodeJS.ProcessEnv, filePath: strin
439
462
  export declare function formatPaneTail(raw: string, maxLines?: number): string;
440
463
  /** Exit code spawnAgent resolves with when a run is killed for crossing a budget cap. */
441
464
  export declare const BUDGET_KILL_EXIT_CODE = 7;
465
+ /**
466
+ * Exit code a tmux-wrapped run resolves with when tmux cannot tell us how the
467
+ * agent finished — the pane is unreadable, or it is dead with no reported status
468
+ * (EXEC-23b). Never 0: an unknown outcome reported as success is how a run killed
469
+ * mid-work gets counted as a clean finish by whatever scripted it.
470
+ */
471
+ export declare const UNKNOWN_OUTCOME_EXIT_CODE = 1;
442
472
  /**
443
473
  * Patterns that indicate a rate/usage limit. Matching is intentionally broad
444
474
  * because providers phrase these differently -- Anthropic uses "5-hour limit"