@fastagent-sh/fastagent 0.21.0 → 0.22.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 (388) hide show
  1. package/README.md +9 -12
  2. package/dist/agent.d.ts +24 -37
  3. package/dist/agent.js +7 -15
  4. package/dist/atomic-write.d.ts +13 -17
  5. package/dist/atomic-write.js +18 -29
  6. package/dist/bind.d.ts +12 -22
  7. package/dist/bind.js +18 -27
  8. package/dist/channel.d.ts +11 -33
  9. package/dist/channels/agentcore-limits.d.ts +2 -13
  10. package/dist/channels/agentcore-limits.js +2 -13
  11. package/dist/channels/agentcore-protocol.d.ts +67 -58
  12. package/dist/channels/agentcore-protocol.js +23 -15
  13. package/dist/channels/agentcore-service.d.ts +19 -33
  14. package/dist/channels/agentcore-service.js +176 -59
  15. package/dist/channels/agentcore.d.ts +39 -33
  16. package/dist/channels/agentcore.js +90 -224
  17. package/dist/channels/body.d.ts +15 -2
  18. package/dist/channels/body.js +24 -2
  19. package/dist/channels/busy.d.ts +1 -21
  20. package/dist/channels/busy.js +2 -39
  21. package/dist/channels/control.d.ts +17 -62
  22. package/dist/channels/control.js +74 -182
  23. package/dist/channels/define-channel.d.ts +39 -0
  24. package/dist/channels/define-channel.js +9 -0
  25. package/dist/channels/discover.d.ts +10 -31
  26. package/dist/channels/discover.js +37 -31
  27. package/dist/channels/feishu/bootstrap-token.d.ts +1 -8
  28. package/dist/channels/feishu/bootstrap-token.js +7 -23
  29. package/dist/channels/feishu/card.d.ts +14 -28
  30. package/dist/channels/feishu/card.js +16 -30
  31. package/dist/channels/feishu/cloud.d.ts +1 -5
  32. package/dist/channels/feishu/context-buffer.d.ts +4 -23
  33. package/dist/channels/feishu/context-buffer.js +8 -31
  34. package/dist/channels/feishu/crypto.d.ts +10 -5
  35. package/dist/channels/feishu/crypto.js +12 -19
  36. package/dist/channels/feishu/feishu-api.d.ts +2 -1
  37. package/dist/channels/feishu/feishu-api.js +5 -4
  38. package/dist/channels/feishu/feishu.d.ts +4 -10
  39. package/dist/channels/feishu/feishu.js +113 -227
  40. package/dist/channels/feishu/invoke-turn.d.ts +5 -4
  41. package/dist/channels/feishu/invoke-turn.js +36 -54
  42. package/dist/channels/feishu/model.d.ts +4 -21
  43. package/dist/channels/feishu/model.js +1 -8
  44. package/dist/channels/feishu/normalize.d.ts +2 -10
  45. package/dist/channels/feishu/normalize.js +7 -42
  46. package/dist/channels/feishu/parse.d.ts +9 -29
  47. package/dist/channels/feishu/parse.js +8 -26
  48. package/dist/channels/feishu/preview.d.ts +12 -14
  49. package/dist/channels/feishu/preview.js +108 -207
  50. package/dist/channels/feishu/register-app.d.ts +8 -23
  51. package/dist/channels/feishu/register-app.js +7 -20
  52. package/dist/channels/feishu/register-webhook.d.ts +2 -9
  53. package/dist/channels/feishu/register-webhook.js +9 -33
  54. package/dist/channels/feishu/scaffold/channel.ts +27 -19
  55. package/dist/channels/feishu/scaffold/channel.websocket.ts +31 -0
  56. package/dist/channels/feishu/setup-mode.d.ts +11 -36
  57. package/dist/channels/feishu/setup-mode.js +7 -26
  58. package/dist/channels/feishu/ws-ingress.d.ts +1 -2
  59. package/dist/channels/feishu/ws-ingress.js +6 -8
  60. package/dist/channels/http.d.ts +15 -15
  61. package/dist/channels/http.js +19 -9
  62. package/dist/channels/kit/attachment-path.d.ts +4 -5
  63. package/dist/channels/kit/attachment-path.js +10 -34
  64. package/dist/channels/kit/context-buffer.d.ts +14 -21
  65. package/dist/channels/kit/context-buffer.js +25 -38
  66. package/dist/channels/kit/delivery.d.ts +35 -0
  67. package/dist/channels/kit/delivery.js +129 -0
  68. package/dist/channels/kit/event-stream.d.ts +5 -0
  69. package/dist/channels/kit/event-stream.js +29 -0
  70. package/dist/channels/kit/invoke-turn-kit.d.ts +53 -26
  71. package/dist/channels/kit/invoke-turn-kit.js +89 -32
  72. package/dist/channels/kit/preview-kit.d.ts +18 -72
  73. package/dist/channels/kit/preview-kit.js +22 -88
  74. package/dist/channels/kit/signature.d.ts +3 -9
  75. package/dist/channels/kit/signature.js +3 -9
  76. package/dist/channels/kit/state.d.ts +1 -2
  77. package/dist/channels/kit/state.js +5 -14
  78. package/dist/channels/kit/stop-command.d.ts +1 -2
  79. package/dist/channels/kit/stop-command.js +6 -9
  80. package/dist/channels/kit/tasks.d.ts +1 -1
  81. package/dist/channels/kit/tasks.js +8 -21
  82. package/dist/channels/kit/text.d.ts +2 -16
  83. package/dist/channels/kit/text.js +23 -31
  84. package/dist/channels/kit/thread-participants.d.ts +4 -17
  85. package/dist/channels/kit/thread-participants.js +8 -55
  86. package/dist/channels/kit/transport.d.ts +26 -0
  87. package/dist/channels/kit/transport.js +20 -0
  88. package/dist/channels/kit/turn-queue.d.ts +7 -11
  89. package/dist/channels/kit/turn-queue.js +21 -39
  90. package/dist/channels/kit/turn-runner.d.ts +32 -18
  91. package/dist/channels/kit/turn-runner.js +98 -53
  92. package/dist/channels/kit/turn-store.d.ts +32 -32
  93. package/dist/channels/kit/turn-store.js +45 -88
  94. package/dist/channels/lark/lark.d.ts +1 -5
  95. package/dist/channels/lark/onboard.d.ts +3 -12
  96. package/dist/channels/lark/onboard.js +3 -13
  97. package/dist/channels/lark/scaffold/channel.ts +27 -19
  98. package/dist/channels/lark/scaffold/channel.websocket.ts +31 -0
  99. package/dist/channels/registration.d.ts +9 -35
  100. package/dist/channels/registration.js +6 -37
  101. package/dist/channels/secret.js +2 -5
  102. package/dist/channels/serve.d.ts +47 -44
  103. package/dist/channels/serve.js +165 -101
  104. package/dist/channels/slack/config-api.d.ts +4 -27
  105. package/dist/channels/slack/config-api.js +5 -34
  106. package/dist/channels/slack/context-buffer.d.ts +2 -3
  107. package/dist/channels/slack/context-buffer.js +5 -5
  108. package/dist/channels/slack/invoke-turn.d.ts +3 -1
  109. package/dist/channels/slack/invoke-turn.js +25 -34
  110. package/dist/channels/slack/manifest.js +1 -3
  111. package/dist/channels/slack/model.d.ts +1 -2
  112. package/dist/channels/slack/model.js +1 -1
  113. package/dist/channels/slack/onboard.d.ts +4 -3
  114. package/dist/channels/slack/onboard.js +8 -11
  115. package/dist/channels/slack/onboarding-state.d.ts +3 -5
  116. package/dist/channels/slack/onboarding-state.js +9 -6
  117. package/dist/channels/slack/parse.d.ts +4 -13
  118. package/dist/channels/slack/parse.js +7 -28
  119. package/dist/channels/slack/preview.d.ts +12 -2
  120. package/dist/channels/slack/preview.js +292 -269
  121. package/dist/channels/slack/reaction.d.ts +11 -3
  122. package/dist/channels/slack/reaction.js +19 -8
  123. package/dist/channels/slack/register-webhook.js +4 -7
  124. package/dist/channels/slack/scaffold/channel.ts +20 -13
  125. package/dist/channels/slack/scaffold/slack-send.ts +2 -2
  126. package/dist/channels/slack/setup-server.d.ts +1 -5
  127. package/dist/channels/slack/setup-server.js +1 -5
  128. package/dist/channels/slack/shared-api.d.ts +1 -4
  129. package/dist/channels/slack/shared-api.js +2 -13
  130. package/dist/channels/slack/slack-api.d.ts +2 -1
  131. package/dist/channels/slack/slack-api.js +6 -4
  132. package/dist/channels/slack/slack.d.ts +11 -14
  133. package/dist/channels/slack/slack.js +121 -122
  134. package/dist/channels/sse.d.ts +1 -1
  135. package/dist/channels/sse.js +1 -1
  136. package/dist/channels/telegram/context-buffer.d.ts +7 -22
  137. package/dist/channels/telegram/context-buffer.js +6 -23
  138. package/dist/channels/telegram/invoke-turn.d.ts +7 -7
  139. package/dist/channels/telegram/invoke-turn.js +24 -43
  140. package/dist/channels/telegram/parse.d.ts +24 -51
  141. package/dist/channels/telegram/parse.js +32 -84
  142. package/dist/channels/telegram/preview.d.ts +10 -1
  143. package/dist/channels/telegram/preview.js +79 -100
  144. package/dist/channels/telegram/register-webhook.js +5 -23
  145. package/dist/channels/telegram/scaffold/channel.ts +25 -18
  146. package/dist/channels/telegram/scaffold/telegram-send.ts +6 -4
  147. package/dist/channels/telegram/telegram-api.d.ts +4 -3
  148. package/dist/channels/telegram/telegram-api.js +9 -7
  149. package/dist/channels/telegram/telegram.d.ts +4 -18
  150. package/dist/channels/telegram/telegram.js +38 -94
  151. package/dist/channels/telegram/turn-store.d.ts +11 -14
  152. package/dist/channels/telegram/turn-store.js +8 -6
  153. package/dist/channels/wait-health.d.ts +4 -6
  154. package/dist/channels/wait-health.js +10 -14
  155. package/dist/cli/add-feishu.d.ts +2 -12
  156. package/dist/cli/add-feishu.js +24 -71
  157. package/dist/cli/add-slack.d.ts +5 -3
  158. package/dist/cli/add-slack.js +53 -76
  159. package/dist/cli/auth-view.d.ts +2 -16
  160. package/dist/cli/auth-view.js +2 -16
  161. package/dist/cli/commands/add.js +25 -43
  162. package/dist/cli/commands/chat.d.ts +0 -1
  163. package/dist/cli/commands/chat.js +5 -6
  164. package/dist/cli/commands/deploy/agentcore.js +60 -65
  165. package/dist/cli/commands/deploy/docker.js +50 -23
  166. package/dist/cli/commands/deploy/fly.js +23 -61
  167. package/dist/cli/commands/deploy/railway.js +23 -18
  168. package/dist/cli/commands/deploy/shared.d.ts +38 -57
  169. package/dist/cli/commands/deploy/shared.js +40 -59
  170. package/dist/cli/commands/deploy.d.ts +10 -27
  171. package/dist/cli/commands/deploy.js +38 -60
  172. package/dist/cli/commands/destroy.d.ts +4 -0
  173. package/dist/cli/commands/destroy.js +56 -0
  174. package/dist/cli/commands/dev.d.ts +2 -1
  175. package/dist/cli/commands/dev.js +20 -23
  176. package/dist/cli/commands/info.d.ts +0 -2
  177. package/dist/cli/commands/info.js +83 -49
  178. package/dist/cli/commands/init.d.ts +1 -2
  179. package/dist/cli/commands/init.js +16 -55
  180. package/dist/cli/commands/invoke.d.ts +0 -1
  181. package/dist/cli/commands/invoke.js +5 -7
  182. package/dist/cli/commands/login.d.ts +2 -1
  183. package/dist/cli/commands/login.js +33 -38
  184. package/dist/cli/commands/logs.js +3 -4
  185. package/dist/cli/commands/models.js +1 -5
  186. package/dist/cli/commands/routine-run.d.ts +6 -0
  187. package/dist/cli/commands/routine-run.js +47 -0
  188. package/dist/cli/commands/routine.d.ts +25 -0
  189. package/dist/cli/commands/routine.js +122 -0
  190. package/dist/cli/commands/start.d.ts +31 -3
  191. package/dist/cli/commands/start.js +131 -81
  192. package/dist/cli/commands/tool.js +26 -12
  193. package/dist/cli/fail.d.ts +13 -23
  194. package/dist/cli/fail.js +20 -23
  195. package/dist/cli/invoke-stream.d.ts +1 -8
  196. package/dist/cli/kernel.d.ts +6 -38
  197. package/dist/cli/kernel.js +14 -77
  198. package/dist/cli/models-view.d.ts +1 -9
  199. package/dist/cli/models-view.js +11 -22
  200. package/dist/cli/program.d.ts +5 -6
  201. package/dist/cli/program.js +120 -157
  202. package/dist/cli/serve.d.ts +57 -41
  203. package/dist/cli/serve.js +94 -121
  204. package/dist/cli/shared.d.ts +15 -61
  205. package/dist/cli/shared.js +55 -181
  206. package/dist/cli.js +1 -8
  207. package/dist/collect.d.ts +6 -0
  208. package/dist/collect.js +6 -0
  209. package/dist/core.d.ts +4 -1
  210. package/dist/core.js +9 -7
  211. package/dist/declared-secrets.d.ts +55 -0
  212. package/dist/declared-secrets.js +88 -0
  213. package/dist/deploy/agentcore/aws-cli.d.ts +91 -0
  214. package/dist/deploy/agentcore/aws-cli.js +64 -0
  215. package/dist/deploy/agentcore/destroy.d.ts +51 -0
  216. package/dist/deploy/agentcore/destroy.js +273 -0
  217. package/dist/deploy/agentcore/forwarder.js +28 -79
  218. package/dist/deploy/agentcore/logs.d.ts +2 -18
  219. package/dist/deploy/agentcore/logs.js +27 -51
  220. package/dist/deploy/agentcore/plan.d.ts +85 -105
  221. package/dist/deploy/agentcore/plan.js +152 -314
  222. package/dist/deploy/agentcore/run.d.ts +28 -28
  223. package/dist/deploy/agentcore/run.js +227 -306
  224. package/dist/deploy/agentcore/zip.d.ts +2 -15
  225. package/dist/deploy/agentcore/zip.js +3 -17
  226. package/dist/deploy/build-context.d.ts +21 -0
  227. package/dist/deploy/build-context.js +137 -0
  228. package/dist/deploy/channel-ingress.d.ts +26 -39
  229. package/dist/deploy/channel-ingress.js +57 -28
  230. package/dist/deploy/container.d.ts +20 -34
  231. package/dist/deploy/container.js +49 -100
  232. package/dist/deploy/docker/plan.d.ts +12 -11
  233. package/dist/deploy/docker/plan.js +43 -24
  234. package/dist/deploy/docker/run.d.ts +22 -25
  235. package/dist/deploy/docker/run.js +39 -37
  236. package/dist/deploy/fly/plan.d.ts +15 -44
  237. package/dist/deploy/fly/plan.js +41 -73
  238. package/dist/deploy/fly/run.d.ts +16 -51
  239. package/dist/deploy/fly/run.js +42 -95
  240. package/dist/deploy/hosts.d.ts +24 -3
  241. package/dist/deploy/hosts.js +24 -3
  242. package/dist/deploy/preflight.d.ts +47 -41
  243. package/dist/deploy/preflight.js +282 -383
  244. package/dist/deploy/railway/plan.d.ts +16 -42
  245. package/dist/deploy/railway/plan.js +42 -60
  246. package/dist/deploy/railway/run.d.ts +30 -68
  247. package/dist/deploy/railway/run.js +86 -100
  248. package/dist/deploy/registration-gate.d.ts +6 -13
  249. package/dist/deploy/residency.d.ts +37 -0
  250. package/dist/deploy/residency.js +24 -0
  251. package/dist/deploy/runner.d.ts +10 -9
  252. package/dist/deploy/runner.js +7 -18
  253. package/dist/deploy/secrets.d.ts +40 -41
  254. package/dist/deploy/secrets.js +117 -103
  255. package/dist/deploy/workspace.d.ts +50 -0
  256. package/dist/deploy/workspace.js +197 -0
  257. package/dist/dev-supervisor.d.ts +1 -9
  258. package/dist/dev-supervisor.js +21 -64
  259. package/dist/effect-port.d.ts +50 -0
  260. package/dist/effect-port.js +77 -0
  261. package/dist/engines/pi/agent-session-factory.d.ts +50 -69
  262. package/dist/engines/pi/agent-session-factory.js +249 -146
  263. package/dist/engines/pi/auth.d.ts +15 -11
  264. package/dist/engines/pi/auth.js +96 -99
  265. package/dist/engines/pi/chat.d.ts +1 -5
  266. package/dist/engines/pi/chat.js +2 -14
  267. package/dist/engines/pi/config.d.ts +53 -51
  268. package/dist/engines/pi/config.js +83 -92
  269. package/dist/engines/pi/create.d.ts +60 -75
  270. package/dist/engines/pi/create.js +108 -141
  271. package/dist/engines/pi/definition.d.ts +14 -58
  272. package/dist/engines/pi/definition.js +21 -85
  273. package/dist/engines/pi/invoke-session.d.ts +5 -25
  274. package/dist/engines/pi/invoke-session.js +209 -244
  275. package/dist/engines/pi/login.d.ts +95 -35
  276. package/dist/engines/pi/login.js +259 -107
  277. package/dist/engines/pi/machine.d.ts +31 -0
  278. package/dist/engines/pi/machine.js +106 -0
  279. package/dist/engines/pi/models.d.ts +70 -89
  280. package/dist/engines/pi/models.js +188 -81
  281. package/dist/engines/pi/open.d.ts +65 -53
  282. package/dist/engines/pi/open.js +129 -69
  283. package/dist/engines/pi/report.d.ts +3 -12
  284. package/dist/engines/pi/report.js +2 -16
  285. package/dist/engines/pi/search-tools.d.ts +1 -9
  286. package/dist/engines/pi/search-tools.js +26 -57
  287. package/dist/engines/pi/service.d.ts +2 -16
  288. package/dist/engines/pi/service.js +2 -16
  289. package/dist/engines/pi/session-builder.d.ts +5 -9
  290. package/dist/engines/pi/session-builder.js +44 -82
  291. package/dist/engines/pi/session-control.js +286 -269
  292. package/dist/engines/pi/session-effects.d.ts +14 -0
  293. package/dist/engines/pi/session-effects.js +30 -0
  294. package/dist/engines/pi/session-inheritance.d.ts +9 -18
  295. package/dist/engines/pi/session-inheritance.js +103 -160
  296. package/dist/engines/pi/session-markers.d.ts +31 -30
  297. package/dist/engines/pi/session-markers.js +26 -25
  298. package/dist/engines/pi/session-settings.d.ts +6 -22
  299. package/dist/engines/pi/session-settings.js +10 -21
  300. package/dist/engines/pi/session-store.d.ts +26 -92
  301. package/dist/engines/pi/session-store.js +96 -310
  302. package/dist/engines/pi/tool-context.d.ts +17 -45
  303. package/dist/engines/pi/tool-context.js +7 -26
  304. package/dist/engines/pi/tool.d.ts +45 -36
  305. package/dist/engines/pi/tool.js +43 -57
  306. package/dist/engines/pi/turn-kit.d.ts +14 -52
  307. package/dist/engines/pi/turn-kit.js +18 -67
  308. package/dist/engines/pi/wake-tool.d.ts +2 -10
  309. package/dist/engines/pi/wake-tool.js +7 -27
  310. package/dist/env.d.ts +27 -28
  311. package/dist/env.js +45 -50
  312. package/dist/index.js +0 -2
  313. package/dist/lark.d.ts +1 -2
  314. package/dist/lark.js +1 -2
  315. package/dist/loader.d.ts +14 -55
  316. package/dist/loader.js +24 -43
  317. package/dist/log.d.ts +2 -12
  318. package/dist/log.js +3 -24
  319. package/dist/node.d.ts +2 -15
  320. package/dist/node.js +2 -18
  321. package/dist/observe.d.ts +2 -8
  322. package/dist/open-url.d.ts +1 -1
  323. package/dist/open-url.js +1 -1
  324. package/dist/paths.d.ts +70 -134
  325. package/dist/paths.js +165 -232
  326. package/dist/pi.d.ts +4 -6
  327. package/dist/pi.js +3 -3
  328. package/dist/proxy.d.ts +16 -6
  329. package/dist/proxy.js +52 -16
  330. package/dist/runtime.d.ts +18 -12
  331. package/dist/runtime.js +18 -11
  332. package/dist/scaffold/add-channel.d.ts +14 -31
  333. package/dist/scaffold/add-channel.js +48 -112
  334. package/dist/scaffold/init.d.ts +9 -31
  335. package/dist/scaffold/init.js +45 -138
  336. package/dist/scaffold/templates/env.example +6 -4
  337. package/dist/scaffold/templates/fastagent.config.ts +36 -0
  338. package/dist/scaffold/templates.d.ts +3 -3
  339. package/dist/scaffold/templates.js +5 -8
  340. package/dist/scaffold/vendor-skill.d.ts +2 -5
  341. package/dist/scaffold/vendor-skill.js +19 -29
  342. package/dist/schedule/cron.d.ts +9 -5
  343. package/dist/schedule/cron.js +9 -11
  344. package/dist/schedule/discover.d.ts +12 -12
  345. package/dist/schedule/discover.js +43 -34
  346. package/dist/schedule/routine.d.ts +43 -0
  347. package/dist/schedule/routine.js +32 -0
  348. package/dist/schedule/run.d.ts +55 -0
  349. package/dist/schedule/run.js +146 -0
  350. package/dist/schedule/scheduler.d.ts +44 -55
  351. package/dist/schedule/scheduler.js +291 -265
  352. package/dist/schedule/state.d.ts +105 -10
  353. package/dist/schedule/state.js +293 -19
  354. package/dist/schedule/wake-alarm.d.ts +10 -23
  355. package/dist/schedule/wake-alarm.js +91 -121
  356. package/dist/schedule/wakeups.d.ts +23 -39
  357. package/dist/schedule/wakeups.js +33 -75
  358. package/dist/secrets-gate.d.ts +32 -0
  359. package/dist/secrets-gate.js +33 -0
  360. package/dist/service.d.ts +137 -98
  361. package/dist/service.js +250 -252
  362. package/dist/session-remote.d.ts +33 -44
  363. package/dist/session-remote.js +203 -192
  364. package/dist/session.d.ts +153 -228
  365. package/dist/session.js +33 -55
  366. package/dist/tunnel.d.ts +8 -36
  367. package/dist/tunnel.js +24 -65
  368. package/dist/version.d.ts +2 -2
  369. package/dist/version.js +2 -2
  370. package/package.json +10 -16
  371. package/dist/channels/agentcore-state.d.ts +0 -77
  372. package/dist/channels/agentcore-state.js +0 -276
  373. package/dist/channels/github/github.d.ts +0 -31
  374. package/dist/channels/github/github.js +0 -89
  375. package/dist/channels/github/scaffold/channel.ts +0 -25
  376. package/dist/cli/commands/attach.d.ts +0 -108
  377. package/dist/cli/commands/attach.js +0 -637
  378. package/dist/cli/commands/fire.d.ts +0 -7
  379. package/dist/cli/commands/fire.js +0 -38
  380. package/dist/cli/commands/schedule.d.ts +0 -12
  381. package/dist/cli/commands/schedule.js +0 -87
  382. package/dist/github.d.ts +0 -3
  383. package/dist/github.js +0 -2
  384. package/dist/scaffold/templates/fastagent.config.mjs +0 -23
  385. package/dist/schedule/audit.d.ts +0 -18
  386. package/dist/schedule/audit.js +0 -57
  387. package/dist/schedule/schedule.d.ts +0 -35
  388. package/dist/schedule/schedule.js +0 -23
