@fastagent-sh/fastagent 0.24.4 → 0.26.0

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 (487) hide show
  1. package/README.md +54 -82
  2. package/dist/agent-api.d.ts +460 -0
  3. package/dist/agent-api.js +209 -0
  4. package/dist/answer-text.d.ts +8 -0
  5. package/dist/answer-text.js +18 -0
  6. package/dist/atomic-write.d.ts +2 -2
  7. package/dist/atomic-write.js +2 -2
  8. package/dist/authoring.d.ts +81 -0
  9. package/dist/authoring.js +245 -0
  10. package/dist/channel.d.ts +29 -15
  11. package/dist/channel.js +4 -1
  12. package/dist/channels/agentcore-protocol.d.ts +36 -50
  13. package/dist/channels/agentcore-protocol.js +3 -3
  14. package/dist/channels/agentcore-service.d.ts +8 -18
  15. package/dist/channels/agentcore-service.js +108 -127
  16. package/dist/channels/agentcore.d.ts +8 -24
  17. package/dist/channels/agentcore.js +32 -65
  18. package/dist/channels/body.d.ts +0 -16
  19. package/dist/channels/body.js +0 -25
  20. package/dist/channels/busy.js +6 -1
  21. package/dist/channels/context.d.ts +4 -0
  22. package/dist/channels/context.js +35 -0
  23. package/dist/channels/discover.d.ts +18 -20
  24. package/dist/channels/discover.js +41 -99
  25. package/dist/channels/feishu/feishu-api.d.ts +54 -4
  26. package/dist/channels/feishu/feishu-api.js +192 -149
  27. package/dist/channels/feishu/feishu.d.ts +3 -0
  28. package/dist/channels/feishu/feishu.js +117 -106
  29. package/dist/channels/feishu/history.d.ts +55 -0
  30. package/dist/channels/feishu/history.js +199 -0
  31. package/dist/channels/feishu/invoke-turn.d.ts +13 -11
  32. package/dist/channels/feishu/invoke-turn.js +9 -10
  33. package/dist/channels/feishu/model.d.ts +2 -1
  34. package/dist/channels/feishu/normalize.js +100 -0
  35. package/dist/channels/feishu/preview.d.ts +2 -2
  36. package/dist/channels/feishu/register-webhook.d.ts +1 -0
  37. package/dist/channels/feishu/register-webhook.js +3 -2
  38. package/dist/channels/feishu/scaffold/channel.ts +65 -46
  39. package/dist/channels/feishu/scaffold/feishu-send.ts +38 -33
  40. package/dist/channels/feishu/scaffold/feishu-threads.ts +25 -0
  41. package/dist/channels/feishu/setup-mode.d.ts +45 -25
  42. package/dist/channels/feishu/setup-mode.js +74 -23
  43. package/dist/channels/feishu/shared-api.d.ts +24 -6
  44. package/dist/channels/feishu/shared-api.js +30 -24
  45. package/dist/channels/kit/context-buffer.d.ts +11 -2
  46. package/dist/channels/kit/context-buffer.js +7 -4
  47. package/dist/channels/kit/delivery.d.ts +19 -3
  48. package/dist/channels/kit/delivery.js +74 -15
  49. package/dist/channels/kit/event-stream.js +2 -1
  50. package/dist/channels/kit/invoke-turn-kit.d.ts +41 -41
  51. package/dist/channels/kit/invoke-turn-kit.js +62 -71
  52. package/dist/channels/kit/place-history.d.ts +107 -0
  53. package/dist/channels/kit/place-history.js +182 -0
  54. package/dist/channels/kit/preview-kit.d.ts +9 -5
  55. package/dist/channels/kit/preview-kit.js +36 -15
  56. package/dist/channels/kit/room-threads.d.ts +46 -0
  57. package/dist/channels/kit/room-threads.js +81 -0
  58. package/dist/channels/kit/seen.js +1 -1
  59. package/dist/channels/kit/stop-command.d.ts +6 -3
  60. package/dist/channels/kit/stop-command.js +20 -18
  61. package/dist/channels/kit/thread-fork.d.ts +17 -0
  62. package/dist/channels/kit/thread-fork.js +43 -0
  63. package/dist/channels/kit/thread-participants.js +1 -1
  64. package/dist/channels/kit/transport.d.ts +5 -0
  65. package/dist/channels/kit/transport.js +5 -0
  66. package/dist/channels/kit/turn-runner.d.ts +10 -9
  67. package/dist/channels/kit/turn-runner.js +17 -19
  68. package/dist/channels/kit/turn-store.d.ts +5 -4
  69. package/dist/channels/kit/turn-store.js +5 -5
  70. package/dist/channels/lark/lark.d.ts +3 -0
  71. package/dist/channels/lark/lark.js +5 -0
  72. package/dist/channels/lark/onboard.d.ts +5 -3
  73. package/dist/channels/lark/onboard.js +14 -14
  74. package/dist/channels/lark/scaffold/channel.ts +67 -44
  75. package/dist/channels/lark/scaffold/lark-send.ts +38 -33
  76. package/dist/channels/lark/scaffold/lark-threads.ts +25 -0
  77. package/dist/channels/respond.d.ts +0 -4
  78. package/dist/channels/respond.js +1 -1
  79. package/dist/channels/router.d.ts +18 -0
  80. package/dist/channels/router.js +68 -0
  81. package/dist/channels/serve.d.ts +5 -70
  82. package/dist/channels/serve.js +105 -287
  83. package/dist/channels/slack/history.d.ts +42 -0
  84. package/dist/channels/slack/history.js +282 -0
  85. package/dist/channels/slack/invoke-turn.d.ts +12 -5
  86. package/dist/channels/slack/invoke-turn.js +7 -5
  87. package/dist/channels/slack/manifest.d.ts +1 -4
  88. package/dist/channels/slack/manifest.js +22 -10
  89. package/dist/channels/slack/model.d.ts +2 -1
  90. package/dist/channels/slack/onboard.d.ts +0 -2
  91. package/dist/channels/slack/onboard.js +2 -4
  92. package/dist/channels/slack/onboarding-state.d.ts +0 -2
  93. package/dist/channels/slack/onboarding-state.js +0 -1
  94. package/dist/channels/slack/parse.d.ts +0 -5
  95. package/dist/channels/slack/parse.js +1 -16
  96. package/dist/channels/slack/preview.d.ts +2 -3
  97. package/dist/channels/slack/preview.js +78 -52
  98. package/dist/channels/slack/register-webhook.d.ts +1 -0
  99. package/dist/channels/slack/register-webhook.js +6 -5
  100. package/dist/channels/slack/scaffold/channel.ts +23 -24
  101. package/dist/channels/slack/scaffold/slack-send.ts +50 -43
  102. package/dist/channels/slack/scaffold/slack-threads.ts +29 -0
  103. package/dist/channels/slack/setup-server.d.ts +19 -0
  104. package/dist/channels/slack/setup-server.js +113 -11
  105. package/dist/channels/slack/shared-api.d.ts +15 -4
  106. package/dist/channels/slack/shared-api.js +19 -14
  107. package/dist/channels/slack/slack-api.d.ts +61 -2
  108. package/dist/channels/slack/slack-api.js +28 -5
  109. package/dist/channels/slack/slack.js +97 -52
  110. package/dist/channels/slack/welcomed.js +1 -1
  111. package/dist/channels/telegram/context-buffer.d.ts +6 -1
  112. package/dist/channels/telegram/context-buffer.js +19 -0
  113. package/dist/channels/telegram/invoke-turn.d.ts +8 -4
  114. package/dist/channels/telegram/invoke-turn.js +7 -7
  115. package/dist/channels/telegram/parse.d.ts +7 -2
  116. package/dist/channels/telegram/parse.js +7 -0
  117. package/dist/channels/telegram/preview.d.ts +2 -2
  118. package/dist/channels/telegram/register-webhook.d.ts +1 -0
  119. package/dist/channels/telegram/register-webhook.js +3 -2
  120. package/dist/channels/telegram/scaffold/channel.ts +27 -28
  121. package/dist/channels/telegram/scaffold/telegram-send.ts +61 -108
  122. package/dist/channels/telegram/shared-api.d.ts +34 -0
  123. package/dist/channels/telegram/shared-api.js +79 -0
  124. package/dist/channels/telegram/telegram-api.d.ts +15 -5
  125. package/dist/channels/telegram/telegram-api.js +10 -6
  126. package/dist/channels/telegram/telegram.js +27 -21
  127. package/dist/channels/telegram/turn-store.js +1 -1
  128. package/dist/channels/{kit/turn-queue.d.ts → turn-queue.d.ts} +2 -2
  129. package/dist/channels/{kit/turn-queue.js → turn-queue.js} +10 -10
  130. package/dist/cli/add-feishu.d.ts +42 -12
  131. package/dist/cli/add-feishu.js +177 -124
  132. package/dist/cli/add-slack.d.ts +8 -3
  133. package/dist/cli/add-slack.js +116 -64
  134. package/dist/cli/auth-view.d.ts +10 -3
  135. package/dist/cli/auth-view.js +8 -6
  136. package/dist/cli/box-login.d.ts +18 -7
  137. package/dist/cli/box-login.js +46 -12
  138. package/dist/cli/commands/add.d.ts +15 -4
  139. package/dist/cli/commands/add.js +253 -143
  140. package/dist/cli/commands/auth.d.ts +6 -0
  141. package/dist/cli/commands/auth.js +50 -0
  142. package/dist/cli/commands/content.d.ts +6 -0
  143. package/dist/cli/commands/content.js +45 -0
  144. package/dist/cli/commands/deploy/agentcore.js +50 -77
  145. package/dist/cli/commands/deploy/docker.js +38 -39
  146. package/dist/cli/commands/deploy/fly.js +21 -18
  147. package/dist/cli/commands/deploy/host-login.d.ts +26 -0
  148. package/dist/cli/commands/deploy/host-login.js +90 -0
  149. package/dist/cli/commands/deploy/railway.js +21 -26
  150. package/dist/cli/commands/deploy/shared.d.ts +45 -17
  151. package/dist/cli/commands/deploy/shared.js +34 -15
  152. package/dist/cli/commands/deploy.d.ts +0 -4
  153. package/dist/cli/commands/deploy.js +237 -50
  154. package/dist/cli/commands/destroy.js +8 -6
  155. package/dist/cli/commands/dev.d.ts +0 -2
  156. package/dist/cli/commands/dev.js +20 -19
  157. package/dist/cli/commands/env.d.ts +12 -0
  158. package/dist/cli/commands/env.js +191 -0
  159. package/dist/cli/commands/info.js +95 -156
  160. package/dist/cli/commands/init.d.ts +2 -2
  161. package/dist/cli/commands/init.js +35 -33
  162. package/dist/cli/commands/invoke.d.ts +6 -0
  163. package/dist/cli/commands/invoke.js +132 -16
  164. package/dist/cli/commands/login.d.ts +31 -2
  165. package/dist/cli/commands/login.js +416 -65
  166. package/dist/cli/commands/logout.d.ts +4 -0
  167. package/dist/cli/commands/logout.js +53 -0
  168. package/dist/cli/commands/logs.js +8 -6
  169. package/dist/cli/commands/models.d.ts +2 -1
  170. package/dist/cli/commands/models.js +39 -37
  171. package/dist/cli/commands/schedules.d.ts +21 -0
  172. package/dist/cli/commands/schedules.js +143 -0
  173. package/dist/cli/commands/start.d.ts +11 -10
  174. package/dist/cli/commands/start.js +35 -62
  175. package/dist/cli/content-view.d.ts +9 -0
  176. package/dist/cli/content-view.js +26 -0
  177. package/dist/cli/fail.d.ts +9 -12
  178. package/dist/cli/fail.js +17 -14
  179. package/dist/cli/invoke-stream.d.ts +12 -3
  180. package/dist/cli/invoke-stream.js +85 -23
  181. package/dist/cli/kernel.d.ts +9 -2
  182. package/dist/cli/kernel.js +15 -6
  183. package/dist/cli/login-relay.d.ts +6 -4
  184. package/dist/cli/login-relay.js +19 -7
  185. package/dist/cli/models-view.d.ts +5 -1
  186. package/dist/cli/models-view.js +1 -1
  187. package/dist/cli/person.d.ts +10 -0
  188. package/dist/cli/person.js +23 -0
  189. package/dist/cli/program.js +421 -203
  190. package/dist/cli/serve.d.ts +13 -63
  191. package/dist/cli/serve.js +31 -121
  192. package/dist/cli/shared.d.ts +21 -48
  193. package/dist/cli/shared.js +70 -89
  194. package/dist/cli/ticket.d.ts +136 -0
  195. package/dist/cli/ticket.js +476 -0
  196. package/dist/client.d.ts +7 -0
  197. package/dist/client.js +2 -0
  198. package/dist/content/declare.d.ts +70 -0
  199. package/dist/content/declare.js +163 -0
  200. package/dist/content/file.d.ts +32 -0
  201. package/dist/content/file.js +119 -0
  202. package/dist/content/git.d.ts +41 -0
  203. package/dist/content/git.js +220 -0
  204. package/dist/content/mount.d.ts +2 -0
  205. package/dist/content/mount.js +15 -0
  206. package/dist/content/resolve.d.ts +52 -0
  207. package/dist/content/resolve.js +151 -0
  208. package/dist/content/source.d.ts +27 -0
  209. package/dist/content/source.js +53 -0
  210. package/dist/conversation-sessions.d.ts +26 -0
  211. package/dist/conversation-sessions.js +99 -0
  212. package/dist/declared-secrets.d.ts +19 -37
  213. package/dist/declared-secrets.js +16 -58
  214. package/dist/deploy/agentcore/destroy.d.ts +3 -3
  215. package/dist/deploy/agentcore/destroy.js +46 -28
  216. package/dist/deploy/agentcore/forwarder.js +105 -22
  217. package/dist/deploy/agentcore/logs.js +1 -1
  218. package/dist/deploy/agentcore/plan.d.ts +10 -24
  219. package/dist/deploy/agentcore/plan.js +31 -135
  220. package/dist/deploy/agentcore/run.d.ts +1 -1
  221. package/dist/deploy/agentcore/run.js +8 -5
  222. package/dist/deploy/agentcore/shell.d.ts +1 -1
  223. package/dist/deploy/agentcore/shell.js +5 -5
  224. package/dist/deploy/api.d.ts +34 -0
  225. package/dist/deploy/api.js +50 -0
  226. package/dist/deploy/box-shell.d.ts +6 -0
  227. package/dist/deploy/box-shell.js +7 -0
  228. package/dist/deploy/build-context.d.ts +7 -5
  229. package/dist/deploy/build-context.js +41 -35
  230. package/dist/deploy/channel-ingress.d.ts +6 -1
  231. package/dist/deploy/channel-ingress.js +18 -5
  232. package/dist/deploy/container.d.ts +22 -9
  233. package/dist/deploy/container.js +96 -55
  234. package/dist/deploy/docker/plan.d.ts +3 -2
  235. package/dist/deploy/docker/plan.js +13 -14
  236. package/dist/deploy/docker/run.d.ts +2 -2
  237. package/dist/deploy/docker/run.js +8 -4
  238. package/dist/deploy/fly/plan.d.ts +1 -1
  239. package/dist/deploy/fly/plan.js +12 -21
  240. package/dist/deploy/fly/run.d.ts +10 -6
  241. package/dist/deploy/fly/run.js +11 -6
  242. package/dist/deploy/hosts.d.ts +2 -1
  243. package/dist/deploy/hosts.js +2 -1
  244. package/dist/deploy/preflight.d.ts +21 -23
  245. package/dist/deploy/preflight.js +223 -202
  246. package/dist/deploy/railway/plan.d.ts +8 -6
  247. package/dist/deploy/railway/plan.js +15 -58
  248. package/dist/deploy/railway/run.d.ts +8 -3
  249. package/dist/deploy/railway/run.js +12 -8
  250. package/dist/deploy/residency.d.ts +5 -11
  251. package/dist/deploy/residency.js +0 -6
  252. package/dist/deploy/runner.d.ts +1 -1
  253. package/dist/deploy/runner.js +1 -1
  254. package/dist/deploy/secrets.d.ts +16 -2
  255. package/dist/deploy/secrets.js +33 -6
  256. package/dist/deploy/workspace.d.ts +11 -6
  257. package/dist/deploy/workspace.js +55 -38
  258. package/dist/dev-supervisor.d.ts +11 -2
  259. package/dist/dev-supervisor.js +52 -27
  260. package/dist/effect-port.d.ts +4 -4
  261. package/dist/effect-port.js +4 -4
  262. package/dist/env.d.ts +0 -13
  263. package/dist/env.js +1 -44
  264. package/dist/environment/apt.d.ts +4 -0
  265. package/dist/environment/apt.js +32 -0
  266. package/dist/environment/declare.d.ts +59 -0
  267. package/dist/environment/declare.js +210 -0
  268. package/dist/environment/mise.d.ts +51 -0
  269. package/dist/environment/mise.js +272 -0
  270. package/dist/feishu.d.ts +2 -2
  271. package/dist/feishu.js +2 -2
  272. package/dist/git.d.ts +13 -0
  273. package/dist/git.js +55 -0
  274. package/dist/harnesses/models/catalog.d.ts +20 -0
  275. package/dist/harnesses/models/catalog.js +254 -0
  276. package/dist/{engines/pi/auth.d.ts → harnesses/models/credentials.d.ts} +3 -3
  277. package/dist/{engines/pi/auth.js → harnesses/models/credentials.js} +3 -3
  278. package/dist/harnesses/models/environment.d.ts +48 -0
  279. package/dist/harnesses/models/environment.js +88 -0
  280. package/dist/harnesses/models/host.d.ts +30 -0
  281. package/dist/harnesses/models/host.js +97 -0
  282. package/dist/{engines/pi → harnesses/models}/login.d.ts +66 -70
  283. package/dist/harnesses/models/login.js +439 -0
  284. package/dist/harnesses/models/models.d.ts +84 -0
  285. package/dist/harnesses/models/models.js +197 -0
  286. package/dist/harnesses/pi-durable/agent.d.ts +42 -0
  287. package/dist/harnesses/pi-durable/agent.js +581 -0
  288. package/dist/harnesses/pi-durable/defaults.d.ts +28 -0
  289. package/dist/harnesses/pi-durable/defaults.js +26 -0
  290. package/dist/harnesses/pi-durable/define.d.ts +77 -0
  291. package/dist/harnesses/pi-durable/define.js +28 -0
  292. package/dist/harnesses/pi-durable/entries.d.ts +32 -0
  293. package/dist/harnesses/pi-durable/entries.js +126 -0
  294. package/dist/harnesses/pi-durable/events.d.ts +25 -0
  295. package/dist/harnesses/pi-durable/events.js +238 -0
  296. package/dist/harnesses/pi-durable/ids.d.ts +16 -0
  297. package/dist/harnesses/pi-durable/ids.js +55 -0
  298. package/dist/harnesses/pi-durable/messages.d.ts +41 -0
  299. package/dist/harnesses/pi-durable/messages.js +116 -0
  300. package/dist/harnesses/pi-durable/open.d.ts +95 -0
  301. package/dist/harnesses/pi-durable/open.js +330 -0
  302. package/dist/harnesses/pi-durable/reads.d.ts +30 -0
  303. package/dist/harnesses/pi-durable/reads.js +94 -0
  304. package/dist/harnesses/pi-durable/registry.d.ts +18 -0
  305. package/dist/harnesses/pi-durable/registry.js +56 -0
  306. package/dist/harnesses/pi-durable/release.d.ts +13 -0
  307. package/dist/harnesses/pi-durable/release.js +40 -0
  308. package/dist/harnesses/pi-durable/serve.d.ts +90 -0
  309. package/dist/harnesses/pi-durable/serve.js +186 -0
  310. package/dist/harnesses/pi-durable/sessions.d.ts +27 -0
  311. package/dist/harnesses/pi-durable/sessions.js +47 -0
  312. package/dist/harnesses/pi-durable/storage.d.ts +4 -0
  313. package/dist/harnesses/pi-durable/storage.js +49 -0
  314. package/dist/harnesses/pi-durable/stream.d.ts +20 -0
  315. package/dist/harnesses/pi-durable/stream.js +221 -0
  316. package/dist/harnesses/pi-durable/text.d.ts +30 -0
  317. package/dist/harnesses/pi-durable/text.js +292 -0
  318. package/dist/harnesses/pi-durable/wake.d.ts +11 -0
  319. package/dist/harnesses/pi-durable/wake.js +90 -0
  320. package/dist/http/client.d.ts +6 -0
  321. package/dist/http/client.js +256 -0
  322. package/dist/http/contract.d.ts +541 -0
  323. package/dist/http/contract.js +179 -0
  324. package/dist/http/server.d.ts +34 -0
  325. package/dist/http/server.js +194 -0
  326. package/dist/index.d.ts +19 -4
  327. package/dist/index.js +13 -5
  328. package/dist/lark.d.ts +2 -2
  329. package/dist/lark.js +2 -2
  330. package/dist/locked-file.d.ts +17 -0
  331. package/dist/{engines/pi/locked-file.js → locked-file.js} +16 -10
  332. package/dist/once.d.ts +6 -0
  333. package/dist/once.js +23 -0
  334. package/dist/paths.d.ts +36 -52
  335. package/dist/paths.js +66 -182
  336. package/dist/runtime.d.ts +25 -2
  337. package/dist/runtime.js +27 -0
  338. package/dist/scaffold/add-channel.d.ts +14 -27
  339. package/dist/scaffold/add-channel.js +82 -180
  340. package/dist/scaffold/init.d.ts +17 -18
  341. package/dist/scaffold/init.js +87 -99
  342. package/dist/scaffold/templates/SYSTEM.md +12 -0
  343. package/dist/scaffold/templates/env.example +4 -10
  344. package/dist/scaffold/templates/fastagent.config.ts +21 -33
  345. package/dist/scaffold/templates/gitignore +8 -1
  346. package/dist/scaffold/templates/skills/writing-great-skills/SKILL.md +1 -2
  347. package/dist/scaffold/templates.d.ts +9 -4
  348. package/dist/scaffold/templates.js +7 -5
  349. package/dist/scaffold/vendor-skill.d.ts +1 -4
  350. package/dist/scaffold/vendor-skill.js +5 -6
  351. package/dist/schedule/cron.d.ts +13 -0
  352. package/dist/schedule/cron.js +52 -0
  353. package/dist/schedule/eventbridge-cron.d.ts +17 -0
  354. package/dist/schedule/eventbridge-cron.js +88 -0
  355. package/dist/schedule/schedule.d.ts +23 -0
  356. package/dist/schedule/schedule.js +34 -0
  357. package/dist/schedule/scheduler.d.ts +34 -33
  358. package/dist/schedule/scheduler.js +251 -137
  359. package/dist/schedule/state.d.ts +4 -14
  360. package/dist/schedule/state.js +7 -7
  361. package/dist/schedule/wake-alarm.d.ts +22 -2
  362. package/dist/schedule/wake-alarm.js +66 -20
  363. package/dist/schedule/wakeups.d.ts +16 -15
  364. package/dist/schedule/wakeups.js +47 -45
  365. package/dist/service.d.ts +56 -169
  366. package/dist/service.js +91 -187
  367. package/dist/serving-command.d.ts +10 -0
  368. package/dist/serving-command.js +16 -0
  369. package/dist/sign-in-api.d.ts +147 -0
  370. package/dist/sign-in-api.js +9 -0
  371. package/dist/slack.d.ts +1 -1
  372. package/dist/slack.js +1 -1
  373. package/dist/{channels/kit/state.js → state-file.js} +6 -6
  374. package/dist/telegram.d.ts +1 -0
  375. package/dist/telegram.js +1 -0
  376. package/dist/tunnel.d.ts +3 -0
  377. package/dist/tunnel.js +14 -5
  378. package/dist/value-file.d.ts +40 -0
  379. package/dist/value-file.js +164 -0
  380. package/dist/version.d.ts +5 -0
  381. package/dist/version.js +14 -1
  382. package/package.json +18 -28
  383. package/dist/agent.d.ts +0 -106
  384. package/dist/agent.js +0 -21
  385. package/dist/channels/control.d.ts +0 -31
  386. package/dist/channels/control.js +0 -329
  387. package/dist/channels/define-channel.d.ts +0 -39
  388. package/dist/channels/define-channel.js +0 -9
  389. package/dist/channels/feishu/context-buffer.d.ts +0 -35
  390. package/dist/channels/feishu/context-buffer.js +0 -65
  391. package/dist/channels/feishu/scaffold/channel.websocket.ts +0 -31
  392. package/dist/channels/http.d.ts +0 -23
  393. package/dist/channels/http.js +0 -57
  394. package/dist/channels/lark/scaffold/channel.websocket.ts +0 -31
  395. package/dist/channels/slack/context-buffer.d.ts +0 -23
  396. package/dist/channels/slack/context-buffer.js +0 -37
  397. package/dist/channels/sse.d.ts +0 -4
  398. package/dist/channels/sse.js +0 -66
  399. package/dist/cli/commands/chat.d.ts +0 -3
  400. package/dist/cli/commands/chat.js +0 -14
  401. package/dist/cli/commands/routine-run.d.ts +0 -6
  402. package/dist/cli/commands/routine-run.js +0 -46
  403. package/dist/cli/commands/routine.d.ts +0 -25
  404. package/dist/cli/commands/routine.js +0 -122
  405. package/dist/cli/commands/tool.d.ts +0 -1
  406. package/dist/cli/commands/tool.js +0 -57
  407. package/dist/collect.d.ts +0 -63
  408. package/dist/collect.js +0 -90
  409. package/dist/core.d.ts +0 -13
  410. package/dist/core.js +0 -15
  411. package/dist/engines/pi/agent-models.d.ts +0 -83
  412. package/dist/engines/pi/agent-models.js +0 -120
  413. package/dist/engines/pi/agent-session-factory.d.ts +0 -121
  414. package/dist/engines/pi/agent-session-factory.js +0 -535
  415. package/dist/engines/pi/chat.d.ts +0 -3
  416. package/dist/engines/pi/chat.js +0 -8
  417. package/dist/engines/pi/config.d.ts +0 -71
  418. package/dist/engines/pi/config.js +0 -199
  419. package/dist/engines/pi/create.d.ts +0 -170
  420. package/dist/engines/pi/create.js +0 -343
  421. package/dist/engines/pi/definition.d.ts +0 -74
  422. package/dist/engines/pi/definition.js +0 -236
  423. package/dist/engines/pi/entry-images.d.ts +0 -14
  424. package/dist/engines/pi/entry-images.js +0 -23
  425. package/dist/engines/pi/invoke-session.d.ts +0 -18
  426. package/dist/engines/pi/invoke-session.js +0 -403
  427. package/dist/engines/pi/locked-file.d.ts +0 -9
  428. package/dist/engines/pi/login.js +0 -331
  429. package/dist/engines/pi/machine.d.ts +0 -53
  430. package/dist/engines/pi/machine.js +0 -137
  431. package/dist/engines/pi/models.d.ts +0 -200
  432. package/dist/engines/pi/models.js +0 -533
  433. package/dist/engines/pi/open.d.ts +0 -180
  434. package/dist/engines/pi/open.js +0 -270
  435. package/dist/engines/pi/openai-account-models.d.ts +0 -35
  436. package/dist/engines/pi/openai-account-models.js +0 -116
  437. package/dist/engines/pi/report.d.ts +0 -18
  438. package/dist/engines/pi/report.js +0 -59
  439. package/dist/engines/pi/retry-event.d.ts +0 -6
  440. package/dist/engines/pi/retry-event.js +0 -15
  441. package/dist/engines/pi/service.d.ts +0 -9
  442. package/dist/engines/pi/service.js +0 -14
  443. package/dist/engines/pi/session-builder.d.ts +0 -13
  444. package/dist/engines/pi/session-builder.js +0 -117
  445. package/dist/engines/pi/session-control.d.ts +0 -77
  446. package/dist/engines/pi/session-control.js +0 -908
  447. package/dist/engines/pi/session-effects.d.ts +0 -14
  448. package/dist/engines/pi/session-effects.js +0 -30
  449. package/dist/engines/pi/session-inheritance.d.ts +0 -21
  450. package/dist/engines/pi/session-inheritance.js +0 -204
  451. package/dist/engines/pi/session-markers.d.ts +0 -49
  452. package/dist/engines/pi/session-markers.js +0 -60
  453. package/dist/engines/pi/session-settings.d.ts +0 -67
  454. package/dist/engines/pi/session-settings.js +0 -119
  455. package/dist/engines/pi/session-store.d.ts +0 -69
  456. package/dist/engines/pi/session-store.js +0 -430
  457. package/dist/engines/pi/tool-context.d.ts +0 -45
  458. package/dist/engines/pi/tool-context.js +0 -31
  459. package/dist/engines/pi/tool.d.ts +0 -99
  460. package/dist/engines/pi/tool.js +0 -118
  461. package/dist/engines/pi/turn-kit.d.ts +0 -92
  462. package/dist/engines/pi/turn-kit.js +0 -288
  463. package/dist/engines/pi/wake-tool.d.ts +0 -9
  464. package/dist/engines/pi/wake-tool.js +0 -92
  465. package/dist/loader.d.ts +0 -41
  466. package/dist/loader.js +0 -116
  467. package/dist/node.d.ts +0 -3
  468. package/dist/node.js +0 -4
  469. package/dist/observe.d.ts +0 -6
  470. package/dist/observe.js +0 -47
  471. package/dist/pi.d.ts +0 -25
  472. package/dist/pi.js +0 -15
  473. package/dist/scaffold/templates/APPEND_SYSTEM.md +0 -12
  474. package/dist/scaffold/templates/tools/fetch-url.ts +0 -25
  475. package/dist/schedule/discover.d.ts +0 -17
  476. package/dist/schedule/discover.js +0 -61
  477. package/dist/schedule/routine.d.ts +0 -43
  478. package/dist/schedule/routine.js +0 -32
  479. package/dist/schedule/run.d.ts +0 -55
  480. package/dist/schedule/run.js +0 -146
  481. package/dist/secrets-gate.d.ts +0 -32
  482. package/dist/secrets-gate.js +0 -33
  483. package/dist/session-remote.d.ts +0 -47
  484. package/dist/session-remote.js +0 -460
  485. package/dist/session.d.ts +0 -466
  486. package/dist/session.js +0 -57
  487. /package/dist/{channels/kit/state.d.ts → state-file.d.ts} +0 -0
