@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
@@ -1,269 +0,0 @@
1
- /**
2
- * `agents export` — copy an ISOLATED install's config back out to the user's real
3
- * `~/.<agent>`, so they can keep their settings and delete agents-cli entirely.
4
- *
5
- * Isolation is currently a one-way door: `agents add <agent>@<v> --isolated` builds a
6
- * self-contained home under the version dir, and nothing ever brings that work back.
7
- * Reversibility is what makes a sandbox safe to try.
8
- *
9
- * Three modes, because "export" means different things depending on which config you
10
- * consider authoritative:
11
- *
12
- * merge (default) — additive. Copy only paths the user doesn't already have. A
13
- * collision is NOT silently skipped: the incoming file is written
14
- * beside theirs as `<name>.from-agents-cli` so they can diff and
15
- * take the parts they want. Nothing of theirs is ever modified.
16
- * replace — the isolated config becomes `~/.<agent>`; theirs moves to
17
- * `backups/<agent>/<ts>`. For when you've been living in the
18
- * sandbox and want to promote it wholesale.
19
- * staged — write the whole tree to `~/.<agent>/.agents-export-<ts>/` and
20
- * activate nothing. For inspecting first.
21
- *
22
- * Every mode leaves a receipt at `~/.<agent>/.agents-cli-export.json` recording what
23
- * came from the export. That is what makes provenance answerable ("which of these
24
- * files are mine?") and the whole operation reversible.
25
- *
26
- * Deliberately NOT implemented: key-level merging of file *contents*. The TOML
27
- * library here does not preserve comments across parse+stringify, so auto-merging a
28
- * `config.toml` would silently delete the user's comments. Handing over both files
29
- * and a diff is honest; rewriting their config behind a "merge" flag is not.
30
- *
31
- * Split into a read-only {@link planExport} and a mutating {@link executeExport} so
32
- * `--dry-run` and the real run share one code path, mirroring `lib/uninstall.ts`.
33
- */
34
- import * as fs from 'fs';
35
- import * as path from 'path';
36
- import { AGENTS } from './agents.js';
37
- import { getAgentConfigPath, getConfigSymlinkVersion } from './shims.js';
38
- import { getVersionHomePath, isVersionIsolated, isVersionInstalled } from './versions.js';
39
- import { getUserAgentsDir, getBackupsDir } from './state.js';
40
- import { copyDirStrippingAgentsSymlinks, moveDirCrossDevice } from './config-transfer.js';
41
- /** Filename of the provenance receipt written into the agent's config dir. */
42
- export const RECEIPT_NAME = '.agents-cli-export.json';
43
- /** Suffix for the incoming copy of a file the user already has. */
44
- export const CONFLICT_SUFFIX = '.from-agents-cli';
45
- /** The config dir's basename (`.codex`), used to locate it inside a version home. */
46
- function configBasename(agent) {
47
- return path.basename(AGENTS[agent].configDir);
48
- }
49
- /**
50
- * Every regular file under `root`, as paths relative to it. Symlinks pointing back
51
- * into `~/.agents` are omitted for the same reason `copyDirStrippingAgentsSymlinks`
52
- * drops them: they dangle the moment `~/.agents` is disposed, and an export that
53
- * leaves dangling links is not an export.
54
- */
55
- function walkFiles(root, agentsDir, rel = '') {
56
- const inside = agentsDir + path.sep;
57
- const out = [];
58
- let entries;
59
- try {
60
- entries = fs.readdirSync(path.join(root, rel), { withFileTypes: true });
61
- }
62
- catch {
63
- return out;
64
- }
65
- for (const entry of entries) {
66
- const childRel = rel ? path.join(rel, entry.name) : entry.name;
67
- const abs = path.join(root, childRel);
68
- if (entry.isSymbolicLink()) {
69
- try {
70
- const tgt = path.resolve(path.dirname(abs), fs.readlinkSync(abs));
71
- if (tgt === agentsDir || tgt.startsWith(inside))
72
- continue;
73
- }
74
- catch {
75
- continue;
76
- }
77
- out.push(childRel);
78
- continue;
79
- }
80
- if (entry.isDirectory()) {
81
- out.push(...walkFiles(root, agentsDir, childRel));
82
- continue;
83
- }
84
- out.push(childRel);
85
- }
86
- return out;
87
- }
88
- /** Build a read-only plan. Performs no mutations. */
89
- export function planExport(agent, version, timestamp, mode = 'merge') {
90
- const source = path.join(getVersionHomePath(agent, version), configBasename(agent));
91
- const dest = getAgentConfigPath(agent);
92
- const base = {
93
- agent,
94
- version,
95
- mode,
96
- source,
97
- dest,
98
- destKind: 'absent',
99
- writes: [],
100
- conflicts: [],
101
- backupPath: null,
102
- stagedPath: null,
103
- receiptPath: path.join(dest, RECEIPT_NAME),
104
- };
105
- if (!isVersionInstalled(agent, version))
106
- return { ...base, blocker: { kind: 'not-installed' } };
107
- if (!isVersionIsolated(agent, version))
108
- return { ...base, blocker: { kind: 'not-isolated' } };
109
- if (!fs.existsSync(source))
110
- return { ...base, blocker: { kind: 'no-config', source } };
111
- // Refuse when `~/.<agent>` is a symlink agents-cli owns: the agent has a normal
112
- // install that adopted it, so writing there would land inside a version home
113
- // rather than in the user's real config, and silently mutate that other install.
114
- const adopted = getConfigSymlinkVersion(agent);
115
- if (adopted !== null) {
116
- return { ...base, blocker: { kind: 'dest-adopted', realPath: dest, adoptedVersion: adopted } };
117
- }
118
- let destKind = 'absent';
119
- try {
120
- destKind = fs.lstatSync(dest).isSymbolicLink() ? 'foreign-symlink' : 'real-dir';
121
- }
122
- catch {
123
- destKind = 'absent';
124
- }
125
- const agentsDir = getUserAgentsDir();
126
- const rels = walkFiles(source, agentsDir).sort();
127
- if (mode === 'staged') {
128
- const stagedPath = path.join(dest, `.agents-export-${timestamp}`);
129
- return {
130
- ...base,
131
- destKind,
132
- stagedPath,
133
- writes: rels.map((rel) => ({
134
- rel,
135
- source: path.join(source, rel),
136
- target: path.join(stagedPath, rel),
137
- })),
138
- blocker: null,
139
- };
140
- }
141
- if (mode === 'replace') {
142
- return {
143
- ...base,
144
- destKind,
145
- backupPath: destKind === 'real-dir' ? path.join(getBackupsDir(), agent, String(timestamp)) : null,
146
- writes: rels.map((rel) => ({
147
- rel,
148
- source: path.join(source, rel),
149
- target: path.join(dest, rel),
150
- })),
151
- blocker: null,
152
- };
153
- }
154
- // merge: additive. Anything the user already has becomes a conflict written
155
- // alongside, so their file is never the thing that changes.
156
- const writes = [];
157
- const conflicts = [];
158
- for (const rel of rels) {
159
- const target = path.join(dest, rel);
160
- let exists = false;
161
- try {
162
- fs.lstatSync(target);
163
- exists = true;
164
- }
165
- catch {
166
- exists = false;
167
- }
168
- if (exists) {
169
- conflicts.push({
170
- rel,
171
- source: path.join(source, rel),
172
- target: target + CONFLICT_SUFFIX,
173
- existing: target,
174
- });
175
- }
176
- else {
177
- writes.push({ rel, source: path.join(source, rel), target });
178
- }
179
- }
180
- return { ...base, destKind, writes, conflicts, blocker: null };
181
- }
182
- /** Copy one file, creating parent dirs. Symlinks are recreated, not followed. */
183
- function placeFile(entry) {
184
- fs.mkdirSync(path.dirname(entry.target), { recursive: true });
185
- const st = fs.lstatSync(entry.source);
186
- if (st.isSymbolicLink()) {
187
- const link = fs.readlinkSync(entry.source);
188
- try {
189
- fs.unlinkSync(entry.target);
190
- }
191
- catch {
192
- /* nothing there */
193
- }
194
- fs.symlinkSync(link, entry.target);
195
- return;
196
- }
197
- fs.copyFileSync(entry.source, entry.target);
198
- }
199
- function writeReceipt(plan, result, timestamp) {
200
- const receipt = {
201
- exportedAt: new Date(timestamp).toISOString(),
202
- from: `${plan.agent}@${plan.version} (isolated)`,
203
- mode: plan.mode,
204
- written: result.written,
205
- conflicts: result.conflicts,
206
- ...(result.backupPath ? { backupPath: result.backupPath } : {}),
207
- ...(result.stagedPath ? { stagedAt: result.stagedPath } : {}),
208
- note: plan.mode === 'merge'
209
- ? `Files under "written" came from this export. Paths under "conflicts" already existed and were NOT modified — the incoming version sits beside yours with the ${CONFLICT_SUFFIX} suffix.`
210
- : plan.mode === 'replace'
211
- ? 'This config was replaced wholesale by the export; the previous one is at backupPath.'
212
- : 'Nothing was activated — the exported tree sits under stagedAt.',
213
- };
214
- fs.mkdirSync(path.dirname(plan.receiptPath), { recursive: true });
215
- fs.writeFileSync(plan.receiptPath, JSON.stringify(receipt, null, 2) + '\n');
216
- }
217
- /** Execute a plan from {@link planExport}. */
218
- export function executeExport(plan, timestamp) {
219
- const result = {
220
- exported: false,
221
- dest: plan.dest,
222
- written: [],
223
- conflicts: [],
224
- backupPath: null,
225
- stagedPath: null,
226
- receiptPath: null,
227
- errors: [],
228
- };
229
- if (plan.blocker) {
230
- result.errors.push(`refusing to export: ${plan.blocker.kind}`);
231
- return result;
232
- }
233
- try {
234
- if (plan.mode === 'replace') {
235
- if (plan.backupPath) {
236
- fs.mkdirSync(path.dirname(plan.backupPath), { recursive: true });
237
- moveDirCrossDevice(plan.dest, plan.backupPath);
238
- result.backupPath = plan.backupPath;
239
- }
240
- else if (plan.destKind === 'foreign-symlink') {
241
- // Not ours to back up, but it must go or cpSync would write through it.
242
- fs.unlinkSync(plan.dest);
243
- }
244
- copyDirStrippingAgentsSymlinks(plan.source, plan.dest, getUserAgentsDir());
245
- result.written = plan.writes.map((w) => w.rel);
246
- }
247
- else {
248
- // merge and staged both place individual files; neither disturbs anything
249
- // the user already has.
250
- for (const entry of plan.writes) {
251
- placeFile(entry);
252
- result.written.push(entry.rel);
253
- }
254
- for (const entry of plan.conflicts) {
255
- placeFile(entry);
256
- result.conflicts.push({ path: entry.rel, theirs: entry.target });
257
- }
258
- if (plan.stagedPath)
259
- result.stagedPath = plan.stagedPath;
260
- }
261
- writeReceipt(plan, result, timestamp);
262
- result.receiptPath = plan.receiptPath;
263
- result.exported = true;
264
- }
265
- catch (err) {
266
- result.errors.push(err instanceof Error ? err.message : String(err));
267
- }
268
- return result;
269
- }
@@ -1,93 +0,0 @@
1
- /**
2
- * `agents.lock` — a deterministic SHA-256 manifest of the resolved resource set
3
- * at a project root, plus the `--frozen` verification that fails closed on any
4
- * drift. This is the reproducible-CI slice of the governance work (#337); org
5
- * version pins and bundle signing are deferred follow-ups.
6
- *
7
- * Design:
8
- * - Content hashing REUSES `fingerprintDir` / `fingerprintFile`
9
- * (src/lib/staleness/fingerprint.ts) — the same two-tier fingerprinter every
10
- * staleness checker uses. No new recursive file walker is introduced here.
11
- * - The resource SET is the layered, resolved source union (project > user >
12
- * system > extras), the same precedence `resolveResource` / `syncResourcesToVersion`
13
- * read from. It is enumerated agent-independently on purpose: the lock must be
14
- * reproducible on a fresh CI checkout that has no installed agent VERSIONS, so
15
- * it snapshots the SOURCES sync copies FROM, not any per-version home.
16
- *
17
- * Lock shape (JSON): `{ "version": 1, "resources": { "<relpath>": "<sha256>" } }`,
18
- * keys sorted so the file is byte-stable across machines and runs.
19
- */
20
- export declare const LOCK_FILENAME = "agents.lock";
21
- export declare const LOCK_VERSION: 1;
22
- /**
23
- * Resource kinds captured by the lock — the file/dir-backed layered resources
24
- * shared across every agent. Presence-only kinds handled specially by the sync
25
- * differ (plugins/promptcuts) are intentionally out of this first slice.
26
- */
27
- export declare const LOCK_KINDS: readonly ["commands", "skills", "hooks", "rules", "mcp", "permissions", "subagents"];
28
- /** The on-disk lockfile: relpath -> sha256 hex digest, keys sorted. */
29
- export interface AgentsLock {
30
- version: typeof LOCK_VERSION;
31
- resources: Record<string, string>;
32
- }
33
- /**
34
- * One resolved resource to fingerprint. `path` is an absolute file or directory;
35
- * `key` is the stable relpath prefix under which its hashes are recorded
36
- * (e.g. `skills/debug` for a directory, `commands/plan.md` for a single file).
37
- */
38
- export interface LockSource {
39
- path: string;
40
- key: string;
41
- }
42
- /** Added/removed/changed keys between an expected lock and the live resources. */
43
- export interface LockDiff {
44
- /** Present in the live resources, absent from the lock. */
45
- added: string[];
46
- /** Present in the lock, absent from the live resources. */
47
- removed: string[];
48
- /** Present in both but the sha256 differs. */
49
- changed: string[];
50
- }
51
- /**
52
- * Hash every resolved source into a flat `relpath -> sha256` map. Directories are
53
- * expanded with `fingerprintDir` (every contained file, sorted); single files use
54
- * `fingerprintFile`. Unreadable / missing sources are skipped — enumeration only
55
- * ever hands us paths that existed at scan time.
56
- */
57
- export declare function hashLockSources(sources: LockSource[]): Record<string, string>;
58
- /** Build a fully-sorted lock object from a resolved source set. */
59
- export declare function buildLock(sources: LockSource[]): AgentsLock;
60
- /** Serialise a lock to the canonical, sorted, newline-terminated JSON form. */
61
- export declare function serializeLock(lock: AgentsLock): string;
62
- /** Absolute path to the lockfile for a project root. */
63
- export declare function lockPath(projectRoot: string): string;
64
- /**
65
- * Read + validate an existing lock. Returns null ONLY when the file is absent —
66
- * a present-but-malformed lock throws, so `--frozen` fails closed instead of
67
- * silently treating corruption as "no lock".
68
- */
69
- export declare function readLock(projectRoot: string): AgentsLock | null;
70
- /** Write the lock to `<projectRoot>/agents.lock`, returning the path written. */
71
- export declare function writeLock(projectRoot: string, lock: AgentsLock): string;
72
- /** Diff a recorded lock against a freshly-computed one. */
73
- export declare function diffLock(expected: AgentsLock, actual: AgentsLock): LockDiff;
74
- /** True when a diff has no added/removed/changed entries. */
75
- export declare function lockDiffIsClean(diff: LockDiff): boolean;
76
- /** Verify a recorded lock against the live resolved sources. */
77
- export declare function verifyLock(expected: AgentsLock, sources: LockSource[]): LockDiff;
78
- /**
79
- * The project root the lockfile lives at: the parent of the discovered project
80
- * `.agents/` dir, or the cwd itself when none is found.
81
- */
82
- export declare function resolveProjectRoot(cwd?: string): string;
83
- /**
84
- * Enumerate the resolved resource sources for a cwd: for each lockable kind, the
85
- * winning entry per name across layers (project > user > system > extras), keyed
86
- * `<kind>/<entryName>`. This is a single-level `readdir` per kind dir — the
87
- * recursive fingerprinting is delegated to `fingerprintDir`.
88
- *
89
- * Entry names keep their extension in the key, so a hook script `foo.sh` and its
90
- * sidecar `foo.yaml` stay distinct (a name-stripped enumerator would collide
91
- * them). Dotfiles at the kind-dir top level are skipped as noise.
92
- */
93
- export declare function enumerateLockSources(cwd?: string): LockSource[];
package/dist/lib/lock.js DELETED
@@ -1,207 +0,0 @@
1
- /**
2
- * `agents.lock` — a deterministic SHA-256 manifest of the resolved resource set
3
- * at a project root, plus the `--frozen` verification that fails closed on any
4
- * drift. This is the reproducible-CI slice of the governance work (#337); org
5
- * version pins and bundle signing are deferred follow-ups.
6
- *
7
- * Design:
8
- * - Content hashing REUSES `fingerprintDir` / `fingerprintFile`
9
- * (src/lib/staleness/fingerprint.ts) — the same two-tier fingerprinter every
10
- * staleness checker uses. No new recursive file walker is introduced here.
11
- * - The resource SET is the layered, resolved source union (project > user >
12
- * system > extras), the same precedence `resolveResource` / `syncResourcesToVersion`
13
- * read from. It is enumerated agent-independently on purpose: the lock must be
14
- * reproducible on a fresh CI checkout that has no installed agent VERSIONS, so
15
- * it snapshots the SOURCES sync copies FROM, not any per-version home.
16
- *
17
- * Lock shape (JSON): `{ "version": 1, "resources": { "<relpath>": "<sha256>" } }`,
18
- * keys sorted so the file is byte-stable across machines and runs.
19
- */
20
- import * as fs from 'fs';
21
- import * as path from 'path';
22
- import { fingerprintDir, fingerprintFile } from './staleness/fingerprint.js';
23
- import { getProjectAgentsDir, getUserAgentsDir, getSystemAgentsDir, getEnabledExtraRepos, } from './state.js';
24
- export const LOCK_FILENAME = 'agents.lock';
25
- export const LOCK_VERSION = 1;
26
- /**
27
- * Resource kinds captured by the lock — the file/dir-backed layered resources
28
- * shared across every agent. Presence-only kinds handled specially by the sync
29
- * differ (plugins/promptcuts) are intentionally out of this first slice.
30
- */
31
- export const LOCK_KINDS = [
32
- 'commands',
33
- 'skills',
34
- 'hooks',
35
- 'rules',
36
- 'mcp',
37
- 'permissions',
38
- 'subagents',
39
- ];
40
- /** Normalise a filesystem-relative path to POSIX separators for stable keys. */
41
- function toPosix(rel) {
42
- return rel.split(path.sep).join('/');
43
- }
44
- /**
45
- * Hash every resolved source into a flat `relpath -> sha256` map. Directories are
46
- * expanded with `fingerprintDir` (every contained file, sorted); single files use
47
- * `fingerprintFile`. Unreadable / missing sources are skipped — enumeration only
48
- * ever hands us paths that existed at scan time.
49
- */
50
- export function hashLockSources(sources) {
51
- const out = {};
52
- for (const src of sources) {
53
- let stat;
54
- try {
55
- stat = fs.statSync(src.path);
56
- }
57
- catch {
58
- continue;
59
- }
60
- if (stat.isDirectory()) {
61
- for (const fp of fingerprintDir(src.path)) {
62
- const rel = toPosix(path.relative(src.path, fp.path));
63
- out[`${src.key}/${rel}`] = fp.sha256;
64
- }
65
- }
66
- else if (stat.isFile()) {
67
- const fp = fingerprintFile(src.path);
68
- if (fp)
69
- out[src.key] = fp.sha256;
70
- }
71
- }
72
- return out;
73
- }
74
- /** Build a fully-sorted lock object from a resolved source set. */
75
- export function buildLock(sources) {
76
- return { version: LOCK_VERSION, resources: sortRecord(hashLockSources(sources)) };
77
- }
78
- /** Return a new record with keys inserted in sorted order (deterministic JSON). */
79
- function sortRecord(record) {
80
- const out = {};
81
- for (const key of Object.keys(record).sort())
82
- out[key] = record[key];
83
- return out;
84
- }
85
- /** Serialise a lock to the canonical, sorted, newline-terminated JSON form. */
86
- export function serializeLock(lock) {
87
- return JSON.stringify({ version: lock.version, resources: sortRecord(lock.resources) }, null, 2) + '\n';
88
- }
89
- /** Absolute path to the lockfile for a project root. */
90
- export function lockPath(projectRoot) {
91
- return path.join(projectRoot, LOCK_FILENAME);
92
- }
93
- /**
94
- * Read + validate an existing lock. Returns null ONLY when the file is absent —
95
- * a present-but-malformed lock throws, so `--frozen` fails closed instead of
96
- * silently treating corruption as "no lock".
97
- */
98
- export function readLock(projectRoot) {
99
- const p = lockPath(projectRoot);
100
- if (!fs.existsSync(p))
101
- return null;
102
- let parsed;
103
- try {
104
- parsed = JSON.parse(fs.readFileSync(p, 'utf-8'));
105
- }
106
- catch (e) {
107
- throw new Error(`${LOCK_FILENAME} is not valid JSON: ${e.message}`);
108
- }
109
- if (!parsed || typeof parsed !== 'object') {
110
- throw new Error(`${LOCK_FILENAME} is malformed (expected an object).`);
111
- }
112
- const obj = parsed;
113
- if (obj.version !== LOCK_VERSION) {
114
- throw new Error(`${LOCK_FILENAME} version ${String(obj.version)} is unsupported (expected ${LOCK_VERSION}).`);
115
- }
116
- if (!obj.resources || typeof obj.resources !== 'object') {
117
- throw new Error(`${LOCK_FILENAME} is missing a resources map.`);
118
- }
119
- return { version: LOCK_VERSION, resources: obj.resources };
120
- }
121
- /** Write the lock to `<projectRoot>/agents.lock`, returning the path written. */
122
- export function writeLock(projectRoot, lock) {
123
- const p = lockPath(projectRoot);
124
- fs.writeFileSync(p, serializeLock(lock));
125
- return p;
126
- }
127
- /** Diff a recorded lock against a freshly-computed one. */
128
- export function diffLock(expected, actual) {
129
- const e = expected.resources;
130
- const a = actual.resources;
131
- const added = [];
132
- const removed = [];
133
- const changed = [];
134
- for (const k of Object.keys(a))
135
- if (!(k in e))
136
- added.push(k);
137
- for (const k of Object.keys(e)) {
138
- if (!(k in a))
139
- removed.push(k);
140
- else if (e[k] !== a[k])
141
- changed.push(k);
142
- }
143
- added.sort();
144
- removed.sort();
145
- changed.sort();
146
- return { added, removed, changed };
147
- }
148
- /** True when a diff has no added/removed/changed entries. */
149
- export function lockDiffIsClean(diff) {
150
- return diff.added.length === 0 && diff.removed.length === 0 && diff.changed.length === 0;
151
- }
152
- /** Verify a recorded lock against the live resolved sources. */
153
- export function verifyLock(expected, sources) {
154
- return diffLock(expected, buildLock(sources));
155
- }
156
- /**
157
- * The project root the lockfile lives at: the parent of the discovered project
158
- * `.agents/` dir, or the cwd itself when none is found.
159
- */
160
- export function resolveProjectRoot(cwd = process.cwd()) {
161
- const projectDir = getProjectAgentsDir(cwd);
162
- return projectDir ? path.dirname(projectDir) : path.resolve(cwd);
163
- }
164
- /**
165
- * Enumerate the resolved resource sources for a cwd: for each lockable kind, the
166
- * winning entry per name across layers (project > user > system > extras), keyed
167
- * `<kind>/<entryName>`. This is a single-level `readdir` per kind dir — the
168
- * recursive fingerprinting is delegated to `fingerprintDir`.
169
- *
170
- * Entry names keep their extension in the key, so a hook script `foo.sh` and its
171
- * sidecar `foo.yaml` stay distinct (a name-stripped enumerator would collide
172
- * them). Dotfiles at the kind-dir top level are skipped as noise.
173
- */
174
- export function enumerateLockSources(cwd = process.cwd()) {
175
- const roots = [];
176
- const projectDir = getProjectAgentsDir(cwd);
177
- if (projectDir)
178
- roots.push(projectDir);
179
- roots.push(getUserAgentsDir());
180
- roots.push(getSystemAgentsDir());
181
- for (const extra of getEnabledExtraRepos())
182
- roots.push(extra.dir);
183
- const sources = [];
184
- const seen = new Set();
185
- for (const kind of LOCK_KINDS) {
186
- for (const root of roots) {
187
- const kindDir = path.join(root, kind);
188
- let entries;
189
- try {
190
- entries = fs.readdirSync(kindDir, { withFileTypes: true });
191
- }
192
- catch {
193
- continue;
194
- }
195
- for (const entry of entries) {
196
- if (entry.name.startsWith('.'))
197
- continue;
198
- const key = `${kind}/${entry.name}`;
199
- if (seen.has(key))
200
- continue; // project layer wins on same name
201
- seen.add(key);
202
- sources.push({ path: path.join(kindDir, entry.name), key });
203
- }
204
- }
205
- }
206
- return sources.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
207
- }
@@ -1,78 +0,0 @@
1
- /**
2
- * Wallet: device-local credit-card vault.
3
- *
4
- * Two-tier storage so listing the wallet doesn't pop Touch ID, but reading
5
- * a card always does:
6
- *
7
- * Card metadata (id, nickname, brand, last4, expiry, created_at, kind)
8
- * -> ~/.agents/wallet/cards.json, mode 0600
9
- * -> Display-only data, equivalent of Apple Wallet's "card art" tier.
10
- *
11
- * Card secret (PAN, CVC, cardholder)
12
- * -> Keychain item `agents-cli.secrets.wallet.<id>` (JSON-encoded)
13
- * -> Routed through the signed helper, so the OS gates decryption with
14
- * Touch ID + biometryCurrentSet. Re-enrolling Touch ID invalidates
15
- * the item, matching Apple Pay's AR-value rotation behavior.
16
- *
17
- * Not Apple Pay: we store a real PAN, not a network DPAN, and we do not
18
- * generate per-transaction cryptograms. Callers must surface this clearly.
19
- */
20
- /** Test seam: override the index path. Returns the previous override (or null). */
21
- export declare function _setIndexPathForTest(p: string | null): string | null;
22
- export type CardBrand = 'visa' | 'mastercard' | 'amex' | 'discover' | 'diners' | 'jcb' | 'unionpay' | 'unknown';
23
- /** Storage kind discriminator. Reserved for future kind: 'stripe_token'. */
24
- export type CardKind = 'pan_encrypted';
25
- /** Non-sensitive card metadata. Safe to display without biometric auth. */
26
- export interface CardMetadata {
27
- id: string;
28
- nickname: string;
29
- brand: CardBrand;
30
- last4: string;
31
- exp_month: string;
32
- exp_year: string;
33
- created_at: string;
34
- kind: CardKind;
35
- }
36
- /** Sensitive card fields. Keychain-stored, Touch ID required to read. */
37
- export interface CardSecret {
38
- pan: string;
39
- cvc: string;
40
- cardholder: string;
41
- }
42
- /** Card metadata plus its secret payload. Returned by show() only. */
43
- export interface CardFull extends CardMetadata, CardSecret {
44
- }
45
- /** Input shape for add(). */
46
- export interface AddCardInput {
47
- nickname: string;
48
- pan: string;
49
- cvc: string;
50
- cardholder: string;
51
- exp_month: string;
52
- exp_year: string;
53
- }
54
- /** Compute the Luhn checksum and verify a candidate PAN. */
55
- export declare function isValidLuhn(pan: string): boolean;
56
- /** Detect card brand from the BIN (first 6 digits). */
57
- export declare function detectBrand(pan: string): CardBrand;
58
- /** Atomically read the index file. Returns [] when missing. */
59
- export declare function readIndex(): CardMetadata[];
60
- /** List all stored cards. Does NOT trigger biometric auth. */
61
- export declare function listCards(): CardMetadata[];
62
- /** Look up a card by id (or by case-insensitive nickname). Returns undefined when missing. */
63
- export declare function findCard(idOrNickname: string): CardMetadata | undefined;
64
- /**
65
- * Add a new card. Validates Luhn + expiry. Returns the metadata for the
66
- * stored card. The PAN/CVC/cardholder are written to Keychain in a single
67
- * JSON blob; only metadata is mirrored to the index file.
68
- */
69
- export declare function addCard(input: AddCardInput): CardMetadata;
70
- /**
71
- * Reveal a card by id. **Triggers Touch ID on macOS.** Throws if the card
72
- * isn't in the index or if the keychain entry is missing/cancelled.
73
- */
74
- export declare function showCard(idOrNickname: string): CardFull;
75
- /** Delete a card from both the index and Keychain. Returns the removed metadata or undefined. */
76
- export declare function removeCard(idOrNickname: string): CardMetadata | undefined;
77
- /** Rename a card. Throws if the new nickname collides with an existing card. */
78
- export declare function renameCard(idOrNickname: string, newNickname: string): CardMetadata;