@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,517 +0,0 @@
1
- /**
2
- * The AgentSession L0's engine binding: fastagent's assembled agent — model, prompt, skills, tools — bound to one
3
- * durable record, per invoke.
4
- */
5
- import { dirname } from "node:path";
6
- import { BUILTIN_EXTENSIONS, DISCOVERY, readMachine, withMachine, } from "./machine.js";
7
- import { ExtensionRunner, ModelRegistry, SessionManager, createAgentSessionServices, createCodemodeExtension, createToolSearchExtension, createAgentSessionFromServices, createBashToolDefinition, createEditToolDefinition, createFindToolDefinition, createGrepToolDefinition, createLsToolDefinition, createReadToolDefinition, createWriteToolDefinition, getAgentDir, initTheme, } from "@earendil-works/pi-coding-agent";
8
- import { log } from "../../log.js";
9
- import { getCurrentSystemMessage } from "@earendil-works/pi-ai";
10
- import { resolveModel } from "./config.js";
11
- import { MissingModel, activePath, resolveSessionSettings } from "./session-settings.js";
12
- import { DEFAULT_THINKING_LEVEL, withModelRegistration } from "./models.js";
13
- import { registerAccountModels } from "./openai-account-models.js";
14
- import { asksToEndRun, markEndsRun } from "./turn-kit.js";
15
- import { agentSessionManager, sessionToolActivation, turnContext } from "./tool-context.js";
16
- /**
17
- * What pi's own coding tools say about themselves in its default prompt. The coding tools fastagent mounts are pi's
18
- * `AgentTool`s, which carry neither field, and they replace pi's definitions of the same name, so without this pi's
19
- * tool list would lose them and its rules would lose their guidelines.
20
- */
21
- const PI_TOOL_PROMPTS = new Map([
22
- createReadToolDefinition,
23
- createBashToolDefinition,
24
- createEditToolDefinition,
25
- createWriteToolDefinition,
26
- createGrepToolDefinition,
27
- createFindToolDefinition,
28
- createLsToolDefinition,
29
- ].map((create) => {
30
- const definition = create(".");
31
- return [
32
- definition.name,
33
- { promptSnippet: definition.promptSnippet, promptGuidelines: definition.promptGuidelines },
34
- ];
35
- }));
36
- /**
37
- * The line pi's default prompt lists a tool by. pi lists only tools that have one; an authored tool's is the first
38
- * line of its description, so `defineTool` needs no field of its own.
39
- */
40
- function promptFields(tool) {
41
- const own = tool;
42
- const pi = PI_TOOL_PROMPTS.get(tool.name);
43
- const promptSnippet = own.promptSnippet ?? pi?.promptSnippet ?? tool.description?.split("\n")[0]?.trim();
44
- const promptGuidelines = own.promptGuidelines ?? pi?.promptGuidelines;
45
- return {
46
- ...(promptSnippet ? { promptSnippet } : {}),
47
- ...(promptGuidelines ? { promptGuidelines } : {}),
48
- };
49
- }
50
- /** fastagent's tools as pi tool definitions, bound to ONE session. */
51
- function toolDefinitions(tools, bound, sessionId) {
52
- return tools.map((tool) => ({
53
- ...tool,
54
- ...promptFields(tool),
55
- label: tool.label || tool.name,
56
- execute: (id, params, signal, onUpdate, ctx) => {
57
- const binding = bound.current;
58
- if (!binding)
59
- throw new Error("tool executed before its turn context was bound (lifecycle invariant broken)");
60
- const { session, context } = binding;
61
- // Expose the caller's id rather than Pi's filename encoding.
62
- const sessionManager = Object.create(ctx.sessionManager, {
63
- getSessionId: { value: () => sessionId },
64
- getHeader: {
65
- value: () => {
66
- const header = ctx.sessionManager.getHeader();
67
- return header ? { ...header, id: sessionId } : header;
68
- },
69
- },
70
- });
71
- // Pi's thinking getter uses a shared runtime; a restored cwd may be a symlink spelling.
72
- const scoped = Object.create(ctx, {
73
- sessionManager: { value: sessionManager },
74
- cwd: { value: context.cwd },
75
- thinkingLevel: { get: () => session.thinkingLevel },
76
- });
77
- return turnContext.run(context, () => tool.execute(id, params, signal, onUpdate, scoped));
78
- },
79
- }));
80
- }
81
- /** The {@link DISCOVERY} tools the mounted tools' exposures need. A disabled extension's name is ignored by Pi. */
82
- function discoveryToolNames(tools) {
83
- const names = new Set();
84
- for (const tool of tools) {
85
- if (tool.exposure === "codemode" || tool.exposure === "deferred")
86
- names.add(DISCOVERY[tool.exposure].tool);
87
- }
88
- return [...names];
89
- }
90
- /**
91
- * Bind ONE pi session to a record: authored tools replace same-name built-ins; Pi owns exposure and discovery.
92
- */
93
- export async function bindPiSession(options) {
94
- const { services, sessionManager, model, thinkingLevel, tools, cwd } = options;
95
- const excludedToolNames = options.excludedToolNames ?? [];
96
- const history = sessionManager.buildSessionContext().messages;
97
- const bound = {};
98
- const sessionId = options.sessionId ?? sessionManager.getSessionId();
99
- const result = await createAgentSessionFromServices({
100
- services,
101
- sessionManager,
102
- ...(options.sessionStartEvent ? { sessionStartEvent: options.sessionStartEvent } : {}),
103
- model,
104
- thinkingLevel,
105
- ...(excludedToolNames.length > 0 ? { excludeTools: [...excludedToolNames] } : {}),
106
- customTools: toolDefinitions(tools, bound, sessionId),
107
- });
108
- const { session } = result;
109
- // One context for the whole session: it describes the SESSION, not the call.
110
- bound.current = {
111
- session,
112
- context: {
113
- cwd,
114
- sessionManager: agentSessionManager(session, sessionId),
115
- tools: sessionToolActivation(session),
116
- },
117
- };
118
- // The SDK always supplies an initial loadout (settings' defaultTools applied), bypassing AgentSession's native
119
- // transcript restore. The loadout is the definition's defaults as they are NOW, plus whatever the transcript still
120
- // declares and is still mounted (a discovery). Removals in the transcript are not honored: fastagent's own activation
121
- // only adds, so a removal records a turn on which the definition did not mount the tool, not the conversation's
122
- // choice, and honoring it would keep a tool out of a long-lived chat after a release that briefly lacked it.
123
- // Replayed through Pi's public APIs, for serving and chat alike.
124
- const defaults = [...session.getActiveToolNames(), ...discoveryToolNames(tools)];
125
- const current = getCurrentSystemMessage(history);
126
- const mounted = new Set(session.getAllTools().map((tool) => tool.name));
127
- const declared = (current?.toolsAdded ?? []).map((tool) => tool.name);
128
- const dropped = declared.filter((name) => !mounted.has(name));
129
- // Debug, not warn: `session_start` handlers register their tools after this point, and Pi activates the
130
- // default-active ones when they do (`_refreshToolRegistry`), so an absence here is routine on every such bind.
131
- if (dropped.length)
132
- log.debug(`[fastagent] session ${sessionId}: not mounted yet or removed: ${dropped.join(", ")}`);
133
- session.setActiveToolsByName([...defaults, ...declared.filter((name) => mounted.has(name))]);
134
- return result;
135
- }
136
- let themeReady = false;
137
- /** Each distinct load diagnostic is said once per process: serving loads the extensions again for every session. */
138
- const reportedExtensionDiagnostics = new Set();
139
- /**
140
- * Extension notifications said once per process at their own level, then at debug: every served turn starts the
141
- * extensions again, so a notification from `session_start` would otherwise log the same line on every message.
142
- */
143
- const reportedNotifications = new Set();
144
- // ponytail: cleared wholesale at this size, so a notification with a counter or id in it cannot grow the set for the
145
- // life of a `start` process; the price is one repeat at warn level after each clear. An LRU if that ever matters.
146
- const MAX_REPORTED_NOTIFICATIONS = 1000;
147
- /**
148
- * Announce extensions pi failed to load, and what it warned about while loading the rest: among them a definition
149
- * extension that registers `codemode` or `tool_search`, which keeps pi's built-in of that name from loading. pi
150
- * collects both into `LoadExtensionsResult` and carries on; only its own TUI shows them.
151
- */
152
- function reportExtensionDiagnostics(services) {
153
- for (const diagnostic of services.diagnostics) {
154
- if (diagnostic.type === "error")
155
- throw new Error(diagnostic.message);
156
- }
157
- const { errors, warnings = [] } = services.resourceLoader.getExtensions();
158
- const said = [
159
- ...errors.map(({ path, error }) => `extension ${path} failed to load: ${error}`),
160
- ...warnings.map(({ path, warning }) => `extension ${path}: ${warning}`),
161
- ];
162
- for (const line of said) {
163
- if (reportedExtensionDiagnostics.has(line))
164
- continue;
165
- reportedExtensionDiagnostics.add(line);
166
- log.warn(`[fastagent] ${line}`);
167
- }
168
- }
169
- /**
170
- * What a command's `ctx` can do to the session when serving. Each turn binds its own session and disposes it, so
171
- * there is no current session to replace, fork or reload; pi's unbound default would report `{ cancelled: false }`
172
- * for all of them without doing anything.
173
- */
174
- function servingCommandActions(session) {
175
- const unavailable = (action) => async () => {
176
- throw new Error(`ctx.${action}() is not available when serving: every turn runs on its own session`);
177
- };
178
- return {
179
- waitForIdle: () => session.waitForIdle(),
180
- newSession: unavailable("newSession"),
181
- fork: unavailable("fork"),
182
- navigateTree: unavailable("navigateTree"),
183
- switchSession: unavailable("switchSession"),
184
- reload: unavailable("reload"),
185
- };
186
- }
187
- const nativeFactories = {
188
- codemode: createCodemodeExtension(),
189
- "tool-search": createToolSearchExtension(),
190
- };
191
- const nativeExtensions = BUILTIN_EXTENSIONS.map((name) => ({
192
- name,
193
- factory: nativeFactories[name],
194
- replaceable: true,
195
- builtin: true,
196
- }));
197
- /**
198
- * FastAgent's own prompt sections, added on `before_agent_start`: pi renders custom sections after its own, so they
199
- * survive a `SYSTEM.md` that replaced pi's default, and they stay out of the slot `APPEND_SYSTEM.md` fills.
200
- */
201
- function fastagentSections(sections) {
202
- return {
203
- name: "fastagent-sections",
204
- hidden: true,
205
- factory: (pi) => {
206
- pi.on("before_agent_start", (event) => {
207
- Object.assign(event.systemPromptOptions.sections, sections);
208
- });
209
- },
210
- };
211
- }
212
- /** The resource posture a fastagent definition asks pi for — ONE definition of it, for both assemblies. */
213
- export function definitionResourceLoaderOptions(source) {
214
- const { definition } = source;
215
- return {
216
- extensionFactories: [
217
- ...nativeExtensions,
218
- compactAdmission,
219
- recordEndsRun,
220
- ...(definition.sections && Object.keys(definition.sections).length > 0
221
- ? [fastagentSections(definition.sections)]
222
- : []),
223
- ],
224
- // The machine's extensions are its owner's setup, not this agent's.
225
- noExtensions: true,
226
- // Explicit paths survive noExtensions, including Pi's built-ins; so they would also survive the machine's own
227
- // `-builtin:<name>`, which is why only the enabled ones are named. Machine extensions stay out.
228
- additionalExtensionPaths: [
229
- ...source.machine.builtinExtensions.map((name) => `builtin:${name}`),
230
- ...(source.extensionPaths ?? []),
231
- ],
232
- // Not pi's discovery: the definition read them (definition.ts), and pi renders what it is handed.
233
- noContextFiles: true,
234
- agentsFilesOverride: () => ({ agentsFiles: definition.contextFiles ?? [] }),
235
- // The IDENTITY is the definition's, whatever the machine thinks: pi's `base` here is the machine's SYSTEM.md, and
236
- // it is never used. Inheriting skills is inheriting capability; inheriting a system prompt would be the agent
237
- // becoming someone else's agent. Undefined leaves pi to build its default.
238
- systemPromptOverride: () => definition.systemPrompt,
239
- appendSystemPromptOverride: () => (definition.appendSystemPrompt ? [definition.appendSystemPrompt] : []),
240
- /**
241
- * THE DEFINITION'S SKILLS, PLUS THE MACHINE'S — an agent inherits the box it runs on (machine.ts), and the
242
- * definition wins a name collision.
243
- *
244
- * NO DISCOVERY OF ITS OWN: the machine's half is the process's single read, so a bound session and `commands()`
245
- * describe the same box. A loader discovering for itself is what made the menu live while a session was not.
246
- */
247
- noSkills: true,
248
- skillsOverride: () => ({
249
- skills: withMachine(toPiSkills(definition.skills), source.machine.skills),
250
- diagnostics: [],
251
- }),
252
- noPromptTemplates: true,
253
- promptsOverride: () => ({
254
- prompts: withMachine(toPiPrompts(definition.prompts ?? []), source.machine.prompts),
255
- diagnostics: [],
256
- }),
257
- };
258
- }
259
- /**
260
- * Records on a tool result that it asked to end its run ({@link asksToEndRun}), so `entries()` can tell a run that
261
- * ended on its tool batch from one cut after its tools. Through pi's `message_end` replacement, which runs before pi
262
- * appends the message to the record. LAST among the extensions (pi appends inline factories after path ones), so a
263
- * definition's own `message_end` replacement cannot drop the flag. One instance per loader, so per session.
264
- */
265
- const recordEndsRun = {
266
- name: "fastagent-record-ends-run",
267
- hidden: true,
268
- factory: (pi) => {
269
- const asked = new Set();
270
- pi.on("tool_execution_end", (event) => {
271
- if (asksToEndRun(event))
272
- asked.add(event.toolCallId);
273
- });
274
- pi.on("message_end", (event) => {
275
- const message = event.message;
276
- if (message.role !== "toolResult" || !asked.delete(message.toolCallId))
277
- return;
278
- return { message: markEndsRun(message) };
279
- });
280
- },
281
- };
282
- /** Manual compactions waiting for pi's admission, keyed by the session's record (what an extension's `ctx` names). */
283
- const compactAdmissions = new WeakMap();
284
- const COMPACT_ADMISSION = "fastagent-compact-admission";
285
- /**
286
- * pi's own admission signal for a manual compaction: `session_before_compact` fires only once `prepareCompaction`
287
- * found work, and before the model call. It must be the FIRST listener ({@link admissionFirst}): pi awaits each
288
- * handler in turn, and a definition's own handler (a custom summarizer, a cancel) runs after admission, like the
289
- * model call it may replace.
290
- */
291
- const compactAdmission = {
292
- name: COMPACT_ADMISSION,
293
- hidden: true,
294
- factory: (pi) => {
295
- pi.on("session_before_compact", (event, ctx) => {
296
- if (event.reason === "manual")
297
- admitCompaction(ctx.sessionManager);
298
- });
299
- },
300
- };
301
- /**
302
- * pi loads path extensions first and appends inline factories after them, so {@link compactAdmission} arrives last.
303
- * Moved to the front here, since pi dispatches handlers in extension order.
304
- */
305
- function admissionFirst(base) {
306
- const path = `<inline:${COMPACT_ADMISSION}>`;
307
- const admission = base.extensions.filter((extension) => extension.path === path);
308
- return { ...base, extensions: [...admission, ...base.extensions.filter((extension) => extension.path !== path)] };
309
- }
310
- /** Tell a waiting {@link startCompaction} that pi admitted the compaction on this record. */
311
- export function admitCompaction(record) {
312
- compactAdmissions.get(record)?.();
313
- }
314
- /**
315
- * pi's refusals when `prepareCompaction` finds nothing. They are plain Errors, so their text is the only way to tell
316
- * them from any other error pi raises before admission. If pi rewords them, the refusal still fails visibly, as
317
- * `boundary_command_failed` instead of `nothing_to_compact`, and the admission tests in session-control.test.ts,
318
- * which run pi's real refusal, fail with it.
319
- */
320
- const NOTHING_TO_COMPACT = /^(Nothing to compact|Already compacted)\b/;
321
- /**
322
- * Start pi's manual compaction on a bound session. `onAdmitted` runs INSIDE pi's admission event, so everything it
323
- * publishes precedes anything pi does next (the model call, its retries). `admission` settles before the model call.
324
- * pi's own pre-admission failures come back as `refused` rather than a rejection: the caller answers them to its
325
- * Caller as a result. `done` is the compaction itself.
326
- */
327
- export function startCompaction(session, instructions, onAdmitted) {
328
- const record = session.sessionManager;
329
- const admitted = new Promise((resolve) => {
330
- compactAdmissions.set(record, () => {
331
- try {
332
- onAdmitted();
333
- }
334
- finally {
335
- resolve("admitted");
336
- }
337
- });
338
- });
339
- const done = session.compact(instructions);
340
- const forget = () => void compactAdmissions.delete(record);
341
- done.then(forget, forget);
342
- const settledFirst = done.then(() => {
343
- throw new Error("pi finished a compaction without announcing its admission (session_before_compact)");
344
- }, (error) => error instanceof Error && NOTHING_TO_COMPACT.test(error.message) ? "nothing_to_compact" : { refused: error });
345
- return { admission: Promise.race([admitted, settledFirst]), done };
346
- }
347
- /** A fresh loader and Pi's native model registration, over a session-local runtime. */
348
- export async function definitionServices(options) {
349
- const { cwd, modelRuntime, definition, extensionPaths } = options;
350
- const machine = await readMachine(cwd);
351
- const services = await withModelRegistration(modelRuntime, () => createAgentSessionServices({
352
- cwd,
353
- agentDir: getAgentDir(),
354
- modelRuntime,
355
- settingsManager: machine.settingsManager(),
356
- resourceLoaderOptions: {
357
- ...definitionResourceLoaderOptions({
358
- definition,
359
- machine,
360
- extensionPaths,
361
- }),
362
- extensionsOverride: admissionFirst,
363
- },
364
- }).then((services) => {
365
- // AFTER the extensions: one that re-registers `openai` replaced the account-catalog wrapper.
366
- registerAccountModels(modelRuntime);
367
- return services;
368
- }));
369
- reportExtensionDiagnostics(services);
370
- return services;
371
- }
372
- /**
373
- * The `/name` commands a served session dispatches, named the way pi resolves them (a name two extensions share gets
374
- * a `:N` suffix). Loaded through the same {@link definitionServices} a turn binds, so the menu and the dispatch cannot
375
- * disagree. Loading runs the extensions' factories; no session opens, so `session_start` does not fire, and the
376
- * instances are never bound (any action they call throws).
377
- */
378
- export async function servedExtensionCommands(options) {
379
- const services = await definitionServices({ ...options, definition: { skills: [] } });
380
- const { extensions, runtime } = services.resourceLoader.getExtensions();
381
- const runner = new ExtensionRunner(extensions, runtime, options.cwd, SessionManager.inMemory(options.cwd), new ModelRegistry(options.modelRuntime));
382
- return runner.getRegisteredCommands();
383
- }
384
- /**
385
- * Open-or-create the record, then bind a fresh session to it — on a fresh resource loader.
386
- *
387
- * ONE LOADER PER SESSION, because pi's extension runtime belongs to its loader: a loader shared across concurrent
388
- * turns would let one conversation's extension act on another's session. It also makes the definition live with no
389
- * bookkeeping: every bind reads the prompt and skills this invoke read. The machine's half is the process's one read
390
- * (machine.ts). Extension CODE is imported once per process, so an edit to `extensions/` needs a restart, which is
391
- * what `dev` does on one.
392
- */
393
- export function piAgentSessionFactory(options) {
394
- const { sessions, thinkingLevel, cwd } = options;
395
- const extensionPaths = options.extensionPaths ?? [];
396
- const excludedToolNames = options.excludedToolNames ?? [];
397
- const tools = options.tools ?? [];
398
- return async (sessionId, inherit) => {
399
- // `ctx.ui.theme` reads pi's global theme, which only pi's own entry points initialize. Serving only: chat's theme
400
- // is InteractiveMode's, and resetting it on every session switch would drop the user's.
401
- if (!themeReady) {
402
- initTheme();
403
- themeReady = true;
404
- }
405
- // Without a default, a turn that cannot run must leave no conversation behind in the listing. A new record with
406
- // nothing to inherit records no model, so it is refused before it is created. One that inherits may get a model
407
- // from its parent, which only the copy decides (the store's cut), so it is created and, if still model-less,
408
- // removed below. The caller holds this session's lease, so nothing else creates the record in between.
409
- const existed = options.modelSpec ? true : (await sessions.openIfExists(sessionId)) !== undefined;
410
- if (!existed && !inherit)
411
- throw new MissingModel(sessionId, []);
412
- // Publish the record before loading resources: boundary writes must find it while binding is in flight.
413
- const sessionManager = await sessions.openOrCreate(sessionId, inherit);
414
- const definition = await options.readDefinition();
415
- const { modelRuntime } = await options.engine();
416
- const services = await definitionServices({ cwd, modelRuntime, definition, extensionPaths });
417
- const model = options.modelSpec ? resolveModel(modelRuntime, options.modelSpec) : undefined;
418
- // What the session RUNS on: the boundary plane records model/thinking overrides as entries, and pi does not read
419
- // them back.
420
- const path = activePath(sessionManager);
421
- const settings = resolveSessionSettings(path, modelRuntime, {
422
- ...(model ? { model } : {}),
423
- thinkingLevel: thinkingLevel ?? DEFAULT_THINKING_LEVEL,
424
- });
425
- if (!settings) {
426
- const missing = new MissingModel(sessionId, path);
427
- if (!existed) {
428
- // The record this bind created for a thread whose parent supplied no model. A failed removal is reported on
429
- // its own and does not replace `missing`: the caller still needs the missing_model answer and its fix.
430
- await sessions.delete(sessionId).catch((error) => {
431
- log.warn(`[fastagent] session ${sessionId}: could not remove the record of a refused turn: ${String(error)}`);
432
- });
433
- }
434
- throw missing;
435
- }
436
- const { session } = await bindPiSession({
437
- services,
438
- sessionManager,
439
- model: settings.model,
440
- thinkingLevel: settings.thinkingLevel,
441
- tools,
442
- cwd,
443
- excludedToolNames,
444
- sessionId,
445
- });
446
- // Pi's headless UI drops notifications. Keep dialogs cancelled and hasUI false, but surface diagnostics.
447
- const runner = session.extensionRunner;
448
- if (runner) {
449
- const createContext = runner.createContext.bind(runner);
450
- runner.createContext = () => {
451
- const context = createContext();
452
- // Pi clones own descriptors for before_agent_start; inherited fields would disappear there.
453
- return Object.defineProperty(context, "ui", {
454
- value: {
455
- ...context.ui,
456
- notify: (message, type) => {
457
- const key = `${type ?? "info"}\u0000${message}`;
458
- const repeat = reportedNotifications.has(key);
459
- if (reportedNotifications.size >= MAX_REPORTED_NOTIFICATIONS)
460
- reportedNotifications.clear();
461
- reportedNotifications.add(key);
462
- const emit = repeat ? log.debug : type === "info" ? log.info : log.warn;
463
- emit(`[fastagent] session ${sessionId}: ${message}`);
464
- },
465
- },
466
- });
467
- };
468
- }
469
- // `onError` is THE ONLY LISTENER for a fault pi reports nowhere else: `/skill:<name>` is expanded by reading
470
- // `filePath` at prompt time, and when that read fails pi raises `skill_expansion` on the extension error channel
471
- // and sends the line to the model unexpanded. The list can outlive the file: it is refreshed per invoke, so a
472
- // steer or follow-up inside a run, or a definition replaced under a running container (`src/deploy/workspace.ts`),
473
- // reaches exactly that state. The same channel carries every extension handler's failure.
474
- //
475
- // No `uiContext`: a served turn has no human at a terminal, and pi's default is what extensions are written to
476
- // detect (`ctx.hasUI === false`; dialogs resolve as cancelled). This call fires `session_start`.
477
- await session.bindExtensions({
478
- onError: ({ extensionPath, event, error }) => log.warn(`[fastagent] session ${sessionId}: ${event} failed for ${extensionPath}: ${error}`),
479
- commandContextActions: servingCommandActions(session),
480
- shutdownHandler: () => log.warn(`[fastagent] session ${sessionId}: an extension called ctx.shutdown(); a served process is stopped by its host, not by a turn`),
481
- });
482
- return session;
483
- };
484
- }
485
- /** The definition's prompt templates as pi's. */
486
- function toPiPrompts(prompts) {
487
- return prompts.map((prompt) => {
488
- const baseDir = dirname(prompt.filePath);
489
- return {
490
- name: prompt.name,
491
- description: prompt.description ?? "",
492
- content: prompt.content,
493
- filePath: prompt.filePath,
494
- sourceInfo: { path: prompt.filePath, source: "fastagent", scope: "project", origin: "top-level", baseDir },
495
- };
496
- });
497
- }
498
- /** fastagent's Skill (content inline) as pi's (read from filePath at invocation time). */
499
- function toPiSkills(skills) {
500
- return skills.map((skill) => {
501
- const baseDir = dirname(skill.filePath);
502
- return {
503
- name: skill.name,
504
- description: skill.description,
505
- filePath: skill.filePath,
506
- baseDir,
507
- sourceInfo: {
508
- path: skill.filePath,
509
- source: "fastagent",
510
- scope: "project",
511
- origin: "top-level",
512
- baseDir,
513
- },
514
- disableModelInvocation: skill.disableModelInvocation ?? false,
515
- };
516
- });
517
- }
@@ -1,3 +0,0 @@
1
- import { type BuildSessionRuntimeOptions } from "./session-builder.ts";
2
- /** Open the workspace's agent in pi's interactive TUI and run until the user exits. */
3
- export declare function runPiChat(dir: string, options?: BuildSessionRuntimeOptions): Promise<void>;
@@ -1,8 +0,0 @@
1
- /** Chat: open a workspace into pi's interactive TUI (`fastagent chat`). */
2
- import { InteractiveMode } from "@earendil-works/pi-coding-agent";
3
- import { buildAgentSessionRuntime } from "./session-builder.js";
4
- /** Open the workspace's agent in pi's interactive TUI and run until the user exits. */
5
- export async function runPiChat(dir, options = {}) {
6
- const runtime = await buildAgentSessionRuntime(dir, options);
7
- await new InteractiveMode(runtime, {}).run();
8
- }
@@ -1,71 +0,0 @@
1
- import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
- import type { FastagentTool } from "./tool.ts";
3
- import type { Models } from "@earendil-works/pi-ai";
4
- import type { AnyModel } from "./models.ts";
5
- import type { HttpSurface } from "../../service.ts";
6
- export interface FastagentConfig {
7
- /** "provider/modelId". */
8
- model?: string;
9
- /** Reasoning effort for the model, pi's scale ("off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max"). */
10
- thinkingLevel?: ThinkingLevel;
11
- /** Extra custom tools, appended after the pi coding tools — never replaces them. */
12
- tools?: FastagentTool[];
13
- /** What the serve publishes on its port, and to which browsers (each key is documented on {@link HttpSurface}). */
14
- http?: HttpSurface & {
15
- /** Default port for `dev` / `start` (`DEFAULT_HTTP_PORT` when unset). */
16
- port?: number;
17
- };
18
- /**
19
- * Serve the session control plane over HTTP (`/control/*`: state/entries/events + dispatch — steer/abort/compact +
20
- * session properties and lifecycle) for remote consumers.
21
- */
22
- sessionControl?: boolean;
23
- /**
24
- * Deploy-time declarations for what the agent needs on the box, so real agents don't hand-write a Dockerfile /
25
- * hand-set variables.
26
- */
27
- deploy?: {
28
- /** Extra apt packages baked into the generated image (Debian default repos: git, ripgrep, jq…). */
29
- apt?: string[];
30
- /** `deploy agentcore` only. */
31
- agentcore?: {
32
- /**
33
- * How long an idle AgentCore session keeps its microVM, 60–1209600 seconds (default 180). Memory bills for the
34
- * whole idle tail, and a session past it cold-starts — the workload picks the trade: a chat agent talked to in
35
- * bursts wants a longer tail, a schedule-only agent a shorter one.
36
- */
37
- idleTimeoutSeconds?: number;
38
- };
39
- };
40
- }
41
- /** Identity function for typing and IDE completion (vite/next-style). */
42
- export declare function defineConfig(config: FastagentConfig): FastagentConfig;
43
- export interface LoadedConfig {
44
- config: FastagentConfig;
45
- /** Config file path; undefined when the loader was pointed at a directory holding none. */
46
- path?: string;
47
- }
48
- export declare function isValidPort(n: number): boolean;
49
- /** Load `<dir>/fastagent.config.ts`. */
50
- export declare function loadConfig(dir: string): Promise<LoadedConfig>;
51
- /** The provider prefix of a "provider/modelId" spec. */
52
- export declare function providerOf(spec: string): string;
53
- /** Resolve "provider/modelId" → a pi Model from `models`, so auth resolves from the same collection. */
54
- export declare function resolveModel(models: Models, spec: string): AnyModel;
55
- /** All registered "provider/modelId" specs in `models`, sorted — the list behind `fastagent models`. */
56
- export declare function listModels(models: Models): string[];
57
- /** Rewrite the `model` in a config file's SOURCE TEXT to `spec`, for the first-run picker's write-back. */
58
- export declare function rewriteConfigModel(src: string, spec: string): string | null;
59
- /**
60
- * Model selection precedence: CLI flag > FASTAGENT_MODEL env > config default. An EMPTY `FASTAGENT_MODEL` is
61
- * "unset", not "no model": `export FASTAGENT_MODEL=` in a shell or CI job, and an `environment:`/`env` entry that
62
- * interpolates a missing variable, both arrive as `""` — and a set-but-empty value that shadowed `config.model`
63
- * would refuse to start an agent whose config names a model.
64
- */
65
- export declare function resolveModelSpec(flag: string | undefined, config: FastagentConfig, env?: NodeJS.ProcessEnv): string | undefined;
66
- /**
67
- * The refusal of a process that runs the agent here (the CLI's dev/start/invoke/routine run, and chat) when no
68
- * default model resolves. The agent itself opens without one; such a process would fail every new conversation, so it
69
- * stops at startup instead.
70
- */
71
- export declare function missingDefaultModel(): Error;