@fastagent-sh/fastagent 0.24.3 → 0.25.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 (480) hide show
  1. package/README.md +53 -82
  2. package/dist/agent-api.d.ts +452 -0
  3. package/dist/agent-api.js +201 -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 +77 -0
  9. package/dist/authoring.js +238 -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 +115 -63
  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 +17 -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 +252 -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 +190 -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 +131 -16
  164. package/dist/cli/commands/login.d.ts +31 -2
  165. package/dist/cli/commands/login.js +413 -64
  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 +3 -2
  184. package/dist/cli/login-relay.js +18 -6
  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 +68 -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 +217 -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 +222 -201
  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 +51 -26
  260. package/dist/effect-port.d.ts +4 -4
  261. package/dist/effect-port.js +4 -4
  262. package/dist/environment/apt.d.ts +4 -0
  263. package/dist/environment/apt.js +32 -0
  264. package/dist/environment/declare.d.ts +59 -0
  265. package/dist/environment/declare.js +210 -0
  266. package/dist/environment/mise.d.ts +50 -0
  267. package/dist/environment/mise.js +268 -0
  268. package/dist/feishu.d.ts +2 -2
  269. package/dist/feishu.js +2 -2
  270. package/dist/git.d.ts +13 -0
  271. package/dist/git.js +55 -0
  272. package/dist/harnesses/models/catalog.d.ts +20 -0
  273. package/dist/harnesses/models/catalog.js +254 -0
  274. package/dist/{engines/pi/auth.d.ts → harnesses/models/credentials.d.ts} +3 -3
  275. package/dist/{engines/pi/auth.js → harnesses/models/credentials.js} +3 -3
  276. package/dist/harnesses/models/environment.d.ts +43 -0
  277. package/dist/harnesses/models/environment.js +82 -0
  278. package/dist/{engines/pi → harnesses/models}/login.d.ts +57 -26
  279. package/dist/{engines/pi → harnesses/models}/login.js +187 -79
  280. package/dist/harnesses/models/models.d.ts +83 -0
  281. package/dist/harnesses/models/models.js +158 -0
  282. package/dist/harnesses/pi-durable/agent.d.ts +42 -0
  283. package/dist/harnesses/pi-durable/agent.js +579 -0
  284. package/dist/harnesses/pi-durable/defaults.d.ts +28 -0
  285. package/dist/harnesses/pi-durable/defaults.js +26 -0
  286. package/dist/harnesses/pi-durable/define.d.ts +77 -0
  287. package/dist/harnesses/pi-durable/define.js +28 -0
  288. package/dist/harnesses/pi-durable/entries.d.ts +32 -0
  289. package/dist/harnesses/pi-durable/entries.js +126 -0
  290. package/dist/harnesses/pi-durable/events.d.ts +25 -0
  291. package/dist/harnesses/pi-durable/events.js +238 -0
  292. package/dist/harnesses/pi-durable/ids.d.ts +16 -0
  293. package/dist/harnesses/pi-durable/ids.js +55 -0
  294. package/dist/harnesses/pi-durable/messages.d.ts +41 -0
  295. package/dist/harnesses/pi-durable/messages.js +116 -0
  296. package/dist/harnesses/pi-durable/open.d.ts +88 -0
  297. package/dist/harnesses/pi-durable/open.js +329 -0
  298. package/dist/harnesses/pi-durable/reads.d.ts +30 -0
  299. package/dist/harnesses/pi-durable/reads.js +94 -0
  300. package/dist/harnesses/pi-durable/registry.d.ts +18 -0
  301. package/dist/harnesses/pi-durable/registry.js +56 -0
  302. package/dist/harnesses/pi-durable/release.d.ts +13 -0
  303. package/dist/harnesses/pi-durable/release.js +40 -0
  304. package/dist/harnesses/pi-durable/serve.d.ts +80 -0
  305. package/dist/harnesses/pi-durable/serve.js +156 -0
  306. package/dist/harnesses/pi-durable/sessions.d.ts +27 -0
  307. package/dist/harnesses/pi-durable/sessions.js +47 -0
  308. package/dist/harnesses/pi-durable/storage.d.ts +4 -0
  309. package/dist/harnesses/pi-durable/storage.js +49 -0
  310. package/dist/harnesses/pi-durable/stream.d.ts +20 -0
  311. package/dist/harnesses/pi-durable/stream.js +221 -0
  312. package/dist/harnesses/pi-durable/text.d.ts +30 -0
  313. package/dist/harnesses/pi-durable/text.js +292 -0
  314. package/dist/harnesses/pi-durable/wake.d.ts +4 -0
  315. package/dist/harnesses/pi-durable/wake.js +81 -0
  316. package/dist/http/client.d.ts +6 -0
  317. package/dist/http/client.js +256 -0
  318. package/dist/http/contract.d.ts +541 -0
  319. package/dist/http/contract.js +179 -0
  320. package/dist/http/server.d.ts +34 -0
  321. package/dist/http/server.js +194 -0
  322. package/dist/index.d.ts +17 -4
  323. package/dist/index.js +10 -5
  324. package/dist/lark.d.ts +2 -2
  325. package/dist/lark.js +2 -2
  326. package/dist/locked-file.d.ts +17 -0
  327. package/dist/{engines/pi/locked-file.js → locked-file.js} +16 -10
  328. package/dist/once.d.ts +6 -0
  329. package/dist/once.js +23 -0
  330. package/dist/paths.d.ts +36 -52
  331. package/dist/paths.js +66 -182
  332. package/dist/runtime.d.ts +25 -2
  333. package/dist/runtime.js +27 -0
  334. package/dist/scaffold/add-channel.d.ts +14 -27
  335. package/dist/scaffold/add-channel.js +82 -180
  336. package/dist/scaffold/init.d.ts +17 -18
  337. package/dist/scaffold/init.js +87 -99
  338. package/dist/scaffold/templates/SYSTEM.md +12 -0
  339. package/dist/scaffold/templates/env.example +4 -10
  340. package/dist/scaffold/templates/fastagent.config.ts +21 -33
  341. package/dist/scaffold/templates/gitignore +8 -1
  342. package/dist/scaffold/templates/skills/writing-great-skills/SKILL.md +1 -2
  343. package/dist/scaffold/templates.d.ts +9 -4
  344. package/dist/scaffold/templates.js +7 -5
  345. package/dist/scaffold/vendor-skill.d.ts +1 -4
  346. package/dist/scaffold/vendor-skill.js +5 -6
  347. package/dist/schedule/cron.d.ts +13 -0
  348. package/dist/schedule/cron.js +52 -0
  349. package/dist/schedule/eventbridge-cron.d.ts +17 -0
  350. package/dist/schedule/eventbridge-cron.js +88 -0
  351. package/dist/schedule/schedule.d.ts +23 -0
  352. package/dist/schedule/schedule.js +34 -0
  353. package/dist/schedule/scheduler.d.ts +34 -33
  354. package/dist/schedule/scheduler.js +251 -137
  355. package/dist/schedule/state.d.ts +4 -14
  356. package/dist/schedule/state.js +7 -7
  357. package/dist/schedule/wake-alarm.d.ts +22 -2
  358. package/dist/schedule/wake-alarm.js +66 -20
  359. package/dist/schedule/wakeups.d.ts +16 -15
  360. package/dist/schedule/wakeups.js +47 -45
  361. package/dist/service.d.ts +56 -169
  362. package/dist/service.js +91 -187
  363. package/dist/serving-command.d.ts +10 -0
  364. package/dist/serving-command.js +16 -0
  365. package/dist/slack.d.ts +1 -1
  366. package/dist/slack.js +1 -1
  367. package/dist/{channels/kit/state.js → state-file.js} +6 -6
  368. package/dist/telegram.d.ts +1 -0
  369. package/dist/telegram.js +1 -0
  370. package/dist/tunnel.d.ts +3 -0
  371. package/dist/tunnel.js +12 -4
  372. package/dist/value-file.d.ts +21 -0
  373. package/dist/value-file.js +108 -0
  374. package/dist/version.d.ts +5 -0
  375. package/dist/version.js +14 -1
  376. package/package.json +18 -28
  377. package/dist/agent.d.ts +0 -106
  378. package/dist/agent.js +0 -21
  379. package/dist/channels/control.d.ts +0 -31
  380. package/dist/channels/control.js +0 -329
  381. package/dist/channels/define-channel.d.ts +0 -39
  382. package/dist/channels/define-channel.js +0 -9
  383. package/dist/channels/feishu/context-buffer.d.ts +0 -35
  384. package/dist/channels/feishu/context-buffer.js +0 -65
  385. package/dist/channels/feishu/scaffold/channel.websocket.ts +0 -31
  386. package/dist/channels/http.d.ts +0 -23
  387. package/dist/channels/http.js +0 -57
  388. package/dist/channels/lark/scaffold/channel.websocket.ts +0 -31
  389. package/dist/channels/slack/context-buffer.d.ts +0 -23
  390. package/dist/channels/slack/context-buffer.js +0 -37
  391. package/dist/channels/sse.d.ts +0 -4
  392. package/dist/channels/sse.js +0 -66
  393. package/dist/cli/commands/chat.d.ts +0 -3
  394. package/dist/cli/commands/chat.js +0 -14
  395. package/dist/cli/commands/routine-run.d.ts +0 -6
  396. package/dist/cli/commands/routine-run.js +0 -46
  397. package/dist/cli/commands/routine.d.ts +0 -25
  398. package/dist/cli/commands/routine.js +0 -122
  399. package/dist/cli/commands/tool.d.ts +0 -1
  400. package/dist/cli/commands/tool.js +0 -57
  401. package/dist/collect.d.ts +0 -63
  402. package/dist/collect.js +0 -90
  403. package/dist/core.d.ts +0 -13
  404. package/dist/core.js +0 -15
  405. package/dist/engines/pi/agent-models.d.ts +0 -83
  406. package/dist/engines/pi/agent-models.js +0 -120
  407. package/dist/engines/pi/agent-session-factory.d.ts +0 -121
  408. package/dist/engines/pi/agent-session-factory.js +0 -517
  409. package/dist/engines/pi/chat.d.ts +0 -3
  410. package/dist/engines/pi/chat.js +0 -8
  411. package/dist/engines/pi/config.d.ts +0 -71
  412. package/dist/engines/pi/config.js +0 -199
  413. package/dist/engines/pi/create.d.ts +0 -170
  414. package/dist/engines/pi/create.js +0 -343
  415. package/dist/engines/pi/definition.d.ts +0 -74
  416. package/dist/engines/pi/definition.js +0 -236
  417. package/dist/engines/pi/entry-images.d.ts +0 -14
  418. package/dist/engines/pi/entry-images.js +0 -23
  419. package/dist/engines/pi/invoke-session.d.ts +0 -18
  420. package/dist/engines/pi/invoke-session.js +0 -403
  421. package/dist/engines/pi/locked-file.d.ts +0 -9
  422. package/dist/engines/pi/machine.d.ts +0 -53
  423. package/dist/engines/pi/machine.js +0 -137
  424. package/dist/engines/pi/models.d.ts +0 -200
  425. package/dist/engines/pi/models.js +0 -533
  426. package/dist/engines/pi/open.d.ts +0 -180
  427. package/dist/engines/pi/open.js +0 -270
  428. package/dist/engines/pi/openai-account-models.d.ts +0 -35
  429. package/dist/engines/pi/openai-account-models.js +0 -116
  430. package/dist/engines/pi/report.d.ts +0 -18
  431. package/dist/engines/pi/report.js +0 -59
  432. package/dist/engines/pi/retry-event.d.ts +0 -6
  433. package/dist/engines/pi/retry-event.js +0 -15
  434. package/dist/engines/pi/service.d.ts +0 -9
  435. package/dist/engines/pi/service.js +0 -14
  436. package/dist/engines/pi/session-builder.d.ts +0 -13
  437. package/dist/engines/pi/session-builder.js +0 -117
  438. package/dist/engines/pi/session-control.d.ts +0 -77
  439. package/dist/engines/pi/session-control.js +0 -908
  440. package/dist/engines/pi/session-effects.d.ts +0 -14
  441. package/dist/engines/pi/session-effects.js +0 -30
  442. package/dist/engines/pi/session-inheritance.d.ts +0 -21
  443. package/dist/engines/pi/session-inheritance.js +0 -204
  444. package/dist/engines/pi/session-markers.d.ts +0 -49
  445. package/dist/engines/pi/session-markers.js +0 -60
  446. package/dist/engines/pi/session-settings.d.ts +0 -67
  447. package/dist/engines/pi/session-settings.js +0 -119
  448. package/dist/engines/pi/session-store.d.ts +0 -69
  449. package/dist/engines/pi/session-store.js +0 -430
  450. package/dist/engines/pi/tool-context.d.ts +0 -45
  451. package/dist/engines/pi/tool-context.js +0 -31
  452. package/dist/engines/pi/tool.d.ts +0 -99
  453. package/dist/engines/pi/tool.js +0 -118
  454. package/dist/engines/pi/turn-kit.d.ts +0 -83
  455. package/dist/engines/pi/turn-kit.js +0 -275
  456. package/dist/engines/pi/wake-tool.d.ts +0 -9
  457. package/dist/engines/pi/wake-tool.js +0 -92
  458. package/dist/loader.d.ts +0 -41
  459. package/dist/loader.js +0 -116
  460. package/dist/node.d.ts +0 -3
  461. package/dist/node.js +0 -4
  462. package/dist/observe.d.ts +0 -6
  463. package/dist/observe.js +0 -47
  464. package/dist/pi.d.ts +0 -25
  465. package/dist/pi.js +0 -15
  466. package/dist/scaffold/templates/APPEND_SYSTEM.md +0 -12
  467. package/dist/scaffold/templates/tools/fetch-url.ts +0 -25
  468. package/dist/schedule/discover.d.ts +0 -17
  469. package/dist/schedule/discover.js +0 -61
  470. package/dist/schedule/routine.d.ts +0 -43
  471. package/dist/schedule/routine.js +0 -32
  472. package/dist/schedule/run.d.ts +0 -55
  473. package/dist/schedule/run.js +0 -146
  474. package/dist/secrets-gate.d.ts +0 -32
  475. package/dist/secrets-gate.js +0 -33
  476. package/dist/session-remote.d.ts +0 -47
  477. package/dist/session-remote.js +0 -460
  478. package/dist/session.d.ts +0 -466
  479. package/dist/session.js +0 -57
  480. /package/dist/{channels/kit/state.d.ts → state-file.d.ts} +0 -0