@@ -1,71 +1,41 @@
1
1
  /**
2
2
  * The shared definition-aware session builder: open a directory's assembled agent as a resident pi
3
- * `AgentSessionRuntime`, running the SAME agent that `dev`/`start` serve. The TUI (chat.ts) is its
4
- * one consumer: the session control plane was built on the invoke pipeline instead of this resident
5
- * runtime, so control-plane observation covers invoke-driven runs and deliberately not chat sessions
6
- * (docs/design/session-control.md §10, §15).
7
- *
8
- * FIDELITY: pi's vanilla discovery (AGENTS.md walk to repo root, machine-global skills/extensions)
9
- * is suppressed; fastagent's assembly is INJECTED into pi's session:
10
- * - prompt → systemPromptOverride = base + instructions ONLY; pi appends the skill section and env
11
- * (cwd) itself (including it here would duplicate it).
12
- * - skills → skillsOverride (fastagent's skills, for the section + invocation).
13
- * - tools → all seven coding tools plus authored tools through pi's customTools path; pi's builtin
14
- * copies are suppressed, and the injected set survives /new, /resume, and fork.
15
- * - models → a ModelRuntime with builtins only (`modelsPath: null`, no availability network), so
16
- * the model surface equals serving's `createPiModels()` — pi's machine-global
17
- * models.json does not leak in.
18
- * - auth → fastagent's credential store at the AGENT's auth path (same resolution as the
19
- * serving opener: `--auth-path`/`FASTAGENT_AUTH_PATH`, else `<root>/.secrets/auth.json`).
20
- * pi's TUI `/login` writes through the injected store into the SAME file, so `fastagent
21
- * login` and chat share one credential lifecycle. pi's `~/.pi` auth is not consulted.
22
- *
23
- * `getAgentDir()` (pi's `~/.pi`) remains ONLY for presentation-level TUI settings (theme,
24
- * keybindings) — user preference, not agent definition; no auth or discovery flows from it.
25
- *
26
- * Cross-workspace session switches are rejected: `.env` is process-global, so one runtime is one
27
- * workspace.
3
+ * `AgentSessionRuntime`, running the SAME agent that `dev`/`start` serve.
28
4
  */
