@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
|
@@ -4,6 +4,7 @@ import { deploymentLoginCommand } from "../box-shell.js";
|
|
|
4
4
|
import { SECRETS_DIRNAME } from "../../paths.js";
|
|
5
5
|
const MOUNT = "/data";
|
|
6
6
|
export const DOCKER_COMPOSE_FILE = "fastagent.compose.yml";
|
|
7
|
+
export const DOCKER_VALUE_FILE = `${SECRETS_DIRNAME}/production/.env`;
|
|
7
8
|
const GENERATED_COMPOSE_MARKER = "# Generated by `fastagent deploy docker`";
|
|
8
9
|
export const MIN_DOCKER_COMPOSE_VERSION = "2.3.3";
|
|
9
10
|
/** Pinned: generated deployment artifacts must not silently move when Cloudflare publishes `latest`. */
|
|
@@ -31,10 +32,7 @@ function composeInterpolation(name) {
|
|
|
31
32
|
return `\${${name}:-}`;
|
|
32
33
|
}
|
|
33
34
|
function composeYaml(input) {
|
|
34
|
-
// Compose sits beside the Dockerfile,
|
|
35
|
-
// climbs back out of the one-level prefix deploy requires.
|
|
36
|
-
const context = "..";
|
|
37
|
-
const dockerfile = `${input.agentPrefix}Dockerfile`;
|
|
35
|
+
// Compose sits beside the Dockerfile, in the agent directory, which is the build context.
|
|
38
36
|
const tunnelService = input.tunnel
|
|
39
37
|
? `
|
|
40
38
|
# Cloudflare Quick Tunnel: ephemeral URL, generated only with \`deploy docker --tunnel\`.
|
|
@@ -69,8 +67,8 @@ name: ${input.projectName}
|
|
|
69
67
|
services:
|
|
70
68
|
agent:
|
|
71
69
|
build:
|
|
72
|
-
context:
|
|
73
|
-
dockerfile:
|
|
70
|
+
context: .
|
|
71
|
+
dockerfile: Dockerfile
|
|
74
72
|
ports:
|
|
75
73
|
- "127.0.0.1:${input.port}:${input.port}"
|
|
76
74
|
# The deployed environment's own declaration, read by the container itself. \`env_file\`, not per-name
|
|
@@ -78,12 +76,13 @@ services:
|
|
|
78
76
|
# source a deployment must not have. A FIXED path, never the builder's FASTAGENT_SECRETS_DIR — this file is a
|
|
79
77
|
# committed artifact and must mean the same thing on every machine. \`deploy\` creates it if it is missing.
|
|
80
78
|
env_file:
|
|
81
|
-
- ${
|
|
79
|
+
- ${DOCKER_VALUE_FILE}
|
|
82
80
|
environment:
|
|
83
81
|
PORT: "${input.port}"
|
|
84
|
-
# Machinery on the ONE state volume: mutable state and credentials (logged in on the box)
|
|
85
|
-
# env_file so a local path in that file (the scaffold lists
|
|
86
|
-
# or credentials somewhere outside the volume — or at a
|
|
82
|
+
# Machinery on the ONE state volume: mutable state and credentials (logged in on the box); the agent's content
|
|
83
|
+
# is linked there by the release itself. Pinned AFTER env_file so a local path in that file (the scaffold lists
|
|
84
|
+
# these) cannot send the container's state, sessions or credentials somewhere outside the volume — or at a
|
|
85
|
+
# host path that does not exist here at all.
|
|
87
86
|
FASTAGENT_STATE_DIR: "${MOUNT}/.state"
|
|
88
87
|
FASTAGENT_SECRETS_DIR: "${MOUNT}/.secrets"
|
|
89
88
|
FASTAGENT_AUTH_PATH: "${MOUNT}/.secrets/auth.json"
|
|
@@ -106,7 +105,7 @@ volumes:
|
|
|
106
105
|
}
|
|
107
106
|
/** Compute local-Docker artifacts + the runbook; no Docker process is touched here. */
|
|
108
107
|
export function planDockerDeploy(input) {
|
|
109
|
-
const composePath =
|
|
108
|
+
const composePath = DOCKER_COMPOSE_FILE;
|
|
110
109
|
const artifacts = [{ path: composePath, content: composeYaml(input) }, ...containerArtifacts(input)];
|
|
111
110
|
// One spelling for every command: the generated file names the value file itself (`env_file`), so no command
|
|
112
111
|
// needs a flag to reach the deployed environment's declaration.
|
|
@@ -121,13 +120,13 @@ export function planDockerDeploy(input) {
|
|
|
121
120
|
if (secrets.length > 0) {
|
|
122
121
|
runbook.push(`# Environment: the container reads ${input.valueFile} whole (Compose \`env_file\`) — that file declares the`, `# deployed environment (in CI, write it before running the command):`, ...secrets.map((secret) => `# ${secret.name}: ${secret.hint}`));
|
|
123
122
|
}
|
|
124
|
-
runbook.push(`# Run from the
|
|
125
|
-
runbook.push(``, `# Before building a new definition release, run \`fastagent deploy docker\` to refresh its manifest.`, `# The Compose volume at ${MOUNT} retains the
|
|
123
|
+
runbook.push(`# Run from the agent directory. The build bakes it as the definition and installs its`, `# package.json dependencies.`);
|
|
124
|
+
runbook.push(``, `# Before building a new definition release, run \`fastagent deploy docker\` to refresh its manifest.`, `# The Compose volume at ${MOUNT} retains the deployed definition, state and credentials.`, `# --pull: the base image is a floating tag, and a copy cached here may be older than the runtime floor.`, `${compose} build --pull`, `${compose} up -d`, `curl --fail http://127.0.0.1:${input.port}/health`, ...(input.boxLogin
|
|
126
125
|
? [
|
|
127
126
|
`# Model auth: once it is up, the deployment logs in to ${input.boxLogin} itself:`,
|
|
128
127
|
`${deploymentLoginCommand("docker", input.boxLogin)}`,
|
|
129
128
|
]
|
|
130
|
-
: []), ``, `# Operate it:`, `${compose} logs -f agent`, `${compose} ps`, `${compose} down # stops containers; keeps the state volume`, `# ${compose} down -v # DESTRUCTIVE: deletes
|
|
129
|
+
: []), ``, `# Operate it:`, `${compose} logs -f agent`, `${compose} ps`, `${compose} down # stops containers; keeps the state volume`, `# ${compose} down -v # DESTRUCTIVE: deletes credentials and all agent state`);
|
|
131
130
|
if (input.tunnel) {
|
|
132
131
|
runbook.push(``, `# Quick Tunnel: \`--run\` starts the Compose tunnel service and reads its ephemeral public URL.`, `# Telegram/Feishu/Lark and locally onboarded Slack auto-register; manual Slack prints its console URL. Re-run after the`, `# tunnel container/Docker daemon restarts: a new Quick Tunnel URL must replace the old webhook URL.`, `${compose} logs -f tunnel`);
|
|
133
132
|
}
|
|
@@ -4,7 +4,7 @@ import type { DeclaredChannel } from "../../channels/discover.ts";
|
|
|
4
4
|
import type { RegistrationOutcome } from "../../channels/registration.ts";
|
|
5
5
|
import type { CliRunner } from "../runner.ts";
|
|
6
6
|
export interface DockerRunPlan {
|
|
7
|
-
/** Compose file relative to the runner cwd (the
|
|
7
|
+
/** Compose file relative to the runner cwd (the agent directory). */
|
|
8
8
|
composeFile: string;
|
|
9
9
|
/** Container port from config; used to ask Compose for the effective published host port. */
|
|
10
10
|
port: number;
|
|
@@ -15,7 +15,7 @@ export interface DockerRunPlan {
|
|
|
15
15
|
secrets: Record<string, string>;
|
|
16
16
|
/** Declared names the value file supplies no value for — the run gates on these before any side effect. */
|
|
17
17
|
missingSecrets: string[];
|
|
18
|
-
/** That value file,
|
|
18
|
+
/** That value file, agent-dir-relative, so the gate names the file this deploy actually read. */
|
|
19
19
|
valueFile: string;
|
|
20
20
|
/** Register the deployment's webhooks against the tunnel URL, reporting what each registrar answered. */
|
|
21
21
|
announce: DockerAnnounce;
|
|
@@ -14,8 +14,8 @@ export function localUrlFromComposePort(stdout) {
|
|
|
14
14
|
return port ? `http://127.0.0.1:${port}` : undefined;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
* The
|
|
18
|
-
*
|
|
17
|
+
* The boot publishes the definition onto the volume (the image's `node_modules` included) before it binds a port,
|
|
18
|
+
* so this budget covers a copy on a slow Docker Desktop disk, not a listen.
|
|
19
19
|
*/
|
|
20
20
|
const defaultHealthProbe = (healthUrl, stillStarting) => waitForHealth(healthUrl, 180_000, 500, stillStarting);
|
|
21
21
|
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -107,7 +107,11 @@ export async function deployDockerRun(plan, docker, log, healthProbe = defaultHe
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
log(`building and reconciling ${plan.composeFile}…`);
|
|
110
|
-
|
|
110
|
+
// `--pull`: the base image is a floating tag, and a copy cached here may be older than the runtime floor.
|
|
111
|
+
if ((await docker([...compose, "build", "--pull"])).code !== 0) {
|
|
112
|
+
return gate(`\`docker compose build\` failed — see the Docker output above; fix it and re-run`);
|
|
113
|
+
}
|
|
114
|
+
if ((await docker([...compose, "up", "-d"])).code !== 0) {
|
|
111
115
|
return gate(`\`docker compose up\` failed — see the Docker output above; fix ${plan.composeFile} and re-run`);
|
|
112
116
|
}
|
|
113
117
|
// Detached `up` can return 0 just before a bad command exits.
|
|
@@ -133,7 +137,7 @@ export async function deployDockerRun(plan, docker, log, healthProbe = defaultHe
|
|
|
133
137
|
return ps.code !== 0 || ps.stdout.split(/\s+/).includes("agent");
|
|
134
138
|
};
|
|
135
139
|
if (!url && plan.boxLogin) {
|
|
136
|
-
// The login runs in the
|
|
140
|
+
// The login runs in the deployed definition, with the CLI the first boot installs: it needs the box READY, and
|
|
137
141
|
// with no published port the only place to ask `/health` is inside the container.
|
|
138
142
|
log("agent is running (no host-published port found); waiting for /health inside the container before login…");
|
|
139
143
|
if (!(await containerHealthy(docker, compose, plan.port, stillStarting))) {
|
|
@@ -22,7 +22,7 @@ export interface FlyPlanInput extends ContainerInput {
|
|
|
22
22
|
* carries.
|
|
23
23
|
*/
|
|
24
24
|
secrets?: readonly DeploymentSecret[];
|
|
25
|
-
/** `
|
|
25
|
+
/** `schedules/` declares a schedule — one of the things that forces a machine up (deploy/residency.ts). */
|
|
26
26
|
hasCron: boolean;
|
|
27
27
|
}
|
|
28
28
|
export interface FlyPlan {
|
package/dist/deploy/fly/plan.js
CHANGED
|
@@ -1,21 +1,13 @@
|
|
|
1
1
|
import { webhookRunbook } from "../channel-ingress.js";
|
|
2
|
-
import { containerArtifacts } from "../container.js";
|
|
2
|
+
import { containerArtifacts, imageHasGit } from "../container.js";
|
|
3
3
|
import { deploymentLoginCommand } from "../box-shell.js";
|
|
4
|
-
import {
|
|
4
|
+
import { WAKEUPS_WHEN_ASLEEP, residencyFor } from "../residency.js";
|
|
5
5
|
function flyToml(appName, port, residency) {
|
|
6
6
|
// WHY is residency.ts's to decide; the SETTING and its wording are Fly's. Anything else is an edit to the
|
|
7
7
|
// generated file, which is the artifact's job.
|
|
8
8
|
const min = residency
|
|
9
9
|
? ` min_machines_running = 1 # ${residency.why}`
|
|
10
10
|
: ` min_machines_running = 0 # scale to zero — ${WAKEUPS_WHEN_ASLEEP}`;
|
|
11
|
-
// The one reason with a way out gets it stated NEXT TO the line it is about, which is where an operator reading
|
|
12
|
-
// `min_machines_running = 1` and wondering what it costs them is looking.
|
|
13
|
-
const alternative = residency?.reason === CRON_CAN_BE_EXTERNAL
|
|
14
|
-
? ` # …or keep the time somewhere else and set this to 0: a scheduler you own (Fly Cron Manager,\n` +
|
|
15
|
-
` # supercronic, GitHub Actions) calls \`POST /run\`, which runs one declared unit of work by name.\n` +
|
|
16
|
-
` # It is an API, not a clock: read its contract first — docs/api-reference.md#post-run.\n` +
|
|
17
|
-
` # At 0, ${WAKEUPS_WHEN_ASLEEP}.\n`
|
|
18
|
-
: "";
|
|
19
11
|
// Suspend, not stop: a resume is fast enough that a webhook does not time out. Edit the line to change it.
|
|
20
12
|
const stopLine = ` auto_stop_machines = "suspend" # suspend on idle (fast resume on the next webhook)`;
|
|
21
13
|
return `${GENERATED_FLY_TOML_MARKER}. Edit freely — it is not regenerated unless you pass --force.
|
|
@@ -35,10 +27,10 @@ primary_region = "iad" # set your region (list: \`fly platform regions\`)
|
|
|
35
27
|
${stopLine}
|
|
36
28
|
auto_start_machines = true
|
|
37
29
|
${min}
|
|
38
|
-
|
|
30
|
+
|
|
39
31
|
[mounts]
|
|
40
32
|
source = "data"
|
|
41
|
-
destination = "/data" #
|
|
33
|
+
destination = "/data" # state and credentials survive stop/suspend/redeploy
|
|
42
34
|
initial_size = "1gb" # the volume is created by the FIRST deploy — it is pinned to one host, and only
|
|
43
35
|
# deploy tells the scheduler which machine (size + image) must fit there too
|
|
44
36
|
|
|
@@ -55,8 +47,7 @@ export function isGeneratedFlyToml(content) {
|
|
|
55
47
|
/** Compute the Fly deploy plan from the resolved definition. */
|
|
56
48
|
export function planFlyDeploy(input) {
|
|
57
49
|
const { appName, port, channels } = input;
|
|
58
|
-
|
|
59
|
-
const flyTomlPath = `${input.agentPrefix}fly.toml`;
|
|
50
|
+
const flyTomlPath = "fly.toml";
|
|
60
51
|
const artifacts = [
|
|
61
52
|
{
|
|
62
53
|
path: flyTomlPath,
|
|
@@ -65,7 +56,7 @@ export function planFlyDeploy(input) {
|
|
|
65
56
|
...containerArtifacts(input),
|
|
66
57
|
];
|
|
67
58
|
const secrets = input.secrets ?? [];
|
|
68
|
-
const deployCmd = `fly deploy . --config ${flyTomlPath} --dockerfile
|
|
59
|
+
const deployCmd = `fly deploy . --config ${flyTomlPath} --dockerfile Dockerfile --app ${appName}`;
|
|
69
60
|
const runbook = [
|
|
70
61
|
`# Deploy "${appName}" to Fly.io. ${flyTomlPath} / Dockerfile(.dockerignore) are generated above.`,
|
|
71
62
|
`# Prereqs: flyctl installed (https://fly.io/docs/flyctl/install) and \`fly auth login\`.`,
|
|
@@ -74,7 +65,7 @@ export function planFlyDeploy(input) {
|
|
|
74
65
|
`# Fly app names are GLOBALLY unique: if this fails as taken, set a unique "app" in fly.toml and`,
|
|
75
66
|
`# re-run \`fastagent deploy fly\` — the runbook follows fly.toml's app name.`,
|
|
76
67
|
`fly apps create ${appName}`,
|
|
77
|
-
`# The volume (
|
|
68
|
+
`# The volume (definition, state, credentials — kept across stop/suspend/redeploy) is created by the deploy`,
|
|
78
69
|
`# below, in primary_region and sized by [mounts].initial_size. Creating it yourself first pins it to a host`,
|
|
79
70
|
`# picked without the machine, which can fail the deploy with "insufficient resources … existing volume".`,
|
|
80
71
|
``,
|
|
@@ -88,13 +79,13 @@ export function planFlyDeploy(input) {
|
|
|
88
79
|
if (secrets.length > 0) {
|
|
89
80
|
runbook.push(``, `# Secrets (replace each <value>):`, ...secrets.map((s) => `# ${s.name}: ${s.hint}`), `fly secrets set --app ${appName} ${secrets.map((s) => `${s.name}=<value>`).join(" ")}`);
|
|
90
81
|
}
|
|
91
|
-
runbook.push(``, `# The build context is the
|
|
92
|
-
runbook.push(``, `# The volume keeps
|
|
93
|
-
? `# Git is
|
|
94
|
-
: `# To
|
|
82
|
+
runbook.push(``, `# The build context is the agent directory, baked as the definition.`, `# Before a new definition release, run \`fastagent deploy fly\` to refresh the release manifest.`, `# Run this from the agent directory:`, deployCmd);
|
|
83
|
+
runbook.push(``, `# The volume keeps .state and .secrets across restarts and deploys; each release replaces /data/definition.`, imageHasGit(input)
|
|
84
|
+
? `# Git is installed (the definition ships its .git, github content is cloned here, or context.json declares it in aptPackages).`
|
|
85
|
+
: `# To give the agent git, declare it: fastagent env add apt:git`);
|
|
95
86
|
// The credential is created on the box, never carried: the box is then the only holder of its grant.
|
|
96
87
|
if (input.boxLogin) {
|
|
97
|
-
runbook.push(``, `# Model auth: once it is up, the deployment logs in to ${input.boxLogin} itself (from
|
|
88
|
+
runbook.push(``, `# Model auth: once it is up, the deployment logs in to ${input.boxLogin} itself (from the agent directory):`, `${deploymentLoginCommand("fly", input.boxLogin)}`);
|
|
98
89
|
}
|
|
99
90
|
// The fastagent-only post-step: point each channel at the live URL.
|
|
100
91
|
const steps = webhookRunbook(`https://${appName}.fly.dev`, channels);
|
package/dist/deploy/fly/run.d.ts
CHANGED
|
@@ -9,22 +9,26 @@ export interface FlyRunPlan {
|
|
|
9
9
|
secrets: Record<string, string>;
|
|
10
10
|
/** Declared names the value file supplies no value for — the run gates on these before any side effect. */
|
|
11
11
|
missingSecrets: string[];
|
|
12
|
-
/** That value file,
|
|
12
|
+
/** That value file, agent-dir-relative, so the gate names the file this deploy actually read. */
|
|
13
13
|
valueFile: string;
|
|
14
14
|
/** Every declared channel and its ingress — the driver asks which of them have a webhook. */
|
|
15
15
|
channels: readonly DeclaredChannel[];
|
|
16
|
-
/** fly.toml path passed to `fly deploy -c` (relative to the run cwd = the
|
|
16
|
+
/** fly.toml path passed to `fly deploy -c` (relative to the run cwd = the agent directory). */
|
|
17
17
|
flyConfig: string;
|
|
18
|
-
/**
|
|
19
|
-
* Dockerfile path passed explicitly (`fastagent/Dockerfile`, with the workspace as context — flyctl would otherwise
|
|
20
|
-
* resolve it relative to the config's own directory).
|
|
21
|
-
*/
|
|
18
|
+
/** Dockerfile path passed explicitly, relative to the run cwd (the build context). */
|
|
22
19
|
dockerfile: string;
|
|
23
20
|
/**
|
|
24
21
|
* Log the box in (`fastagent login --deployment`) once it is up and before any webhook is pointed at it: a channel pointed at
|
|
25
22
|
* a box with no model credential answers every message with a failure. Resolves a gate line, or undefined.
|
|
26
23
|
*/
|
|
27
24
|
boxLogin?: BoxLoginStep;
|
|
25
|
+
/**
|
|
26
|
+
* Sign the host's CLI in when it is signed out, through whoever can (host-login.ts): resolves a gate line, or
|
|
27
|
+
* undefined once signed in. Absent: nobody can, and the run stops naming how.
|
|
28
|
+
*/
|
|
29
|
+
hostLogin?: () => Promise<string | undefined>;
|
|
30
|
+
/** The command a coding agent runs to deploy this, its person's steps handed to its user (`--run --json`). */
|
|
31
|
+
forAgent: string;
|
|
28
32
|
}
|
|
29
33
|
/** Done, or a gate the operator must clear before re-running (printed + non-zero exit by the CLI). */
|
|
30
34
|
export type FlyRunOutcome = {
|
package/dist/deploy/fly/run.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { loginGate, publicHealthGate, registerWebhooks, } from "../channel-ingress.js";
|
|
2
2
|
import { readOutput } from "../runner.js";
|
|
3
|
-
import { missingValuesGate } from "../secrets.js";
|
|
3
|
+
import { hostSignedOutGate, missingValuesGate } from "../secrets.js";
|
|
4
4
|
/**
|
|
5
5
|
* The `Type` values that put an app on `https://<app>.fly.dev`, BY FAMILY — one entry per allocate command, because
|
|
6
6
|
* that is the granularity the answer is acted on at.
|
|
@@ -30,14 +30,19 @@ export function listHasName(stdout, name) {
|
|
|
30
30
|
}
|
|
31
31
|
export async function deployFlyRun(plan, fly, log, registrars, healthProbe) {
|
|
32
32
|
const gate = (g) => ({ ok: false, gate: g });
|
|
33
|
-
// 1.
|
|
34
|
-
|
|
35
|
-
return gate("not logged in to Fly — run `fly auth login` (opens a browser), or set FLY_API_TOKEN, then re-run");
|
|
36
|
-
}
|
|
37
|
-
// 2. Gate missing required secret VALUES before any side effect (no half-created infra).
|
|
33
|
+
// 1. Gate missing required secret VALUES before any side effect (no half-created infra), and before asking a
|
|
34
|
+
// person to sign in for a deploy that would stop here anyway.
|
|
38
35
|
const missingValues = missingValuesGate(plan.missingSecrets, plan.valueFile);
|
|
39
36
|
if (missingValues)
|
|
40
37
|
return gate(missingValues);
|
|
38
|
+
// 2.
|
|
39
|
+
if ((await fly(["auth", "whoami"], { capture: true })).code !== 0) {
|
|
40
|
+
const failed = plan.hostLogin
|
|
41
|
+
? await plan.hostLogin()
|
|
42
|
+
: hostSignedOutGate("Fly", "fly auth login", "FLY_API_TOKEN", plan.forAgent);
|
|
43
|
+
if (failed)
|
|
44
|
+
return gate(failed);
|
|
45
|
+
}
|
|
41
46
|
// 3.
|
|
42
47
|
const appExists = await readOutput(fly, "fly", ["apps", "list", "--json"], (out) => listHasName(out, plan.appName));
|
|
43
48
|
if ("gate" in appExists)
|
package/dist/deploy/hosts.d.ts
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* Three edits: a directory beside this file (copy `fly/`: `plan.ts` pure, `run.ts` driving the host
|
|
9
9
|
* CLI behind the runner seam), its `HostDeploy` in `cli/commands/deploy/<host>.ts` (kept-file
|
|
10
10
|
* semantics, gates, the drive glue — the half that may exit the process), and its name in the array
|
|
11
|
-
* below.
|
|
11
|
+
* below. Locally known refusals belong in `HostDeploy.validate`: the dispatcher runs it before app onboarding
|
|
12
|
+
* and again on the facts onboarding produces. `deploy/` itself is a neutral kernel plus one directory per host; nothing host-specific
|
|
12
13
|
* belongs in the kernel, and no host may hold a fact about another one (a host-only flag is a row in
|
|
13
14
|
* `HOST_ONLY_FLAGS` in `cli/commands/deploy.ts`, warning elsewhere; `--tunnel` stays a usage GATE in `runDeploy`
|
|
14
15
|
* because a refusal is not a row).
|
package/dist/deploy/hosts.js
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* Three edits: a directory beside this file (copy `fly/`: `plan.ts` pure, `run.ts` driving the host
|
|
9
9
|
* CLI behind the runner seam), its `HostDeploy` in `cli/commands/deploy/<host>.ts` (kept-file
|
|
10
10
|
* semantics, gates, the drive glue — the half that may exit the process), and its name in the array
|
|
11
|
-
* below.
|
|
11
|
+
* below. Locally known refusals belong in `HostDeploy.validate`: the dispatcher runs it before app onboarding
|
|
12
|
+
* and again on the facts onboarding produces. `deploy/` itself is a neutral kernel plus one directory per host; nothing host-specific
|
|
12
13
|
* belongs in the kernel, and no host may hold a fact about another one (a host-only flag is a row in
|
|
13
14
|
* `HOST_ONLY_FLAGS` in `cli/commands/deploy.ts`, warning elsewhere; `--tunnel` stays a usage GATE in `runDeploy`
|
|
14
15
|
* because a refusal is not a row).
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type ResolvedPlacement } from "../paths.ts";
|
|
1
|
+
import type { AgentConfig } from "../harnesses/pi-durable/define.ts";
|
|
3
2
|
import { type DeclaredChannel } from "../channels/discover.ts";
|
|
4
|
-
import {
|
|
3
|
+
import type { DeclaredSecret } from "../declared-secrets.ts";
|
|
5
4
|
import { type ContainerInput } from "./container.ts";
|
|
6
5
|
import { type DeploymentSecret } from "./secrets.ts";
|
|
7
6
|
/** A stderr line the CLI prints (`[fastagent] warn: …` / `[fastagent] note: …`). */
|
|
@@ -14,31 +13,27 @@ interface DeployFacts {
|
|
|
14
13
|
messages: DeployMessage[];
|
|
15
14
|
/** Every declared channel with the ingress its module shape says it has, custom ones included. */
|
|
16
15
|
channels: DeclaredChannel[];
|
|
17
|
-
/**
|
|
18
|
-
* `routines/` declares at least one cron — the one residency reason with an external substitute: `POST /run` lets
|
|
19
|
-
* someone else's clock run a declared routine, so an operator who wants scale-to-zero has an option here.
|
|
20
|
-
*/
|
|
16
|
+
/** `src/schedules/` declares at least one schedule. */
|
|
21
17
|
hasCron: boolean;
|
|
22
18
|
/**
|
|
23
19
|
* The deployed environment's declaration, read ONCE here so the plan side and the run side cannot disagree about
|
|
24
20
|
* what this deployment carries. The environment running `deploy` is deliberately absent from it (§9).
|
|
25
21
|
*/
|
|
26
22
|
values: ReadonlyMap<string, string>;
|
|
27
|
-
/** That file,
|
|
23
|
+
/** That file, agent-dir-relative — the name every "set it here" message must use. */
|
|
28
24
|
valueFile: string;
|
|
29
25
|
/**
|
|
30
|
-
* The variable the value file carries the model's key in
|
|
31
|
-
*
|
|
26
|
+
* The variable the value file carries the model's key in, or undefined when no key travels that way
|
|
27
|
+
* ({@link credentialRoute}).
|
|
32
28
|
*/
|
|
33
29
|
modelAuth: string | undefined;
|
|
34
30
|
/**
|
|
35
31
|
* The provider the deployment must log in to itself (`fastagent login --deployment`): the model's credential does
|
|
36
|
-
* not travel, because it is neither a variable in the value file nor
|
|
37
|
-
*
|
|
38
|
-
* box is its only holder.
|
|
32
|
+
* not travel, because it is neither a variable in the value file nor resolved by the definition's own provider code.
|
|
33
|
+
* Nothing from this machine's credentials file is ever copied, so a login on the box is its only holder.
|
|
39
34
|
*/
|
|
40
35
|
boxLogin: string | undefined;
|
|
41
|
-
/** Every
|
|
36
|
+
/** Every declaration the definition makes — the names the value file must supply, by declaring file. */
|
|
42
37
|
declaredSecrets: DeclaredSecret[];
|
|
43
38
|
/** The runbook's variable list: the declared names, then everything else the value file carries. */
|
|
44
39
|
secrets: DeploymentSecret[];
|
|
@@ -63,21 +58,24 @@ export interface DeployReport {
|
|
|
63
58
|
issue(text: string): void;
|
|
64
59
|
}
|
|
65
60
|
interface PreflightInput {
|
|
66
|
-
|
|
67
|
-
config:
|
|
61
|
+
agentDir: string;
|
|
62
|
+
config: AgentConfig;
|
|
68
63
|
/** `--run` fully deploys, so a definition that resolves NO model is a GATE (a known crash-loop); else it warns. */
|
|
69
64
|
run: boolean;
|
|
70
65
|
/** `--force` regenerates the artifacts fastagent OWNS, so a kept `.dockerignore`'s content checks do not apply. */
|
|
71
66
|
force: boolean;
|
|
72
|
-
/** The target delivers cron slots from an external clock and holds no resident process (AgentCore). */
|
|
73
|
-
externalClock?: boolean;
|
|
74
67
|
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
|
|
78
|
-
|
|
68
|
+
* The target holds no resident process (AgentCore): what wakes it is outside it (webhooks, alarms), so the notes
|
|
69
|
+
* about keeping one machine running do not apply.
|
|
70
|
+
*/
|
|
71
|
+
noResidentProcess?: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Does every deployment start this host's storage over (AgentCore)? Then a clone the instance made, and anything the
|
|
74
|
+
* agent did in it, does not outlive a release. Its own question, apart from {@link noResidentProcess}.
|
|
79
75
|
*/
|
|
80
|
-
|
|
76
|
+
storageResets?: boolean;
|
|
77
|
+
/** Does this deployment serve the Agent API under `/v1` (deploy/api.ts)? Then a Caller with its key reaches it. */
|
|
78
|
+
servesApi?: boolean;
|
|
81
79
|
}
|
|
82
80
|
/** Run the host-neutral pre-flight. */
|
|
83
81
|
export declare function preflightDeploy(input: PreflightInput): Promise<DeployPreflight>;
|