@@ -4,6 +4,7 @@ import { deploymentLoginCommand } from "../box-shell.js";
4
4
  import { SECRETS_DIRNAME } from "../../paths.js";
5
5
  const MOUNT = "/data";
6
6
  export const DOCKER_COMPOSE_FILE = "fastagent.compose.yml";
7
+ export const DOCKER_VALUE_FILE = `${SECRETS_DIRNAME}/production/.env`;
7
8
  const GENERATED_COMPOSE_MARKER = "# Generated by `fastagent deploy docker`";
8
9
  export const MIN_DOCKER_COMPOSE_VERSION = "2.3.3";
9
10
  /** Pinned: generated deployment artifacts must not silently move when Cloudflare publishes `latest`. */
@@ -31,10 +32,7 @@ function composeInterpolation(name) {
31
32
  return `\${${name}:-}`;
32
33
  }
33
34
  function composeYaml(input) {
34
- // Compose sits beside the Dockerfile, under the agent prefix; the build context is always the WORKSPACE, so it
35
- // climbs back out of the one-level prefix deploy requires.
36
- const context = "..";
37
- const dockerfile = `${input.agentPrefix}Dockerfile`;
35
+ // Compose sits beside the Dockerfile, in the agent directory, which is the build context.
38
36
  const tunnelService = input.tunnel
39
37
  ? `
40
38
  # Cloudflare Quick Tunnel: ephemeral URL, generated only with \`deploy docker --tunnel\`.
@@ -69,8 +67,8 @@ name: ${input.projectName}
69
67
  services:
70
68
  agent:
71
69
  build:
72
- context: ${context}
73
- dockerfile: ${dockerfile}
70
+ context: .
71
+ dockerfile: Dockerfile
74
72
  ports:
75
73
  - "127.0.0.1:${input.port}:${input.port}"
76
74
  # The deployed environment's own declaration, read by the container itself. \`env_file\`, not per-name
@@ -78,12 +76,13 @@ services:
78
76
  # source a deployment must not have. A FIXED path, never the builder's FASTAGENT_SECRETS_DIR — this file is a
79
77
  # committed artifact and must mean the same thing on every machine. \`deploy\` creates it if it is missing.
80
78
  env_file:
81
- - ${SECRETS_DIRNAME}/.env
79
+ - ${DOCKER_VALUE_FILE}
82
80
  environment:
83
81
  PORT: "${input.port}"
84
- # Machinery on the ONE state volume: mutable state and credentials (logged in on the box). Pinned AFTER
85
- # env_file so a local path in that file (the scaffold lists these) cannot send the container's state, sessions
86
- # or credentials somewhere outside the volume — or at a host path that does not exist here at all.
82
+ # Machinery on the ONE state volume: mutable state and credentials (logged in on the box); the agent's content
83
+ # is linked there by the release itself. Pinned AFTER env_file so a local path in that file (the scaffold lists
84
+ # these) cannot send the container's state, sessions or credentials somewhere outside the volume — or at a
85
+ # host path that does not exist here at all.
87
86
  FASTAGENT_STATE_DIR: "${MOUNT}/.state"
88
87
  FASTAGENT_SECRETS_DIR: "${MOUNT}/.secrets"
89
88
  FASTAGENT_AUTH_PATH: "${MOUNT}/.secrets/auth.json"
@@ -106,7 +105,7 @@ volumes:
106
105
  }
107
106
  /** Compute local-Docker artifacts + the runbook; no Docker process is touched here. */
108
107
  export function planDockerDeploy(input) {
109
- const composePath = `${input.agentPrefix}${DOCKER_COMPOSE_FILE}`;
108
+ const composePath = DOCKER_COMPOSE_FILE;
110
109
  const artifacts = [{ path: composePath, content: composeYaml(input) }, ...containerArtifacts(input)];
111
110
  // One spelling for every command: the generated file names the value file itself (`env_file`), so no command
112
111
  // needs a flag to reach the deployed environment's declaration.
@@ -121,13 +120,13 @@ export function planDockerDeploy(input) {
121
120
  if (secrets.length > 0) {
122
121
  runbook.push(`# Environment: the container reads ${input.valueFile} whole (Compose \`env_file\`) — that file declares the`, `# deployed environment (in CI, write it before running the command):`, ...secrets.map((secret) => `# ${secret.name}: ${secret.hint}`));
123
122
  }