29
5
  import { existsSync, readFileSync } from "node:fs";
30
6
  import { resolve } from "node:path";
31
7
  import { NodeExecutionEnv } from "@earendil-works/pi-agent-core/node";
32
- import { SessionManager, createAgentSessionRuntime, createAgentSessionServices, getAgentDir, } from "@earendil-works/pi-coding-agent";
8
+ import { SessionManager, SettingsManager, createAgentSessionRuntime, createAgentSessionServices, getAgentDir, } from "@earendil-works/pi-coding-agent";
33
9
  import { bindPiSession, definitionResourceLoaderOptions, reportExtensionErrors } from "./agent-session-factory.js";
10
+ import { readMachine } from "./machine.js";
34
11
  import { resolveModel } from "./config.js";
35
12
  import { assembleSystemPrompt, piBasePrompt } from "./create.js";
36
13
  import { canonicalPath, loadAgentDefinition, loadExtensionPaths } from "./definition.js";
37
- import { createPiModelRuntime } from "./models.js";
38
- import { reportModuleLoadFailures } from "../../loader.js";
14
+ import { DEFAULT_THINKING_LEVEL, createPiModelRuntime } from "./models.js";
39
15
  import { reportFindingsIfChanged, reportToolCollisions } from "./report.js";
40
16
  import { resolveAgentAssembly } from "./open.js";
