@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.
- package/README.md +53 -82
- package/dist/agent-api.d.ts +452 -0
- package/dist/agent-api.js +201 -0
- package/dist/answer-text.d.ts +8 -0
- package/dist/answer-text.js +18 -0
- package/dist/atomic-write.d.ts +2 -2
- package/dist/atomic-write.js +2 -2
- package/dist/authoring.d.ts +77 -0
- package/dist/authoring.js +238 -0
- package/dist/channel.d.ts +29 -15
- package/dist/channel.js +4 -1
- package/dist/channels/agentcore-protocol.d.ts +36 -50
- package/dist/channels/agentcore-protocol.js +3 -3
- package/dist/channels/agentcore-service.d.ts +8 -18
- package/dist/channels/agentcore-service.js +108 -127
- package/dist/channels/agentcore.d.ts +8 -24
- package/dist/channels/agentcore.js +32 -65
- package/dist/channels/body.d.ts +0 -16
- package/dist/channels/body.js +0 -25
- package/dist/channels/busy.js +6 -1
- package/dist/channels/context.d.ts +4 -0
- package/dist/channels/context.js +35 -0
- package/dist/channels/discover.d.ts +18 -20
- package/dist/channels/discover.js +41 -99
- package/dist/channels/feishu/feishu-api.d.ts +54 -4
- package/dist/channels/feishu/feishu-api.js +192 -149
- package/dist/channels/feishu/feishu.d.ts +3 -0
- package/dist/channels/feishu/feishu.js +117 -106
- package/dist/channels/feishu/history.d.ts +55 -0
- package/dist/channels/feishu/history.js +199 -0
- package/dist/channels/feishu/invoke-turn.d.ts +13 -11
- package/dist/channels/feishu/invoke-turn.js +9 -10
- package/dist/channels/feishu/model.d.ts +2 -1
- package/dist/channels/feishu/normalize.js +100 -0
- package/dist/channels/feishu/preview.d.ts +2 -2
- package/dist/channels/feishu/register-webhook.d.ts +1 -0
- package/dist/channels/feishu/register-webhook.js +3 -2
- package/dist/channels/feishu/scaffold/channel.ts +65 -46
- package/dist/channels/feishu/scaffold/feishu-send.ts +38 -33
- package/dist/channels/feishu/scaffold/feishu-threads.ts +25 -0
- package/dist/channels/feishu/setup-mode.d.ts +45 -25
- package/dist/channels/feishu/setup-mode.js +74 -23
- package/dist/channels/feishu/shared-api.d.ts +24 -6
- package/dist/channels/feishu/shared-api.js +30 -24
- package/dist/channels/kit/context-buffer.d.ts +11 -2
- package/dist/channels/kit/context-buffer.js +7 -4
- package/dist/channels/kit/delivery.d.ts +19 -3
- package/dist/channels/kit/delivery.js +74 -15
- package/dist/channels/kit/event-stream.js +2 -1
- package/dist/channels/kit/invoke-turn-kit.d.ts +41 -41
- package/dist/channels/kit/invoke-turn-kit.js +62 -71
- package/dist/channels/kit/place-history.d.ts +107 -0
- package/dist/channels/kit/place-history.js +182 -0
- package/dist/channels/kit/preview-kit.d.ts +9 -5
- package/dist/channels/kit/preview-kit.js +36 -15
- package/dist/channels/kit/room-threads.d.ts +46 -0
- package/dist/channels/kit/room-threads.js +81 -0
- package/dist/channels/kit/seen.js +1 -1
- package/dist/channels/kit/stop-command.d.ts +6 -3
- package/dist/channels/kit/stop-command.js +20 -18
- package/dist/channels/kit/thread-fork.d.ts +17 -0
- package/dist/channels/kit/thread-fork.js +43 -0
- package/dist/channels/kit/thread-participants.js +1 -1
- package/dist/channels/kit/transport.d.ts +5 -0
- package/dist/channels/kit/transport.js +5 -0
- package/dist/channels/kit/turn-runner.d.ts +10 -9
- package/dist/channels/kit/turn-runner.js +17 -19
- package/dist/channels/kit/turn-store.d.ts +5 -4
- package/dist/channels/kit/turn-store.js +5 -5
- package/dist/channels/lark/lark.d.ts +3 -0
- package/dist/channels/lark/lark.js +5 -0
- package/dist/channels/lark/onboard.d.ts +5 -3
- package/dist/channels/lark/onboard.js +14 -14
- package/dist/channels/lark/scaffold/channel.ts +67 -44
- package/dist/channels/lark/scaffold/lark-send.ts +38 -33
- package/dist/channels/lark/scaffold/lark-threads.ts +25 -0
- package/dist/channels/respond.d.ts +0 -4
- package/dist/channels/respond.js +1 -1
- package/dist/channels/router.d.ts +18 -0
- package/dist/channels/router.js +68 -0
- package/dist/channels/serve.d.ts +5 -70
- package/dist/channels/serve.js +105 -287
- package/dist/channels/slack/history.d.ts +42 -0
- package/dist/channels/slack/history.js +282 -0
- package/dist/channels/slack/invoke-turn.d.ts +12 -5
- package/dist/channels/slack/invoke-turn.js +7 -5
- package/dist/channels/slack/manifest.d.ts +1 -4
- package/dist/channels/slack/manifest.js +22 -10
- package/dist/channels/slack/model.d.ts +2 -1
- package/dist/channels/slack/onboard.d.ts +0 -2
- package/dist/channels/slack/onboard.js +2 -4
- package/dist/channels/slack/onboarding-state.d.ts +0 -2
- package/dist/channels/slack/onboarding-state.js +0 -1
- package/dist/channels/slack/parse.d.ts +0 -5
- package/dist/channels/slack/parse.js +1 -16
- package/dist/channels/slack/preview.d.ts +2 -3
- package/dist/channels/slack/preview.js +78 -52
- package/dist/channels/slack/register-webhook.d.ts +1 -0
- package/dist/channels/slack/register-webhook.js +6 -5
- package/dist/channels/slack/scaffold/channel.ts +23 -24
- package/dist/channels/slack/scaffold/slack-send.ts +50 -43
- package/dist/channels/slack/scaffold/slack-threads.ts +29 -0
- package/dist/channels/slack/setup-server.d.ts +19 -0
- package/dist/channels/slack/setup-server.js +113 -11
- package/dist/channels/slack/shared-api.d.ts +15 -4
- package/dist/channels/slack/shared-api.js +19 -14
- package/dist/channels/slack/slack-api.d.ts +61 -2
- package/dist/channels/slack/slack-api.js +28 -5
- package/dist/channels/slack/slack.js +97 -52
- package/dist/channels/slack/welcomed.js +1 -1
- package/dist/channels/telegram/context-buffer.d.ts +6 -1
- package/dist/channels/telegram/context-buffer.js +19 -0
- package/dist/channels/telegram/invoke-turn.d.ts +8 -4
- package/dist/channels/telegram/invoke-turn.js +7 -7
- package/dist/channels/telegram/parse.d.ts +7 -2
- package/dist/channels/telegram/parse.js +7 -0
- package/dist/channels/telegram/preview.d.ts +2 -2
- package/dist/channels/telegram/register-webhook.d.ts +1 -0
- package/dist/channels/telegram/register-webhook.js +3 -2
- package/dist/channels/telegram/scaffold/channel.ts +27 -28
- package/dist/channels/telegram/scaffold/telegram-send.ts +61 -108
- package/dist/channels/telegram/shared-api.d.ts +34 -0
- package/dist/channels/telegram/shared-api.js +79 -0
- package/dist/channels/telegram/telegram-api.d.ts +15 -5
- package/dist/channels/telegram/telegram-api.js +10 -6
- package/dist/channels/telegram/telegram.js +27 -21
- package/dist/channels/telegram/turn-store.js +1 -1
- package/dist/channels/{kit/turn-queue.d.ts → turn-queue.d.ts} +2 -2
- package/dist/channels/{kit/turn-queue.js → turn-queue.js} +10 -10
- package/dist/cli/add-feishu.d.ts +42 -12
- package/dist/cli/add-feishu.js +177 -124
- package/dist/cli/add-slack.d.ts +8 -3
- package/dist/cli/add-slack.js +115 -63
- package/dist/cli/auth-view.d.ts +10 -3
- package/dist/cli/auth-view.js +8 -6
- package/dist/cli/box-login.d.ts +17 -7
- package/dist/cli/box-login.js +46 -12
- package/dist/cli/commands/add.d.ts +15 -4
- package/dist/cli/commands/add.js +252 -143
- package/dist/cli/commands/auth.d.ts +6 -0
- package/dist/cli/commands/auth.js +50 -0
- package/dist/cli/commands/content.d.ts +6 -0
- package/dist/cli/commands/content.js +45 -0
- package/dist/cli/commands/deploy/agentcore.js +50 -77
- package/dist/cli/commands/deploy/docker.js +38 -39
- package/dist/cli/commands/deploy/fly.js +21 -18
- package/dist/cli/commands/deploy/host-login.d.ts +26 -0
- package/dist/cli/commands/deploy/host-login.js +90 -0
- package/dist/cli/commands/deploy/railway.js +21 -26
- package/dist/cli/commands/deploy/shared.d.ts +45 -17
- package/dist/cli/commands/deploy/shared.js +34 -15
- package/dist/cli/commands/deploy.d.ts +0 -4
- package/dist/cli/commands/deploy.js +237 -50
- package/dist/cli/commands/destroy.js +8 -6
- package/dist/cli/commands/dev.d.ts +0 -2
- package/dist/cli/commands/dev.js +20 -19
- package/dist/cli/commands/env.d.ts +12 -0
- package/dist/cli/commands/env.js +190 -0
- package/dist/cli/commands/info.js +95 -156
- package/dist/cli/commands/init.d.ts +2 -2
- package/dist/cli/commands/init.js +35 -33
- package/dist/cli/commands/invoke.d.ts +6 -0
- package/dist/cli/commands/invoke.js +131 -16
- package/dist/cli/commands/login.d.ts +31 -2
- package/dist/cli/commands/login.js +413 -64
- package/dist/cli/commands/logout.d.ts +4 -0
- package/dist/cli/commands/logout.js +53 -0
- package/dist/cli/commands/logs.js +8 -6
- package/dist/cli/commands/models.d.ts +2 -1
- package/dist/cli/commands/models.js +39 -37
- package/dist/cli/commands/schedules.d.ts +21 -0
- package/dist/cli/commands/schedules.js +143 -0
- package/dist/cli/commands/start.d.ts +11 -10
- package/dist/cli/commands/start.js +35 -62
- package/dist/cli/content-view.d.ts +9 -0
- package/dist/cli/content-view.js +26 -0
- package/dist/cli/fail.d.ts +9 -12
- package/dist/cli/fail.js +17 -14
- package/dist/cli/invoke-stream.d.ts +12 -3
- package/dist/cli/invoke-stream.js +85 -23
- package/dist/cli/kernel.d.ts +9 -2
- package/dist/cli/kernel.js +15 -6
- package/dist/cli/login-relay.d.ts +3 -2
- package/dist/cli/login-relay.js +18 -6
- package/dist/cli/models-view.d.ts +5 -1
- package/dist/cli/models-view.js +1 -1
- package/dist/cli/person.d.ts +10 -0
- package/dist/cli/person.js +23 -0
- package/dist/cli/program.js +421 -203
- package/dist/cli/serve.d.ts +13 -63
- package/dist/cli/serve.js +31 -121
- package/dist/cli/shared.d.ts +21 -48
- package/dist/cli/shared.js +68 -89
- package/dist/cli/ticket.d.ts +136 -0
- package/dist/cli/ticket.js +476 -0
- package/dist/client.d.ts +7 -0
- package/dist/client.js +2 -0
- package/dist/content/declare.d.ts +70 -0
- package/dist/content/declare.js +163 -0
- package/dist/content/file.d.ts +32 -0
- package/dist/content/file.js +119 -0
- package/dist/content/git.d.ts +41 -0
- package/dist/content/git.js +217 -0
- package/dist/content/mount.d.ts +2 -0
- package/dist/content/mount.js +15 -0
- package/dist/content/resolve.d.ts +52 -0
- package/dist/content/resolve.js +151 -0
- package/dist/content/source.d.ts +27 -0
- package/dist/content/source.js +53 -0
- package/dist/conversation-sessions.d.ts +26 -0
- package/dist/conversation-sessions.js +99 -0
- package/dist/declared-secrets.d.ts +19 -37
- package/dist/declared-secrets.js +16 -58
- package/dist/deploy/agentcore/destroy.d.ts +3 -3
- package/dist/deploy/agentcore/destroy.js +46 -28
- package/dist/deploy/agentcore/forwarder.js +105 -22
- package/dist/deploy/agentcore/logs.js +1 -1
- package/dist/deploy/agentcore/plan.d.ts +10 -24
- package/dist/deploy/agentcore/plan.js +31 -135
- package/dist/deploy/agentcore/run.d.ts +1 -1
- package/dist/deploy/agentcore/run.js +8 -5
- package/dist/deploy/agentcore/shell.d.ts +1 -1
- package/dist/deploy/agentcore/shell.js +5 -5
- package/dist/deploy/api.d.ts +34 -0
- package/dist/deploy/api.js +50 -0
- package/dist/deploy/box-shell.d.ts +6 -0
- package/dist/deploy/box-shell.js +7 -0
- package/dist/deploy/build-context.d.ts +7 -5
- package/dist/deploy/build-context.js +41 -35
- package/dist/deploy/channel-ingress.d.ts +6 -1
- package/dist/deploy/channel-ingress.js +18 -5
- package/dist/deploy/container.d.ts +22 -9
- package/dist/deploy/container.js +96 -55
- package/dist/deploy/docker/plan.d.ts +3 -2
- package/dist/deploy/docker/plan.js +13 -14
- package/dist/deploy/docker/run.d.ts +2 -2
- package/dist/deploy/docker/run.js +8 -4
- package/dist/deploy/fly/plan.d.ts +1 -1
- package/dist/deploy/fly/plan.js +12 -21
- package/dist/deploy/fly/run.d.ts +10 -6
- package/dist/deploy/fly/run.js +11 -6
- package/dist/deploy/hosts.d.ts +2 -1
- package/dist/deploy/hosts.js +2 -1
- package/dist/deploy/preflight.d.ts +21 -23
- package/dist/deploy/preflight.js +222 -201
- package/dist/deploy/railway/plan.d.ts +8 -6
- package/dist/deploy/railway/plan.js +15 -58
- package/dist/deploy/railway/run.d.ts +8 -3
- package/dist/deploy/railway/run.js +12 -8
- package/dist/deploy/residency.d.ts +5 -11
- package/dist/deploy/residency.js +0 -6
- package/dist/deploy/runner.d.ts +1 -1
- package/dist/deploy/runner.js +1 -1
- package/dist/deploy/secrets.d.ts +16 -2
- package/dist/deploy/secrets.js +33 -6
- package/dist/deploy/workspace.d.ts +11 -6
- package/dist/deploy/workspace.js +55 -38
- package/dist/dev-supervisor.d.ts +11 -2
- package/dist/dev-supervisor.js +51 -26
- package/dist/effect-port.d.ts +4 -4
- package/dist/effect-port.js +4 -4
- package/dist/environment/apt.d.ts +4 -0
- package/dist/environment/apt.js +32 -0
- package/dist/environment/declare.d.ts +59 -0
- package/dist/environment/declare.js +210 -0
- package/dist/environment/mise.d.ts +50 -0
- package/dist/environment/mise.js +268 -0
- package/dist/feishu.d.ts +2 -2
- package/dist/feishu.js +2 -2
- package/dist/git.d.ts +13 -0
- package/dist/git.js +55 -0
- package/dist/harnesses/models/catalog.d.ts +20 -0
- package/dist/harnesses/models/catalog.js +254 -0
- package/dist/{engines/pi/auth.d.ts → harnesses/models/credentials.d.ts} +3 -3
- package/dist/{engines/pi/auth.js → harnesses/models/credentials.js} +3 -3
- package/dist/harnesses/models/environment.d.ts +43 -0
- package/dist/harnesses/models/environment.js +82 -0
- package/dist/{engines/pi → harnesses/models}/login.d.ts +57 -26
- package/dist/{engines/pi → harnesses/models}/login.js +187 -79
- package/dist/harnesses/models/models.d.ts +83 -0
- package/dist/harnesses/models/models.js +158 -0
- package/dist/harnesses/pi-durable/agent.d.ts +42 -0
- package/dist/harnesses/pi-durable/agent.js +579 -0
- package/dist/harnesses/pi-durable/defaults.d.ts +28 -0
- package/dist/harnesses/pi-durable/defaults.js +26 -0
- package/dist/harnesses/pi-durable/define.d.ts +77 -0
- package/dist/harnesses/pi-durable/define.js +28 -0
- package/dist/harnesses/pi-durable/entries.d.ts +32 -0
- package/dist/harnesses/pi-durable/entries.js +126 -0
- package/dist/harnesses/pi-durable/events.d.ts +25 -0
- package/dist/harnesses/pi-durable/events.js +238 -0
- package/dist/harnesses/pi-durable/ids.d.ts +16 -0
- package/dist/harnesses/pi-durable/ids.js +55 -0
- package/dist/harnesses/pi-durable/messages.d.ts +41 -0
- package/dist/harnesses/pi-durable/messages.js +116 -0
- package/dist/harnesses/pi-durable/open.d.ts +88 -0
- package/dist/harnesses/pi-durable/open.js +329 -0
- package/dist/harnesses/pi-durable/reads.d.ts +30 -0
- package/dist/harnesses/pi-durable/reads.js +94 -0
- package/dist/harnesses/pi-durable/registry.d.ts +18 -0
- package/dist/harnesses/pi-durable/registry.js +56 -0
- package/dist/harnesses/pi-durable/release.d.ts +13 -0
- package/dist/harnesses/pi-durable/release.js +40 -0
- package/dist/harnesses/pi-durable/serve.d.ts +80 -0
- package/dist/harnesses/pi-durable/serve.js +156 -0
- package/dist/harnesses/pi-durable/sessions.d.ts +27 -0
- package/dist/harnesses/pi-durable/sessions.js +47 -0
- package/dist/harnesses/pi-durable/storage.d.ts +4 -0
- package/dist/harnesses/pi-durable/storage.js +49 -0
- package/dist/harnesses/pi-durable/stream.d.ts +20 -0
- package/dist/harnesses/pi-durable/stream.js +221 -0
- package/dist/harnesses/pi-durable/text.d.ts +30 -0
- package/dist/harnesses/pi-durable/text.js +292 -0
- package/dist/harnesses/pi-durable/wake.d.ts +4 -0
- package/dist/harnesses/pi-durable/wake.js +81 -0
- package/dist/http/client.d.ts +6 -0
- package/dist/http/client.js +256 -0
- package/dist/http/contract.d.ts +541 -0
- package/dist/http/contract.js +179 -0
- package/dist/http/server.d.ts +34 -0
- package/dist/http/server.js +194 -0
- package/dist/index.d.ts +17 -4
- package/dist/index.js +10 -5
- package/dist/lark.d.ts +2 -2
- package/dist/lark.js +2 -2
- package/dist/locked-file.d.ts +17 -0
- package/dist/{engines/pi/locked-file.js → locked-file.js} +16 -10
- package/dist/once.d.ts +6 -0
- package/dist/once.js +23 -0
- package/dist/paths.d.ts +36 -52
- package/dist/paths.js +66 -182
- package/dist/runtime.d.ts +25 -2
- package/dist/runtime.js +27 -0
- package/dist/scaffold/add-channel.d.ts +14 -27
- package/dist/scaffold/add-channel.js +82 -180
- package/dist/scaffold/init.d.ts +17 -18
- package/dist/scaffold/init.js +87 -99
- package/dist/scaffold/templates/SYSTEM.md +12 -0
- package/dist/scaffold/templates/env.example +4 -10
- package/dist/scaffold/templates/fastagent.config.ts +21 -33
- package/dist/scaffold/templates/gitignore +8 -1
- package/dist/scaffold/templates/skills/writing-great-skills/SKILL.md +1 -2
- package/dist/scaffold/templates.d.ts +9 -4
- package/dist/scaffold/templates.js +7 -5
- package/dist/scaffold/vendor-skill.d.ts +1 -4
- package/dist/scaffold/vendor-skill.js +5 -6
- package/dist/schedule/cron.d.ts +13 -0
- package/dist/schedule/cron.js +52 -0
- package/dist/schedule/eventbridge-cron.d.ts +17 -0
- package/dist/schedule/eventbridge-cron.js +88 -0
- package/dist/schedule/schedule.d.ts +23 -0
- package/dist/schedule/schedule.js +34 -0
- package/dist/schedule/scheduler.d.ts +34 -33
- package/dist/schedule/scheduler.js +251 -137
- package/dist/schedule/state.d.ts +4 -14
- package/dist/schedule/state.js +7 -7
- package/dist/schedule/wake-alarm.d.ts +22 -2
- package/dist/schedule/wake-alarm.js +66 -20
- package/dist/schedule/wakeups.d.ts +16 -15
- package/dist/schedule/wakeups.js +47 -45
- package/dist/service.d.ts +56 -169
- package/dist/service.js +91 -187
- package/dist/serving-command.d.ts +10 -0
- package/dist/serving-command.js +16 -0
- package/dist/slack.d.ts +1 -1
- package/dist/slack.js +1 -1
- package/dist/{channels/kit/state.js → state-file.js} +6 -6
- package/dist/telegram.d.ts +1 -0
- package/dist/telegram.js +1 -0
- package/dist/tunnel.d.ts +3 -0
- package/dist/tunnel.js +12 -4
- package/dist/value-file.d.ts +21 -0
- package/dist/value-file.js +108 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.js +14 -1
- package/package.json +18 -28
- package/dist/agent.d.ts +0 -106
- package/dist/agent.js +0 -21
- package/dist/channels/control.d.ts +0 -31
- package/dist/channels/control.js +0 -329
- package/dist/channels/define-channel.d.ts +0 -39
- package/dist/channels/define-channel.js +0 -9
- package/dist/channels/feishu/context-buffer.d.ts +0 -35
- package/dist/channels/feishu/context-buffer.js +0 -65
- package/dist/channels/feishu/scaffold/channel.websocket.ts +0 -31
- package/dist/channels/http.d.ts +0 -23
- package/dist/channels/http.js +0 -57
- package/dist/channels/lark/scaffold/channel.websocket.ts +0 -31
- package/dist/channels/slack/context-buffer.d.ts +0 -23
- package/dist/channels/slack/context-buffer.js +0 -37
- package/dist/channels/sse.d.ts +0 -4
- package/dist/channels/sse.js +0 -66
- package/dist/cli/commands/chat.d.ts +0 -3
- package/dist/cli/commands/chat.js +0 -14
- package/dist/cli/commands/routine-run.d.ts +0 -6
- package/dist/cli/commands/routine-run.js +0 -46
- package/dist/cli/commands/routine.d.ts +0 -25
- package/dist/cli/commands/routine.js +0 -122
- package/dist/cli/commands/tool.d.ts +0 -1
- package/dist/cli/commands/tool.js +0 -57
- package/dist/collect.d.ts +0 -63
- package/dist/collect.js +0 -90
- package/dist/core.d.ts +0 -13
- package/dist/core.js +0 -15
- package/dist/engines/pi/agent-models.d.ts +0 -83
- package/dist/engines/pi/agent-models.js +0 -120
- package/dist/engines/pi/agent-session-factory.d.ts +0 -121
- package/dist/engines/pi/agent-session-factory.js +0 -535
- package/dist/engines/pi/chat.d.ts +0 -3
- package/dist/engines/pi/chat.js +0 -8
- package/dist/engines/pi/config.d.ts +0 -71
- package/dist/engines/pi/config.js +0 -199
- package/dist/engines/pi/create.d.ts +0 -170
- package/dist/engines/pi/create.js +0 -343
- package/dist/engines/pi/definition.d.ts +0 -74
- package/dist/engines/pi/definition.js +0 -236
- package/dist/engines/pi/entry-images.d.ts +0 -14
- package/dist/engines/pi/entry-images.js +0 -23
- package/dist/engines/pi/invoke-session.d.ts +0 -18
- package/dist/engines/pi/invoke-session.js +0 -403
- package/dist/engines/pi/locked-file.d.ts +0 -9
- package/dist/engines/pi/machine.d.ts +0 -53
- package/dist/engines/pi/machine.js +0 -137
- package/dist/engines/pi/models.d.ts +0 -200
- package/dist/engines/pi/models.js +0 -533
- package/dist/engines/pi/open.d.ts +0 -180
- package/dist/engines/pi/open.js +0 -270
- package/dist/engines/pi/openai-account-models.d.ts +0 -35
- package/dist/engines/pi/openai-account-models.js +0 -116
- package/dist/engines/pi/report.d.ts +0 -18
- package/dist/engines/pi/report.js +0 -59
- package/dist/engines/pi/retry-event.d.ts +0 -6
- package/dist/engines/pi/retry-event.js +0 -15
- package/dist/engines/pi/service.d.ts +0 -9
- package/dist/engines/pi/service.js +0 -14
- package/dist/engines/pi/session-builder.d.ts +0 -13
- package/dist/engines/pi/session-builder.js +0 -117
- package/dist/engines/pi/session-control.d.ts +0 -77
- package/dist/engines/pi/session-control.js +0 -908
- package/dist/engines/pi/session-effects.d.ts +0 -14
- package/dist/engines/pi/session-effects.js +0 -30
- package/dist/engines/pi/session-inheritance.d.ts +0 -21
- package/dist/engines/pi/session-inheritance.js +0 -204
- package/dist/engines/pi/session-markers.d.ts +0 -49
- package/dist/engines/pi/session-markers.js +0 -60
- package/dist/engines/pi/session-settings.d.ts +0 -67
- package/dist/engines/pi/session-settings.js +0 -119
- package/dist/engines/pi/session-store.d.ts +0 -69
- package/dist/engines/pi/session-store.js +0 -430
- package/dist/engines/pi/tool-context.d.ts +0 -45
- package/dist/engines/pi/tool-context.js +0 -31
- package/dist/engines/pi/tool.d.ts +0 -99
- package/dist/engines/pi/tool.js +0 -118
- package/dist/engines/pi/turn-kit.d.ts +0 -92
- package/dist/engines/pi/turn-kit.js +0 -288
- package/dist/engines/pi/wake-tool.d.ts +0 -9
- package/dist/engines/pi/wake-tool.js +0 -92
- package/dist/loader.d.ts +0 -41
- package/dist/loader.js +0 -116
- package/dist/node.d.ts +0 -3
- package/dist/node.js +0 -4
- package/dist/observe.d.ts +0 -6
- package/dist/observe.js +0 -47
- package/dist/pi.d.ts +0 -25
- package/dist/pi.js +0 -15
- package/dist/scaffold/templates/APPEND_SYSTEM.md +0 -12
- package/dist/scaffold/templates/tools/fetch-url.ts +0 -25
- package/dist/schedule/discover.d.ts +0 -17
- package/dist/schedule/discover.js +0 -61
- package/dist/schedule/routine.d.ts +0 -43
- package/dist/schedule/routine.js +0 -32
- package/dist/schedule/run.d.ts +0 -55
- package/dist/schedule/run.js +0 -146
- package/dist/secrets-gate.d.ts +0 -32
- package/dist/secrets-gate.js +0 -33
- package/dist/session-remote.d.ts +0 -47
- package/dist/session-remote.js +0 -460
- package/dist/session.d.ts +0 -466
- package/dist/session.js +0 -57
- /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 {};
|