124
- runbook.push(`# Run from the WORKSPACE ROOT (the directory containing ${input.agentPrefix}).`, `# The build bakes the whole directory as the agent's workspace; only the agent's own`, `# dependencies (${input.agentPrefix}package.json) are installed.`);
125
- runbook.push(``, `# Before building a new definition release, run \`fastagent deploy docker\` to refresh its manifest.`, `# The Compose volume at ${MOUNT} retains the workspace, state and credentials.`, `${compose} up -d --build`, `curl --fail http://127.0.0.1:${input.port}/health`, ...(input.boxLogin
123
+ runbook.push(`# Run from the agent directory. The build bakes it as the definition and installs its`, `# package.json dependencies.`);
124
+ runbook.push(``, `# Before building a new definition release, run \`fastagent deploy docker\` to refresh its manifest.`, `# The Compose volume at ${MOUNT} retains the deployed definition, state and credentials.`, `# --pull: the base image is a floating tag, and a copy cached here may be older than the runtime floor.`, `${compose} build --pull`, `${compose} up -d`, `curl --fail http://127.0.0.1:${input.port}/health`, ...(input.boxLogin
126
125
  ? [
127
126
  `# Model auth: once it is up, the deployment logs in to ${input.boxLogin} itself:`,
128
127
  `${deploymentLoginCommand("docker", input.boxLogin)}`,
129
128
  ]
130
- : []), ``, `# Operate it:`, `${compose} logs -f agent`, `${compose} ps`, `${compose} down # stops containers; keeps the state volume`, `# ${compose} down -v # DESTRUCTIVE: deletes workspace, credentials and all agent state`);
129
+ : []), ``, `# Operate it:`, `${compose} logs -f agent`, `${compose} ps`, `${compose} down # stops containers; keeps the state volume`, `# ${compose} down -v # DESTRUCTIVE: deletes credentials and all agent state`);
131
130
  if (input.tunnel) {
132
131
  runbook.push(``, `# Quick Tunnel: \`--run\` starts the Compose tunnel service and reads its ephemeral public URL.`, `# Telegram/Feishu/Lark and locally onboarded Slack auto-register; manual Slack prints its console URL. Re-run after the`, `# tunnel container/Docker daemon restarts: a new Quick Tunnel URL must replace the old webhook URL.`, `${compose} logs -f tunnel`);
133
132
  }
