@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
@@ -1,10 +1,11 @@
1
- /** `fastagent destroy agentcore [dir]`: remove every AWS resource the deploy created. */
1
+ /** `fastagent destroy agentcore [agent]`: remove every AWS resource the deploy created. */
2
2
  import { basename, resolve } from "node:path";
3
3
  import { destroyAgentcoreDeployment } from "../../deploy/agentcore/destroy.js";
4
4
  import { agentcoreName } from "../../deploy/agentcore/plan.js";
5
5
  import { awsRunner } from "../../deploy/runner.js";
6
6
  import { enterAgentEnv } from "../../env.js";
7
- import { failStartup, failUsage, placementOrExit } from "../fail.js";
7
+ import { selectAgentEnvironment } from "../../paths.js";
8
+ import { agentDirOrExit, failStartup, failUsage } from "../fail.js";
8
9
  export async function runDestroy(host, dirArg, opts) {
9
10
  // The host argument is DISPATCHED here, as in runLogs. In practice commander rejects anything else first
10
11
  // (the spec declares `choices`), so what the operator reads is its message plus the spec's notes, which name
@@ -12,10 +13,11 @@ export async function runDestroy(host, dirArg, opts) {
12
13
  // treated as agentcore.
13
14
  if (host !== "agentcore")
14
15
  failUsage(`destroy: unsupported host "${host}"`);
15
- const placement = placementOrExit(resolve(dirArg));
16
- enterAgentEnv(placement.agentDir); // AWS_PROFILE/region/proxy may be definition-local, as on deploy
17
- const name = agentcoreName(basename(placement.workspace));
18
- const outcome = await destroyAgentcoreDeployment({ name, run: opts.run === true }, awsRunner(placement.workspace), (message) => console.error(`[fastagent] destroy: ${message}`));
16
+ const agentDir = agentDirOrExit(resolve(dirArg));
17
+ selectAgentEnvironment("production");
18
+ enterAgentEnv(agentDir);
19
+ const name = agentcoreName(basename(agentDir));
20
+ const outcome = await destroyAgentcoreDeployment({ name, run: opts.run === true }, awsRunner(agentDir), (message) => console.error(`[fastagent] destroy: ${message}`));
19
21
  if (!outcome.ok) {
20
22
  // THE WHOLE PICTURE, before the gate: a half-finished teardown is exactly when an operator needs to know
21
23
  // what is out there, what is already gone, and what the retry still has to reach.
@@ -5,8 +5,6 @@ export interface DevOptions {
5
5
  /** false ⇔ `--no-watch`. */
6
6
  watch?: boolean;
7
7
  tunnel?: boolean;
8
- /** false ⇔ `--no-invoke`: withhold `POST /invoke` for THIS run (`http.invoke` is the persistent form). */
9
- invoke?: boolean;
10
8
  /** false ⇔ `--no-input`. */
11
9
  input?: boolean;
12
10
  }
@@ -2,13 +2,14 @@
2
2
  * `fastagent dev`: a SUPERVISOR that spawns a worker (this command with FASTAGENT_DEV_WORKER set) to assemble + serve,
3
3
  * restarting it on agent edits.
4
4
  */
5
- import { runDevSupervisor } from "../../dev-supervisor.js";
5
+ import { listenForRestart, runDevSupervisor } from "../../dev-supervisor.js";
6
6
  import { setLogLevel } from "../../log.js";
7
- import { createPiAgentFromDir } from "../../engines/pi/open.js";
8
- import { DEFAULT_HTTP_PORT, mountAgentService } from "../../service.js";
9
- import { logAgentLoop } from "../../observe.js";
7
+ import { markDevServe } from "../../serving-command.js";
8
+ import { selectAgentEnvironment } from "../../paths.js";
9
+ import { openServing } from "../../harnesses/pi-durable/serve.js";
10
+ import { DEFAULT_HTTP_PORT, serveAgent } from "../../service.js";
10
11
  import { failStartup } from "../fail.js";
11
- import { assertTunnelBindable, cliMountOptions, serveService, withRunOverrides } from "../serve.js";
12
+ import { assertTunnelBindable, cliMountOptions, serveService } from "../serve.js";
12
13
  import { enterAgentCommand, parseBind, parsePort, reportAssembly } from "../shared.js";
13
14
  /**
14
15
  * `dev` binds loopback unless `--bind` says otherwise: a dev serve carries the agent's full tool authority and lands on
@@ -17,32 +18,32 @@ import { enterAgentCommand, parseBind, parsePort, reportAssembly } from "../shar
17
18
  const DEV_BIND = "127.0.0.1";
18
19
  export async function runDev(dirArg, opts) {
19
20
  setLogLevel("debug"); // dev posture: verbose, includes the debug turn trace (content) — supervisor and worker both
21
+ selectAgentEnvironment("dev");
22
+ markDevServe(); // the worker inherits both selections
20
23
  const isWorker = process.env.FASTAGENT_DEV_WORKER === "1";
24
+ // First, so a restart asked for while the worker is still assembling is heard: with nothing running it stops at once.
25
+ if (isWorker)
26
+ process.on("message", listenForRestart(() => process.kill(process.pid, "SIGTERM")));
21
27
  // The model is picked ONCE, in the parent process (a TTY; watch and --no-watch both).
22
- const placement = await enterAgentCommand(dirArg, { ...opts, input: isWorker ? false : opts.input });
28
+ const { agentDir, modelSpec } = await enterAgentCommand(dirArg, { ...opts, input: isWorker ? false : opts.input });
23
29
  if (isWorker || opts.watch === false) {
24
- await serveOnce(placement, opts);
30
+ await serveOnce(agentDir, modelSpec, opts);
25
31
  return;
26
32
  }
27
33
  parsePort(opts.port, "--port", "flag"); // flag-shape checks before spawning
28
34
  // The --bind/--tunnel conflict is decidable from flags alone: refuse it HERE, before a worker and a tunnel exist.
29
35
  assertTunnelBindable(parseBind(opts.bind), opts.tunnel ?? false);
30
- await runDevSupervisor(placement, { tunnel: opts.tunnel ?? false });
36
+ await runDevSupervisor(agentDir, { tunnel: opts.tunnel ?? false });
31
37
  }
32
38
  /** Assemble the agent and serve it once (the dev worker; also the --no-watch path). */
33
- async function serveOnce(placement, opts) {
39
+ async function serveOnce(agentDir, modelSpec, opts) {
34
40
  const portFlag = parsePort(opts.port, "--port", "flag");
35
41
  const host = parseBind(opts.bind) ?? DEV_BIND;
36
42
  const tunnel = opts.tunnel ?? false;
37
43
  assertTunnelBindable(host, tunnel);
38
- const a = await createPiAgentFromDir(placement.agentDir, {
39
- model: placement.modelSpec,
40
- serving: true, // long-running serve: the scheduler poller runs (and the wake tool is mounted)
41
- }).catch(failStartup);
42
- // The same report `start` prints; `config:` is dev's own extra (see reportAssembly on the asymmetry).
43
- await reportAssembly({ ...a, modelSpec: placement.modelSpec }, { beforeModel: [["config", a.configPath ?? "(none)"]] });
44
- // The SAME assembly an embedder gets from `createAgentService` — channels, control plane, schedules, long
45
- // connections.
46
- const service = await mountAgentService(withRunOverrides(a, opts), cliMountOptions(logAgentLoop)).catch(failStartup);
47
- serveService(service, { port: portFlag ?? a.config.http?.port ?? DEFAULT_HTTP_PORT, host }, { tunnel, agentDir: a.agentDir, stateRoot: a.stateRoot });
44
+ const opened = await openServing(agentDir, { model: modelSpec }).catch(failStartup);
45
+ await reportAssembly(opened, modelSpec);
46
+ const { config } = opened.definition;
47
+ const service = await serveAgent(opened, cliMountOptions(config)).catch(failStartup);
48
+ serveService(service, { port: portFlag ?? config.http?.port ?? DEFAULT_HTTP_PORT, host }, { tunnel, agentDir, stateRoot: opened.stateRoot, config });
48
49
  }
@@ -0,0 +1,12 @@
1
+ export declare function runEnvAdd(args: string[]): Promise<void>;
2
+ export declare function runEnvRemove(args: string[]): Promise<void>;
3
+ export declare function runEnvList(opts?: {
4
+ json?: boolean;
5
+ }): Promise<void>;
6
+ /**
7
+ * Install what context.json declares here, mise first when the agent has none (into its package.json): every package at
8
+ * the newest release its version allows, a newer one where one is out. Apt packages are the image's: one missing here
9
+ * is said, with how.
10
+ */
11
+ export declare function runEnvInstall(): Promise<void>;
12
+ export declare function runEnvExec(command: string[]): Promise<void>;
@@ -0,0 +1,190 @@
1
+ /**
2
+ * `fastagent env add|remove|list|install|exec`: the agent's environment, declared under `environment` in context.json
3
+ * and installed by the agent's own mise (docs/design/agent-service.md §4), in the agent directory, the current one.
4
+ */
5
+ import { spawn } from "node:child_process";
6
+ import { resolve } from "node:path";
7
+ import { loadEnvironment, readContextFile } from "../../content/file.js";
8
+ import { aptAdvice, missingAptPackages } from "../../environment/apt.js";
9
+ import { declareEnvironment, declaredVariables, parsePackageArgument, runtimeAdvice, } from "../../environment/declare.js";
10
+ import { checkPackages, ensureMise, enterEnvironment, installPackages, miseBinary } from "../../environment/mise.js";
11
+ import { writeEnvironment } from "../../authoring.js";
12
+ import { log } from "../../log.js";
13
+ import { agentDirOrExit, failStartup } from "../fail.js";
14
+ import { dotEnvPath, enterAgentEnv } from "../../env.js";
15
+ import { missingSecrets } from "../../declared-secrets.js";
16
+ const NONE = { packages: {}, aptPackages: [], variables: {} };
17
+ /**
18
+ * The agent directory, the current one, entered as every command that runs in it is: its `.env` in `process.env`, and
19
+ * the proxy that `.env` may declare. mise's downloads go through that proxy, and `env exec` runs its command with the
20
+ * same values the agent's own commands get.
21
+ */
22
+ function enterAgentHere() {
23
+ const agentDir = agentDirOrExit(resolve("."));
24
+ enterAgentEnv(agentDir);
25
+ return agentDir;
26
+ }
27
+ export async function runEnvAdd(args) {
28
+ const agentDir = enterAgentHere();
29
+ const parsed = args.map(parsePackageArgument);
30
+ const apt = parsed.flatMap((one) => ("apt" in one ? [one.apt] : []));
31
+ await edit(agentDir, (current) => {
32
+ const packages = { ...current.packages };
33
+ const aptPackages = [...current.aptPackages];
34
+ for (const one of parsed) {
35
+ if ("apt" in one) {
36
+ if (!aptPackages.includes(one.apt))
37
+ aptPackages.push(one.apt);
38
+ }
39
+ else {
40
+ packages[one.name] = one.version;
41
+ }
42
+ }
43
+ return { ...current, packages, aptPackages };
44
+ }).catch(failStartup);
45
+ const missing = missingAptPackages(apt);
46
+ if (missing && missing.length > 0)
47
+ log.warn(`[fastagent] ${aptAdvice(missing)}`);
48
+ }
49
+ export async function runEnvRemove(args) {
50
+ const agentDir = enterAgentHere();
51
+ await edit(agentDir, (current) => {
52
+ const packages = { ...current.packages };
53
+ let aptPackages = [...current.aptPackages];
54
+ for (const arg of args) {
55
+ const apt = arg.startsWith("apt:") ? arg.slice("apt:".length) : undefined;
56
+ const declared = apt !== undefined ? aptPackages.includes(apt) : Object.hasOwn(packages, arg);
57
+ if (!declared)
58
+ throw noPackage(current, arg);
59
+ if (apt !== undefined)
60
+ aptPackages = aptPackages.filter((name) => name !== apt);
61
+ else
62
+ delete packages[arg];
63
+ }
64
+ return { ...current, packages, aptPackages };
65
+ }).catch(failStartup);
66
+ }
67
+ export async function runEnvList(opts = {}) {
68
+ const agentDir = enterAgentHere();
69
+ const declared = await Promise.resolve()
70
+ .then(() => loadEnvironment(agentDir) ?? NONE)
71
+ .catch(failStartup);
72
+ const variables = declaredVariables(declared);
73
+ if (opts.json) {
74
+ // Whether each variable has a value here, never the value.
75
+ const listed = {
76
+ packages: Object.entries(declared.packages).map(([name, version]) => ({ name, version })),
77
+ apt: declared.aptPackages,
78
+ variables: variables.map(({ name, description }) => ({ name, description, set: Boolean(process.env[name]) })),
79
+ };
80
+ console.log(JSON.stringify(listed, null, 2));
81
+ }
82
+ else {
83
+ printEnvironment(declared, variables);
84
+ }
85
+ if (Object.keys(declared.packages).length > 0) {
86
+ const bin = miseBinary(agentDir);
87
+ if (!bin) {
88
+ log.warn(`[fastagent] the packages are not checked: the agent's mise is not installed here — run ` +
89
+ `\`fastagent env install\``);
90
+ }
91
+ else {
92
+ const { refusals, runtime } = await checkPackages(agentDir, bin, declared.packages).catch(failStartup);
93
+ for (const refusal of refusals)
94
+ log.warn(`[fastagent] ${refusal}`);
95
+ if (runtime)
96
+ log.warn(`[fastagent] ${runtimeAdvice(runtime)}`);
97
+ }
98
+ }
99
+ const missing = missingAptPackages(declared.aptPackages);
100
+ if (missing && missing.length > 0)
101
+ log.warn(`[fastagent] ${aptAdvice(missing)}`);
102
+ const unset = missingSecrets(variables).map(({ name }) => name);
103
+ if (unset.length > 0) {
104
+ log.warn(`[fastagent] no value here for ${unset.join(", ")}: dev and start refuse to run until they have one — set ` +
105
+ `them in ${dotEnvPath(agentDir)}`);
106
+ }
107
+ }
108
+ function printEnvironment(declared, variables) {
109
+ const names = [
110
+ ...Object.keys(declared.packages),
111
+ ...declared.aptPackages.map((name) => `apt:${name}`),
112
+ ...variables.map(({ name }) => name),
113
+ ];
114
+ if (names.length === 0)
115
+ console.log("(none: the agent runs this machine's commands)");
116
+ const width = Math.max(0, ...names.map((name) => name.length));
117
+ for (const [name, version] of Object.entries(declared.packages)) {
118
+ console.log(`${name.padEnd(width)} ${version}`);
119
+ }
120
+ for (const name of declared.aptPackages)
121
+ console.log(`${`apt:${name}`.padEnd(width)} (installed by the image)`);
122
+ // Whether each has a value here, never the value.
123
+ for (const { name, description } of variables) {
124
+ console.log(`${name.padEnd(width)} ${(process.env[name] ? "set" : "not set").padEnd(8)} ${description}`);
125
+ }
126
+ }
127
+ /**
128
+ * Install what context.json declares here, mise first when the agent has none (into its package.json): every package at
129
+ * the newest release its version allows, a newer one where one is out. Apt packages are the image's: one missing here
130
+ * is said, with how.
131
+ */
132
+ export async function runEnvInstall() {
133
+ const agentDir = enterAgentHere();
134
+ await Promise.resolve()
135
+ .then(async () => {
136
+ const declared = loadEnvironment(agentDir) ?? NONE;
137
+ if (Object.keys(declared.packages).length > 0) {
138
+ await installPackages(agentDir, await checkedMise(agentDir, declared.packages), declared.packages, "all");
139
+ // Nothing in the agent directory changes, so `dev` does not restart: its PATH names the releases it started on.
140
+ log.info("[fastagent] a running `fastagent dev` keeps the releases it started with until it restarts");
141
+ }
142
+ const missing = missingAptPackages(declared.aptPackages);
143
+ if (missing && missing.length > 0)
144
+ log.warn(`[fastagent] ${aptAdvice(missing)}`);
145
+ })
146
+ .catch(failStartup);
147
+ }
148
+ export async function runEnvExec(command) {
149
+ const agentDir = enterAgentHere();
150
+ await enterEnvironment(agentDir).catch(failStartup);
151
+ const [program, ...args] = command;
152
+ const code = await new Promise((done, fail) => {
153
+ const child = spawn(program, args, { stdio: "inherit" });
154
+ child.on("error", fail);
155
+ child.on("close", (exit, signal) => done(exit ?? (signal ? 1 : 0)));
156
+ }).catch((error) => failStartup(error.code === "ENOENT" ? new Error(`${program}: command not found in the environment`) : error));
157
+ process.exit(code);
158
+ }
159
+ /**
160
+ * Change the declaration with `change`, checked as a whole. A package it adds or declares at another version is checked
161
+ * and installed first at the newest release its version allows, whatever older one this machine has, so a declared
162
+ * package is one that installs; what else it declares is installed when nothing here matches it. The declaration is
163
+ * then written under context.json's lock, `change` applied to it as it is by then, so two edits at once keep both.
164
+ * `change` is therefore called twice, and computes alone.
165
+ */
166
+ async function edit(agentDir, change) {
167
+ // Read whole, as the write that follows is: a refused content entry stops the edit before anything is installed.
168
+ const current = readContextFile(agentDir).environment ?? NONE;
169
+ const next = declareEnvironment(change(current)) ?? NONE;
170
+ const added = Object.keys(next.packages).filter((name) => current.packages[name] !== next.packages[name]);
171
+ if (added.length > 0) {
172
+ await installPackages(agentDir, await checkedMise(agentDir, next.packages), next.packages, added);
173
+ }
174
+ return writeEnvironment(agentDir, (now) => declareEnvironment(change(now ?? NONE)) ?? NONE);
175
+ }
176
+ /** The refusal for a package `environment` does not declare, with what it does. */
177
+ function noPackage(environment, name) {
178
+ const has = [...Object.keys(environment.packages), ...environment.aptPackages.map((apt) => `apt:${apt}`)];
179
+ return new Error(`the environment has no package "${name}" (it has: ${has.join(", ") || "none"})`);
180
+ }
181
+ /** The agent's mise (added when it has none), once `packages` pass: a refused one stops the command. */
182
+ async function checkedMise(agentDir, packages) {
183
+ const bin = await ensureMise(agentDir);
184
+ const { refusals, runtime } = await checkPackages(agentDir, bin, packages);
185
+ if (refusals.length > 0)
186
+ throw new Error(refusals.join("\n"));
187
+ if (runtime)
188
+ log.warn(`[fastagent] ${runtimeAdvice(runtime)}`);
189
+ return bin;
190
+ }
@@ -1,182 +1,121 @@
1
- /** `fastagent info [dir] [--json]`: print what the directory ASSEMBLES into, WITHOUT booting a server. */
1
+ /** `fastagent info [agent] [--json]`: print what the directory builds into, WITHOUT opening or serving the agent. */
2
2
  import { resolve } from "node:path";
3
+ import { channelIngress } from "../../channels/discover.js";
4
+ import { loadContent, loadEnvironment } from "../../content/file.js";
5
+ import { contentAbsentHere, resolveContent } from "../../content/resolve.js";
6
+ import { describeSecrets, missingSecrets } from "../../declared-secrets.js";
3
7
  import { enterAgentEnv } from "../../env.js";
4
- import { inspectChannels } from "../../channels/discover.js";
5
- import { loadConfig, providerOf, resolveModel, resolveModelSpec } from "../../engines/pi/config.js";
6
- import { machineModels } from "../../engines/pi/models.js";
7
- import { agentModels } from "../../engines/pi/agent-models.js";
8
- import { resolveSessionsDir, resolveStateRoot } from "../../paths.js";
9
- import { CODING_TOOL_NAMES, resolveAgentTools } from "../../engines/pi/create.js";
10
- import { loadAgentDefinition } from "../../engines/pi/definition.js";
11
- import { describeIndirectTools, describePrompt, reportFindingsIfChanged, reportToolCollisions, } from "../../engines/pi/report.js";
12
- import { allSecrets, describeSecrets, missingSecrets } from "../../declared-secrets.js";
13
- import { log } from "../../log.js";
14
- import { reportModuleLoadFailures } from "../../loader.js";
15
- import { readMachine, withMachine } from "../../engines/pi/machine.js";
8
+ import { modelEnvironment } from "../../harnesses/models/environment.js";
9
+ import { buildDefinition, modelSpecFor, prepareDefinition, secretsManifest } from "../../harnesses/pi-durable/open.js";
10
+ import { readCommands } from "../../harnesses/pi-durable/text.js";
11
+ import { resolveStateRoot } from "../../paths.js";
16
12
  import { nextRun } from "../../schedule/cron.js";
17
- import { loadRoutines } from "../../schedule/discover.js";
18
- import { failStartup, placementOrExit } from "../fail.js";
13
+ import { contentLines } from "../content-view.js";
14
+ import { agentDirOrExit, failStartup } from "../fail.js";
19
15
  export async function runInfo(dirArg, opts) {
20
- const dir = resolve(dirArg);
21
- const { agentDir, workspace } = placementOrExit(dir);
22
- enterAgentEnv(agentDir); // skills/tools may read env — and fetch — at load time
23
- const { config, path: configPath } = await loadConfig(agentDir).catch(failStartup);
24
- const modelSpec = resolveModelSpec(opts.model, config);
25
- // agentDir = where the agent lives (definition + config + machinery); workspace = what it works ON (its cwd, whose
26
- // AGENTS.md ancestors are ② context).
27
- const definition = await loadAgentDefinition(agentDir, { cwd: workspace }).catch(failStartup);
28
- // What this agent HAS: the definition's skills and prompt templates plus the ones its machine lends (machine.ts).
29
- const machineResources = await readMachine(workspace);
30
- const skills = withMachine(definition.skills, machineResources.skills);
31
- const prompts = withMachine(definition.prompts, machineResources.prompts);
32
- // A tool that fails to load, for any reason (a missing dep, a top-level throw, or just not being a tool), is
33
- // isolated the same way everywhere (G2).
34
- const tools = await resolveAgentTools(config, agentDir, workspace)
35
- .then((r) => ({
36
- names: r.toolNames,
37
- indirect: r.indirectTools,
38
- collisions: r.toolCollisions,
39
- failures: r.toolFailures,
40
- secrets: allSecrets(r.toolSecrets),
41
- error: undefined,
42
- }))
43
- .catch((e) => ({
44
- names: [],
45
- indirect: [],
46
- collisions: [],
47
- failures: [],
48
- secrets: [],
49
- error: e.message,
16
+ const agentDir = agentDirOrExit(resolve(dirArg));
17
+ enterAgentEnv(agentDir); // code may read its secrets, and fetch, when it is built
18
+ const definition = await prepareDefinition(agentDir).catch(failStartup);
19
+ const { config } = definition;
20
+ const modelSpec = modelSpecFor(config, opts.model);
21
+ const manifest = secretsManifest(definition);
22
+ const declared = manifest.flatMap(({ name, optional, declaredIn }) => declaredIn.map((source) => ({ name, optional, source })));
23
+ const unsetSecrets = missingSecrets(declared);
24
+ // Built only when every required secret has a value: building is what reads them. A module that is not what its
25
+ // directory holds is said as the refusal `dev` and `start` would stop on.
26
+ const code = unsetSecrets.length === 0
27
+ ? await Promise.resolve()
28
+ .then(() => buildDefinition(definition))
29
+ .catch(failStartup)
30
+ : undefined;
31
+ // Reported, not fatal: `info` is how an author finds out a content entry is missing, or the environment refused.
32
+ let content = [];
33
+ let contentAbsent = [];
34
+ let contentError;
35
+ try {
36
+ const declaration = loadContent(agentDir);
37
+ content = resolveContent(agentDir, declaration);
38
+ contentAbsent = contentAbsentHere(declaration);
39
+ }
40
+ catch (error) {
41
+ contentError = error.message;
42
+ }
43
+ // Read already, by the definition's secrets: a refused environment is a definition that does not open.
44
+ const environment = loadEnvironment(agentDir);
45
+ const models = await modelEnvironment(agentDir, {}, code?.providers ?? []);
46
+ const slash = modelSpec?.indexOf("/") ?? -1;
47
+ const modelError = modelSpec === undefined || models.models.getModel(modelSpec.slice(0, slash), modelSpec.slice(slash + 1))
48
+ ? undefined
49
+ : `no provider "${modelSpec.slice(0, Math.max(slash, 0))}" offers "${modelSpec.slice(slash + 1)}"`;
50
+ const channels = [...(code?.channels ?? new Map())].map(([name, module]) => ({
51
+ name,
52
+ ingress: channelIngress(module),
50
53
  }));
51
- // IMPORTED, like tools and schedules: a channel's declared secrets are part of what this command
52
- // exists to report (and a channel that cannot load is what `dev` would fail on next).
53
- const inspected = await inspectChannels(agentDir).catch(failStartup);
54
- const channels = inspected.channels.map((c) => c.name);
55
- // Loaded (imported + validated), not just discovered.
56
- const sched = await loadRoutines(agentDir).catch(failStartup);
57
- // What the definition DECLARED it needs, and which of those have no value here. `info` reports
58
- // (never asserts): it is the read-only view of the same list `dev`/`start` refuse to boot without
59
- // and `deploy` requires a value for.
60
- const declaredSecrets = [
61
- ...tools.secrets,
62
- ...allSecrets(sched.secrets),
63
- ...allSecrets(inspected.secrets),
64
- ];
65
- const unsetSecrets = missingSecrets(declaredSecrets);
66
- const routines = sched.routines.map((r) => ({
67
- name: r.name,
68
- cron: r.cron ?? null,
69
- tz: r.tz ?? null,
70
- // A routine with no cron has no next fire — it is reached by name (`POST /run`, `routine run`), which is a
71
- // fact worth printing rather than a null to squint at.
72
- next: r.cron === undefined ? null : (nextRun(r.cron, r.tz, new Date())?.toISOString() ?? null),
54
+ const schedules = (code?.schedules ?? []).map((s) => ({
55
+ name: s.name,
56
+ cron: s.cron,
57
+ tz: s.tz ?? null,
58
+ next: nextRun(s.cron, s.tz, new Date())?.toISOString() ?? null,
73
59
  }));
74
- // The default sessions/auth paths WITHOUT creating anything (info is read-only; dev/start mkdir/login create them,
75
- // info must not).
60
+ const commands = readCommands(agentDir).map(({ name, description }) => ({ name, description: description ?? null }));
76
61
  const stateRoot = resolveStateRoot(agentDir);
77
- const sessionsDir = resolveSessionsDir(agentDir);
78
- // Both layers: "what is this agent's state" is the question `info` answers, and a credential it runs on can live in
79
- // a file the agent dir does not contain.
80
- const models = agentModels(agentDir, {}, { cwd: workspace });
81
- const { auth } = models;
82
- // RESOLVE the spec, do not just echo it: a spec is only real once its provider/model exist in the agent's own
83
- // surface (built-ins + its models.json), which is exactly what a custom endpoint changes.
84
- const modelError = modelSpec
85
- ? await models
86
- .runtime()
87
- .then((runtime) => {
88
- resolveModel(runtime, modelSpec);
89
- return undefined;
90
- })
91
- .catch((error) => error.message)
92
- : undefined;
93
- // The machine's own endpoints, which this agent inherits unless its models.json declares the same provider.
94
- const machine = await machineModels(agentDir).then((value) => ({ value, error: undefined }), (error) => ({ value: undefined, error: error.message }));
95
- const modelFromMachine = modelSpec !== undefined && machine.value?.inherited.includes(providerOf(modelSpec)) === true;
62
+ const auth = models.auth;
96
63
  if (opts.json) {
97
64
  console.log(JSON.stringify({
98
65
  agentDir,
99
- workspace,
100
- configPath: configPath ?? null,
66
+ name: definition.name,
67
+ content,
68
+ contentAbsent,
69
+ contentError: contentError ?? null,
70
+ environment: environment ?? null,
101
71
  model: modelSpec ?? null,
102
72
  modelError: modelError ?? null,
103
- modelFromMachine,
104
- machineModels: machine.value ?? null,
105
- machineModelsError: machine.error ?? null,
106
73
  thinkingLevel: config.thinkingLevel ?? null,
107
- codingTools: [...CODING_TOOL_NAMES],
108
- context: definition.contextFiles.map((f) => f.path),
109
- systemPrompt: definition.systemPrompt?.path ?? null,
110
- appendSystemPrompt: definition.appendSystemPrompt?.path ?? null,
111
- skills: skills.map((skill) => ({ name: skill.name, description: skill.description })),
112
- prompts: prompts.map((prompt) => ({ name: prompt.name, description: prompt.description ?? null })),
113
- tools: tools.names,
114
- indirectTools: tools.indirect,
115
- toolError: tools.error ?? null,
116
- channels,
117
- routines,
118
- routineFailures: sched.failures,
119
- channelFailures: inspected.failures,
74
+ tools: code?.tools.map(({ name }) => name) ?? null,
75
+ extensions: code?.extensions.map(({ name }) => name) ?? null,
76
+ channels: code === undefined ? null : channels,
77
+ schedules: code === undefined ? null : schedules,
78
+ commands,
79
+ secrets: manifest,
80
+ unsetSecrets: unsetSecrets.map(({ name }) => name),
120
81
  stateRoot,
121
- sessionsDir,
122
- authPath: auth.path,
123
- fallbackAuthPath: auth.fallback ?? null,
124
- diagnostics: definition.diagnostics,
125
- skillCollisions: definition.collisions,
126
- shadowed: definition.shadowed,
127
- ignored: definition.ignored,
128
- toolCollisions: tools.collisions,
129
- toolFailures: tools.failures,
130
- declaredSecrets,
131
- unsetSecrets,
82
+ authPath: auth?.path ?? null,
83
+ fallbackAuthPath: auth?.fallback ?? null,
132
84
  }, null, 2));
133
85
  return;
134
86
  }
135
- // One padded label writer, so labels stay aligned.
136
87
  const line = (label, value) => console.log(`${`${label}:`.padEnd(13)} ${value}`);
137
88
  /** A continuation under the previous line, aligned to the same column (no label, so no bare colon). */
138
89
  const cont = (value) => console.log(`${"".padEnd(13)} ${value}`);
139
- line("agent", agentDir);
140
- line("workspace", workspace);
141
- line("config", configPath ?? "(none)");
142
- line("model", modelSpec ?? "(not set — pass --model, set FASTAGENT_MODEL, or config.model)");
90
+ line("agent", `${definition.name} — ${agentDir}`);
91
+ for (const [label, value] of contentLines(content, contentAbsent))
92
+ line(label, value);
93
+ if (contentError)
94
+ cont(`⚠ ${contentError}`);
95
+ line("environment", environment ? describeEnvironment(environment) : "(none: the machine's commands)");
96
+ line("model", modelSpec ?? "(not set — pass --model, set FASTAGENT_MODEL, or model in fastagent.config.ts)");
143
97
  if (modelError)
144
98
  cont(`⚠ does not resolve: ${modelError}`);
145
- if (modelFromMachine)
146
- cont(`endpoint from the machine's ${machine.value?.path} (does not ship with a deploy)`);
147
99
  if (config.thinkingLevel)
148
100
  line("thinking", config.thinkingLevel);
149
- line("codingTools", CODING_TOOL_NAMES.join(", "));
150
- line("context", definition.contextFiles.map((f) => f.path).join(", ") || "(none)");
151
- line("prompt", describePrompt(definition));
152
- line("skills", skills.map((skill) => skill.name).join(", ") || "(none)");
153
- line("prompts", prompts.map((prompt) => prompt.name).join(", ") || "(none)");
154
- line("tools", tools.error ? "(could not load — see warning below)" : tools.names.join(", ") || "(none)");
155
- if (tools.indirect.length > 0)
156
- line("indirect", describeIndirectTools(tools.indirect));
157
- line("channels", channels.join(", ") || "(none)");
158
- line("routines", routines.map((r) => `${r.name} (${r.cron === null ? "on demand" : `next ${r.next ?? "never"}`})`).join(", ") ||
159
- "(none)");
160
- line("secrets", declaredSecrets.length > 0 ? describeSecrets(declaredSecrets) : "(none declared)");
161
- if (unsetSecrets.length > 0)
162
- cont(`⚠ dev/start refuse to boot until set: ${unsetSecrets.map((s) => s.name).join(", ")}`);
163
- line("state", stateRoot);
164
- line("sessions", sessionsDir);
165
- line("auth", auth.fallback === undefined ? auth.path : `${auth.path} (then ${auth.fallback})`);
166
- if (machine.error)
167
- line("endpoints", `⚠ ${machine.error}`);
168
- else if (machine.value) {
169
- const { path, inherited, overridden } = machine.value;
170
- const parts = [inherited.join(", ") || "(none inherited)"];
171
- if (overridden.length > 0)
172
- parts.push(`overridden by the agent: ${overridden.join(", ")}`);
173
- line("endpoints", `${path}: ${parts.join("; ")}`);
101
+ const unbuilt = "(not built: a required secret has no value)";
102
+ line("tools", code ? code.tools.map(({ name }) => name).join(", ") || "(none)" : unbuilt);
103
+ if (code && code.extensions.length > 0)
104
+ line("extensions", code.extensions.map(({ name }) => name).join(", "));
105
+ line("channels", code ? channels.map((c) => `${c.name} (${c.ingress})`).join(", ") || "(none)" : unbuilt);
106
+ line("schedules", code ? schedules.map((s) => `${s.name} (next ${s.next ?? "never"})`).join(", ") || "(none)" : unbuilt);
107
+ line("commands", commands.map(({ name }) => `/${name}`).join(", ") || "(none)");
108
+ line("secrets", declared.length > 0 ? describeSecrets(declared) : "(none declared)");
109
+ if (unsetSecrets.length > 0) {
110
+ cont(`⚠ dev, start and deployments refuse to boot until set: ${unsetSecrets.map((s) => s.name).join(", ")}`);
174
111
  }
175
- reportToolCollisions(tools.collisions);
176
- reportModuleLoadFailures(tools.failures);
177
- reportModuleLoadFailures(sched.failures);
178
- reportModuleLoadFailures(inspected.failures);
179
- if (tools.error)
180
- log.warn(`[fastagent] ${tools.error}`);
181
- reportFindingsIfChanged(definition.dir, definition);
112
+ line("state", stateRoot);
113
+ if (auth)
114
+ line("auth", auth.fallback === undefined ? auth.path : `${auth.path} (then ${auth.fallback})`);
115
+ }
116
+ /** The packages and apt packages an environment declares, as one line. */
117
+ function describeEnvironment(environment) {
118
+ const packages = Object.entries(environment.packages).map(([name, version]) => `${name} ${version}`);
119
+ const apt = environment.aptPackages.map((name) => `apt:${name}`);
120
+ return [...packages, ...apt].join(", ") || "(none: the machine's commands)";
182
121
  }
@@ -1,7 +1,7 @@
1
1
  export interface InitOptions {
2
2
  /** false ⇔ `--no-install`. */
3
3
  install: boolean;
4
- /** The agent directory's name inside `dir` — undefined = the default. */
5
- agentDir?: string;
4
+ /** `--content` sources, each a directory the agent works on. */
5
+ content: string[];
6
6
  }
7
7
  export declare function runInit(dirArg: string, opts: InitOptions): Promise<void>;