41
17
  /**
42
- * Build pi's interactive runtime driven by fastagent's assembled agent (model, prompt, tools,
43
- * skills, and auth resolved exactly as the serving opener does). Split from the TUI launcher so the
44
- * assembly — the fidelity-critical part — is inspectable and reusable without launching a TUI.
18
+ * Build pi's interactive runtime driven by fastagent's assembled agent (model, prompt, tools, skills, and auth
19
+ * resolved exactly as the serving opener does).
45
20
  */
46
- export async function buildAgentSessionRuntime(dir, options = {},
47
- /** Session backend. Defaults to pi's project-scoped store; tests inject SessionManager.inMemory(). */
48
- sessionManager) {
21
+ export async function buildAgentSessionRuntime(dir, options = {}, sessionManager) {
49
22
  async function resolveAssembly(cwd) {
50
- // The shared front half — the SAME placement/config/model-spec/tool/auth resolution the serving
51
- // opener uses (open.ts); those inputs cannot drift between the two consumption shapes.
52
- // Serving re-reads the definition per invoke; chat keeps a startup snapshot. Both pass identity
53
- // and project context to Pi, which appends skills/cwd. `tools` already includes search_tools.
54
- const { config, modelSpec, agentDir, authPath, stateRoot, tools, toolCollisions, toolFailures } = await resolveAgentAssembly(cwd, options);
23
+ // The shared front half — the SAME placement/config/model-spec/tool/auth resolution the serving opener uses
24
+ // (open.ts).
25
+ const { config, modelSpec, agentDir, auth, stateRoot, tools, toolCollisions } = await resolveAgentAssembly(cwd, options);
55
26
  reportToolCollisions(toolCollisions);
56
- reportModuleLoadFailures(toolFailures);
57
- // ONE hub owns model resolution AND per-request auth; see models.ts.
58
- // agentDir carries the agent's own models.json (custom endpoints); stateRoot keeps pi's generated
59
- // catalog cache out of the definition dir. See createPiModelRuntime.
60
- const modelRuntime = await createPiModelRuntime({ authPath, agentDir, stateRoot });
27
+ // ONE hub owns model resolution AND per-request auth.
28
+ // The fallback layer travels too: `chat` resolving credentials differently from dev/start/invoke is exactly the
29
+ // divergence the layer exists to remove.
30
+ const modelRuntime = await createPiModelRuntime({ auth, agentDir, stateRoot });
61
31
  const env = new NodeExecutionEnv({ cwd });
62
32
  const definition = await loadAgentDefinition(agentDir, { cwd, env });
63
33
  reportFindingsIfChanged(definition.dir, definition);
64
- // Assembly-time, like serving's: this whole function is memoized, so the scan and its warnings
65
- // happen once per runtime rather than per session rebuild (/new, /resume, fork).
34
+ // Assembly-time, like serving's: this whole function is memoized, so the scan and its warnings happen once per
35
+ // runtime rather than per session rebuild (/new, /resume, fork).
66
36
  const extensionPaths = await loadExtensionPaths(agentDir, { cwd, env });
67
- // base + instructions ONLY — pi appends the skill section and env (cwd) itself (including
68
- // them here would duplicate them).
37
+ // base + instructions ONLY — pi appends the skill section and env (cwd) itself (including them here would
38
+ // duplicate them).
69
39
  const systemPrompt = assembleSystemPrompt({
70
40
  base: piBasePrompt({ tools, persona: definition.persona }),
71
41
  contextFiles: definition.contextFiles,
@@ -81,16 +51,12 @@ sessionManager) {
81
51
  systemPrompt,
82
52
  };
83
53
  }
84
- // pi calls the factory again on /new, /resume, switch, and fork. Config/tools dynamic imports are
85
- // ESM-cached, so treating same-cwd rebuilds as hot reload would yield a half-fresh agent (fresh
86
- // AGENTS.md/skills, stale config/tools). Keep the runtime a coherent startup snapshot: restart to
87
- // load edits. And keep it workspace-scoped — `.env` is process-global, so a switch to another cwd
88
- // would leak env or require mutating global env at runtime.
54
+ // pi calls the factory again on /new, /resume, switch, and fork.
89
55
  const rootCwd = canonicalPath(dir);
90
56
  let assembly;
91
57
  const assemblyFor = (cwd) => {
92
- // Canonical paths: pi's process.cwd() fallback is a realpath, so a symlinked workspace would
93
- // otherwise mismatch a non-realpath rootCwd.
58
+ // Canonical paths: pi's process.cwd() fallback is a realpath, so a symlinked workspace would otherwise mismatch a
59
+ // non-realpath rootCwd.
94
60
  const activeCwd = canonicalPath(cwd);
95
61
  if (activeCwd !== rootCwd) {
96
62
  throw workspaceScopeError(activeCwd);
@@ -100,42 +66,43 @@ sessionManager) {
100
66
  };
101
67
  const createRuntime = async ({ cwd, sessionManager, sessionStartEvent }) => {
102
68
  const { modelRuntime, modelSpec, thinkingLevel, definition, extensionPaths, tools, systemPrompt } = await assemblyFor(cwd);
103
- // Per session, NOT memoized with the assembly: pi replaces the session on /new, /resume and
104
- // fork, and its extension contract is that the replacement gets freshly loaded extensions
105
- // rather than the previous session's objects. The expensive halves (model hub, auth) are shared
106
- // through the assembly; only the resource loader is rebuilt.
107
- const services = await createAgentSessionServices({
69
+ // Per session, NOT memoized with the assembly.
70
+ const machine = await readMachine(cwd);
71
+ const loaded = await createAgentSessionServices({
108
72
  cwd,
109
- // fastagent's models + auth hub replaces pi's default (~/.pi-backed) one — the auth
110
- // unification point; see the header.
73
+ // fastagent's models + auth hub replaces pi's default (~/.pi-backed) one — the auth unification point; see the
74
+ // header.
111
75
  modelRuntime,
112
- // Chat's assembly is fixed for the life of the runtime (a rebuild makes a new one), so these
113
- // read constants — where serving passes accessors that change per turn — and it DOES pass its
114
- // extension paths: chat runs them.
76
+ // PACKAGELESS, for the loader: fastagent never installs a pi package (machine.ts). Handed pi's own settings, the
77
+ // loader resolves `packages` itself — installing a missing one, and failing chat's start when that fails.
78
+ settingsManager: machine.settingsManager(),
79
+ // Chat's assembly is fixed for the life of the runtime (a rebuild makes a new one), so these read constants.
115
80
  resourceLoaderOptions: definitionResourceLoaderOptions({
116
81
  systemPrompt: () => systemPrompt,
117
82
  skills: () => definition.skills,
83
+ machine,
118
84
  extensionPaths,
119
85
  }),
120
86
  });
87
+ // ...while the SESSION keeps pi's own file-backed settings, so `/settings` in the TUI still saves. pi persists by
88
+ // re-reading the file under its lock and writing only the fields that changed, so `packages` there is untouched.
89
+ const services = { ...loaded, settingsManager: SettingsManager.create(cwd, loaded.agentDir) };
121
90
  reportExtensionErrors(services);
122
- // AFTER the services, because an extension may be what defines the model. `registerProvider()`
123
- // is pi's documented way for one to add providers, and extensions do not execute until the
124
- // services are built — resolving first fails a definition whose configured model comes from its
125
- // own extension with a bare "unknown model".
91
+ // AFTER the services, because an extension may be what defines the model.
126
92
  const model = resolveModel(modelRuntime, modelSpec);
127
- // The same bind serving performs, minus the activation record: pi's chat session has nowhere to
128
- // put one, which is the documented divergence — a resumed chat re-discovers via search_tools.
129
- // NOT bound to the host here: InteractiveMode.bindCurrentSessionExtensions() calls
130
- // session.bindExtensions() with the TUI's uiContext, abort handler and command actions — binding
131
- // here too would emit session_start twice per chat, so an extension opening a resource on start
132
- // would open two.
93
+ // The same bind serving performs, minus the activation record: pi's chat session has nowhere to put one, which is
94
+ // the documented divergence.
133
95
  const result = await bindPiSession({
134
96
  services,
135
97
  sessionManager,
136
98
  sessionStartEvent,
137
99
  model,
138
- thinkingLevel,
100
+ // The SPELLING serving uses (agent-session-factory), never `thinkingLevel` alone: pi resolves an ABSENT level
101
+ // from its own settings, which every posture now reads from the machine (`~/.pi/agent/settings.json`). A
102
+ // `/thinking` + Ctrl+S saved for coding would otherwise silently make this the one posture that answers at a
103
+ // different reasoning effort than the deployment does — the effort is the DEFINITION's (`thinkingLevel` in
104
+ // fastagent.config.ts), unlike the engine knobs around it.
105
+ thinkingLevel: thinkingLevel ?? DEFAULT_THINKING_LEVEL,
139
106
  tools,
140
107
  // A tool must see one spelling of the workspace, including when opened through a symlink.
141
108
  cwd: rootCwd,
@@ -172,12 +139,7 @@ function readSessionHeaderCwd(sessionPath) {
172
139
  }
173
140
  return undefined;
174
141
  }
175
- /**
176
- * Keep resume/import inside the runtime's single workspace, deciding BEFORE delegating to pi. The
177
- * process is chdir'd into rootCwd, so a session with no cwd header already lands on rootCwd. The gap
178
- * is a session that EXPLICITLY records a different cwd: pi would bind it and the factory would reject
179
- * it — but only AFTER tearing the live session down. Reject such a switch up front.
180
- */
142
+ /** Keep resume/import inside the runtime's single workspace, deciding BEFORE delegating to pi. */
181
143
  function enforceWorkspaceScopedSessionSwitches(runtime, rootCwd) {
182
144
  const rejectForeignTarget = (sessionPath, cwdOverride) => {
183
145
  const target = cwdOverride !== undefined ? canonicalPath(cwdOverride) : readSessionHeaderCwd(sessionPath);