package/dist/cli/fail.js CHANGED
@@ -1,5 +1,4 @@
1
- import { resolvePlacement } from "../paths.js";
2
- import { gateSecrets } from "../secrets-gate.js";
1
+ import { findAgentDir, resolveAgentDir } from "../paths.js";
3
2
  /** stderr renders color: a color TTY, with Node's `hasColors()` carrying the NO_COLOR/TERM=dumb veto. */
4
3
  function stderrHasColors() {
5
4
  return process.stderr.isTTY === true && (process.stderr.hasColors?.() ?? false);
@@ -8,36 +7,39 @@ function stderrHasColors() {
8
7
  export function errorPrefix(colors = stderrHasColors()) {
9
8
  return colors ? "\x1b[1;31mError:\x1b[0m" : "Error:";
10
9
  }
10
+ let failureRecorder;
11
+ /**
12
+ * A ticket's process (ticket.ts): a failure that ends the process is the ticket's failure too, recorded before the
13
+ * process exits, wherever in a long command it happens.
14
+ */
15
+ export function recordFailures(record) {
16
+ failureRecorder = record;
17
+ }
11
18
  /**
12
19
  * User-fixable startup problems (missing model / bad config / broken definition) are thrown as plain `Error` — print
13
20
  * just the message. Anything else (a TypeError, a non-Error throw) is a bug: keep the stack.
14
21
  */
15
22
  export function failStartup(error) {
23
+ failureRecorder?.(error instanceof Error ? error.message : String(error));
16
24
  if (error instanceof Error && error.constructor === Error)
17
25
  console.error(`${errorPrefix()} ${error.message}`);
18
26
  else
19
27
  console.error(errorPrefix(), error);
20
28
  process.exit(1);
21
29
  }
22
- /**
23
- * {@link gateSecrets} at the process boundary, for a command that runs ONE owner's code (`fastagent
24
- * tool`, `fastagent routine run`). The gate throws SYNCHRONOUSLY, so there is no promise to hang the usual
25
- * `.catch(failStartup)` on, and a raw throw reaches `cli.ts`'s top-level await as a Node stack that
26
- * buries the one line naming the file. The catch translates that expected failure into the CLI's
27
- * single-line refusal and exits 1; nothing is recovered.
28
- */
29
- export function gateSecretsOrExit(input) {
30
+ /** THE addressing entry point for commands: the agent directory `dir` names, or exit 1 with the one-line refusal. */
31
+ export function agentDirOrExit(dir) {
30
32
  try {
31
- gateSecrets(input);
33
+ return resolveAgentDir(dir);
32
34
  }
33
35
  catch (error) {
34
36
  failStartup(error);
35
37
  }
36
38
  }
37
- /** THE placement entry point for commands: resolve `dir`, or exit 1 with the one-line refusal. */
38
- export function placementOrExit(dir) {
39
+ /** {@link findAgentDir} for a command that also works without an agent: undefined when there is none, exit 1 inside one. */
40
+ export function optionalAgentDirOrExit(dir) {
39
41
  try {
40
- return resolvePlacement(dir);
42
+ return findAgentDir(dir);
41
43
  }
42
44
  catch (error) {
43
45
  failStartup(error);
@@ -48,6 +50,7 @@ export function placementOrExit(dir) {
48
50
  * command body): print the message and exit 2.
49
51
  */
50
52
  export function failUsage(message) {
53
+ failureRecorder?.(message);
51
54
  console.error(`${errorPrefix()} ${message}`);
52
55
  process.exit(2);
53
56
  }
@@ -1,3 +1,12 @@
1
- /** Render an Agent event stream to two sinks plus an exit code. */
2
- import type { AgentEvent } from "../agent.ts";
3
- export declare function runInvokeStream(events: AsyncIterable<AgentEvent>, out: (text: string) => void, err: (line: string) => void): Promise<number>;
1
+ /** Render one message's answer, as `messages.stream` delivers it, plus an exit code: 0 only for `completed`. */
2
+ import { type Message, type MessageStreamEvent } from "../agent-api.ts";
3
+ /** A command that sends a message exits 0 only when it completed. */
4
+ export declare const exitCodeOf: (message: Pick<Message, "status">) => number;
5
+ /** The answer as text on `out`, what the tools did and why it failed on `err`. */
6
+ export declare function runInvokeStream(events: AsyncIterable<MessageStreamEvent>, out: (text: string) => void, err: (line: string) => void): Promise<number>;
7
+ /**
8
+ * The answer as JSON lines, for a program to read: the message's events as `messages.stream` delivers them, its
9
+ * `message` first, through its `done`. A message that ends no other way ends with the line that says why: `rejected`
10
+ * when the agent refused it, a `stream_error` event, or `unfinished` when the events end first.
11
+ */
12
+ export declare function runInvokeJson(events: AsyncIterable<MessageStreamEvent>, line: (json: string) => void): Promise<number>;
@@ -1,35 +1,97 @@
1
+ /** Render one message's answer, as `messages.stream` delivers it, plus an exit code: 0 only for `completed`. */
2
+ import { AgentError, errorData } from "../agent-api.js";
3
+ import { answerText } from "../answer-text.js";
4
+ /** A command that sends a message exits 0 only when it completed. */
5
+ export const exitCodeOf = (message) => (message.status === "completed" ? 0 : 1);
6
+ function failure(message) {
7
+ const { status, error } = message;
8
+ if (status === "completed")
9
+ return undefined;
10
+ if (error === undefined)
11
+ return status;
12
+ return `${error.code}: ${error.message}${error.retryable ? " (retryable)" : ""}`;
13
+ }
14
+ /**
15
+ * Read `events` to their end with `read`, which answers an exit code once the message has ended; a send the agent
16
+ * refused rejects the first read, and is said by `refused`.
17
+ */
18
+ async function readMessage(events, read, refused) {
19
+ try {
20
+ for await (const event of events) {
21
+ const exit = read(event);
22
+ if (exit !== undefined)
23
+ return exit;
24
+ }
25
+ }
26
+ catch (error) {
27
+ if (!(error instanceof AgentError))
28
+ throw error;
29
+ refused(error);
30
+ return 1;
31
+ }
32
+ return undefined;
33
+ }
34
+ /** The answer as text on `out`, what the tools did and why it failed on `err`. */
1
35
  export async function runInvokeStream(events, out, err) {
2
- const toolName = new Map(); // tool_ended carries no name — remember it from tool_started
3
- let exitCode = 0;
4
- for await (const event of events) {
36
+ const toolName = new Map(); // a tool result carries the id; its name came with tool_started
37
+ const textOf = answerText();
38
+ const exit = await readMessage(events, (event) => {
39
+ const text = event.type === "delta" || event.type === "entry" ? textOf(event) : "";
40
+ if (text !== "")
41
+ out(text);
5
42
  switch (event.type) {
6
- case "text":
7
- out(event.delta);
8
- break;
9
43
  case "tool_started":
10
- toolName.set(event.id, event.name);
44
+ toolName.set(event.toolCallId, event.name);
11
45
  err(`[tool] ${event.name}`);
12
- break;
46
+ return undefined;
13
47
  case "tool_progress":
14
- err(`[tool] ${toolName.get(event.id) ?? event.id} › ${clipStatus(event.text)}`);
15
- break;
16
- case "tool_ended":
17
- if (event.isError)
18
- err(`[tool] ${toolName.get(event.id) ?? event.id} failed`);
19
- break;
48
+ err(`[tool] ${toolName.get(event.toolCallId) ?? event.toolCallId} › ${clipStatus(event.text)}`);
49
+ return undefined;
20
50
  case "retrying":
21
51
  // Operator-facing: include the reason (channels show a neutral customer line instead).
22
52
  err(`[fastagent] transient failure — retrying (${event.attempt}/${event.maxAttempts} in ${event.delayMs}ms): ${event.reason}`);
23
- break;
24
- case "failed":
25
- err(`[fastagent] failed: ${event.details}${event.retryable ? " (retryable)" : ""}`);
26
- exitCode = 1;
27
- break;
28
- case "completed":
29
- break; // terminal success — nothing to render (structured data, if any, is not a CLI concern)
53
+ return undefined;
54
+ case "stream_error":
55
+ err(`[fastagent] ${event.error.message}`);
56
+ return 1;
57
+ case "entry": {
58
+ const data = event.entry.data;
59
+ if (event.entry.kind === "tool_result" && data.isError) {
60
+ err(`[tool] ${toolName.get(data.toolCallId ?? "") ?? data.toolCallId} failed`);
61
+ }
62
+ return undefined;
63
+ }
64
+ case "done": {
65
+ const failed = failure(event.message);
66
+ if (failed !== undefined)
67
+ err(`[fastagent] failed: ${failed}`);
68
+ return exitCodeOf(event.message);
69
+ }
70
+ default:
71
+ return undefined;
30
72
  }
31
- }
32
- return exitCode;
73
+ }, (error) => err(`[fastagent] rejected: ${error.code}: ${error.message}`));
74
+ if (exit !== undefined)
75
+ return exit;
76
+ err("[fastagent] the stream ended before the message did");
77
+ return 1;
78
+ }
79
+ /**
80
+ * The answer as JSON lines, for a program to read: the message's events as `messages.stream` delivers them, its
81
+ * `message` first, through its `done`. A message that ends no other way ends with the line that says why: `rejected`
82
+ * when the agent refused it, a `stream_error` event, or `unfinished` when the events end first.
83
+ */
84
+ export async function runInvokeJson(events, line) {
85
+ const exit = await readMessage(events, (event) => {
86
+ line(JSON.stringify(event));
87
+ if (event.type === "stream_error")
88
+ return 1;
89
+ return event.type === "done" ? exitCodeOf(event.message) : undefined;
90
+ }, (error) => line(JSON.stringify({ type: "rejected", error: errorData(error) })));
91
+ if (exit !== undefined)
92
+ return exit;
93
+ line(JSON.stringify({ type: "unfinished", reason: "the stream ended before the message did" }));
94
+ return 1;
33
95
  }
34
96
  /** How much of a status line a terminal gets, in code points. */
35
97
  const STATUS_MAX = 120;
@@ -1,12 +1,17 @@
1
1
  /** CLI kernel — commands as data. */
2
2
  import { Command } from "commander";
3
- /** One positional argument, in commander syntax: `<name>` required, `[dir]` optional. */
3
+ /**
4
+ * One positional argument, in commander syntax: `<name>` required, `[dir]` optional, `<names...>` one or more (the
5
+ * command receives them as an array).
6
+ */
4
7
  interface ArgSpec {
5
8
  name: string;
6
9
  description: string;
7
10
  default?: string;
8
11
  /** Closed value set — the parser rejects anything else as a usage error (exit 2). */
9
12
  choices?: string[];
13
+ /** Passed on as given, an empty value included: another program's arguments (`env exec`). */
14
+ verbatim?: boolean;
10
15
  }
11
16
  /** One flag, in the flag DSL: `--json`, or `--bind <addr>` for a value-taking flag. */
12
17
  export interface FlagSpec {
@@ -14,6 +19,8 @@ export interface FlagSpec {
14
19
  description: string;
15
20
  /** Parsed but left out of help: an internal seam between two fastagent processes, not a user-facing flag. */
16
21
  hidden?: boolean;
22
+ /** May be given more than once; the command receives every value, in order, as an array. */
23
+ repeatable?: boolean;
17
24
  }
18
25
  interface ExampleSpec {
19
26
  cmd: string;
@@ -37,7 +44,7 @@ export interface CommandSpec {
37
44
  * The implementation: positional args in declaration order (an optional arg without a default is `undefined`), then
38
45
  * the parsed flags.
39
46
  */
40
- run?: (args: (string | undefined)[], flags: Record<string, unknown>) => Promise<void> | void;
47
+ run?: (args: (string | string[] | undefined)[], flags: Record<string, unknown>) => Promise<void> | void;
41
48
  }
42
49
  export interface ProgramOptions {
43
50
  /** Printed by `-v`/`--version`. */
@@ -9,7 +9,7 @@ const specOf = new WeakMap();
9
9
  export function buildProgram(specs, options = {}) {
10
10
  const exit = options.exit ?? ((code) => process.exit(code));
11
11
  const program = new Command("fastagent");
12
- program.description("Serve a file-defined agent — SYSTEM.md, skills/, tools/, channels/ — as a live service.");
12
+ program.description("Serve a file-defined agent — SYSTEM.md, skills/, src/ — as a live service.");
13
13
  // The exit-code policy: commander throws only for parse-level events — help/version displays carry exitCode 0 (→
14
14
  // 0), everything else it rejects is a usage error (→ 2).
15
15
  program.exitOverride((err) => exit(err.exitCode === 0 ? 0 : 2));
@@ -52,17 +52,26 @@ function register(parent, spec) {
52
52
  if (a.choices)
53
53
  arg.choices(a.choices);
54
54
  // A required argument means a non-empty VALUE, not just a present token.
55
- if (a.name.startsWith("<") && !a.choices) {
56
- arg.argParser((value) => {
55
+ if (a.name.startsWith("<") && !a.choices && !a.verbatim) {
56
+ const nonEmpty = (value) => {
57
57
  if (value.trim() === "")
58
58
  throw new InvalidArgumentError("must not be empty.");
59
59
  return value;
60
- });
60
+ };
61
+ // A parser of a variadic argument replaces commander's own collecting, so it collects too.
62
+ if (a.name.endsWith("...>"))
63
+ arg.argParser((value, previous = []) => [...previous, nonEmpty(value)]);
64
+ else
65
+ arg.argParser(nonEmpty);
61
66
  }
62
67
  cmd.addArgument(arg);
63
68
  }
64
- for (const f of spec.flags ?? [])
65
- cmd.addOption(new Option(f.flags, f.description).hideHelp(f.hidden === true));
69
+ for (const f of spec.flags ?? []) {
70
+ const option = new Option(f.flags, f.description).hideHelp(f.hidden === true);
71
+ if (f.repeatable)
72
+ option.argParser((value, previous = []) => [...previous, value]);
73
+ cmd.addOption(option);
74
+ }
66
75
  for (const sub of spec.subcommands ?? [])
67
76
  register(cmd, sub);
68
77
  const run = spec.run;
@@ -1,12 +1,13 @@
1
1
  import type { Readable, Writable } from "node:stream";
2
- import type { LoginIO, LoginMethod } from "../engines/pi/login.ts";
2
+ import type { LoginIO } from "../harnesses/models/login.ts";
3
+ import type { SignInMethod } from "../sign-in-api.ts";
3
4
  /** How a login on the box ended, as the box reports it. */
4
5
  export type RelayResult =
5
6
  /** Logged in now: `method` is how, `path` where the box saved it. */
6
7
  {
7
8
  ok: true;
8
9
  provider: string;
9
- method: LoginMethod;
10
+ method: SignInMethod;
10
11
  path: string;
11
12
  }
12
13
  /**
@@ -24,7 +25,7 @@ export type RelayResult =
24
25
  };
25
26
  /**
26
27
  * The box half: a {@link LoginIO} over `input`/`output`. Once `input` ends (the session dropped), every pending and
27
- * later question reads as backed out, so the flow ends in `LoginCancelled` instead of waiting forever.
28
+ * later question reads as backed out, so the flow ends in `SignInCancelled` instead of waiting forever.
28
29
  */
29
30
  export declare function stdioLoginIO(input: Readable, output: Writable): {
30
31
  io: LoginIO;
@@ -32,7 +33,8 @@ export declare function stdioLoginIO(input: Readable, output: Writable): {
32
33
  };
33
34
  /**
34
35
  * The terminal half: drive `io` from what the box sends on `from`, answering on `to`. Resolves with the box's
35
- * `result` line when `from` ends, or `undefined` when it ended without one. A line that is not the wire (a host
36
+ * `result` line when `from` ends, `undefined` when it ended without one, or a failure of this side's own when the box
37
+ * speaks an older wire than this one (`BOX_CLI_PREDATES`). A line that is not the wire (a host
36
38
  * CLI's banner, a shell's error) goes to `passthrough`, so nothing the box printed is lost.
37
39
  */
38
40
  export declare function relayLogin(from: Readable, to: Writable, io: LoginIO, passthrough: (line: string) => void): Promise<RelayResult | undefined>;
@@ -8,10 +8,11 @@
8
8
  * seen doing so), so an ended stream without that line is a failure, whatever the exit code says.
9
9
  */
10
10
  import { createInterface } from "node:readline";
11
+ import { BOX_CLI_PREDATES } from "../deploy/box-shell.js";
11
12
  const send = (out, message) => void out.write(`${JSON.stringify(message)}\n`);
12
13
  /**
13
14
  * The box half: a {@link LoginIO} over `input`/`output`. Once `input` ends (the session dropped), every pending and
14
- * later question reads as backed out, so the flow ends in `LoginCancelled` instead of waiting forever.
15
+ * later question reads as backed out, so the flow ends in `SignInCancelled` instead of waiting forever.
15
16
  */
16
17
  export function stdioLoginIO(input, output) {
17
18
  const pending = new Map();
@@ -47,9 +48,9 @@ export function stdioLoginIO(input, output) {
47
48
  return {
48
49
  io: {
49
50
  select: (message, options) => ask((id) => ({ type: "select", id, message, options })),
50
- prompt: (message, opts) => ask((id) => ({ type: "prompt", id, message, hidden: opts?.hidden === true }), opts?.signal),
51
+ prompt: (message, opts) => ask((id) => ({ type: "prompt", id, message, hidden: opts?.hidden === true, redirect: opts?.redirect === true }), opts?.signal),
51
52
  note: (message) => send(output, { type: "note", message }),
52
- openUrl: (url) => send(output, { type: "open", url }),
53
+ openUrl: (url, userCode) => send(output, { type: "open", url, ...(userCode ? { userCode } : {}) }),
53
54
  },
54
55
  result: (result) => {
55
56
  send(output, { type: "result", ...result });
@@ -59,7 +60,8 @@ export function stdioLoginIO(input, output) {
59
60
  }
60
61
  /**
61
62
  * The terminal half: drive `io` from what the box sends on `from`, answering on `to`. Resolves with the box's
62
- * `result` line when `from` ends, or `undefined` when it ended without one. A line that is not the wire (a host
63
+ * `result` line when `from` ends, `undefined` when it ended without one, or a failure of this side's own when the box
64
+ * speaks an older wire than this one (`BOX_CLI_PREDATES`). A line that is not the wire (a host
63
65
  * CLI's banner, a shell's error) goes to `passthrough`, so nothing the box printed is lost.
64
66
  */
65
67
  export function relayLogin(from, to, io, passthrough) {
@@ -68,6 +70,8 @@ export function relayLogin(from, to, io, passthrough) {
68
70
  const answer = (id, value) => send(to, { id, value: value ?? null });
69
71
  const prompts = new Map();
70
72
  let result;
73
+ /** Why this relay stopped the box itself: a box whose wire this CLI cannot read whole. */
74
+ let refused;
71
75
  const lines = createInterface({ input: from });
72
76
  lines.on("line", (line) => {
73
77
  const message = parse(line);
@@ -78,9 +82,17 @@ export function relayLogin(from, to, io, passthrough) {
78
82
  void io.select(message.message, message.options).then((value) => answer(message.id, value));
79
83
  return;
80
84
  case "prompt": {
85
+ if (typeof message.redirect !== "boolean") {
86
+ // An older box: which of its prompts takes the browser's address cannot be told, so none could be answered
87
+ // from the redirect this side catches. Its input ends, so it stops instead of waiting on a paste.
88
+ refused = BOX_CLI_PREDATES;
89
+ to.end();
90
+ return;
91
+ }
81
92
  const controller = new AbortController();
82
93
  prompts.set(message.id, controller);
83
- void io.prompt(message.message, { hidden: message.hidden, signal: controller.signal }).then((value) => {
94
+ const asked = { hidden: message.hidden, redirect: message.redirect, signal: controller.signal };
95
+ void io.prompt(message.message, asked).then((value) => {
84
96
  prompts.delete(message.id);
85
97
  if (!controller.signal.aborted)
86
98
  answer(message.id, value);
@@ -93,7 +105,7 @@ export function relayLogin(from, to, io, passthrough) {
93
105
  case "note":
94
106
  return io.note(message.message);
95
107
  case "open":
96
- return io.openUrl(message.url);
108
+ return io.openUrl(message.url, message.userCode);
97
109
  case "result": {
98
110
  const { type: _, ...rest } = message;
99
111
  result = rest;
@@ -104,7 +116,7 @@ export function relayLogin(from, to, io, passthrough) {
104
116
  return new Promise((resolve) => lines.on("close", () => {
105
117
  for (const controller of prompts.values())
106
118
  controller.abort();
107
- resolve(result);
119
+ resolve(refused === undefined ? result : { ok: false, reason: "failed", message: refused });
108
120
  }));
109
121
  }
110
122
  const WIRE_TYPES = new Set(["select", "prompt", "abort", "note", "open", "result"]);
@@ -1,4 +1,8 @@
1
- import type { ProviderAuthStatus } from "../engines/pi/models.ts";
1
+ /**
2
+ * CLI presenter for the model-facing commands: `fastagent models [search]` output and the first-run picker's option
3
+ * list.
4
+ */
5
+ import { type ProviderAuthStatus } from "../harnesses/models/models.ts";
2
6
  /** One first-run picker entry (@clack/prompts option shape). */
3
7
  export interface ModelPickerOption {
4
8
  value: string;
@@ -2,7 +2,7 @@
2
2
  * CLI presenter for the model-facing commands: `fastagent models [search]` output and the first-run picker's option
3
3
  * list.
4
4
  */
5
- import { providerOf } from "../engines/pi/config.js";
5
+ import { providerOf } from "../harnesses/models/models.js";
6
6
  /** The remedy hint for a non-ready provider, by what picking it actually does. */
7
7
  function remedy(login) {
8
8
  if (login === "oauth")
@@ -0,0 +1,10 @@
1
+ export interface Person {
2
+ /** A step this run waits on: `instructions`, at `url`; `until`, when the step itself lapses (ms since the epoch). */
3
+ waitsOn(url: string, instructions: string, until?: number): void;
4
+ /** The step waited on is done: the run carries on without the person. */
5
+ carriesOn(): void;
6
+ /** A step left to the person once this run ends, which nothing here waits for; at `url`, when it has one. */
7
+ afterwards(instructions: string, url?: string): void;
8
+ }
9
+ /** The person at this terminal: told, and the page opened for them. */
10
+ export declare const terminalPerson: Person;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * What an app's setup says to the person setting it up, for the steps only they can take. At a terminal it is printed,
3
+ * and the page opened. In a coding agent's run it goes to the ticket the agent hands its person (ticket.ts): the step
4
+ * the run waits on as `need_user_action`, and a step left to them after it as `afterwards`.
5
+ */
6
+ import { openExternalUrl } from "../open-url.js";
7
+ /** The person at this terminal: told, and the page opened for them. */
8
+ export const terminalPerson = {
9
+ waitsOn(url, instructions, until) {
10
+ const lapses = until === undefined ? "" : `, valid for ${Math.round((until - Date.now()) / 60_000)} minutes`;
11
+ console.error(`[fastagent] ${instructions} — opening ${url} (waiting${lapses}; keep this running)`);
12
+ openExternalUrl(url);
13
+ },
14
+ carriesOn() { },
15
+ afterwards(instructions, url) {
16
+ if (url === undefined) {
17
+ console.error(`[fastagent] ${instructions}`);
18
+ return;
19
+ }
20
+ console.error(`[fastagent] ${instructions} — opening ${url}`);
21
+ openExternalUrl(url);
22
+ },
23
+ };