@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
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Slack's half of the shared context buffer (mechanics + consume protocol: ../kit/context-buffer.ts): the entry shape,
|
|
3
|
-
* its fold-line rendering, and buffered-file selection.
|
|
4
|
-
*/
|
|
5
|
-
import { capBufferedRefs, createContextBuffer as createGenericContextBuffer, } from "../kit/context-buffer.js";
|
|
6
|
-
function bufferLine(entry) {
|
|
7
|
-
const meta = [`msg ${entry.messageId}`, entry.replyTo ? `thread root ${entry.replyTo}` : undefined]
|
|
8
|
-
.filter(Boolean)
|
|
9
|
-
.join(", ");
|
|
10
|
-
return `${entry.sender} (${meta}): ${entry.body}`;
|
|
11
|
-
}
|
|
12
|
-
export function collectSlackBufferedFiles(consumed, primaryIds) {
|
|
13
|
-
const seen = new Set();
|
|
14
|
-
const files = [];
|
|
15
|
-
for (const entry of consumed) {
|
|
16
|
-
for (const id of entry.fileIds ?? []) {
|
|
17
|
-
if (primaryIds.has(id) || seen.has(id))
|
|
18
|
-
continue;
|
|
19
|
-
seen.add(id);
|
|
20
|
-
files.push({ id, from: entry.sender, messageId: entry.messageId });
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
const capped = capBufferedRefs(files);
|
|
24
|
-
return { files: capped.kept, skipped: capped.skipped };
|
|
25
|
-
}
|
|
26
|
-
function isEntry(value) {
|
|
27
|
-
const entry = value;
|
|
28
|
-
return (typeof entry?.sender === "string" &&
|
|
29
|
-
typeof entry.body === "string" &&
|
|
30
|
-
typeof entry.messageId === "string" &&
|
|
31
|
-
(entry.replyTo === undefined || typeof entry.replyTo === "string") &&
|
|
32
|
-
(entry.fileIds === undefined ||
|
|
33
|
-
(Array.isArray(entry.fileIds) && entry.fileIds.every((id) => typeof id === "string"))));
|
|
34
|
-
}
|
|
35
|
-
export function createSlackContextBuffer(path, label) {
|
|
36
|
-
return createGenericContextBuffer({ path, label, isEntry, line: bufferLine });
|
|
37
|
-
}
|
package/dist/channels/sse.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/** Shared SSE response lifecycle for invoke and session observation. */
|
|
2
|
-
/** The remote client's idle watchdog allows three missed heartbeats. */
|
|
3
|
-
export declare const SSE_HEARTBEAT_MS = 30000;
|
|
4
|
-
export declare function sseResponse<T>(events: AsyncIterable<T>, project?: (event: T) => unknown): Response;
|
package/dist/channels/sse.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/** Shared SSE response lifecycle for invoke and session observation. */
|
|
2
|
-
/** The remote client's idle watchdog allows three missed heartbeats. */
|
|
3
|
-
export const SSE_HEARTBEAT_MS = 30_000;
|
|
4
|
-
const encoder = new TextEncoder();
|
|
5
|
-
const heartbeat = encoder.encode(": ping\n\n");
|
|
6
|
-
export function sseResponse(events, project = (event) => event) {
|
|
7
|
-
const iterator = events[Symbol.asyncIterator]();
|
|
8
|
-
// Subscribe before headers; synchronous startup errors belong to the HTTP error boundary.
|
|
9
|
-
let pending = Promise.resolve(iterator.next());
|
|
10
|
-
// pull() surfaces asynchronous failures. Observe rejection even if the caller cancels before that pull.
|
|
11
|
-
pending.catch(() => { });
|
|
12
|
-
let closed = false;
|
|
13
|
-
let timer;
|
|
14
|
-
const stop = () => {
|
|
15
|
-
closed = true;
|
|
16
|
-
clearInterval(timer);
|
|
17
|
-
};
|
|
18
|
-
const cancel = async () => {
|
|
19
|
-
if (closed)
|
|
20
|
-
return;
|
|
21
|
-
stop();
|
|
22
|
-
await iterator.return?.();
|
|
23
|
-
};
|
|
24
|
-
const stream = new ReadableStream({
|
|
25
|
-
start(controller) {
|
|
26
|
-
timer = setInterval(() => controller.enqueue(heartbeat), SSE_HEARTBEAT_MS);
|
|
27
|
-
},
|
|
28
|
-
async pull(controller) {
|
|
29
|
-
try {
|
|
30
|
-
const next = await (pending ?? iterator.next());
|
|
31
|
-
pending = undefined;
|
|
32
|
-
// Cancellation can settle a pending next(); its value no longer has a reader.
|
|
33
|
-
if (closed)
|
|
34
|
-
return;
|
|
35
|
-
if (next.done) {
|
|
36
|
-
stop();
|
|
37
|
-
controller.close();
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
controller.enqueue(encoder.encode(`data: ${JSON.stringify(project(next.value))}\n\n`));
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
if (closed)
|
|
45
|
-
return;
|
|
46
|
-
// Errored streams never call cancel(), so iterator and timer cleanup belongs here too.
|
|
47
|
-
try {
|
|
48
|
-
await cancel();
|
|
49
|
-
}
|
|
50
|
-
catch (cleanupError) {
|
|
51
|
-
controller.error(new AggregateError([error, cleanupError], "SSE source and cleanup failed", { cause: error }));
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
controller.error(error);
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
cancel,
|
|
58
|
-
});
|
|
59
|
-
return new Response(stream, {
|
|
60
|
-
headers: {
|
|
61
|
-
"content-type": "text/event-stream",
|
|
62
|
-
"cache-control": "no-cache",
|
|
63
|
-
connection: "keep-alive",
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/** `fastagent chat [dir]`: open the SAME assembled agent in pi's interactive TUI. */
|
|
2
|
-
import { failStartup } from "../fail.js";
|
|
3
|
-
import { enterAgentCommand } from "../shared.js";
|
|
4
|
-
export async function runChat(dirArg, opts) {
|
|
5
|
-
// Chat authenticates through fastagent's credential store like every other command (the shared session builder
|
|
6
|
-
// injects it — see engines/pi/session-builder.ts), so the first-run picker and its inline login apply here too.
|
|
7
|
-
const placement = await enterAgentCommand(dirArg, opts);
|
|
8
|
-
// Run the chat process AT the workspace: pi resolves a session's cwd as `header.cwd ?? process.cwd()`, so aligning
|
|
9
|
-
// process.cwd() with the workspace keeps a cwd-less session on it.
|
|
10
|
-
process.chdir(placement.workspace);
|
|
11
|
-
// Lazy-import: chat pulls pi's interactive TUI module graph; headless start/dev never need it.
|
|
12
|
-
const { runPiChat } = await import("../../engines/pi/chat.js");
|
|
13
|
-
await runPiChat(placement.agentDir, { model: placement.modelSpec }).catch(failStartup);
|
|
14
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `fastagent routine run <name> [dir]`: run ONE routine's turn immediately — the authoring loop for routines (like
|
|
3
|
-
* `invoke` is for a prompt). Cron or not: a routine that declares none has no other local entry.
|
|
4
|
-
*/
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { displayPath } from "../../paths.js";
|
|
7
|
-
import { reportModuleLoadFailures } from "../../loader.js";
|
|
8
|
-
import { createPiAgentFromDir } from "../../engines/pi/open.js";
|
|
9
|
-
import { runInvokeStream } from "../invoke-stream.js";
|
|
10
|
-
import { loadRoutines } from "../../schedule/discover.js";
|
|
11
|
-
import { routineSession } from "../../schedule/routine.js";
|
|
12
|
-
import { failStartup, gateSecretsOrExit } from "../fail.js";
|
|
13
|
-
import { enterAgentDirectory, reportAuth, requireDefaultModel } from "../shared.js";
|
|
14
|
-
export async function runRoutine(name, dirArg, opts) {
|
|
15
|
-
const placement = await enterAgentDirectory(dirArg, opts);
|
|
16
|
-
// Routines are agent surface — discovered where dev/start/`routine list` do (the agent dir), so this command
|
|
17
|
-
// sees the same set the clock serves.
|
|
18
|
-
const { routines, secrets, failures } = await loadRoutines(placement.agentDir).catch(failStartup);
|
|
19
|
-
// Reported BEFORE the name is looked up: a routine file that failed to import is missing from
|
|
20
|
-
// `routines`, so "unknown routine" is the case where the author most needs to hear about it.
|
|
21
|
-
reportModuleLoadFailures(failures);
|
|
22
|
-
const routine = routines.find((r) => r.name === name);
|
|
23
|
-
if (!routine) {
|
|
24
|
-
// Name the discovery path: a schedule misplaced in the workspace (outside the agent dir) should read as "wrong
|
|
25
|
-
// place", not "broken file".
|
|
26
|
-
failStartup(new Error(`unknown routine "${name}" (looked in ${displayPath(process.cwd(), join(placement.agentDir, "routines")) ?? "routines"}). ` +
|
|
27
|
-
`available: ${routines.map((r) => r.name).join(", ") || "(none)"}`));
|
|
28
|
-
}
|
|
29
|
-
// This RUNS the routine, so it takes the serving path's guarantee: a prompt built from an
|
|
30
|
-
// unset declared value is the degraded turn this feature exists to prevent (`Post the digest to `
|
|
31
|
-
// — sent and executed), and the loader resolved it into a string before anything could notice.
|
|
32
|
-
// THIS schedule only (`owner`): running one routine must not fail because a SIBLING ROUTINE needs a
|
|
33
|
-
// credential this machine has no reason to hold. The agent assembled below is a different question
|
|
34
|
-
// and gates every mounted tool — a run's turn can call any of them — so this command is not free of a
|
|
35
|
-
// tool's declaration, only of another routine's. The failures go to the gate too, even though they
|
|
36
|
-
// were printed above: its guarantee must not depend on this call site remembering (a repeated line
|
|
37
|
-
// on the refusal path is the cheaper failure).
|
|
38
|
-
gateSecretsOrExit({ declared: secrets, failures, owner: name });
|
|
39
|
-
const { modelSpec } = requireDefaultModel(placement);
|
|
40
|
-
const { agent, models } = await createPiAgentFromDir(placement.agentDir, { model: modelSpec }).catch(failStartup);
|
|
41
|
-
console.error(`[fastagent] routine run: ${name} (${modelSpec})`);
|
|
42
|
-
await reportAuth(models, modelSpec);
|
|
43
|
-
const exitCode = await runInvokeStream(agent.invoke({ session: routineSession(name) }, { text: routine.prompt }), (text) => process.stdout.write(text), (line) => console.error(line));
|
|
44
|
-
process.stdout.write("\n");
|
|
45
|
-
process.exit(exitCode);
|
|
46
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `fastagent routine history <name> [dir]`: print this routine's fired slots — when each fired, how it ended, how
|
|
3
|
-
* long it took.
|
|
4
|
-
*
|
|
5
|
-
* The history IS the claims (`schedule/claims/<name>/`), so it is bounded by construction and carries no turn text:
|
|
6
|
-
* what the run SAID is in its session (`routine:<name>`), stored once, like any other turn's, under the state
|
|
7
|
-
* root's `sessions/` — which is where this command points rather than copying any of it here.
|
|
8
|
-
*
|
|
9
|
-
* This command does NOT try to say which turn belongs to which fire. Nothing links them: a routine's fires share
|
|
10
|
-
* ONE continuing conversation, so the session id is the same for all of them, and the turn-level identifier would
|
|
11
|
-
* have to cross the engine-neutral contract (no `AgentEvent` carries an entry id) or cost the shared conversation.
|
|
12
|
-
* A claim's timestamp against a time-ordered journal is what an operator reads anyway — matching them HERE only
|
|
13
|
-
* moves a human's judgement into a heuristic that cannot be right about a session other writers also append to.
|
|
14
|
-
*/
|
|
15
|
-
export declare function runRoutineHistory(name: string, dirArg: string, json: boolean): void;
|
|
16
|
-
/**
|
|
17
|
-
* `fastagent routine list [dir]`: every declared routine, and when (or whether) a clock fires it.
|
|
18
|
-
*
|
|
19
|
-
* IT ALSO READS the agent's pending wake-ups. They are a different owner (the state, not the definition) but the
|
|
20
|
-
* same question when an operator is asking it: "what is going to wake this agent up?". Deleting the command that
|
|
21
|
-
* CANCELLED one was right — `unwake({ id })` covers it, and a serve that can receive the alarm can also be spoken
|
|
22
|
-
* to — but that argument is about WRITING. Without a read, the only way to learn why an agent wakes at 3am is to
|
|
23
|
-
* open `<stateRoot>/schedule/wakeups.json` by hand.
|
|
24
|
-
*/
|
|
25
|
-
export declare function runRoutineList(dirArg: string, json: boolean): Promise<void>;
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `fastagent routine history|list` — the routines this DEFINITION declares.
|
|
3
|
-
*
|
|
4
|
-
* The agent's own pending wake-ups are not here and have no command: they live in the state, not the definition,
|
|
5
|
-
* and `unwake({ id })` is what cancels one (schedule/wakeups.ts says why).
|
|
6
|
-
*/
|
|
7
|
-
import { resolve } from "node:path";
|
|
8
|
-
import { enterAgentEnv } from "../../env.js";
|
|
9
|
-
import { resolveSessionsDir, resolveStateRoot } from "../../paths.js";
|
|
10
|
-
import { reportModuleLoadFailures } from "../../loader.js";
|
|
11
|
-
import { nextRun } from "../../schedule/cron.js";
|
|
12
|
-
import { loadRoutines } from "../../schedule/discover.js";
|
|
13
|
-
import { routineSession } from "../../schedule/routine.js";
|
|
14
|
-
import { isSafeScheduleName, readFires } from "../../schedule/state.js";
|
|
15
|
-
import { listWakeups } from "../../schedule/wakeups.js";
|
|
16
|
-
import { failStartup, placementOrExit } from "../fail.js";
|
|
17
|
-
/**
|
|
18
|
-
* `fastagent routine history <name> [dir]`: print this routine's fired slots — when each fired, how it ended, how
|
|
19
|
-
* long it took.
|
|
20
|
-
*
|
|
21
|
-
* The history IS the claims (`schedule/claims/<name>/`), so it is bounded by construction and carries no turn text:
|
|
22
|
-
* what the run SAID is in its session (`routine:<name>`), stored once, like any other turn's, under the state
|
|
23
|
-
* root's `sessions/` — which is where this command points rather than copying any of it here.
|
|
24
|
-
*
|
|
25
|
-
* This command does NOT try to say which turn belongs to which fire. Nothing links them: a routine's fires share
|
|
26
|
-
* ONE continuing conversation, so the session id is the same for all of them, and the turn-level identifier would
|
|
27
|
-
* have to cross the engine-neutral contract (no `AgentEvent` carries an entry id) or cost the shared conversation.
|
|
28
|
-
* A claim's timestamp against a time-ordered journal is what an operator reads anyway — matching them HERE only
|
|
29
|
-
* moves a human's judgement into a heuristic that cannot be right about a session other writers also append to.
|
|
30
|
-
*/
|
|
31
|
-
export function runRoutineHistory(name, dirArg, json) {
|
|
32
|
-
const { agentDir: target } = placementOrExit(resolve(dirArg));
|
|
33
|
-
enterAgentEnv(target); // FASTAGENT_STATE_DIR may live in .env — read the SAME state root the scheduler wrote
|
|
34
|
-
const stateRoot = resolveStateRoot(target);
|
|
35
|
-
// A name that cannot be a routine is a MISTYPED ARGUMENT, and it must not look like an empty history: exit 1 the
|
|
36
|
-
// way every other user-input refusal does, so `--json` printing nothing is never read as "the command succeeded".
|
|
37
|
-
if (!isSafeScheduleName(name)) {
|
|
38
|
-
failStartup(new Error(`"${name}" cannot be a routine name (no path separators, "." or "..")`));
|
|
39
|
-
}
|
|
40
|
-
// `readFires` throws a raw fs error on unreadable state, because its other caller is the serving boot, which must
|
|
41
|
-
// fail rather than arm a schedule it cannot read. This caller is a read-only CLI command: the same fact is an
|
|
42
|
-
// operator's to fix, so it exits the way every other refusal in this file does instead of printing a Node stack.
|
|
43
|
-
let fires;
|
|
44
|
-
try {
|
|
45
|
-
fires = readFires(stateRoot, name);
|
|
46
|
-
}
|
|
47
|
-
catch (e) {
|
|
48
|
-
failStartup(new Error(`the fired-slot claims for "${name}" are unreadable (state: ${stateRoot}): ${String(e)}`));
|
|
49
|
-
}
|
|
50
|
-
if (json) {
|
|
51
|
-
console.log(JSON.stringify(fires, null, 2));
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
if (fires.length === 0) {
|
|
55
|
-
// No special case for "wake": it is an ordinary schedule name now (`discover.ts` stopped reserving it).
|
|
56
|
-
console.error(`no recorded fires for "${name}" (state: ${stateRoot})`);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
// The question is "did LAST NIGHT's run fail?", so text mode tails the most recent fires; --json above is the
|
|
60
|
-
// whole retained window.
|
|
61
|
-
const TAIL = 20;
|
|
62
|
-
const shown = fires.slice(-TAIL);
|
|
63
|
-
for (const f of shown) {
|
|
64
|
-
// An unreported fire has no duration to print, and `0ms` would be a value a fast turn really produces — the
|
|
65
|
-
// column stays empty rather than claiming the turn took no time.
|
|
66
|
-
const took = f.ms === undefined ? "" : `${f.ms}ms`;
|
|
67
|
-
console.log(`${f.firedAt} ${(f.outcome ?? "unreported").padEnd(11)} ${took.padStart(8)}`);
|
|
68
|
-
}
|
|
69
|
-
if (fires.length > shown.length) {
|
|
70
|
-
console.error(`(the last ${shown.length} of ${fires.length} fires — --json for all)`);
|
|
71
|
-
}
|
|
72
|
-
// The other half of the answer, and where it lives: these rows say a fire happened, not what it produced. The
|
|
73
|
-
// session id comes from the ONE place that spells it and the directory from the ONE place that resolves it. The
|
|
74
|
-
// record is one level further down and under a name pi accepts (`piSessionId` escapes the `:`), so the pointer
|
|
75
|
-
// says how to recognise the file rather than claiming a path the reader can paste.
|
|
76
|
-
console.error(`(what these runs said: session ${routineSession(name)} — a JSON-lines journal under ${resolveSessionsDir(target)}, ` +
|
|
77
|
-
`in the file whose name carries "${name}")`);
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* `fastagent routine list [dir]`: every declared routine, and when (or whether) a clock fires it.
|
|
81
|
-
*
|
|
82
|
-
* IT ALSO READS the agent's pending wake-ups. They are a different owner (the state, not the definition) but the
|
|
83
|
-
* same question when an operator is asking it: "what is going to wake this agent up?". Deleting the command that
|
|
84
|
-
* CANCELLED one was right — `unwake({ id })` covers it, and a serve that can receive the alarm can also be spoken
|
|
85
|
-
* to — but that argument is about WRITING. Without a read, the only way to learn why an agent wakes at 3am is to
|
|
86
|
-
* open `<stateRoot>/schedule/wakeups.json` by hand.
|
|
87
|
-
*/
|
|
88
|
-
export async function runRoutineList(dirArg, json) {
|
|
89
|
-
const { agentDir: target } = placementOrExit(resolve(dirArg));
|
|
90
|
-
enterAgentEnv(target);
|
|
91
|
-
const { routines, failures } = await loadRoutines(target).catch(failStartup);
|
|
92
|
-
reportModuleLoadFailures(failures);
|
|
93
|
-
const wakeups = listWakeups(resolveStateRoot(target));
|
|
94
|
-
if (json) {
|
|
95
|
-
console.log(JSON.stringify({
|
|
96
|
-
routines: routines.map((r) => ({
|
|
97
|
-
...r,
|
|
98
|
-
next: r.cron === undefined ? null : (nextRun(r.cron, r.tz, new Date())?.toISOString() ?? null),
|
|
99
|
-
})),
|
|
100
|
-
wakeups,
|
|
101
|
-
}, null, 2));
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
if (routines.length === 0 && wakeups.length === 0) {
|
|
105
|
-
console.error(`nothing declared or pending — no routines/ files, no wake-ups (agent: ${target})`);
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
for (const r of routines) {
|
|
109
|
-
// A routine with no cron is not broken and not idle: it is reached by NAME (`routine run`, `POST /run`), and
|
|
110
|
-
// saying "on demand" is the difference between that and a cron that will never fire again.
|
|
111
|
-
const when = r.cron === undefined
|
|
112
|
-
? "on demand".padEnd(26)
|
|
113
|
-
: `${(nextRun(r.cron, r.tz, new Date())?.toISOString() ?? "(never)").padEnd(26)}cron ${r.cron}${r.tz ? ` ${r.tz}` : ""}`;
|
|
114
|
-
console.log(`${r.name.padEnd(20)} ${when}`);
|
|
115
|
-
}
|
|
116
|
-
// Labelled, because these two are NOT the same kind of thing: a routine is the author's, a wake-up is the
|
|
117
|
-
// agent's own and is cancelled with `unwake` rather than a command here.
|
|
118
|
-
for (const w of wakeups) {
|
|
119
|
-
const kind = w.cron ? `cron ${w.cron}${w.tz ? ` ${w.tz}` : ""}` : "one-shot";
|
|
120
|
-
console.log(`wake ${w.id} ${w.fireAt} ${kind} session=${w.session} ${w.prompt.slice(0, 60)}`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function runTool(name: string, argsJson: string, dirArg: string): Promise<void>;
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/** `fastagent tool <name> '<json>' [dir]`: run one tool's body directly with JSON args — no model. */
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
import { enterAgentEnv } from "../../env.js";
|
|
4
|
-
import { loadConfig } from "../../engines/pi/config.js";
|
|
5
|
-
import { resolveAgentTools } from "../../engines/pi/create.js";
|
|
6
|
-
import { reportModuleLoadFailures } from "../../loader.js";
|
|
7
|
-
import { turnContext } from "../../engines/pi/tool-context.js";
|
|
8
|
-
import { failStartup, failUsage, gateSecretsOrExit, placementOrExit } from "../fail.js";
|
|
9
|
-
export async function runTool(name, argsJson, dirArg) {
|
|
10
|
-
// Argument shape first: malformed JSON is a USAGE error (exit 2), independent of whether the directory is an agent
|
|
11
|
-
// (a runtime failure, exit 1).
|
|
12
|
-
const args = parseToolArgs(argsJson);
|
|
13
|
-
const { agentDir, workspace } = placementOrExit(resolve(dirArg));
|
|
14
|
-
enterAgentEnv(agentDir); // a tool may read a key from .env — and fetch through the proxy it declares
|
|
15
|
-
const { config } = await loadConfig(agentDir).catch(failStartup);
|
|
16
|
-
// The same tool set dev/start mount (all coding tools + config.tools + discovered, deduped), so the runner
|
|
17
|
-
// exercises exactly what gets served.
|
|
18
|
-
const { tools, toolCollisions, toolFailures, toolSecrets } = await resolveAgentTools(config, agentDir, workspace).catch(failStartup);
|
|
19
|
-
for (const c of toolCollisions) {
|
|
20
|
-
console.error(`[fastagent] warn: tool "${c.name}" (${c.source}) is shadowed by a default/config tool — not mounted`);
|
|
21
|
-
}
|
|
22
|
-
// Reported BEFORE the name is looked up: a file that failed to import is missing from `tools`, so
|
|
23
|
-
// "unknown tool" is exactly the case where the author most needs to hear that something blew up
|
|
24
|
-
// rather than that they mistyped it.
|
|
25
|
-
reportModuleLoadFailures(toolFailures);
|
|
26
|
-
const tool = tools.find((t) => t.name === name);
|
|
27
|
-
if (!tool) {
|
|
28
|
-
failStartup(new Error(`unknown tool "${name}". available: ${tools.map((t) => t.name).join(", ") || "(none)"}`));
|
|
29
|
-
}
|
|
30
|
-
// This command RUNS one tool body, so it takes the same guarantee dev/start take — for THAT tool
|
|
31
|
-
// only (`owner`): running one tool by hand must not require the credentials of the tools it is not
|
|
32
|
-
// running, and `routine run` scopes the same way for one routine.
|
|
33
|
-
// The failures go to the gate as well, even though they were just printed: the gate's guarantee is
|
|
34
|
-
// that a refusal never hides them, and it cannot know a caller already reported. A repeated line on
|
|
35
|
-
// the refusal path is the cheaper failure than one that depends on this call site remembering.
|
|
36
|
-
gateSecretsOrExit({ declared: toolSecrets, failures: toolFailures, owner: name });
|
|
37
|
-
// Authored tools read cwd from turnContext; coding tools are already rooted at the workspace.
|
|
38
|
-
const result = await turnContext.run({ cwd: workspace }, () => tool.execute(`cli-${name}`, args)).catch(failStartup);
|
|
39
|
-
// What the MODEL receives, which is not what is printed below: the printed form is `details` (readable, indented),
|
|
40
|
-
// the model's is the content text (compact JSON). Piping stdout through `wc -c` therefore answers the wrong
|
|
41
|
-
// question, and there is nowhere else to ask this one — so the run that a tool author already does reports it.
|
|
42
|
-
const modelText = (result?.content ?? []).map((c) => ("text" in c ? c.text : "")).join("");
|
|
43
|
-
const out = result?.details !== undefined ? result.details : modelText;
|
|
44
|
-
console.log(typeof out === "string" ? out : JSON.stringify(out, null, 2)); // stdout stays DATA
|
|
45
|
-
// No threshold warning: context windows run from 128k to 1M, so any fixed ceiling here would be invented. The
|
|
46
|
-
// number is the signal; docs/api-reference.md carries the judgement. ~4 chars/token is the usual rough figure.
|
|
47
|
-
console.error(`[fastagent] result: ${modelText.length} chars ≈ ${Math.ceil(modelText.length / 4)} tokens to the model`);
|
|
48
|
-
}
|
|
49
|
-
/** Parse the CLI's JSON args blob; malformed input syntax is a usage error (exit 2). */
|
|
50
|
-
function parseToolArgs(argsJson) {
|
|
51
|
-
try {
|
|
52
|
-
return JSON.parse(argsJson);
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
failUsage(`invalid JSON args: ${argsJson}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
package/dist/collect.d.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stream helpers around the SPEC's two stream disciplines.
|
|
3
|
-
*
|
|
4
|
-
* Caller side: `collect` (buffered consumption, SPEC §7) reduces an AgentEvent stream to a final
|
|
5
|
-
* value, encoding the terminal discipline (failed → throw, missing terminal → error) — streaming
|
|
6
|
-
* consumers for-await themselves.
|
|
7
|
-
*
|
|
8
|
-
* Agent side: the cancellation protocol (SPEC MUST 3), in two halves that only work together —
|
|
9
|
-
* `abortFirstIterator` delivers the consumer's knock, `cancellableStream` is what an engine wraps
|
|
10
|
-
* its turn in to receive it.
|
|
11
|
-
*/
|
|
12
|
-
import type { AgentEvent, Json } from "./agent.ts";
|
|
13
|
-
/**
|
|
14
|
-
* The abort-first cancellation protocol, ONCE: an async generator suspended on a quiet await (a
|
|
15
|
-
* tool mid-execution, a silent SSE read) parks inside that await, and `gen.return()`/`gen.throw()`
|
|
16
|
-
* queue behind the pending `next()` FOREVER (async-generator semantics) — a consumer's cancel
|
|
17
|
-
* would deadlock. The wrapper's `return()` first runs `cancel` (abort the underlying work, which
|
|
18
|
-
* settles the suspension), then delegates to `gen.return`, swallowing its rejection (the
|
|
19
|
-
* generator's own catch/finally already surfaced the outcome). `throw()` tears down identically
|
|
20
|
-
* and rethrows the caller's error deterministically instead of poking a completed generator.
|
|
21
|
-
*
|
|
22
|
-
* NOT `Stream.toAsyncIterable`. Its `return()` does interrupt the in-flight pull and close the scope,
|
|
23
|
-
* but a pull that has ALREADY resolved still hands its value back from the same `next()` — the entry
|
|
24
|
-
* guard only catches later calls. A consumer that cancels while a buffered terminal is in flight would
|
|
25
|
-
* therefore receive that terminal, which is the one thing MUST 3 forbids. The re-check after the await
|
|
26
|
-
* below is what makes the silence deterministic instead of a race.
|
|
27
|
-
*
|
|
28
|
-
* Cancellation also SILENCES the stream, and that belongs here rather than in each producer: a
|
|
29
|
-
* generator parked in an await can still reach a `yield` on its way out (an error path that
|
|
30
|
-
* yields a terminal, say), and that yield satisfies the pending `next()` — handing a terminal
|
|
31
|
-
* event to a consumer that already walked away, which SPEC MUST 3 forbids. Deciding it once, at
|
|
32
|
-
* the protocol boundary, is what keeps every producer from having to re-ask "is anyone still
|
|
33
|
-
* listening?" before each yield.
|
|
34
|
-
*/
|
|
35
|
-
export declare function abortFirstIterator<T>(gen: AsyncGenerator<T>, cancel: () => void): AsyncIterator<T>;
|
|
36
|
-
/** What a turn generator gets so a consumer walking away can stop it. */
|
|
37
|
-
export interface CancelHooks {
|
|
38
|
-
/** Publish the door: how to abort the engine work, once there is engine work to abort. */
|
|
39
|
-
onCancelReady: (cancel: () => void) => void;
|
|
40
|
-
/** The latch, for the window where the door is armed but the engine is still idle — knocking then
|
|
41
|
-
* does nothing, so a turn must read this before committing to work no one is waiting for. */
|
|
42
|
-
wasCancelled: () => boolean;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Wrap a turn generator in the cancellation protocol: cancelling the returned stream latches the
|
|
46
|
-
* intent AND knocks on whatever door the generator published, in that order (the latch must be set
|
|
47
|
-
* before the knock, or a turn checking it mid-flight could miss the cancel it just received).
|
|
48
|
-
*/
|
|
49
|
-
export declare function cancellableStream<T>(start: (hooks: CancelHooks) => AsyncGenerator<T>): AsyncIterable<T>;
|
|
50
|
-
/** Exception form of a failed event (thrown by collect). Carries the failed event's fields verbatim, so
|
|
51
|
-
* a buffered consumer can branch on `code` (SPEC §8 failure subdivision) just like a streaming one. */
|
|
52
|
-
export declare class AgentFailure extends Error {
|
|
53
|
-
readonly details: string;
|
|
54
|
-
readonly retryable: boolean;
|
|
55
|
-
/** Machine-readable failure subdivision (SPEC §8), when the engine set one. */
|
|
56
|
-
readonly code?: string;
|
|
57
|
-
constructor(details: string, retryable: boolean, code?: string);
|
|
58
|
-
}
|
|
59
|
-
export interface CollectResult {
|
|
60
|
-
text: string;
|
|
61
|
-
data?: Json;
|
|
62
|
-
}
|
|
63
|
-
export declare function collect(events: AsyncIterable<AgentEvent>): Promise<CollectResult>;
|
package/dist/collect.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The abort-first cancellation protocol, ONCE: an async generator suspended on a quiet await (a
|
|
3
|
-
* tool mid-execution, a silent SSE read) parks inside that await, and `gen.return()`/`gen.throw()`
|
|
4
|
-
* queue behind the pending `next()` FOREVER (async-generator semantics) — a consumer's cancel
|
|
5
|
-
* would deadlock. The wrapper's `return()` first runs `cancel` (abort the underlying work, which
|
|
6
|
-
* settles the suspension), then delegates to `gen.return`, swallowing its rejection (the
|
|
7
|
-
* generator's own catch/finally already surfaced the outcome). `throw()` tears down identically
|
|
8
|
-
* and rethrows the caller's error deterministically instead of poking a completed generator.
|
|
9
|
-
*
|
|
10
|
-
* NOT `Stream.toAsyncIterable`. Its `return()` does interrupt the in-flight pull and close the scope,
|
|
11
|
-
* but a pull that has ALREADY resolved still hands its value back from the same `next()` — the entry
|
|
12
|
-
* guard only catches later calls. A consumer that cancels while a buffered terminal is in flight would
|
|
13
|
-
* therefore receive that terminal, which is the one thing MUST 3 forbids. The re-check after the await
|
|
14
|
-
* below is what makes the silence deterministic instead of a race.
|
|
15
|
-
*
|
|
16
|
-
* Cancellation also SILENCES the stream, and that belongs here rather than in each producer: a
|
|
17
|
-
* generator parked in an await can still reach a `yield` on its way out (an error path that
|
|
18
|
-
* yields a terminal, say), and that yield satisfies the pending `next()` — handing a terminal
|
|
19
|
-
* event to a consumer that already walked away, which SPEC MUST 3 forbids. Deciding it once, at
|
|
20
|
-
* the protocol boundary, is what keeps every producer from having to re-ask "is anyone still
|
|
21
|
-
* listening?" before each yield.
|
|
22
|
-
*/
|
|
23
|
-
export function abortFirstIterator(gen, cancel) {
|
|
24
|
-
let cancelled = false;
|
|
25
|
-
const teardown = async () => {
|
|
26
|
-
cancelled = true;
|
|
27
|
-
cancel();
|
|
28
|
-
await gen.return(undefined).catch(() => { });
|
|
29
|
-
};
|
|
30
|
-
return {
|
|
31
|
-
async next() {
|
|
32
|
-
const result = await gen.next();
|
|
33
|
-
return cancelled ? { done: true, value: undefined } : result;
|
|
34
|
-
},
|
|
35
|
-
async return() {
|
|
36
|
-
await teardown();
|
|
37
|
-
return { done: true, value: undefined };
|
|
38
|
-
},
|
|
39
|
-
async throw(error) {
|
|
40
|
-
await teardown();
|
|
41
|
-
throw error;
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Wrap a turn generator in the cancellation protocol: cancelling the returned stream latches the
|
|
47
|
-
* intent AND knocks on whatever door the generator published, in that order (the latch must be set
|
|
48
|
-
* before the knock, or a turn checking it mid-flight could miss the cancel it just received).
|
|
49
|
-
*/
|
|
50
|
-
export function cancellableStream(start) {
|
|
51
|
-
let door;
|
|
52
|
-
let cancelled = false;
|
|
53
|
-
const iterator = abortFirstIterator(start({
|
|
54
|
-
onCancelReady: (cancel) => {
|
|
55
|
-
door = cancel;
|
|
56
|
-
},
|
|
57
|
-
wasCancelled: () => cancelled,
|
|
58
|
-
}), () => {
|
|
59
|
-
cancelled = true;
|
|
60
|
-
door?.();
|
|
61
|
-
});
|
|
62
|
-
return { [Symbol.asyncIterator]: () => iterator };
|
|
63
|
-
}
|
|
64
|
-
/** Exception form of a failed event (thrown by collect). Carries the failed event's fields verbatim, so
|
|
65
|
-
* a buffered consumer can branch on `code` (SPEC §8 failure subdivision) just like a streaming one. */
|
|
66
|
-
export class AgentFailure extends Error {
|
|
67
|
-
details;
|
|
68
|
-
retryable;
|
|
69
|
-
/** Machine-readable failure subdivision (SPEC §8), when the engine set one. */
|
|
70
|
-
code;
|
|
71
|
-
constructor(details, retryable, code) {
|
|
72
|
-
super(details);
|
|
73
|
-
this.name = "AgentFailure";
|
|
74
|
-
this.details = details;
|
|
75
|
-
this.retryable = retryable;
|
|
76
|
-
this.code = code;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
export async function collect(events) {
|
|
80
|
-
let text = "";
|
|
81
|
-
for await (const e of events) {
|
|
82
|
-
if (e.type === "text")
|
|
83
|
-
text += e.delta;
|
|
84
|
-
else if (e.type === "completed")
|
|
85
|
-
return { text, data: e.data };
|
|
86
|
-
else if (e.type === "failed")
|
|
87
|
-
throw new AgentFailure(e.details, e.retryable, e.code);
|
|
88
|
-
}
|
|
89
|
-
throw new Error("stream ended without a terminal event"); // violates SPEC MUST 1
|
|
90
|
-
}
|
package/dist/core.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export type { Agent, AgentEvent, ImageRef, Json, Prompt, Scope } from "./agent.ts";
|
|
2
|
-
export { ABORTED_CODE, MISSING_MODEL_CODE, SESSION_BUSY_CODE } from "./agent.ts";
|
|
3
|
-
export { collect, AgentFailure, type CollectResult } from "./collect.ts";
|
|
4
|
-
export type { ModuleLoadFailure } from "./loader.ts";
|
|
5
|
-
export { createInvokeHandler } from "./channels/http.ts";
|
|
6
|
-
export type { WireEvent } from "./channels/control.ts";
|
|
7
|
-
export { ControlRequestError, connectAgent, connectSessionControl, type RemoteEndpointOptions, } from "./session-remote.ts";
|
|
8
|
-
export { readBodyCapped } from "./channels/body.ts";
|
|
9
|
-
export { text, textHeaders } from "./channels/respond.ts";
|
|
10
|
-
export type { ChannelContext, ChannelHandler, ChannelModule, LongConnection, LongConnectionChannelModule, Routes, } from "./channel.ts";
|
|
11
|
-
export { defineRoutine, type DefineRoutineOptions, type LoadedRoutine, type Routine } from "./schedule/routine.ts";
|
|
12
|
-
export { defineChannel, type DefineChannelOptions } from "./channels/define-channel.ts";
|
|
13
|
-
export type { DeclaredSecret } from "./declared-secrets.ts";
|
package/dist/core.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
// VALUES, not types: each caller does something DIFFERENT with these codes (busy: retry with backoff, skip the
|
|
2
|
-
// occurrence, or steer the live run instead of failing; aborted: settle a deliberate stop, never replay it;
|
|
3
|
-
// missing_model: do not retry, give the session a model or the agent a default), which is why they are named at all.
|
|
4
|
-
// Without an export an embedder copies the literal, and the copy is how the first-event rule goes silently wrong.
|
|
5
|
-
export { ABORTED_CODE, MISSING_MODEL_CODE, SESSION_BUSY_CODE } from "./agent.js";
|
|
6
|
-
export { collect, AgentFailure } from "./collect.js";
|
|
7
|
-
export { createInvokeHandler } from "./channels/http.js";
|
|
8
|
-
export { ControlRequestError, connectAgent, connectSessionControl, } from "./session-remote.js";
|
|
9
|
-
export { readBodyCapped } from "./channels/body.js";
|
|
10
|
-
export { text, textHeaders } from "./channels/respond.js";
|
|
11
|
-
// Mounting only.
|
|
12
|
-
export { defineRoutine } from "./schedule/routine.js";
|
|
13
|
-
// What a `channels/*.ts` file is written against when it needs credentials: declaring them is what
|
|
14
|
-
// lets `deploy` carry them and the serve refuse to start without them.
|
|
15
|
-
export { defineChannel } from "./channels/define-channel.js";
|