@fastagent-sh/fastagent 0.24.4 → 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 -535
  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 -92
  455. package/dist/engines/pi/turn-kit.js +0 -288
  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,57 +0,0 @@
1
- /** `fastagent tool <name> '<json>' [dir]`: run one tool's body directly with JSON args — no model. */
2
- import { resolve } from "node:path";
3
- import { enterAgentEnv } from "../../env.js";
4
- import { loadConfig } from "../../engines/pi/config.js";
5
- import { resolveAgentTools } from "../../engines/pi/create.js";
6
- import { reportModuleLoadFailures } from "../../loader.js";
7
- import { turnContext } from "../../engines/pi/tool-context.js";
8
- import { failStartup, failUsage, gateSecretsOrExit, placementOrExit } from "../fail.js";
9
- export async function runTool(name, argsJson, dirArg) {
10
- // Argument shape first: malformed JSON is a USAGE error (exit 2), independent of whether the directory is an agent
11
- // (a runtime failure, exit 1).
12
- const args = parseToolArgs(argsJson);
13
- const { agentDir, workspace } = placementOrExit(resolve(dirArg));
14
- enterAgentEnv(agentDir); // a tool may read a key from .env — and fetch through the proxy it declares
15
- const { config } = await loadConfig(agentDir).catch(failStartup);
16
- // The same tool set dev/start mount (all coding tools + config.tools + discovered, deduped), so the runner
17
- // exercises exactly what gets served.
18
- const { tools, toolCollisions, toolFailures, toolSecrets } = await resolveAgentTools(config, agentDir, workspace).catch(failStartup);
19
- for (const c of toolCollisions) {
20
- console.error(`[fastagent] warn: tool "${c.name}" (${c.source}) is shadowed by a default/config tool — not mounted`);
21
- }
22
- // Reported BEFORE the name is looked up: a file that failed to import is missing from `tools`, so
23
- // "unknown tool" is exactly the case where the author most needs to hear that something blew up
24
- // rather than that they mistyped it.
25
- reportModuleLoadFailures(toolFailures);
26
- const tool = tools.find((t) => t.name === name);
27
- if (!tool) {
28
- failStartup(new Error(`unknown tool "${name}". available: ${tools.map((t) => t.name).join(", ") || "(none)"}`));
29
- }
30
- // This command RUNS one tool body, so it takes the same guarantee dev/start take — for THAT tool
31
- // only (`owner`): running one tool by hand must not require the credentials of the tools it is not
32
- // running, and `routine run` scopes the same way for one routine.
33
- // The failures go to the gate as well, even though they were just printed: the gate's guarantee is
34
- // that a refusal never hides them, and it cannot know a caller already reported. A repeated line on
35
- // the refusal path is the cheaper failure than one that depends on this call site remembering.
36
- gateSecretsOrExit({ declared: toolSecrets, failures: toolFailures, owner: name });
37
- // Authored tools read cwd from turnContext; coding tools are already rooted at the workspace.
38
- const result = await turnContext.run({ cwd: workspace }, () => tool.execute(`cli-${name}`, args)).catch(failStartup);
39
- // What the MODEL receives, which is not what is printed below: the printed form is `details` (readable, indented),
40
- // the model's is the content text (compact JSON). Piping stdout through `wc -c` therefore answers the wrong
41
- // question, and there is nowhere else to ask this one — so the run that a tool author already does reports it.
42
- const modelText = (result?.content ?? []).map((c) => ("text" in c ? c.text : "")).join("");
43
- const out = result?.details !== undefined ? result.details : modelText;
44
- console.log(typeof out === "string" ? out : JSON.stringify(out, null, 2)); // stdout stays DATA
45
- // No threshold warning: context windows run from 128k to 1M, so any fixed ceiling here would be invented. The
46
- // number is the signal; docs/api-reference.md carries the judgement. ~4 chars/token is the usual rough figure.
47
- console.error(`[fastagent] result: ${modelText.length} chars ≈ ${Math.ceil(modelText.length / 4)} tokens to the model`);
48
- }
49
- /** Parse the CLI's JSON args blob; malformed input syntax is a usage error (exit 2). */
50
- function parseToolArgs(argsJson) {
51
- try {
52
- return JSON.parse(argsJson);
53
- }
54
- catch {
55
- failUsage(`invalid JSON args: ${argsJson}`);
56
- }
57
- }
package/dist/collect.d.ts DELETED
@@ -1,63 +0,0 @@
1
- /**
2
- * Stream helpers around the SPEC's two stream disciplines.
3
- *
4
- * Caller side: `collect` (buffered consumption, SPEC §7) reduces an AgentEvent stream to a final
5
- * value, encoding the terminal discipline (failed → throw, missing terminal → error) — streaming
6
- * consumers for-await themselves.
7
- *
8
- * Agent side: the cancellation protocol (SPEC MUST 3), in two halves that only work together —
9
- * `abortFirstIterator` delivers the consumer's knock, `cancellableStream` is what an engine wraps
10
- * its turn in to receive it.
11
- */
12
- import type { AgentEvent, Json } from "./agent.ts";
13
- /**
14
- * The abort-first cancellation protocol, ONCE: an async generator suspended on a quiet await (a
15
- * tool mid-execution, a silent SSE read) parks inside that await, and `gen.return()`/`gen.throw()`
16
- * queue behind the pending `next()` FOREVER (async-generator semantics) — a consumer's cancel
17
- * would deadlock. The wrapper's `return()` first runs `cancel` (abort the underlying work, which
18
- * settles the suspension), then delegates to `gen.return`, swallowing its rejection (the
19
- * generator's own catch/finally already surfaced the outcome). `throw()` tears down identically
20
- * and rethrows the caller's error deterministically instead of poking a completed generator.
21
- *
22
- * NOT `Stream.toAsyncIterable`. Its `return()` does interrupt the in-flight pull and close the scope,
23
- * but a pull that has ALREADY resolved still hands its value back from the same `next()` — the entry
24
- * guard only catches later calls. A consumer that cancels while a buffered terminal is in flight would
25
- * therefore receive that terminal, which is the one thing MUST 3 forbids. The re-check after the await
26
- * below is what makes the silence deterministic instead of a race.
27
- *
28
- * Cancellation also SILENCES the stream, and that belongs here rather than in each producer: a
29
- * generator parked in an await can still reach a `yield` on its way out (an error path that
30
- * yields a terminal, say), and that yield satisfies the pending `next()` — handing a terminal
31
- * event to a consumer that already walked away, which SPEC MUST 3 forbids. Deciding it once, at
32
- * the protocol boundary, is what keeps every producer from having to re-ask "is anyone still
33
- * listening?" before each yield.
34
- */
35
- export declare function abortFirstIterator<T>(gen: AsyncGenerator<T>, cancel: () => void): AsyncIterator<T>;
36
- /** What a turn generator gets so a consumer walking away can stop it. */
37
- export interface CancelHooks {
38
- /** Publish the door: how to abort the engine work, once there is engine work to abort. */
39
- onCancelReady: (cancel: () => void) => void;
40
- /** The latch, for the window where the door is armed but the engine is still idle — knocking then
41
- * does nothing, so a turn must read this before committing to work no one is waiting for. */
42
- wasCancelled: () => boolean;
43
- }
44
- /**
45
- * Wrap a turn generator in the cancellation protocol: cancelling the returned stream latches the
46
- * intent AND knocks on whatever door the generator published, in that order (the latch must be set
47
- * before the knock, or a turn checking it mid-flight could miss the cancel it just received).
48
- */
49
- export declare function cancellableStream<T>(start: (hooks: CancelHooks) => AsyncGenerator<T>): AsyncIterable<T>;
50
- /** Exception form of a failed event (thrown by collect). Carries the failed event's fields verbatim, so
51
- * a buffered consumer can branch on `code` (SPEC §8 failure subdivision) just like a streaming one. */
52
- export declare class AgentFailure extends Error {
53
- readonly details: string;
54
- readonly retryable: boolean;
55
- /** Machine-readable failure subdivision (SPEC §8), when the engine set one. */
56
- readonly code?: string;
57
- constructor(details: string, retryable: boolean, code?: string);
58
- }
59
- export interface CollectResult {
60
- text: string;
61
- data?: Json;
62
- }
63
- export declare function collect(events: AsyncIterable<AgentEvent>): Promise<CollectResult>;
package/dist/collect.js DELETED
@@ -1,90 +0,0 @@
1
- /**
2
- * The abort-first cancellation protocol, ONCE: an async generator suspended on a quiet await (a
3
- * tool mid-execution, a silent SSE read) parks inside that await, and `gen.return()`/`gen.throw()`
4
- * queue behind the pending `next()` FOREVER (async-generator semantics) — a consumer's cancel
5
- * would deadlock. The wrapper's `return()` first runs `cancel` (abort the underlying work, which
6
- * settles the suspension), then delegates to `gen.return`, swallowing its rejection (the
7
- * generator's own catch/finally already surfaced the outcome). `throw()` tears down identically
8
- * and rethrows the caller's error deterministically instead of poking a completed generator.
9
- *
10
- * NOT `Stream.toAsyncIterable`. Its `return()` does interrupt the in-flight pull and close the scope,
11
- * but a pull that has ALREADY resolved still hands its value back from the same `next()` — the entry
12
- * guard only catches later calls. A consumer that cancels while a buffered terminal is in flight would
13
- * therefore receive that terminal, which is the one thing MUST 3 forbids. The re-check after the await
14
- * below is what makes the silence deterministic instead of a race.
15
- *
16
- * Cancellation also SILENCES the stream, and that belongs here rather than in each producer: a
17
- * generator parked in an await can still reach a `yield` on its way out (an error path that
18
- * yields a terminal, say), and that yield satisfies the pending `next()` — handing a terminal
19
- * event to a consumer that already walked away, which SPEC MUST 3 forbids. Deciding it once, at
20
- * the protocol boundary, is what keeps every producer from having to re-ask "is anyone still
21
- * listening?" before each yield.
22
- */
23
- export function abortFirstIterator(gen, cancel) {
24
- let cancelled = false;
25
- const teardown = async () => {
26
- cancelled = true;
27
- cancel();
28
- await gen.return(undefined).catch(() => { });
29
- };
30
- return {
31
- async next() {
32
- const result = await gen.next();
33
- return cancelled ? { done: true, value: undefined } : result;
34
- },
35
- async return() {
36
- await teardown();
37
- return { done: true, value: undefined };
38
- },
39
- async throw(error) {
40
- await teardown();
41
- throw error;
42
- },
43
- };
44
- }
45
- /**
46
- * Wrap a turn generator in the cancellation protocol: cancelling the returned stream latches the
47
- * intent AND knocks on whatever door the generator published, in that order (the latch must be set
48
- * before the knock, or a turn checking it mid-flight could miss the cancel it just received).
49
- */
50
- export function cancellableStream(start) {
51
- let door;
52
- let cancelled = false;
53
- const iterator = abortFirstIterator(start({
54
- onCancelReady: (cancel) => {
55
- door = cancel;
56
- },
57
- wasCancelled: () => cancelled,
58
- }), () => {
59
- cancelled = true;
60
- door?.();
61
- });
62
- return { [Symbol.asyncIterator]: () => iterator };
63
- }
64
- /** Exception form of a failed event (thrown by collect). Carries the failed event's fields verbatim, so
65
- * a buffered consumer can branch on `code` (SPEC §8 failure subdivision) just like a streaming one. */
66
- export class AgentFailure extends Error {
67
- details;
68
- retryable;
69
- /** Machine-readable failure subdivision (SPEC §8), when the engine set one. */
70
- code;
71
- constructor(details, retryable, code) {
72
- super(details);
73
- this.name = "AgentFailure";
74
- this.details = details;
75
- this.retryable = retryable;
76
- this.code = code;
77
- }
78
- }
79
- export async function collect(events) {
80
- let text = "";
81
- for await (const e of events) {
82
- if (e.type === "text")
83
- text += e.delta;
84
- else if (e.type === "completed")
85
- return { text, data: e.data };
86
- else if (e.type === "failed")
87
- throw new AgentFailure(e.details, e.retryable, e.code);
88
- }
89
- throw new Error("stream ended without a terminal event"); // violates SPEC MUST 1
90
- }
package/dist/core.d.ts DELETED
@@ -1,13 +0,0 @@
1
- export type { Agent, AgentEvent, ImageRef, Json, Prompt, Scope } from "./agent.ts";
2
- export { ABORTED_CODE, MISSING_MODEL_CODE, SESSION_BUSY_CODE } from "./agent.ts";
3
- export { collect, AgentFailure, type CollectResult } from "./collect.ts";
4
- export type { ModuleLoadFailure } from "./loader.ts";
5
- export { createInvokeHandler } from "./channels/http.ts";
6
- export type { WireEvent } from "./channels/control.ts";
7
- export { ControlRequestError, connectAgent, connectSessionControl, type RemoteEndpointOptions, } from "./session-remote.ts";
8
- export { readBodyCapped } from "./channels/body.ts";
9
- export { text, textHeaders } from "./channels/respond.ts";
10
- export type { ChannelContext, ChannelHandler, ChannelModule, LongConnection, LongConnectionChannelModule, Routes, } from "./channel.ts";
11
- export { defineRoutine, type DefineRoutineOptions, type LoadedRoutine, type Routine } from "./schedule/routine.ts";
12
- export { defineChannel, type DefineChannelOptions } from "./channels/define-channel.ts";
13
- export type { DeclaredSecret } from "./declared-secrets.ts";
package/dist/core.js DELETED
@@ -1,15 +0,0 @@
1
- // VALUES, not types: each caller does something DIFFERENT with these codes (busy: retry with backoff, skip the
2
- // occurrence, or steer the live run instead of failing; aborted: settle a deliberate stop, never replay it;
3
- // missing_model: do not retry, give the session a model or the agent a default), which is why they are named at all.
4
- // Without an export an embedder copies the literal, and the copy is how the first-event rule goes silently wrong.
5
- export { ABORTED_CODE, MISSING_MODEL_CODE, SESSION_BUSY_CODE } from "./agent.js";
6
- export { collect, AgentFailure } from "./collect.js";
7
- export { createInvokeHandler } from "./channels/http.js";
8
- export { ControlRequestError, connectAgent, connectSessionControl, } from "./session-remote.js";
9
- export { readBodyCapped } from "./channels/body.js";
10
- export { text, textHeaders } from "./channels/respond.js";
11
- // Mounting only.
12
- export { defineRoutine } from "./schedule/routine.js";
13
- // What a `channels/*.ts` file is written against when it needs credentials: declaring them is what
14
- // lets `deploy` carry them and the serve refuse to start without them.
15
- export { defineChannel } from "./channels/define-channel.js";
@@ -1,83 +0,0 @@
1
- /**
2
- * An agent's MODEL ENVIRONMENT as one value: the credential store its turns authenticate through, the registry they
3
- * resolve models against, and what authenticates a provider there. Every reader builds it through {@link agentModels}
4
- * — the opener and L2, the startup report and a deployed box's `login --if-missing`, `info`, the first-run picker,
5
- * login, the model list — so none of them can read other credential layers or another registry than the runtime
6
- * does. Each used to compose these parts itself, and two of those copies drifted from the rule (#636, #660).
7
- */
8
- import type { ExecutionEnv } from "@earendil-works/pi-agent-core";
9
- import type { Credential, CredentialStore, Models, Provider } from "@earendil-works/pi-ai";
10
- import { ModelRuntime } from "@earendil-works/pi-coding-agent";
11
- import { type AuthLayers, type CredentialSourceOptions, type FastagentAuthOptions } from "./auth.ts";
12
- /** What authenticates one provider for an agent ({@link AgentModels.authStatus}). */
13
- interface AuthStatus {
14
- /** What satisfies it now (`OAuth`, `stored credential`, an env variable's name), after a due refresh. */
15
- source?: string;
16
- /** Why resolving it failed (a corrupt entry, a refresh the provider refused), when it did. */
17
- error?: string;
18
- /** The file that holds the stored credential, or the one a login would write; absent over a caller's store. */
19
- path?: string;
20
- /** The kind of credential the store holds for it, usable or not. */
21
- stored?: Credential["type"];
22
- /**
23
- * An env variable that also authenticates it but goes unused, because pi lets a stored credential own its provider
24
- * — a key added to a deployment's value file after the box was logged in, typically.
25
- */
26
- shadowed?: string;
27
- }
28
- export interface AgentModels {
29
- /** The credentials files behind {@link credentials}; absent when the caller supplied its own store. */
30
- auth?: AuthLayers;
31
- credentials: CredentialStore;
32
- /**
33
- * The registry: pi's built-ins, plus (with a directory) the agent's `models.json` and model catalog over the
34
- * machine's, plus `providers` and extension model declarations. An unbound catalog, built on first use and shared
35
- * after; session bindings use createRuntime and their own extension instances.
36
- */
37
- runtime(): Promise<ModelRuntime>;
38
- /** A session-local registry, before its extensions are loaded. Credentials remain shared. */
39
- createRuntime(): Promise<ModelRuntime>;
40
- /**
41
- * What authenticates `provider` here, resolved exactly as a turn resolves it: the ONE answer the startup report and a
42
- * deployed box's `login --if-missing` both give. `modelId` picks the model to probe with; the provider's first one
43
- * otherwise (auth is provider-scoped).
44
- */
45
- authStatus(provider: string, modelId?: string): Promise<AuthStatus>;
46
- /**
47
- * The definition's extension entry points, discovered once: what this catalog registers models from and what every
48
- * session of the assembly built over it loads. Empty without a directory.
49
- */
50
- extensionPaths(): Promise<readonly string[]>;
51
- }
52
- export interface AgentModelsOptions {
53
- /** Workspace for extension model registration; defaults to agentDir for standalone definitions. */
54
- cwd?: string;
55
- /** Where `extensions/` is listed from; Node's filesystem by default. */
56
- env?: ExecutionEnv;
57
- /** Extra providers registered on top of the built-ins (a same id replaces one). */
58
- providers?: readonly Provider[];
59
- /**
60
- * Layer the machine's models.json and model catalog under the agent's (default). Off for the registry a DEPLOYED
61
- * agent has, since neither ships.
62
- */
63
- machineLayer?: boolean;
64
- }
65
- /**
66
- * The model environment of the agent in `agentDir` (or, without one, of a caller with no directory: pi's built-ins
67
- * over the named or global credentials file). A supplied `credentialStore` is used as given; otherwise the files:
68
- * the directory's own layers ({@link resolveAuthLayers}), or the named file or the global one.
69
- */
70
- export declare function agentModels(agentDir: string | undefined, source?: {
71
- authPath?: string;
72
- credentialStore?: undefined;
73
- } & FastagentAuthOptions, options?: AgentModelsOptions): AgentModels & {
74
- auth: AuthLayers;
75
- };
76
- export declare function agentModels(agentDir: string | undefined, source?: CredentialSourceOptions & FastagentAuthOptions, options?: AgentModelsOptions): AgentModels;
77
- export interface CreatePiModelsOptions extends FastagentAuthOptions, CredentialSourceOptions {
78
- /** Extra providers registered on top of the built-ins (same id overrides a built-in). */
79
- providers?: Provider[];
80
- }
81
- /** A `Models` with every built-in pi provider, wired to fastagent's auth. */
82
- export declare function createPiModels(options?: CreatePiModelsOptions): Models;
83
- export {};
@@ -1,120 +0,0 @@
1
- import { ModelRuntime } from "@earendil-works/pi-coding-agent";
2
- import { definitionServices } from "./agent-session-factory.js";
3
- import { loadExtensionPaths } from "./definition.js";
4
- import { GLOBAL_AUTH_PATH, assertOneCredentialSource, fastagentCredentialStore, resolveAuthLayers, } from "./auth.js";
5
- import { createPiModelRuntime, environmentAuthSource, modelRuntimeFiles, piModelsOver, probeAuthSource, } from "./models.js";
6
- export function agentModels(agentDir, source = {}, options = {}) {
7
- assertOneCredentialSource(source);
8
- const { providers, machineLayer } = options;
9
- const files = source.credentialStore
10
- ? undefined
11
- : agentDir
12
- ? resolveAuthLayers(agentDir, source.authPath)
13
- : { path: source.authPath ?? GLOBAL_AUTH_PATH };
14
- // The model files, read once for every runtime this agent builds: a session's and the control plane's.
15
- let modelFiles;
16
- const readModelFiles = () => (modelFiles ??= modelRuntimeFiles({
17
- ...(agentDir ? { agentDir } : {}),
18
- ...(machineLayer !== undefined ? { machineLayer } : {}),
19
- }));
20
- const store = files
21
- ? agentCredentialStore(files, readModelFiles, { providers, warn: source.warn })
22
- : undefined;
23
- const credentials = source.credentialStore ?? store;
24
- const createRuntime = async () => createPiModelRuntime({
25
- credentials,
26
- files: await readModelFiles(),
27
- ...(agentDir ? { agentDir } : {}),
28
- ...(providers ? { providers } : {}),
29
- ...(machineLayer !== undefined ? { machineLayer } : {}),
30
- });
31
- const cwd = options.cwd ?? agentDir;
32
- let discovered;
33
- const extensionPaths = () => (discovered ??= agentDir
34
- ? loadExtensionPaths(agentDir, { ...(cwd ? { cwd } : {}), ...(options.env ? { env: options.env } : {}) })
35
- : Promise.resolve([]));
36
- let registry;
37
- const runtime = () => {
38
- registry ??= createRuntime().then(async (models) => {
39
- if (agentDir) {
40
- await definitionServices({
41
- cwd: cwd ?? agentDir,
42
- modelRuntime: models,
43
- definition: { skills: [] },
44
- extensionPaths: await extensionPaths(),
45
- });
46
- }
47
- return models;
48
- });
49
- return registry;
50
- };
51
- return {
52
- ...(files ? { auth: files } : {}),
53
- credentials,
54
- runtime,
55
- createRuntime,
56
- extensionPaths,
57
- async authStatus(provider, modelId) {
58
- const models = await runtime();
59
- const id = modelId ?? models.getProvider(provider)?.getModels()[0]?.id;
60
- let resolved = {};
61
- if (id !== undefined) {
62
- try {
63
- const found = await probeAuthSource(models, `${provider}/${id}`);
64
- if (found !== undefined)
65
- resolved = { source: found };
66
- }
67
- catch (error) {
68
- // The first line: pi folds the request's stack into the message of a failed refresh.
69
- resolved = { error: String(error.message).split("\n")[0] };
70
- }
71
- }
72
- // `read` never refreshes: this is the kind on file, whatever became of it.
73
- const stored = (await credentials.read(provider))?.type;
74
- const fromEnvironment = stored === undefined ? undefined : await environmentAuthSource(provider, process.env);
75
- const shadowed = resolved.source !== undefined && fromEnvironment !== resolved.source ? fromEnvironment : undefined;
76
- return {
77
- ...(store ? { path: await store.layerOf(provider) } : {}),
78
- ...resolved,
79
- ...(stored !== undefined ? { stored } : {}),
80
- ...(shadowed !== undefined ? { shadowed } : {}),
81
- };
82
- },
83
- };
84
- }
85
- /** A `Models` with every built-in pi provider, wired to fastagent's auth. */
86
- export function createPiModels(options = {}) {
87
- return piModelsOver(agentModels(undefined, options).credentials, options.providers);
88
- }
89
- /**
90
- * The credential store an agent reads through: its own file, then the user-global one for a provider the PROJECT
91
- * authenticates no other way (its own auth file, a models.json key, or the environment). "No other way" is answered
92
- * by pi's own resolution over a registry that has no global layer, built the first time a provider is looked up
93
- * there. A deployment never has the global file, so a global login that outranked, say, an `ANTHROPIC_API_KEY` in
94
- * `.secrets/.env` would run one credential here and a different one deployed.
95
- */
96
- function agentCredentialStore(auth, modelFiles, options) {
97
- const { warn, providers = [] } = options;
98
- const fallback = auth.fallback;
99
- if (fallback === undefined)
100
- return fastagentCredentialStore(auth.path, { warn });
101
- let project;
102
- const projectRuntime = () => {
103
- project ??= (async () => {
104
- const runtime = await ModelRuntime.create({
105
- credentials: fastagentCredentialStore(auth.path, { warn }),
106
- ...(await (await modelFiles()).create()),
107
- refreshOnCreate: false,
108
- });
109
- for (const provider of providers)
110
- runtime.registerNativeProvider(provider);
111
- return runtime;
112
- })();
113
- return project;
114
- };
115
- return fastagentCredentialStore(auth.path, {
116
- warn,
117
- fallbackPath: fallback,
118
- projectAuthenticates: async (providerId) => (await (await projectRuntime()).checkAuth(providerId)) !== undefined,
119
- });
120
- }
@@ -1,121 +0,0 @@
1
- import { type Machine } from "./machine.ts";
2
- import type { Skill, ThinkingLevel } from "@earendil-works/pi-agent-core";
3
- import { type AgentSession, type AgentSessionServices, type CompactionResult, type CreateAgentSessionServicesOptions, type ModelRuntime, type ResolvedCommand, SessionManager, createAgentSessionFromServices } from "@earendil-works/pi-coding-agent";
4
- import type { PiAgentSessionFactory } from "./invoke-session.ts";
5
- import type { PiSessionRecordStore } from "./session-store.ts";
6
- import type { MountedTool } from "./tool.ts";
7
- import { type AnyModel } from "./models.ts";
8
- import type { DefinitionPrompt } from "./definition.ts";
9
- /** What one binding reads from the definition: the prompt pieces, skills and prompt templates pi is handed. */
10
- export interface PiSessionDefinition {
11
- /** Replaces pi's default prompt when set (`SYSTEM.md`, L2's `base`, L1's `instructions`); absent → pi's default. */
12
- systemPrompt?: string;
13
- /** Added after the prompt, whichever it is (`APPEND_SYSTEM.md`). */
14
- appendSystemPrompt?: string;
15
- /** Project instructions (AGENTS.md); pi renders them as its project context. */
16
- contextFiles?: Array<{
17
- path: string;
18
- content: string;
19
- }>;
20
- /** FastAgent's own named prompt sections: pi renders them after its own, whoever wrote the rest. */
21
- sections?: Record<string, string>;
22
- skills: Skill[];
23
- /** The definition's own prompt templates; the machine's are added behind them. */
24
- prompts?: DefinitionPrompt[];
25
- }
26
- export interface PiAgentSessionFactoryOptions {
27
- /** Where conversations live. */
28
- sessions: PiSessionRecordStore;
29
- /** A fresh model runtime per binding: extension routers and provider registrations belong to this session. */
30
- engine: () => Promise<{
31
- modelRuntime: ModelRuntime;
32
- }>;
33
- /**
34
- * The default model, resolved after extensions register their models. Optional: a session that records a model
35
- * runs on it, and one that records none is refused with {@link MissingModel} when there is no default either.
36
- */
37
- modelSpec?: string;
38
- thinkingLevel?: ThinkingLevel;
39
- tools?: MountedTool[];
40
- /** Read once per binding; prompt and skills come from the same definition read. */
41
- readDefinition: () => PiSessionDefinition | Promise<PiSessionDefinition>;
42
- /** The agent's working directory — what fastagent-defined tools see as `cwd`. */
43
- cwd: string;
44
- /** The definition's own extension entry points, loaded fresh for every bound session. */
45
- extensionPaths?: string[];
46
- /** Built-ins omitted by an explicit lower-level tool list. */
47
- excludedToolNames?: readonly string[];
48
- }
49
- export interface BindPiSessionOptions {
50
- services: AgentSessionServices;
51
- sessionManager: SessionManager;
52
- /** Chat only: pi's runtime hands the resumed/new session its start event. */
53
- sessionStartEvent?: Parameters<typeof createAgentSessionFromServices>[0]["sessionStartEvent"];
54
- model: AnyModel;
55
- thinkingLevel: ThinkingLevel | undefined;
56
- tools: MountedTool[];
57
- /** The agent's working directory — what fastagent-defined tools see as `cwd`. */
58
- cwd: string;
59
- /** Built-ins omitted by an explicit lower-level tool list. */
60
- excludedToolNames?: readonly string[];
61
- /** The CALLER's session id — what a tool asking which conversation it is in hears. */
62
- sessionId?: string;
63
- }
64
- /**
65
- * Bind ONE pi session to a record: authored tools replace same-name built-ins; Pi owns exposure and discovery.
66
- */
67
- export declare function bindPiSession(options: BindPiSessionOptions): ReturnType<typeof createAgentSessionFromServices>;
68
- /** What pi is allowed to discover, minus the parts each assembly fills in itself. */
69
- type DefinitionLoaderOptions = NonNullable<CreateAgentSessionServicesOptions["resourceLoaderOptions"]>;
70
- /** The resource posture a fastagent definition asks pi for — ONE definition of it, for both assemblies. */
71
- export declare function definitionResourceLoaderOptions(source: {
72
- definition: PiSessionDefinition;
73
- /** {@link readMachine} for this workspace — resolved by the caller, because this function is synchronous. */
74
- machine: Machine;
75
- extensionPaths?: readonly string[];
76
- }): DefinitionLoaderOptions;
77
- /** Tell a waiting {@link startCompaction} that pi admitted the compaction on this record. */
78
- export declare function admitCompaction(record: SessionManager): void;
79
- /** What pi decided before its model call: go ahead, nothing to do, or a failure of its own (in `refused`). */
80
- export type CompactAdmission = "admitted" | "nothing_to_compact" | {
81
- refused: unknown;
82
- };
83
- /**
84
- * Start pi's manual compaction on a bound session. `onAdmitted` runs INSIDE pi's admission event, so everything it
85
- * publishes precedes anything pi does next (the model call, its retries). `admission` settles before the model call.
86
- * pi's own pre-admission failures come back as `refused` rather than a rejection: the caller answers them to its
87
- * Caller as a result. `done` is the compaction itself.
88
- */
89
- export declare function startCompaction(session: AgentSession, instructions: string | undefined, onAdmitted: () => void): {
90
- admission: Promise<CompactAdmission>;
91
- done: Promise<CompactionResult>;
92
- };
93
- /** A fresh loader and Pi's native model registration, over a session-local runtime. */
94
- export declare function definitionServices(options: {
95
- cwd: string;
96
- modelRuntime: ModelRuntime;
97
- definition: PiSessionDefinition;
98
- extensionPaths: readonly string[];
99
- }): Promise<AgentSessionServices>;
100
- /**
101
- * The `/name` commands a served session dispatches, named the way pi resolves them (a name two extensions share gets
102
- * a `:N` suffix). Loaded through the same {@link definitionServices} a turn binds, so the menu and the dispatch cannot
103
- * disagree. Loading runs the extensions' factories; no session opens, so `session_start` does not fire, and the
104
- * instances are never bound (any action they call throws).
105
- */
106
- export declare function servedExtensionCommands(options: {
107
- cwd: string;
108
- modelRuntime: ModelRuntime;
109
- extensionPaths: readonly string[];
110
- }): Promise<ResolvedCommand[]>;
111
- /**
112
- * Open-or-create the record, then bind a fresh session to it — on a fresh resource loader.
113
- *
114
- * ONE LOADER PER SESSION, because pi's extension runtime belongs to its loader: a loader shared across concurrent
115
- * turns would let one conversation's extension act on another's session. It also makes the definition live with no
116
- * bookkeeping: every bind reads the prompt and skills this invoke read. The machine's half is the process's one read
117
- * (machine.ts). Extension CODE is imported once per process, so an edit to `extensions/` needs a restart, which is
118
- * what `dev` does on one.
119
- */
120
- export declare function piAgentSessionFactory(options: PiAgentSessionFactoryOptions): PiAgentSessionFactory;
121
- export {};