@fastagent-sh/fastagent 0.24.4 → 0.26.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 +54 -82
- package/dist/agent-api.d.ts +460 -0
- package/dist/agent-api.js +209 -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 +81 -0
- package/dist/authoring.js +245 -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 +116 -64
- package/dist/cli/auth-view.d.ts +10 -3
- package/dist/cli/auth-view.js +8 -6
- package/dist/cli/box-login.d.ts +18 -7
- package/dist/cli/box-login.js +46 -12
- package/dist/cli/commands/add.d.ts +15 -4
- package/dist/cli/commands/add.js +253 -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 +191 -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 +132 -16
- package/dist/cli/commands/login.d.ts +31 -2
- package/dist/cli/commands/login.js +416 -65
- 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 +6 -4
- package/dist/cli/login-relay.js +19 -7
- 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 +70 -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 +220 -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 +223 -202
- 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 +52 -27
- package/dist/effect-port.d.ts +4 -4
- package/dist/effect-port.js +4 -4
- package/dist/env.d.ts +0 -13
- package/dist/env.js +1 -44
- 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 +51 -0
- package/dist/environment/mise.js +272 -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 +48 -0
- package/dist/harnesses/models/environment.js +88 -0
- package/dist/harnesses/models/host.d.ts +30 -0
- package/dist/harnesses/models/host.js +97 -0
- package/dist/{engines/pi → harnesses/models}/login.d.ts +66 -70
- package/dist/harnesses/models/login.js +439 -0
- package/dist/harnesses/models/models.d.ts +84 -0
- package/dist/harnesses/models/models.js +197 -0
- package/dist/harnesses/pi-durable/agent.d.ts +42 -0
- package/dist/harnesses/pi-durable/agent.js +581 -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 +95 -0
- package/dist/harnesses/pi-durable/open.js +330 -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 +90 -0
- package/dist/harnesses/pi-durable/serve.js +186 -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 +11 -0
- package/dist/harnesses/pi-durable/wake.js +90 -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 +19 -4
- package/dist/index.js +13 -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/sign-in-api.d.ts +147 -0
- package/dist/sign-in-api.js +9 -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 +14 -5
- package/dist/value-file.d.ts +40 -0
- package/dist/value-file.js +164 -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/login.js +0 -331
- 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
package/dist/cli/fail.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { gateSecrets } from "../secrets-gate.js";
|
|
1
|
+
import { findAgentDir, resolveAgentDir } from "../paths.js";
|
|
3
2
|
/** stderr renders color: a color TTY, with Node's `hasColors()` carrying the NO_COLOR/TERM=dumb veto. */
|
|
4
3
|
function stderrHasColors() {
|
|
5
4
|
return process.stderr.isTTY === true && (process.stderr.hasColors?.() ?? false);
|
|
@@ -8,36 +7,39 @@ function stderrHasColors() {
|
|
|
8
7
|
export function errorPrefix(colors = stderrHasColors()) {
|
|
9
8
|
return colors ? "\x1b[1;31mError:\x1b[0m" : "Error:";
|
|
10
9
|
}
|
|
10
|
+
let failureRecorder;
|
|
11
|
+
/**
|
|
12
|
+
* A ticket's process (ticket.ts): a failure that ends the process is the ticket's failure too, recorded before the
|
|
13
|
+
* process exits, wherever in a long command it happens.
|
|
14
|
+
*/
|
|
15
|
+
export function recordFailures(record) {
|
|
16
|
+
failureRecorder = record;
|
|
17
|
+
}
|
|
11
18
|
/**
|
|
12
19
|
* User-fixable startup problems (missing model / bad config / broken definition) are thrown as plain `Error` — print
|
|
13
20
|
* just the message. Anything else (a TypeError, a non-Error throw) is a bug: keep the stack.
|
|
14
21
|
*/
|
|
15
22
|
export function failStartup(error) {
|
|
23
|
+
failureRecorder?.(error instanceof Error ? error.message : String(error));
|
|
16
24
|
if (error instanceof Error && error.constructor === Error)
|
|
17
25
|
console.error(`${errorPrefix()} ${error.message}`);
|
|
18
26
|
else
|
|
19
27
|
console.error(errorPrefix(), error);
|
|
20
28
|
process.exit(1);
|
|
21
29
|
}
|
|
22
|
-
/**
|
|
23
|
-
|
|
24
|
-
* tool`, `fastagent routine run`). The gate throws SYNCHRONOUSLY, so there is no promise to hang the usual
|
|
25
|
-
* `.catch(failStartup)` on, and a raw throw reaches `cli.ts`'s top-level await as a Node stack that
|
|
26
|
-
* buries the one line naming the file. The catch translates that expected failure into the CLI's
|
|
27
|
-
* single-line refusal and exits 1; nothing is recovered.
|
|
28
|
-
*/
|
|
29
|
-
export function gateSecretsOrExit(input) {
|
|
30
|
+
/** THE addressing entry point for commands: the agent directory `dir` names, or exit 1 with the one-line refusal. */
|
|
31
|
+
export function agentDirOrExit(dir) {
|
|
30
32
|
try {
|
|
31
|
-
|
|
33
|
+
return resolveAgentDir(dir);
|
|
32
34
|
}
|
|
33
35
|
catch (error) {
|
|
34
36
|
failStartup(error);
|
|
35
37
|
}
|
|
36
38
|
}
|
|
37
|
-
/**
|
|
38
|
-
export function
|
|
39
|
+
/** {@link findAgentDir} for a command that also works without an agent: undefined when there is none, exit 1 inside one. */
|
|
40
|
+
export function optionalAgentDirOrExit(dir) {
|
|
39
41
|
try {
|
|
40
|
-
return
|
|
42
|
+
return findAgentDir(dir);
|
|
41
43
|
}
|
|
42
44
|
catch (error) {
|
|
43
45
|
failStartup(error);
|
|
@@ -48,6 +50,7 @@ export function placementOrExit(dir) {
|
|
|
48
50
|
* command body): print the message and exit 2.
|
|
49
51
|
*/
|
|
50
52
|
export function failUsage(message) {
|
|
53
|
+
failureRecorder?.(message);
|
|
51
54
|
console.error(`${errorPrefix()} ${message}`);
|
|
52
55
|
process.exit(2);
|
|
53
56
|
}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
-
/** Render
|
|
2
|
-
import type
|
|
3
|
-
|
|
1
|
+
/** Render one message's answer, as `messages.stream` delivers it, plus an exit code: 0 only for `completed`. */
|
|
2
|
+
import { type Message, type MessageStreamEvent } from "../agent-api.ts";
|
|
3
|
+
/** A command that sends a message exits 0 only when it completed. */
|
|
4
|
+
export declare const exitCodeOf: (message: Pick<Message, "status">) => number;
|
|
5
|
+
/** The answer as text on `out`, what the tools did and why it failed on `err`. */
|
|
6
|
+
export declare function runInvokeStream(events: AsyncIterable<MessageStreamEvent>, out: (text: string) => void, err: (line: string) => void): Promise<number>;
|
|
7
|
+
/**
|
|
8
|
+
* The answer as JSON lines, for a program to read: the message's events as `messages.stream` delivers them, its
|
|
9
|
+
* `message` first, through its `done`. A message that ends no other way ends with the line that says why: `rejected`
|
|
10
|
+
* when the agent refused it, a `stream_error` event, or `unfinished` when the events end first.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runInvokeJson(events: AsyncIterable<MessageStreamEvent>, line: (json: string) => void): Promise<number>;
|
|
@@ -1,35 +1,97 @@
|
|
|
1
|
+
/** Render one message's answer, as `messages.stream` delivers it, plus an exit code: 0 only for `completed`. */
|
|
2
|
+
import { AgentError, errorData } from "../agent-api.js";
|
|
3
|
+
import { answerText } from "../answer-text.js";
|
|
4
|
+
/** A command that sends a message exits 0 only when it completed. */
|
|
5
|
+
export const exitCodeOf = (message) => (message.status === "completed" ? 0 : 1);
|
|
6
|
+
function failure(message) {
|
|
7
|
+
const { status, error } = message;
|
|
8
|
+
if (status === "completed")
|
|
9
|
+
return undefined;
|
|
10
|
+
if (error === undefined)
|
|
11
|
+
return status;
|
|
12
|
+
return `${error.code}: ${error.message}${error.retryable ? " (retryable)" : ""}`;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Read `events` to their end with `read`, which answers an exit code once the message has ended; a send the agent
|
|
16
|
+
* refused rejects the first read, and is said by `refused`.
|
|
17
|
+
*/
|
|
18
|
+
async function readMessage(events, read, refused) {
|
|
19
|
+
try {
|
|
20
|
+
for await (const event of events) {
|
|
21
|
+
const exit = read(event);
|
|
22
|
+
if (exit !== undefined)
|
|
23
|
+
return exit;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (!(error instanceof AgentError))
|
|
28
|
+
throw error;
|
|
29
|
+
refused(error);
|
|
30
|
+
return 1;
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
/** The answer as text on `out`, what the tools did and why it failed on `err`. */
|
|
1
35
|
export async function runInvokeStream(events, out, err) {
|
|
2
|
-
const toolName = new Map(); //
|
|
3
|
-
|
|
4
|
-
|
|
36
|
+
const toolName = new Map(); // a tool result carries the id; its name came with tool_started
|
|
37
|
+
const textOf = answerText();
|
|
38
|
+
const exit = await readMessage(events, (event) => {
|
|
39
|
+
const text = event.type === "delta" || event.type === "entry" ? textOf(event) : "";
|
|
40
|
+
if (text !== "")
|
|
41
|
+
out(text);
|
|
5
42
|
switch (event.type) {
|
|
6
|
-
case "text":
|
|
7
|
-
out(event.delta);
|
|
8
|
-
break;
|
|
9
43
|
case "tool_started":
|
|
10
|
-
toolName.set(event.
|
|
44
|
+
toolName.set(event.toolCallId, event.name);
|
|
11
45
|
err(`[tool] ${event.name}`);
|
|
12
|
-
|
|
46
|
+
return undefined;
|
|
13
47
|
case "tool_progress":
|
|
14
|
-
err(`[tool] ${toolName.get(event.
|
|
15
|
-
|
|
16
|
-
case "tool_ended":
|
|
17
|
-
if (event.isError)
|
|
18
|
-
err(`[tool] ${toolName.get(event.id) ?? event.id} failed`);
|
|
19
|
-
break;
|
|
48
|
+
err(`[tool] ${toolName.get(event.toolCallId) ?? event.toolCallId} › ${clipStatus(event.text)}`);
|
|
49
|
+
return undefined;
|
|
20
50
|
case "retrying":
|
|
21
51
|
// Operator-facing: include the reason (channels show a neutral customer line instead).
|
|
22
52
|
err(`[fastagent] transient failure — retrying (${event.attempt}/${event.maxAttempts} in ${event.delayMs}ms): ${event.reason}`);
|
|
23
|
-
|
|
24
|
-
case "
|
|
25
|
-
err(`[fastagent]
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
53
|
+
return undefined;
|
|
54
|
+
case "stream_error":
|
|
55
|
+
err(`[fastagent] ${event.error.message}`);
|
|
56
|
+
return 1;
|
|
57
|
+
case "entry": {
|
|
58
|
+
const data = event.entry.data;
|
|
59
|
+
if (event.entry.kind === "tool_result" && data.isError) {
|
|
60
|
+
err(`[tool] ${toolName.get(data.toolCallId ?? "") ?? data.toolCallId} failed`);
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
case "done": {
|
|
65
|
+
const failed = failure(event.message);
|
|
66
|
+
if (failed !== undefined)
|
|
67
|
+
err(`[fastagent] failed: ${failed}`);
|
|
68
|
+
return exitCodeOf(event.message);
|
|
69
|
+
}
|
|
70
|
+
default:
|
|
71
|
+
return undefined;
|
|
30
72
|
}
|
|
31
|
-
}
|
|
32
|
-
|
|
73
|
+
}, (error) => err(`[fastagent] rejected: ${error.code}: ${error.message}`));
|
|
74
|
+
if (exit !== undefined)
|
|
75
|
+
return exit;
|
|
76
|
+
err("[fastagent] the stream ended before the message did");
|
|
77
|
+
return 1;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The answer as JSON lines, for a program to read: the message's events as `messages.stream` delivers them, its
|
|
81
|
+
* `message` first, through its `done`. A message that ends no other way ends with the line that says why: `rejected`
|
|
82
|
+
* when the agent refused it, a `stream_error` event, or `unfinished` when the events end first.
|
|
83
|
+
*/
|
|
84
|
+
export async function runInvokeJson(events, line) {
|
|
85
|
+
const exit = await readMessage(events, (event) => {
|
|
86
|
+
line(JSON.stringify(event));
|
|
87
|
+
if (event.type === "stream_error")
|
|
88
|
+
return 1;
|
|
89
|
+
return event.type === "done" ? exitCodeOf(event.message) : undefined;
|
|
90
|
+
}, (error) => line(JSON.stringify({ type: "rejected", error: errorData(error) })));
|
|
91
|
+
if (exit !== undefined)
|
|
92
|
+
return exit;
|
|
93
|
+
line(JSON.stringify({ type: "unfinished", reason: "the stream ended before the message did" }));
|
|
94
|
+
return 1;
|
|
33
95
|
}
|
|
34
96
|
/** How much of a status line a terminal gets, in code points. */
|
|
35
97
|
const STATUS_MAX = 120;
|
package/dist/cli/kernel.d.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
/** CLI kernel — commands as data. */
|
|
2
2
|
import { Command } from "commander";
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* One positional argument, in commander syntax: `<name>` required, `[dir]` optional, `<names...>` one or more (the
|
|
5
|
+
* command receives them as an array).
|
|
6
|
+
*/
|
|
4
7
|
interface ArgSpec {
|
|
5
8
|
name: string;
|
|
6
9
|
description: string;
|
|
7
10
|
default?: string;
|
|
8
11
|
/** Closed value set — the parser rejects anything else as a usage error (exit 2). */
|
|
9
12
|
choices?: string[];
|
|
13
|
+
/** Passed on as given, an empty value included: another program's arguments (`env exec`). */
|
|
14
|
+
verbatim?: boolean;
|
|
10
15
|
}
|
|
11
16
|
/** One flag, in the flag DSL: `--json`, or `--bind <addr>` for a value-taking flag. */
|
|
12
17
|
export interface FlagSpec {
|
|
@@ -14,6 +19,8 @@ export interface FlagSpec {
|
|
|
14
19
|
description: string;
|
|
15
20
|
/** Parsed but left out of help: an internal seam between two fastagent processes, not a user-facing flag. */
|
|
16
21
|
hidden?: boolean;
|
|
22
|
+
/** May be given more than once; the command receives every value, in order, as an array. */
|
|
23
|
+
repeatable?: boolean;
|
|
17
24
|
}
|
|
18
25
|
interface ExampleSpec {
|
|
19
26
|
cmd: string;
|
|
@@ -37,7 +44,7 @@ export interface CommandSpec {
|
|
|
37
44
|
* The implementation: positional args in declaration order (an optional arg without a default is `undefined`), then
|
|
38
45
|
* the parsed flags.
|
|
39
46
|
*/
|
|
40
|
-
run?: (args: (string | undefined)[], flags: Record<string, unknown>) => Promise<void> | void;
|
|
47
|
+
run?: (args: (string | string[] | undefined)[], flags: Record<string, unknown>) => Promise<void> | void;
|
|
41
48
|
}
|
|
42
49
|
export interface ProgramOptions {
|
|
43
50
|
/** Printed by `-v`/`--version`. */
|
package/dist/cli/kernel.js
CHANGED
|
@@ -9,7 +9,7 @@ const specOf = new WeakMap();
|
|
|
9
9
|
export function buildProgram(specs, options = {}) {
|
|
10
10
|
const exit = options.exit ?? ((code) => process.exit(code));
|
|
11
11
|
const program = new Command("fastagent");
|
|
12
|
-
program.description("Serve a file-defined agent — SYSTEM.md, skills/,
|
|
12
|
+
program.description("Serve a file-defined agent — SYSTEM.md, skills/, src/ — as a live service.");
|
|
13
13
|
// The exit-code policy: commander throws only for parse-level events — help/version displays carry exitCode 0 (→
|
|
14
14
|
// 0), everything else it rejects is a usage error (→ 2).
|
|
15
15
|
program.exitOverride((err) => exit(err.exitCode === 0 ? 0 : 2));
|
|
@@ -52,17 +52,26 @@ function register(parent, spec) {
|
|
|
52
52
|
if (a.choices)
|
|
53
53
|
arg.choices(a.choices);
|
|
54
54
|
// A required argument means a non-empty VALUE, not just a present token.
|
|
55
|
-
if (a.name.startsWith("<") && !a.choices) {
|
|
56
|
-
|
|
55
|
+
if (a.name.startsWith("<") && !a.choices && !a.verbatim) {
|
|
56
|
+
const nonEmpty = (value) => {
|
|
57
57
|
if (value.trim() === "")
|
|
58
58
|
throw new InvalidArgumentError("must not be empty.");
|
|
59
59
|
return value;
|
|
60
|
-
}
|
|
60
|
+
};
|
|
61
|
+
// A parser of a variadic argument replaces commander's own collecting, so it collects too.
|
|
62
|
+
if (a.name.endsWith("...>"))
|
|
63
|
+
arg.argParser((value, previous = []) => [...previous, nonEmpty(value)]);
|
|
64
|
+
else
|
|
65
|
+
arg.argParser(nonEmpty);
|
|
61
66
|
}
|
|
62
67
|
cmd.addArgument(arg);
|
|
63
68
|
}
|
|
64
|
-
for (const f of spec.flags ?? [])
|
|
65
|
-
|
|
69
|
+
for (const f of spec.flags ?? []) {
|
|
70
|
+
const option = new Option(f.flags, f.description).hideHelp(f.hidden === true);
|
|
71
|
+
if (f.repeatable)
|
|
72
|
+
option.argParser((value, previous = []) => [...previous, value]);
|
|
73
|
+
cmd.addOption(option);
|
|
74
|
+
}
|
|
66
75
|
for (const sub of spec.subcommands ?? [])
|
|
67
76
|
register(cmd, sub);
|
|
68
77
|
const run = spec.run;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import type { Readable, Writable } from "node:stream";
|
|
2
|
-
import type { LoginIO
|
|
2
|
+
import type { LoginIO } from "../harnesses/models/login.ts";
|
|
3
|
+
import type { SignInMethod } from "../sign-in-api.ts";
|
|
3
4
|
/** How a login on the box ended, as the box reports it. */
|
|
4
5
|
export type RelayResult =
|
|
5
6
|
/** Logged in now: `method` is how, `path` where the box saved it. */
|
|
6
7
|
{
|
|
7
8
|
ok: true;
|
|
8
9
|
provider: string;
|
|
9
|
-
method:
|
|
10
|
+
method: SignInMethod;
|
|
10
11
|
path: string;
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
@@ -24,7 +25,7 @@ export type RelayResult =
|
|
|
24
25
|
};
|
|
25
26
|
/**
|
|
26
27
|
* The box half: a {@link LoginIO} over `input`/`output`. Once `input` ends (the session dropped), every pending and
|
|
27
|
-
* later question reads as backed out, so the flow ends in `
|
|
28
|
+
* later question reads as backed out, so the flow ends in `SignInCancelled` instead of waiting forever.
|
|
28
29
|
*/
|
|
29
30
|
export declare function stdioLoginIO(input: Readable, output: Writable): {
|
|
30
31
|
io: LoginIO;
|
|
@@ -32,7 +33,8 @@ export declare function stdioLoginIO(input: Readable, output: Writable): {
|
|
|
32
33
|
};
|
|
33
34
|
/**
|
|
34
35
|
* The terminal half: drive `io` from what the box sends on `from`, answering on `to`. Resolves with the box's
|
|
35
|
-
* `result` line when `from` ends,
|
|
36
|
+
* `result` line when `from` ends, `undefined` when it ended without one, or a failure of this side's own when the box
|
|
37
|
+
* speaks an older wire than this one (`BOX_CLI_PREDATES`). A line that is not the wire (a host
|
|
36
38
|
* CLI's banner, a shell's error) goes to `passthrough`, so nothing the box printed is lost.
|
|
37
39
|
*/
|
|
38
40
|
export declare function relayLogin(from: Readable, to: Writable, io: LoginIO, passthrough: (line: string) => void): Promise<RelayResult | undefined>;
|
package/dist/cli/login-relay.js
CHANGED
|
@@ -8,10 +8,11 @@
|
|
|
8
8
|
* seen doing so), so an ended stream without that line is a failure, whatever the exit code says.
|
|
9
9
|
*/
|
|
10
10
|
import { createInterface } from "node:readline";
|
|
11
|
+
import { BOX_CLI_PREDATES } from "../deploy/box-shell.js";
|
|
11
12
|
const send = (out, message) => void out.write(`${JSON.stringify(message)}\n`);
|
|
12
13
|
/**
|
|
13
14
|
* The box half: a {@link LoginIO} over `input`/`output`. Once `input` ends (the session dropped), every pending and
|
|
14
|
-
* later question reads as backed out, so the flow ends in `
|
|
15
|
+
* later question reads as backed out, so the flow ends in `SignInCancelled` instead of waiting forever.
|
|
15
16
|
*/
|
|
16
17
|
export function stdioLoginIO(input, output) {
|
|
17
18
|
const pending = new Map();
|
|
@@ -47,9 +48,9 @@ export function stdioLoginIO(input, output) {
|
|
|
47
48
|
return {
|
|
48
49
|
io: {
|
|
49
50
|
select: (message, options) => ask((id) => ({ type: "select", id, message, options })),
|
|
50
|
-
prompt: (message, opts) => ask((id) => ({ type: "prompt", id, message, hidden: opts?.hidden === true }), opts?.signal),
|
|
51
|
+
prompt: (message, opts) => ask((id) => ({ type: "prompt", id, message, hidden: opts?.hidden === true, redirect: opts?.redirect === true }), opts?.signal),
|
|
51
52
|
note: (message) => send(output, { type: "note", message }),
|
|
52
|
-
openUrl: (url) => send(output, { type: "open", url }),
|
|
53
|
+
openUrl: (url, userCode) => send(output, { type: "open", url, ...(userCode ? { userCode } : {}) }),
|
|
53
54
|
},
|
|
54
55
|
result: (result) => {
|
|
55
56
|
send(output, { type: "result", ...result });
|
|
@@ -59,7 +60,8 @@ export function stdioLoginIO(input, output) {
|
|
|
59
60
|
}
|
|
60
61
|
/**
|
|
61
62
|
* The terminal half: drive `io` from what the box sends on `from`, answering on `to`. Resolves with the box's
|
|
62
|
-
* `result` line when `from` ends,
|
|
63
|
+
* `result` line when `from` ends, `undefined` when it ended without one, or a failure of this side's own when the box
|
|
64
|
+
* speaks an older wire than this one (`BOX_CLI_PREDATES`). A line that is not the wire (a host
|
|
63
65
|
* CLI's banner, a shell's error) goes to `passthrough`, so nothing the box printed is lost.
|
|
64
66
|
*/
|
|
65
67
|
export function relayLogin(from, to, io, passthrough) {
|
|
@@ -68,6 +70,8 @@ export function relayLogin(from, to, io, passthrough) {
|
|
|
68
70
|
const answer = (id, value) => send(to, { id, value: value ?? null });
|
|
69
71
|
const prompts = new Map();
|
|
70
72
|
let result;
|
|
73
|
+
/** Why this relay stopped the box itself: a box whose wire this CLI cannot read whole. */
|
|
74
|
+
let refused;
|
|
71
75
|
const lines = createInterface({ input: from });
|
|
72
76
|
lines.on("line", (line) => {
|
|
73
77
|
const message = parse(line);
|
|
@@ -78,9 +82,17 @@ export function relayLogin(from, to, io, passthrough) {
|
|
|
78
82
|
void io.select(message.message, message.options).then((value) => answer(message.id, value));
|
|
79
83
|
return;
|
|
80
84
|
case "prompt": {
|
|
85
|
+
if (typeof message.redirect !== "boolean") {
|
|
86
|
+
// An older box: which of its prompts takes the browser's address cannot be told, so none could be answered
|
|
87
|
+
// from the redirect this side catches. Its input ends, so it stops instead of waiting on a paste.
|
|
88
|
+
refused = BOX_CLI_PREDATES;
|
|
89
|
+
to.end();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
81
92
|
const controller = new AbortController();
|
|
82
93
|
prompts.set(message.id, controller);
|
|
83
|
-
|
|
94
|
+
const asked = { hidden: message.hidden, redirect: message.redirect, signal: controller.signal };
|
|
95
|
+
void io.prompt(message.message, asked).then((value) => {
|
|
84
96
|
prompts.delete(message.id);
|
|
85
97
|
if (!controller.signal.aborted)
|
|
86
98
|
answer(message.id, value);
|
|
@@ -93,7 +105,7 @@ export function relayLogin(from, to, io, passthrough) {
|
|
|
93
105
|
case "note":
|
|
94
106
|
return io.note(message.message);
|
|
95
107
|
case "open":
|
|
96
|
-
return io.openUrl(message.url);
|
|
108
|
+
return io.openUrl(message.url, message.userCode);
|
|
97
109
|
case "result": {
|
|
98
110
|
const { type: _, ...rest } = message;
|
|
99
111
|
result = rest;
|
|
@@ -104,7 +116,7 @@ export function relayLogin(from, to, io, passthrough) {
|
|
|
104
116
|
return new Promise((resolve) => lines.on("close", () => {
|
|
105
117
|
for (const controller of prompts.values())
|
|
106
118
|
controller.abort();
|
|
107
|
-
resolve(result);
|
|
119
|
+
resolve(refused === undefined ? result : { ok: false, reason: "failed", message: refused });
|
|
108
120
|
}));
|
|
109
121
|
}
|
|
110
122
|
const WIRE_TYPES = new Set(["select", "prompt", "abort", "note", "open", "result"]);
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* CLI presenter for the model-facing commands: `fastagent models [search]` output and the first-run picker's option
|
|
3
|
+
* list.
|
|
4
|
+
*/
|
|
5
|
+
import { type ProviderAuthStatus } from "../harnesses/models/models.ts";
|
|
2
6
|
/** One first-run picker entry (@clack/prompts option shape). */
|
|
3
7
|
export interface ModelPickerOption {
|
|
4
8
|
value: string;
|
package/dist/cli/models-view.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* CLI presenter for the model-facing commands: `fastagent models [search]` output and the first-run picker's option
|
|
3
3
|
* list.
|
|
4
4
|
*/
|
|
5
|
-
import { providerOf } from "../
|
|
5
|
+
import { providerOf } from "../harnesses/models/models.js";
|
|
6
6
|
/** The remedy hint for a non-ready provider, by what picking it actually does. */
|
|
7
7
|
function remedy(login) {
|
|
8
8
|
if (login === "oauth")
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface Person {
|
|
2
|
+
/** A step this run waits on: `instructions`, at `url`; `until`, when the step itself lapses (ms since the epoch). */
|
|
3
|
+
waitsOn(url: string, instructions: string, until?: number): void;
|
|
4
|
+
/** The step waited on is done: the run carries on without the person. */
|
|
5
|
+
carriesOn(): void;
|
|
6
|
+
/** A step left to the person once this run ends, which nothing here waits for; at `url`, when it has one. */
|
|
7
|
+
afterwards(instructions: string, url?: string): void;
|
|
8
|
+
}
|
|
9
|
+
/** The person at this terminal: told, and the page opened for them. */
|
|
10
|
+
export declare const terminalPerson: Person;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an app's setup says to the person setting it up, for the steps only they can take. At a terminal it is printed,
|
|
3
|
+
* and the page opened. In a coding agent's run it goes to the ticket the agent hands its person (ticket.ts): the step
|
|
4
|
+
* the run waits on as `need_user_action`, and a step left to them after it as `afterwards`.
|
|
5
|
+
*/
|
|
6
|
+
import { openExternalUrl } from "../open-url.js";
|
|
7
|
+
/** The person at this terminal: told, and the page opened for them. */
|
|
8
|
+
export const terminalPerson = {
|
|
9
|
+
waitsOn(url, instructions, until) {
|
|
10
|
+
const lapses = until === undefined ? "" : `, valid for ${Math.round((until - Date.now()) / 60_000)} minutes`;
|
|
11
|
+
console.error(`[fastagent] ${instructions} — opening ${url} (waiting${lapses}; keep this running)`);
|
|
12
|
+
openExternalUrl(url);
|
|
13
|
+
},
|
|
14
|
+
carriesOn() { },
|
|
15
|
+
afterwards(instructions, url) {
|
|
16
|
+
if (url === undefined) {
|
|
17
|
+
console.error(`[fastagent] ${instructions}`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
console.error(`[fastagent] ${instructions} — opening ${url}`);
|
|
21
|
+
openExternalUrl(url);
|
|
22
|
+
},
|
|
23
|
+
};
|