@@ -4,7 +4,7 @@ import type { DeclaredChannel } from "../../channels/discover.ts";
4
4
  import type { RegistrationOutcome } from "../../channels/registration.ts";
5
5
  import type { CliRunner } from "../runner.ts";
6
6
  export interface DockerRunPlan {
7
- /** Compose file relative to the runner cwd (the workspace root). */
7
+ /** Compose file relative to the runner cwd (the agent directory). */
8
8
  composeFile: string;
9
9
  /** Container port from config; used to ask Compose for the effective published host port. */
10
10
  port: number;
@@ -15,7 +15,7 @@ export interface DockerRunPlan {
15
15
  secrets: Record<string, string>;
16
16
  /** Declared names the value file supplies no value for — the run gates on these before any side effect. */
17
17
  missingSecrets: string[];
18
- /** That value file, workspace-relative, so the gate names the file this deploy actually read. */
18
+ /** That value file, agent-dir-relative, so the gate names the file this deploy actually read. */
19
19
  valueFile: string;
20
20
  /** Register the deployment's webhooks against the tunnel URL, reporting what each registrar answered. */
21
21
  announce: DockerAnnounce;
@@ -14,8 +14,8 @@ export function localUrlFromComposePort(stdout) {
14
14
  return port ? `http://127.0.0.1:${port}` : undefined;
15
15
  }
16
16
  /**
17
- * The FIRST boot seeds the whole workspace onto the volume (the image's `node_modules` included) before it binds a
18
- * port, so this budget covers a copy on a slow Docker Desktop disk, not a listen.
17
+ * The boot publishes the definition onto the volume (the image's `node_modules` included) before it binds a port,
18
+ * so this budget covers a copy on a slow Docker Desktop disk, not a listen.
19
19
  */
20
20
  const defaultHealthProbe = (healthUrl, stillStarting) => waitForHealth(healthUrl, 180_000, 500, stillStarting);
21
21
  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
@@ -107,7 +107,11 @@ export async function deployDockerRun(plan, docker, log, healthProbe = defaultHe
107
107
  }
108
108
  }
109
109
  log(`building and reconciling ${plan.composeFile}…`);
110
- if ((await docker([...compose, "up", "-d", "--build"])).code !== 0) {
110
+ // `--pull`: the base image is a floating tag, and a copy cached here may be older than the runtime floor.
111
+ if ((await docker([...compose, "build", "--pull"])).code !== 0) {
112
+ return gate(`\`docker compose build\` failed — see the Docker output above; fix it and re-run`);
113
+ }
114
+ if ((await docker([...compose, "up", "-d"])).code !== 0) {
111
115
  return gate(`\`docker compose up\` failed — see the Docker output above; fix ${plan.composeFile} and re-run`);
112
116
  }
113
117
  // Detached `up` can return 0 just before a bad command exits.
@@ -133,7 +137,7 @@ export async function deployDockerRun(plan, docker, log, healthProbe = defaultHe
133
137
  return ps.code !== 0 || ps.stdout.split(/\s+/).includes("agent");
134
138
  };
135
139
  if (!url && plan.boxLogin) {
136
- // The login runs in the prepared workspace, with the CLI the first boot installs: it needs the box READY, and
140
+ // The login runs in the deployed definition, with the CLI the first boot installs: it needs the box READY, and
137
141
  // with no published port the only place to ask `/health` is inside the container.
138
142
  log("agent is running (no host-published port found); waiting for /health inside the container before login…");
139
143
  if (!(await containerHealthy(docker, compose, plan.port, stillStarting))) {
@@ -22,7 +22,7 @@ export interface FlyPlanInput extends ContainerInput {
22
22
  * carries.
23
23
  */
24
24
  secrets?: readonly DeploymentSecret[];
25
- /** `routines/` declares a cron — one of the things that forces a machine up (deploy/residency.ts). */
25
+ /** `schedules/` declares a schedule — one of the things that forces a machine up (deploy/residency.ts). */
26
26
  hasCron: boolean;
27
27
  }
28
28
  export interface FlyPlan {
@@ -1,21 +1,13 @@
1
1
  import { webhookRunbook } from "../channel-ingress.js";
2
- import { containerArtifacts } from "../container.js";
2
+ import { containerArtifacts, imageHasGit } from "../container.js";
3
3
  import { deploymentLoginCommand } from "../box-shell.js";
4
- import { CRON_CAN_BE_EXTERNAL, WAKEUPS_WHEN_ASLEEP, residencyFor } from "../residency.js";
4
+ import { WAKEUPS_WHEN_ASLEEP, residencyFor } from "../residency.js";
5
5
  function flyToml(appName, port, residency) {
6
6
  // WHY is residency.ts's to decide; the SETTING and its wording are Fly's. Anything else is an edit to the
7
7
  // generated file, which is the artifact's job.
8
8
  const min = residency
9
9
  ? ` min_machines_running = 1 # ${residency.why}`
10
10
  : ` min_machines_running = 0 # scale to zero — ${WAKEUPS_WHEN_ASLEEP}`;
11
- // The one reason with a way out gets it stated NEXT TO the line it is about, which is where an operator reading
12
- // `min_machines_running = 1` and wondering what it costs them is looking.
13
- const alternative = residency?.reason === CRON_CAN_BE_EXTERNAL
14
- ? ` # …or keep the time somewhere else and set this to 0: a scheduler you own (Fly Cron Manager,\n` +
15
- ` # supercronic, GitHub Actions) calls \`POST /run\`, which runs one declared unit of work by name.\n` +
16
- ` # It is an API, not a clock: read its contract first — docs/api-reference.md#post-run.\n` +
17
- ` # At 0, ${WAKEUPS_WHEN_ASLEEP}.\n`
18
- : "";
19
11
  // Suspend, not stop: a resume is fast enough that a webhook does not time out. Edit the line to change it.
20
12
  const stopLine = ` auto_stop_machines = "suspend" # suspend on idle (fast resume on the next webhook)`;
21
13
  return `${GENERATED_FLY_TOML_MARKER}. Edit freely — it is not regenerated unless you pass --force.
@@ -35,10 +27,10 @@ primary_region = "iad" # set your region (list: \`fly platform regions\`)
35
27
  ${stopLine}
36
28
  auto_start_machines = true
37
29
  ${min}
38
- ${alternative}
30
+
39
31
  [mounts]
40
32
  source = "data"
41
- destination = "/data" # workspace, state and credentials survive stop/suspend/redeploy
33
+ destination = "/data" # state and credentials survive stop/suspend/redeploy
42
34
  initial_size = "1gb" # the volume is created by the FIRST deploy — it is pinned to one host, and only
43
35
  # deploy tells the scheduler which machine (size + image) must fit there too
44
36
 
@@ -55,8 +47,7 @@ export function isGeneratedFlyToml(content) {
55
47
  /** Compute the Fly deploy plan from the resolved definition. */
56
48
  export function planFlyDeploy(input) {
57
49
  const { appName, port, channels } = input;
58
- // Artifacts sit under the agent prefix, so they never touch the workspace's own deploy files.
59
- const flyTomlPath = `${input.agentPrefix}fly.toml`;
50
+ const flyTomlPath = "fly.toml";
60
51
  const artifacts = [
61
52
  {
62
53
  path: flyTomlPath,
@@ -65,7 +56,7 @@ export function planFlyDeploy(input) {
65
56
  ...containerArtifacts(input),
66
57
  ];
67
58
  const secrets = input.secrets ?? [];
68
- const deployCmd = `fly deploy . --config ${flyTomlPath} --dockerfile ${input.agentPrefix}Dockerfile --app ${appName}`;
59
+ const deployCmd = `fly deploy . --config ${flyTomlPath} --dockerfile Dockerfile --app ${appName}`;
69
60
  const runbook = [
70
61
  `# Deploy "${appName}" to Fly.io. ${flyTomlPath} / Dockerfile(.dockerignore) are generated above.`,
71
62
  `# Prereqs: flyctl installed (https://fly.io/docs/flyctl/install) and \`fly auth login\`.`,
@@ -74,7 +65,7 @@ export function planFlyDeploy(input) {
74
65
  `# Fly app names are GLOBALLY unique: if this fails as taken, set a unique "app" in fly.toml and`,
75
66
  `# re-run \`fastagent deploy fly\` — the runbook follows fly.toml's app name.`,
76
67
  `fly apps create ${appName}`,
77
- `# The volume (workspace, state, credentials — kept across stop/suspend/redeploy) is created by the deploy`,
68
+ `# The volume (definition, state, credentials — kept across stop/suspend/redeploy) is created by the deploy`,
78
69
  `# below, in primary_region and sized by [mounts].initial_size. Creating it yourself first pins it to a host`,
79
70
  `# picked without the machine, which can fail the deploy with "insufficient resources … existing volume".`,
80
71
  ``,
@@ -88,13 +79,13 @@ export function planFlyDeploy(input) {
88
79
  if (secrets.length > 0) {
89
80
  runbook.push(``, `# Secrets (replace each <value>):`, ...secrets.map((s) => `# ${s.name}: ${s.hint}`), `fly secrets set --app ${appName} ${secrets.map((s) => `${s.name}=<value>`).join(" ")}`);
90
81
  }
91
- runbook.push(``, `# The build context is the WORKSPACE ROOT (the whole directory is baked as the agent's cwd).`, `# The config/Dockerfile live under ${input.agentPrefix} so they never collide with the workspace's own.`, `# Before a new definition release, run \`fastagent deploy fly\` to refresh the release manifest.`, `# Run this from the workspace root:`, deployCmd);
92
- runbook.push(``, `# The volume keeps /data/base (including uncommitted work), .state and .secrets across restarts and deploys.`, `# Each generated release replaces only /data/base/${input.agentPrefix}; other workspace files are initialized once.`, input.shipsGit
93
- ? `# Git is available for optional collaboration. Verify uploaded history with \`git status\`; clone if the host stripped it.`
94
- : `# To use Git for collaboration, add deploy: { apt: ["git"] }. Storage durability does not require Git.`);
82
+ runbook.push(``, `# The build context is the agent directory, baked as the definition.`, `# Before a new definition release, run \`fastagent deploy fly\` to refresh the release manifest.`, `# Run this from the agent directory:`, deployCmd);
83
+ runbook.push(``, `# The volume keeps .state and .secrets across restarts and deploys; each release replaces /data/definition.`, imageHasGit(input)
84
+ ? `# Git is installed (the definition ships its .git, github content is cloned here, or context.json declares it in aptPackages).`
85
+ : `# To give the agent git, declare it: fastagent env add apt:git`);
95
86
  // The credential is created on the box, never carried: the box is then the only holder of its grant.
96
87
  if (input.boxLogin) {
97
- runbook.push(``, `# Model auth: once it is up, the deployment logs in to ${input.boxLogin} itself (from this workspace):`, `${deploymentLoginCommand("fly", input.boxLogin)}`);
88
+ runbook.push(``, `# Model auth: once it is up, the deployment logs in to ${input.boxLogin} itself (from the agent directory):`, `${deploymentLoginCommand("fly", input.boxLogin)}`);
98
89
  }
99
90
  // The fastagent-only post-step: point each channel at the live URL.
100
91
  const steps = webhookRunbook(`https://${appName}.fly.dev`, channels);
@@ -9,22 +9,26 @@ export interface FlyRunPlan {
9
9
  secrets: Record<string, string>;
10
10
  /** Declared names the value file supplies no value for — the run gates on these before any side effect. */
11
11
  missingSecrets: string[];
12
- /** That value file, workspace-relative, so the gate names the file this deploy actually read. */
12
+ /** That value file, agent-dir-relative, so the gate names the file this deploy actually read. */
13
13
  valueFile: string;
14
14
  /** Every declared channel and its ingress — the driver asks which of them have a webhook. */
15
15
  channels: readonly DeclaredChannel[];
16
- /** fly.toml path passed to `fly deploy -c` (relative to the run cwd = the workspace root). */
16
+ /** fly.toml path passed to `fly deploy -c` (relative to the run cwd = the agent directory). */
17
17
  flyConfig: string;
18
- /**
19
- * Dockerfile path passed explicitly (`fastagent/Dockerfile`, with the workspace as context — flyctl would otherwise
20
- * resolve it relative to the config's own directory).
21
- */
18
+ /** Dockerfile path passed explicitly, relative to the run cwd (the build context). */
22
19
  dockerfile: string;
23
20
  /**
24
21
  * Log the box in (`fastagent login --deployment`) once it is up and before any webhook is pointed at it: a channel pointed at
25
22
  * a box with no model credential answers every message with a failure. Resolves a gate line, or undefined.
26
23
  */
27
24
  boxLogin?: BoxLoginStep;
25
+ /**
26
+ * Sign the host's CLI in when it is signed out, through whoever can (host-login.ts): resolves a gate line, or
27
+ * undefined once signed in. Absent: nobody can, and the run stops naming how.
28
+ */
29
+ hostLogin?: () => Promise<string | undefined>;
30
+ /** The command a coding agent runs to deploy this, its person's steps handed to its user (`--run --json`). */
31
+ forAgent: string;
28
32
  }
29
33
  /** Done, or a gate the operator must clear before re-running (printed + non-zero exit by the CLI). */
30
34
  export type FlyRunOutcome = {
@@ -1,6 +1,6 @@
1
1
  import { loginGate, publicHealthGate, registerWebhooks, } from "../channel-ingress.js";
2
2
  import { readOutput } from "../runner.js";
3
- import { missingValuesGate } from "../secrets.js";
3
+ import { hostSignedOutGate, missingValuesGate } from "../secrets.js";
4
4
  /**
5
5
  * The `Type` values that put an app on `https://<app>.fly.dev`, BY FAMILY — one entry per allocate command, because
6
6
  * that is the granularity the answer is acted on at.
@@ -30,14 +30,19 @@ export function listHasName(stdout, name) {
30
30
  }
31
31
  export async function deployFlyRun(plan, fly, log, registrars, healthProbe) {
32
32
  const gate = (g) => ({ ok: false, gate: g });
33
- // 1.
34
- if ((await fly(["auth", "whoami"], { capture: true })).code !== 0) {
35
- return gate("not logged in to Fly — run `fly auth login` (opens a browser), or set FLY_API_TOKEN, then re-run");
36
- }
37
- // 2. Gate missing required secret VALUES before any side effect (no half-created infra).
33
+ // 1. Gate missing required secret VALUES before any side effect (no half-created infra), and before asking a
34
+ // person to sign in for a deploy that would stop here anyway.
38
35
  const missingValues = missingValuesGate(plan.missingSecrets, plan.valueFile);
39
36
  if (missingValues)
40
37
  return gate(missingValues);
38
+ // 2.
39
+ if ((await fly(["auth", "whoami"], { capture: true })).code !== 0) {
40
+ const failed = plan.hostLogin
41
+ ? await plan.hostLogin()
42
+ : hostSignedOutGate("Fly", "fly auth login", "FLY_API_TOKEN", plan.forAgent);
43
+ if (failed)
44
+ return gate(failed);
45
+ }
41
46
  // 3.
42
47
  const appExists = await readOutput(fly, "fly", ["apps", "list", "--json"], (out) => listHasName(out, plan.appName));
43
48
  if ("gate" in appExists)
@@ -8,7 +8,8 @@
8
8
  * Three edits: a directory beside this file (copy `fly/`: `plan.ts` pure, `run.ts` driving the host
9
9
  * CLI behind the runner seam), its `HostDeploy` in `cli/commands/deploy/<host>.ts` (kept-file
10
10
  * semantics, gates, the drive glue — the half that may exit the process), and its name in the array
11
- * below. `deploy/` itself is a neutral kernel plus one directory per host; nothing host-specific
11
+ * below. Locally known refusals belong in `HostDeploy.validate`: the dispatcher runs it before app onboarding
12
+ * and again on the facts onboarding produces. `deploy/` itself is a neutral kernel plus one directory per host; nothing host-specific
12
13
  * belongs in the kernel, and no host may hold a fact about another one (a host-only flag is a row in
13
14
  * `HOST_ONLY_FLAGS` in `cli/commands/deploy.ts`, warning elsewhere; `--tunnel` stays a usage GATE in `runDeploy`
14
15
  * because a refusal is not a row).
@@ -8,7 +8,8 @@
8
8
  * Three edits: a directory beside this file (copy `fly/`: `plan.ts` pure, `run.ts` driving the host
9
9
  * CLI behind the runner seam), its `HostDeploy` in `cli/commands/deploy/<host>.ts` (kept-file
10
10
  * semantics, gates, the drive glue — the half that may exit the process), and its name in the array
11
- * below. `deploy/` itself is a neutral kernel plus one directory per host; nothing host-specific
11
+ * below. Locally known refusals belong in `HostDeploy.validate`: the dispatcher runs it before app onboarding
12
+ * and again on the facts onboarding produces. `deploy/` itself is a neutral kernel plus one directory per host; nothing host-specific
12
13
  * belongs in the kernel, and no host may hold a fact about another one (a host-only flag is a row in
13
14
  * `HOST_ONLY_FLAGS` in `cli/commands/deploy.ts`, warning elsewhere; `--tunnel` stays a usage GATE in `runDeploy`
14
15
  * because a refusal is not a row).
@@ -1,7 +1,6 @@
1
- import { type FastagentConfig } from "../engines/pi/config.ts";
2
- import { type ResolvedPlacement } from "../paths.ts";
1
+ import type { AgentConfig } from "../harnesses/pi-durable/define.ts";
3
2
  import { type DeclaredChannel } from "../channels/discover.ts";
4
- import { type DeclaredSecret } from "../declared-secrets.ts";
3
+ import type { DeclaredSecret } from "../declared-secrets.ts";
5
4
  import { type ContainerInput } from "./container.ts";
6
5
  import { type DeploymentSecret } from "./secrets.ts";
7
6
  /** A stderr line the CLI prints (`[fastagent] warn: …` / `[fastagent] note: …`). */
@@ -14,31 +13,27 @@ interface DeployFacts {
14
13
  messages: DeployMessage[];
15
14
  /** Every declared channel with the ingress its module shape says it has, custom ones included. */
16
15
  channels: DeclaredChannel[];
17
- /**
18
- * `routines/` declares at least one cron — the one residency reason with an external substitute: `POST /run` lets
19
- * someone else's clock run a declared routine, so an operator who wants scale-to-zero has an option here.
20
- */
16
+ /** `src/schedules/` declares at least one schedule. */
21
17
  hasCron: boolean;
22
18
  /**
23
19
  * The deployed environment's declaration, read ONCE here so the plan side and the run side cannot disagree about
24
20
  * what this deployment carries. The environment running `deploy` is deliberately absent from it (§9).
25
21
  */
26
22
  values: ReadonlyMap<string, string>;
27
- /** That file, workspace-relative — the name every "set it here" message must use. */
23
+ /** That file, agent-dir-relative — the name every "set it here" message must use. */
28
24
  valueFile: string;
29
25
  /**
30
- * The variable the value file carries the model's key in (the provider's own, or a models.json `"$NAME"`), or
31
- * undefined when no key travels that way ({@link credentialRoute}).
26
+ * The variable the value file carries the model's key in, or undefined when no key travels that way
27
+ * ({@link credentialRoute}).
32
28
  */
33
29
  modelAuth: string | undefined;
34
30
  /**
35
31
  * The provider the deployment must log in to itself (`fastagent login --deployment`): the model's credential does
36
- * not travel, because it is neither a variable in the value file nor carried by the definition (a models.json
37
- * literal `apiKey` or `!command`). Nothing from this machine's credentials file is ever copied, so a login on the
38
- * box is its only holder.
32
+ * not travel, because it is neither a variable in the value file nor resolved by the definition's own provider code.
33
+ * Nothing from this machine's credentials file is ever copied, so a login on the box is its only holder.
39
34
  */
40
35
  boxLogin: string | undefined;
41
- /** Every tool/routine/channel declaration — the names the value file must supply, by declaring file. */
36
+ /** Every declaration the definition makes — the names the value file must supply, by declaring file. */
42
37
  declaredSecrets: DeclaredSecret[];
43
38
  /** The runbook's variable list: the declared names, then everything else the value file carries. */
44
39
  secrets: DeploymentSecret[];
@@ -63,21 +58,24 @@ export interface DeployReport {
63
58
  issue(text: string): void;
64
59
  }
65
60
  interface PreflightInput {
66
- placement: ResolvedPlacement;
67
- config: FastagentConfig;
61
+ agentDir: string;
62
+ config: AgentConfig;
68
63
  /** `--run` fully deploys, so a definition that resolves NO model is a GATE (a known crash-loop); else it warns. */
69
64
  run: boolean;
70
65
  /** `--force` regenerates the artifacts fastagent OWNS, so a kept `.dockerignore`'s content checks do not apply. */
71
66
  force: boolean;
72
- /** The target delivers cron slots from an external clock and holds no resident process (AgentCore). */
73
- externalClock?: boolean;
74
67
  /**
75
- * Does this target publish the serve at a URL anyone can dial? True for every host that mints one (Fly, Railway,
76
- * a Docker box); false for AgentCore, where the container is reachable only through the Runtime's IAM and the
77
- * forwarder's shared secret. Kept apart from {@link externalClock} on purpose — they happen to agree on AgentCore
78
- * today, and answering two questions with one boolean is how the answer to one of them goes wrong later.
68
+ * The target holds no resident process (AgentCore): what wakes it is outside it (webhooks, alarms), so the notes
69
+ * about keeping one machine running do not apply.
70
+ */
71
+ noResidentProcess?: boolean;
72
+ /**
73
+ * Does every deployment start this host's storage over (AgentCore)? Then a clone the instance made, and anything the
74
+ * agent did in it, does not outlive a release. Its own question, apart from {@link noResidentProcess}.
79
75
  */
80
- publicUrl?: boolean;
76
+ storageResets?: boolean;
77
+ /** Does this deployment serve the Agent API under `/v1` (deploy/api.ts)? Then a Caller with its key reaches it. */
78
+ servesApi?: boolean;
81
79
  }
82
80
  /** Run the host-neutral pre-flight. */
83
81
  export declare function preflightDeploy(input: PreflightInput): Promise<DeployPreflight>;