@fastagent-sh/fastagent 0.24.4 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -82
- package/dist/agent-api.d.ts +452 -0
- package/dist/agent-api.js +201 -0
- package/dist/answer-text.d.ts +8 -0
- package/dist/answer-text.js +18 -0
- package/dist/atomic-write.d.ts +2 -2
- package/dist/atomic-write.js +2 -2
- package/dist/authoring.d.ts +77 -0
- package/dist/authoring.js +238 -0
- package/dist/channel.d.ts +29 -15
- package/dist/channel.js +4 -1
- package/dist/channels/agentcore-protocol.d.ts +36 -50
- package/dist/channels/agentcore-protocol.js +3 -3
- package/dist/channels/agentcore-service.d.ts +8 -18
- package/dist/channels/agentcore-service.js +108 -127
- package/dist/channels/agentcore.d.ts +8 -24
- package/dist/channels/agentcore.js +32 -65
- package/dist/channels/body.d.ts +0 -16
- package/dist/channels/body.js +0 -25
- package/dist/channels/busy.js +6 -1
- package/dist/channels/context.d.ts +4 -0
- package/dist/channels/context.js +35 -0
- package/dist/channels/discover.d.ts +18 -20
- package/dist/channels/discover.js +41 -99
- package/dist/channels/feishu/feishu-api.d.ts +54 -4
- package/dist/channels/feishu/feishu-api.js +192 -149
- package/dist/channels/feishu/feishu.d.ts +3 -0
- package/dist/channels/feishu/feishu.js +117 -106
- package/dist/channels/feishu/history.d.ts +55 -0
- package/dist/channels/feishu/history.js +199 -0
- package/dist/channels/feishu/invoke-turn.d.ts +13 -11
- package/dist/channels/feishu/invoke-turn.js +9 -10
- package/dist/channels/feishu/model.d.ts +2 -1
- package/dist/channels/feishu/normalize.js +100 -0
- package/dist/channels/feishu/preview.d.ts +2 -2
- package/dist/channels/feishu/register-webhook.d.ts +1 -0
- package/dist/channels/feishu/register-webhook.js +3 -2
- package/dist/channels/feishu/scaffold/channel.ts +65 -46
- package/dist/channels/feishu/scaffold/feishu-send.ts +38 -33
- package/dist/channels/feishu/scaffold/feishu-threads.ts +25 -0
- package/dist/channels/feishu/setup-mode.d.ts +45 -25
- package/dist/channels/feishu/setup-mode.js +74 -23
- package/dist/channels/feishu/shared-api.d.ts +24 -6
- package/dist/channels/feishu/shared-api.js +30 -24
- package/dist/channels/kit/context-buffer.d.ts +11 -2
- package/dist/channels/kit/context-buffer.js +7 -4
- package/dist/channels/kit/delivery.d.ts +19 -3
- package/dist/channels/kit/delivery.js +74 -15
- package/dist/channels/kit/event-stream.js +2 -1
- package/dist/channels/kit/invoke-turn-kit.d.ts +41 -41
- package/dist/channels/kit/invoke-turn-kit.js +62 -71
- package/dist/channels/kit/place-history.d.ts +107 -0
- package/dist/channels/kit/place-history.js +182 -0
- package/dist/channels/kit/preview-kit.d.ts +9 -5
- package/dist/channels/kit/preview-kit.js +36 -15
- package/dist/channels/kit/room-threads.d.ts +46 -0
- package/dist/channels/kit/room-threads.js +81 -0
- package/dist/channels/kit/seen.js +1 -1
- package/dist/channels/kit/stop-command.d.ts +6 -3
- package/dist/channels/kit/stop-command.js +20 -18
- package/dist/channels/kit/thread-fork.d.ts +17 -0
- package/dist/channels/kit/thread-fork.js +43 -0
- package/dist/channels/kit/thread-participants.js +1 -1
- package/dist/channels/kit/transport.d.ts +5 -0
- package/dist/channels/kit/transport.js +5 -0
- package/dist/channels/kit/turn-runner.d.ts +10 -9
- package/dist/channels/kit/turn-runner.js +17 -19
- package/dist/channels/kit/turn-store.d.ts +5 -4
- package/dist/channels/kit/turn-store.js +5 -5
- package/dist/channels/lark/lark.d.ts +3 -0
- package/dist/channels/lark/lark.js +5 -0
- package/dist/channels/lark/onboard.d.ts +5 -3
- package/dist/channels/lark/onboard.js +14 -14
- package/dist/channels/lark/scaffold/channel.ts +67 -44
- package/dist/channels/lark/scaffold/lark-send.ts +38 -33
- package/dist/channels/lark/scaffold/lark-threads.ts +25 -0
- package/dist/channels/respond.d.ts +0 -4
- package/dist/channels/respond.js +1 -1
- package/dist/channels/router.d.ts +18 -0
- package/dist/channels/router.js +68 -0
- package/dist/channels/serve.d.ts +5 -70
- package/dist/channels/serve.js +105 -287
- package/dist/channels/slack/history.d.ts +42 -0
- package/dist/channels/slack/history.js +282 -0
- package/dist/channels/slack/invoke-turn.d.ts +12 -5
- package/dist/channels/slack/invoke-turn.js +7 -5
- package/dist/channels/slack/manifest.d.ts +1 -4
- package/dist/channels/slack/manifest.js +22 -10
- package/dist/channels/slack/model.d.ts +2 -1
- package/dist/channels/slack/onboard.d.ts +0 -2
- package/dist/channels/slack/onboard.js +2 -4
- package/dist/channels/slack/onboarding-state.d.ts +0 -2
- package/dist/channels/slack/onboarding-state.js +0 -1
- package/dist/channels/slack/parse.d.ts +0 -5
- package/dist/channels/slack/parse.js +1 -16
- package/dist/channels/slack/preview.d.ts +2 -3
- package/dist/channels/slack/preview.js +78 -52
- package/dist/channels/slack/register-webhook.d.ts +1 -0
- package/dist/channels/slack/register-webhook.js +6 -5
- package/dist/channels/slack/scaffold/channel.ts +23 -24
- package/dist/channels/slack/scaffold/slack-send.ts +50 -43
- package/dist/channels/slack/scaffold/slack-threads.ts +29 -0
- package/dist/channels/slack/setup-server.d.ts +19 -0
- package/dist/channels/slack/setup-server.js +113 -11
- package/dist/channels/slack/shared-api.d.ts +15 -4
- package/dist/channels/slack/shared-api.js +19 -14
- package/dist/channels/slack/slack-api.d.ts +61 -2
- package/dist/channels/slack/slack-api.js +28 -5
- package/dist/channels/slack/slack.js +97 -52
- package/dist/channels/slack/welcomed.js +1 -1
- package/dist/channels/telegram/context-buffer.d.ts +6 -1
- package/dist/channels/telegram/context-buffer.js +19 -0
- package/dist/channels/telegram/invoke-turn.d.ts +8 -4
- package/dist/channels/telegram/invoke-turn.js +7 -7
- package/dist/channels/telegram/parse.d.ts +7 -2
- package/dist/channels/telegram/parse.js +7 -0
- package/dist/channels/telegram/preview.d.ts +2 -2
- package/dist/channels/telegram/register-webhook.d.ts +1 -0
- package/dist/channels/telegram/register-webhook.js +3 -2
- package/dist/channels/telegram/scaffold/channel.ts +27 -28
- package/dist/channels/telegram/scaffold/telegram-send.ts +61 -108
- package/dist/channels/telegram/shared-api.d.ts +34 -0
- package/dist/channels/telegram/shared-api.js +79 -0
- package/dist/channels/telegram/telegram-api.d.ts +15 -5
- package/dist/channels/telegram/telegram-api.js +10 -6
- package/dist/channels/telegram/telegram.js +27 -21
- package/dist/channels/telegram/turn-store.js +1 -1
- package/dist/channels/{kit/turn-queue.d.ts → turn-queue.d.ts} +2 -2
- package/dist/channels/{kit/turn-queue.js → turn-queue.js} +10 -10
- package/dist/cli/add-feishu.d.ts +42 -12
- package/dist/cli/add-feishu.js +177 -124
- package/dist/cli/add-slack.d.ts +8 -3
- package/dist/cli/add-slack.js +115 -63
- package/dist/cli/auth-view.d.ts +10 -3
- package/dist/cli/auth-view.js +8 -6
- package/dist/cli/box-login.d.ts +17 -7
- package/dist/cli/box-login.js +46 -12
- package/dist/cli/commands/add.d.ts +15 -4
- package/dist/cli/commands/add.js +252 -143
- package/dist/cli/commands/auth.d.ts +6 -0
- package/dist/cli/commands/auth.js +50 -0
- package/dist/cli/commands/content.d.ts +6 -0
- package/dist/cli/commands/content.js +45 -0
- package/dist/cli/commands/deploy/agentcore.js +50 -77
- package/dist/cli/commands/deploy/docker.js +38 -39
- package/dist/cli/commands/deploy/fly.js +21 -18
- package/dist/cli/commands/deploy/host-login.d.ts +26 -0
- package/dist/cli/commands/deploy/host-login.js +90 -0
- package/dist/cli/commands/deploy/railway.js +21 -26
- package/dist/cli/commands/deploy/shared.d.ts +45 -17
- package/dist/cli/commands/deploy/shared.js +34 -15
- package/dist/cli/commands/deploy.d.ts +0 -4
- package/dist/cli/commands/deploy.js +237 -50
- package/dist/cli/commands/destroy.js +8 -6
- package/dist/cli/commands/dev.d.ts +0 -2
- package/dist/cli/commands/dev.js +20 -19
- package/dist/cli/commands/env.d.ts +12 -0
- package/dist/cli/commands/env.js +190 -0
- package/dist/cli/commands/info.js +95 -156
- package/dist/cli/commands/init.d.ts +2 -2
- package/dist/cli/commands/init.js +35 -33
- package/dist/cli/commands/invoke.d.ts +6 -0
- package/dist/cli/commands/invoke.js +131 -16
- package/dist/cli/commands/login.d.ts +31 -2
- package/dist/cli/commands/login.js +413 -64
- package/dist/cli/commands/logout.d.ts +4 -0
- package/dist/cli/commands/logout.js +53 -0
- package/dist/cli/commands/logs.js +8 -6
- package/dist/cli/commands/models.d.ts +2 -1
- package/dist/cli/commands/models.js +39 -37
- package/dist/cli/commands/schedules.d.ts +21 -0
- package/dist/cli/commands/schedules.js +143 -0
- package/dist/cli/commands/start.d.ts +11 -10
- package/dist/cli/commands/start.js +35 -62
- package/dist/cli/content-view.d.ts +9 -0
- package/dist/cli/content-view.js +26 -0
- package/dist/cli/fail.d.ts +9 -12
- package/dist/cli/fail.js +17 -14
- package/dist/cli/invoke-stream.d.ts +12 -3
- package/dist/cli/invoke-stream.js +85 -23
- package/dist/cli/kernel.d.ts +9 -2
- package/dist/cli/kernel.js +15 -6
- package/dist/cli/login-relay.d.ts +3 -2
- package/dist/cli/login-relay.js +18 -6
- package/dist/cli/models-view.d.ts +5 -1
- package/dist/cli/models-view.js +1 -1
- package/dist/cli/person.d.ts +10 -0
- package/dist/cli/person.js +23 -0
- package/dist/cli/program.js +421 -203
- package/dist/cli/serve.d.ts +13 -63
- package/dist/cli/serve.js +31 -121
- package/dist/cli/shared.d.ts +21 -48
- package/dist/cli/shared.js +68 -89
- package/dist/cli/ticket.d.ts +136 -0
- package/dist/cli/ticket.js +476 -0
- package/dist/client.d.ts +7 -0
- package/dist/client.js +2 -0
- package/dist/content/declare.d.ts +70 -0
- package/dist/content/declare.js +163 -0
- package/dist/content/file.d.ts +32 -0
- package/dist/content/file.js +119 -0
- package/dist/content/git.d.ts +41 -0
- package/dist/content/git.js +217 -0
- package/dist/content/mount.d.ts +2 -0
- package/dist/content/mount.js +15 -0
- package/dist/content/resolve.d.ts +52 -0
- package/dist/content/resolve.js +151 -0
- package/dist/content/source.d.ts +27 -0
- package/dist/content/source.js +53 -0
- package/dist/conversation-sessions.d.ts +26 -0
- package/dist/conversation-sessions.js +99 -0
- package/dist/declared-secrets.d.ts +19 -37
- package/dist/declared-secrets.js +16 -58
- package/dist/deploy/agentcore/destroy.d.ts +3 -3
- package/dist/deploy/agentcore/destroy.js +46 -28
- package/dist/deploy/agentcore/forwarder.js +105 -22
- package/dist/deploy/agentcore/logs.js +1 -1
- package/dist/deploy/agentcore/plan.d.ts +10 -24
- package/dist/deploy/agentcore/plan.js +31 -135
- package/dist/deploy/agentcore/run.d.ts +1 -1
- package/dist/deploy/agentcore/run.js +8 -5
- package/dist/deploy/agentcore/shell.d.ts +1 -1
- package/dist/deploy/agentcore/shell.js +5 -5
- package/dist/deploy/api.d.ts +34 -0
- package/dist/deploy/api.js +50 -0
- package/dist/deploy/box-shell.d.ts +6 -0
- package/dist/deploy/box-shell.js +7 -0
- package/dist/deploy/build-context.d.ts +7 -5
- package/dist/deploy/build-context.js +41 -35
- package/dist/deploy/channel-ingress.d.ts +6 -1
- package/dist/deploy/channel-ingress.js +18 -5
- package/dist/deploy/container.d.ts +22 -9
- package/dist/deploy/container.js +96 -55
- package/dist/deploy/docker/plan.d.ts +3 -2
- package/dist/deploy/docker/plan.js +13 -14
- package/dist/deploy/docker/run.d.ts +2 -2
- package/dist/deploy/docker/run.js +8 -4
- package/dist/deploy/fly/plan.d.ts +1 -1
- package/dist/deploy/fly/plan.js +12 -21
- package/dist/deploy/fly/run.d.ts +10 -6
- package/dist/deploy/fly/run.js +11 -6
- package/dist/deploy/hosts.d.ts +2 -1
- package/dist/deploy/hosts.js +2 -1
- package/dist/deploy/preflight.d.ts +21 -23
- package/dist/deploy/preflight.js +222 -201
- package/dist/deploy/railway/plan.d.ts +8 -6
- package/dist/deploy/railway/plan.js +15 -58
- package/dist/deploy/railway/run.d.ts +8 -3
- package/dist/deploy/railway/run.js +12 -8
- package/dist/deploy/residency.d.ts +5 -11
- package/dist/deploy/residency.js +0 -6
- package/dist/deploy/runner.d.ts +1 -1
- package/dist/deploy/runner.js +1 -1
- package/dist/deploy/secrets.d.ts +16 -2
- package/dist/deploy/secrets.js +33 -6
- package/dist/deploy/workspace.d.ts +11 -6
- package/dist/deploy/workspace.js +55 -38
- package/dist/dev-supervisor.d.ts +11 -2
- package/dist/dev-supervisor.js +51 -26
- package/dist/effect-port.d.ts +4 -4
- package/dist/effect-port.js +4 -4
- package/dist/environment/apt.d.ts +4 -0
- package/dist/environment/apt.js +32 -0
- package/dist/environment/declare.d.ts +59 -0
- package/dist/environment/declare.js +210 -0
- package/dist/environment/mise.d.ts +50 -0
- package/dist/environment/mise.js +268 -0
- package/dist/feishu.d.ts +2 -2
- package/dist/feishu.js +2 -2
- package/dist/git.d.ts +13 -0
- package/dist/git.js +55 -0
- package/dist/harnesses/models/catalog.d.ts +20 -0
- package/dist/harnesses/models/catalog.js +254 -0
- package/dist/{engines/pi/auth.d.ts → harnesses/models/credentials.d.ts} +3 -3
- package/dist/{engines/pi/auth.js → harnesses/models/credentials.js} +3 -3
- package/dist/harnesses/models/environment.d.ts +43 -0
- package/dist/harnesses/models/environment.js +82 -0
- package/dist/{engines/pi → harnesses/models}/login.d.ts +57 -26
- package/dist/{engines/pi → harnesses/models}/login.js +187 -79
- package/dist/harnesses/models/models.d.ts +83 -0
- package/dist/harnesses/models/models.js +158 -0
- package/dist/harnesses/pi-durable/agent.d.ts +42 -0
- package/dist/harnesses/pi-durable/agent.js +579 -0
- package/dist/harnesses/pi-durable/defaults.d.ts +28 -0
- package/dist/harnesses/pi-durable/defaults.js +26 -0
- package/dist/harnesses/pi-durable/define.d.ts +77 -0
- package/dist/harnesses/pi-durable/define.js +28 -0
- package/dist/harnesses/pi-durable/entries.d.ts +32 -0
- package/dist/harnesses/pi-durable/entries.js +126 -0
- package/dist/harnesses/pi-durable/events.d.ts +25 -0
- package/dist/harnesses/pi-durable/events.js +238 -0
- package/dist/harnesses/pi-durable/ids.d.ts +16 -0
- package/dist/harnesses/pi-durable/ids.js +55 -0
- package/dist/harnesses/pi-durable/messages.d.ts +41 -0
- package/dist/harnesses/pi-durable/messages.js +116 -0
- package/dist/harnesses/pi-durable/open.d.ts +88 -0
- package/dist/harnesses/pi-durable/open.js +329 -0
- package/dist/harnesses/pi-durable/reads.d.ts +30 -0
- package/dist/harnesses/pi-durable/reads.js +94 -0
- package/dist/harnesses/pi-durable/registry.d.ts +18 -0
- package/dist/harnesses/pi-durable/registry.js +56 -0
- package/dist/harnesses/pi-durable/release.d.ts +13 -0
- package/dist/harnesses/pi-durable/release.js +40 -0
- package/dist/harnesses/pi-durable/serve.d.ts +80 -0
- package/dist/harnesses/pi-durable/serve.js +156 -0
- package/dist/harnesses/pi-durable/sessions.d.ts +27 -0
- package/dist/harnesses/pi-durable/sessions.js +47 -0
- package/dist/harnesses/pi-durable/storage.d.ts +4 -0
- package/dist/harnesses/pi-durable/storage.js +49 -0
- package/dist/harnesses/pi-durable/stream.d.ts +20 -0
- package/dist/harnesses/pi-durable/stream.js +221 -0
- package/dist/harnesses/pi-durable/text.d.ts +30 -0
- package/dist/harnesses/pi-durable/text.js +292 -0
- package/dist/harnesses/pi-durable/wake.d.ts +4 -0
- package/dist/harnesses/pi-durable/wake.js +81 -0
- package/dist/http/client.d.ts +6 -0
- package/dist/http/client.js +256 -0
- package/dist/http/contract.d.ts +541 -0
- package/dist/http/contract.js +179 -0
- package/dist/http/server.d.ts +34 -0
- package/dist/http/server.js +194 -0
- package/dist/index.d.ts +17 -4
- package/dist/index.js +10 -5
- package/dist/lark.d.ts +2 -2
- package/dist/lark.js +2 -2
- package/dist/locked-file.d.ts +17 -0
- package/dist/{engines/pi/locked-file.js → locked-file.js} +16 -10
- package/dist/once.d.ts +6 -0
- package/dist/once.js +23 -0
- package/dist/paths.d.ts +36 -52
- package/dist/paths.js +66 -182
- package/dist/runtime.d.ts +25 -2
- package/dist/runtime.js +27 -0
- package/dist/scaffold/add-channel.d.ts +14 -27
- package/dist/scaffold/add-channel.js +82 -180
- package/dist/scaffold/init.d.ts +17 -18
- package/dist/scaffold/init.js +87 -99
- package/dist/scaffold/templates/SYSTEM.md +12 -0
- package/dist/scaffold/templates/env.example +4 -10
- package/dist/scaffold/templates/fastagent.config.ts +21 -33
- package/dist/scaffold/templates/gitignore +8 -1
- package/dist/scaffold/templates/skills/writing-great-skills/SKILL.md +1 -2
- package/dist/scaffold/templates.d.ts +9 -4
- package/dist/scaffold/templates.js +7 -5
- package/dist/scaffold/vendor-skill.d.ts +1 -4
- package/dist/scaffold/vendor-skill.js +5 -6
- package/dist/schedule/cron.d.ts +13 -0
- package/dist/schedule/cron.js +52 -0
- package/dist/schedule/eventbridge-cron.d.ts +17 -0
- package/dist/schedule/eventbridge-cron.js +88 -0
- package/dist/schedule/schedule.d.ts +23 -0
- package/dist/schedule/schedule.js +34 -0
- package/dist/schedule/scheduler.d.ts +34 -33
- package/dist/schedule/scheduler.js +251 -137
- package/dist/schedule/state.d.ts +4 -14
- package/dist/schedule/state.js +7 -7
- package/dist/schedule/wake-alarm.d.ts +22 -2
- package/dist/schedule/wake-alarm.js +66 -20
- package/dist/schedule/wakeups.d.ts +16 -15
- package/dist/schedule/wakeups.js +47 -45
- package/dist/service.d.ts +56 -169
- package/dist/service.js +91 -187
- package/dist/serving-command.d.ts +10 -0
- package/dist/serving-command.js +16 -0
- package/dist/slack.d.ts +1 -1
- package/dist/slack.js +1 -1
- package/dist/{channels/kit/state.js → state-file.js} +6 -6
- package/dist/telegram.d.ts +1 -0
- package/dist/telegram.js +1 -0
- package/dist/tunnel.d.ts +3 -0
- package/dist/tunnel.js +12 -4
- package/dist/value-file.d.ts +21 -0
- package/dist/value-file.js +108 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.js +14 -1
- package/package.json +18 -28
- package/dist/agent.d.ts +0 -106
- package/dist/agent.js +0 -21
- package/dist/channels/control.d.ts +0 -31
- package/dist/channels/control.js +0 -329
- package/dist/channels/define-channel.d.ts +0 -39
- package/dist/channels/define-channel.js +0 -9
- package/dist/channels/feishu/context-buffer.d.ts +0 -35
- package/dist/channels/feishu/context-buffer.js +0 -65
- package/dist/channels/feishu/scaffold/channel.websocket.ts +0 -31
- package/dist/channels/http.d.ts +0 -23
- package/dist/channels/http.js +0 -57
- package/dist/channels/lark/scaffold/channel.websocket.ts +0 -31
- package/dist/channels/slack/context-buffer.d.ts +0 -23
- package/dist/channels/slack/context-buffer.js +0 -37
- package/dist/channels/sse.d.ts +0 -4
- package/dist/channels/sse.js +0 -66
- package/dist/cli/commands/chat.d.ts +0 -3
- package/dist/cli/commands/chat.js +0 -14
- package/dist/cli/commands/routine-run.d.ts +0 -6
- package/dist/cli/commands/routine-run.js +0 -46
- package/dist/cli/commands/routine.d.ts +0 -25
- package/dist/cli/commands/routine.js +0 -122
- package/dist/cli/commands/tool.d.ts +0 -1
- package/dist/cli/commands/tool.js +0 -57
- package/dist/collect.d.ts +0 -63
- package/dist/collect.js +0 -90
- package/dist/core.d.ts +0 -13
- package/dist/core.js +0 -15
- package/dist/engines/pi/agent-models.d.ts +0 -83
- package/dist/engines/pi/agent-models.js +0 -120
- package/dist/engines/pi/agent-session-factory.d.ts +0 -121
- package/dist/engines/pi/agent-session-factory.js +0 -535
- package/dist/engines/pi/chat.d.ts +0 -3
- package/dist/engines/pi/chat.js +0 -8
- package/dist/engines/pi/config.d.ts +0 -71
- package/dist/engines/pi/config.js +0 -199
- package/dist/engines/pi/create.d.ts +0 -170
- package/dist/engines/pi/create.js +0 -343
- package/dist/engines/pi/definition.d.ts +0 -74
- package/dist/engines/pi/definition.js +0 -236
- package/dist/engines/pi/entry-images.d.ts +0 -14
- package/dist/engines/pi/entry-images.js +0 -23
- package/dist/engines/pi/invoke-session.d.ts +0 -18
- package/dist/engines/pi/invoke-session.js +0 -403
- package/dist/engines/pi/locked-file.d.ts +0 -9
- package/dist/engines/pi/machine.d.ts +0 -53
- package/dist/engines/pi/machine.js +0 -137
- package/dist/engines/pi/models.d.ts +0 -200
- package/dist/engines/pi/models.js +0 -533
- package/dist/engines/pi/open.d.ts +0 -180
- package/dist/engines/pi/open.js +0 -270
- package/dist/engines/pi/openai-account-models.d.ts +0 -35
- package/dist/engines/pi/openai-account-models.js +0 -116
- package/dist/engines/pi/report.d.ts +0 -18
- package/dist/engines/pi/report.js +0 -59
- package/dist/engines/pi/retry-event.d.ts +0 -6
- package/dist/engines/pi/retry-event.js +0 -15
- package/dist/engines/pi/service.d.ts +0 -9
- package/dist/engines/pi/service.js +0 -14
- package/dist/engines/pi/session-builder.d.ts +0 -13
- package/dist/engines/pi/session-builder.js +0 -117
- package/dist/engines/pi/session-control.d.ts +0 -77
- package/dist/engines/pi/session-control.js +0 -908
- package/dist/engines/pi/session-effects.d.ts +0 -14
- package/dist/engines/pi/session-effects.js +0 -30
- package/dist/engines/pi/session-inheritance.d.ts +0 -21
- package/dist/engines/pi/session-inheritance.js +0 -204
- package/dist/engines/pi/session-markers.d.ts +0 -49
- package/dist/engines/pi/session-markers.js +0 -60
- package/dist/engines/pi/session-settings.d.ts +0 -67
- package/dist/engines/pi/session-settings.js +0 -119
- package/dist/engines/pi/session-store.d.ts +0 -69
- package/dist/engines/pi/session-store.js +0 -430
- package/dist/engines/pi/tool-context.d.ts +0 -45
- package/dist/engines/pi/tool-context.js +0 -31
- package/dist/engines/pi/tool.d.ts +0 -99
- package/dist/engines/pi/tool.js +0 -118
- package/dist/engines/pi/turn-kit.d.ts +0 -92
- package/dist/engines/pi/turn-kit.js +0 -288
- package/dist/engines/pi/wake-tool.d.ts +0 -9
- package/dist/engines/pi/wake-tool.js +0 -92
- package/dist/loader.d.ts +0 -41
- package/dist/loader.js +0 -116
- package/dist/node.d.ts +0 -3
- package/dist/node.js +0 -4
- package/dist/observe.d.ts +0 -6
- package/dist/observe.js +0 -47
- package/dist/pi.d.ts +0 -25
- package/dist/pi.js +0 -15
- package/dist/scaffold/templates/APPEND_SYSTEM.md +0 -12
- package/dist/scaffold/templates/tools/fetch-url.ts +0 -25
- package/dist/schedule/discover.d.ts +0 -17
- package/dist/schedule/discover.js +0 -61
- package/dist/schedule/routine.d.ts +0 -43
- package/dist/schedule/routine.js +0 -32
- package/dist/schedule/run.d.ts +0 -55
- package/dist/schedule/run.js +0 -146
- package/dist/secrets-gate.d.ts +0 -32
- package/dist/secrets-gate.js +0 -33
- package/dist/session-remote.d.ts +0 -47
- package/dist/session-remote.js +0 -460
- package/dist/session.d.ts +0 -466
- package/dist/session.js +0 -57
- /package/dist/{channels/kit/state.d.ts → state-file.d.ts} +0 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An Agent over HTTP (SPEC.md §8, §9): the interface `openAgent` gives in process, called through the contract the
|
|
3
|
+
* server answers from. Runs wherever `fetch` does (Node, Bun, Deno, Workers): nothing here needs a runtime's own API.
|
|
4
|
+
*/
|
|
5
|
+
import * as Cause from "effect/Cause";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Exit from "effect/Exit";
|
|
8
|
+
import * as Schema from "effect/Schema";
|
|
9
|
+
import * as Stream from "effect/Stream";
|
|
10
|
+
import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/http";
|
|
11
|
+
import { HttpApiClient } from "effect/http-api";
|
|
12
|
+
import { AgentError, CompactOptions, CreateSessionOptions, EntriesOptions, LIMITS, ListOptions, MessageKey, SendRequest, SessionChanges, Wait, agentError, errorData, hasEnded, } from "../agent-api.js";
|
|
13
|
+
import { AgentHttpApi, MESSAGE_STREAM_EVENT_TYPES, Refusal, SESSION_EVENT_TYPES } from "./contract.js";
|
|
14
|
+
/**
|
|
15
|
+
* What a request checks before it is sent, with the schema the in-process Agent checks it with. A field given as
|
|
16
|
+
* `undefined` is left out (§4): JSON would send it as `null`, which in a session's changes clears the field.
|
|
17
|
+
*/
|
|
18
|
+
function checked(schema, value, what) {
|
|
19
|
+
const exit = Schema.decodeUnknownExit(schema)(value);
|
|
20
|
+
if (Exit.isSuccess(exit))
|
|
21
|
+
return present(exit.value);
|
|
22
|
+
throw agentError("invalid_request", `${what}: ${String(Cause.squash(exit.cause))}`);
|
|
23
|
+
}
|
|
24
|
+
function present(value) {
|
|
25
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
26
|
+
return value;
|
|
27
|
+
return Object.fromEntries(Object.entries(value).flatMap(([key, field]) => (field === undefined ? [] : [[key, present(field)]])));
|
|
28
|
+
}
|
|
29
|
+
const rejected = (signal) => Effect.callback((resume) => {
|
|
30
|
+
const onAbort = () => resume(Effect.fail(signal.reason));
|
|
31
|
+
if (signal.aborted)
|
|
32
|
+
return onAbort();
|
|
33
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
34
|
+
return Effect.sync(() => signal.removeEventListener("abort", onAbort));
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* A refusal at a status the contract does not declare, a later server's: its body says what it is, as any refusal's
|
|
38
|
+
* does (§7.1). A body that is not one (a proxy's page) leaves the failure the request met.
|
|
39
|
+
*/
|
|
40
|
+
const refusalIn = (error) => {
|
|
41
|
+
const response = error.reason?.response;
|
|
42
|
+
if (response === undefined || response.status < 400)
|
|
43
|
+
return Effect.fail(error);
|
|
44
|
+
return response.json.pipe(Effect.flatMap(Schema.decodeUnknownEffect(Refusal)), Effect.matchEffect({ onSuccess: Effect.fail, onFailure: () => Effect.fail(error) }));
|
|
45
|
+
};
|
|
46
|
+
const reasonOf = (error) => error.reason;
|
|
47
|
+
/** A request this client could not make: it never left. */
|
|
48
|
+
const unsent = (error) => ["EncodeError", "InvalidUrlError"].includes(reasonOf(error)?._tag ?? "");
|
|
49
|
+
const said = (error) => (error instanceof Error ? error.message : String(error));
|
|
50
|
+
/** What stopped a request that left, said for a Caller. */
|
|
51
|
+
const whatFailed = (baseUrl, error) => reasonOf(error)?._tag === "TransportError"
|
|
52
|
+
? `could not reach the agent at ${baseUrl}: ${said(error)}`
|
|
53
|
+
: `the agent at ${baseUrl} answered what this client cannot read: ${said(error)}`;
|
|
54
|
+
/**
|
|
55
|
+
* A read's failure, and a write's other than a send's: a refusal as the agent answered it; one that could not get
|
|
56
|
+
* through or met a server's error may be sent again, since repeating any request but a send does no harm (§7);
|
|
57
|
+
* anything else is not the Caller's to retry.
|
|
58
|
+
*/
|
|
59
|
+
function readFailure(baseUrl, error) {
|
|
60
|
+
if (error instanceof AgentError)
|
|
61
|
+
return error;
|
|
62
|
+
if (unsent(error))
|
|
63
|
+
return agentError("internal", `this client could not make a request of ${baseUrl}: ${said(error)}`);
|
|
64
|
+
const reason = reasonOf(error);
|
|
65
|
+
const status = reason?.response?.status;
|
|
66
|
+
const again = reason?._tag === "TransportError" || (status !== undefined && status >= 500);
|
|
67
|
+
return agentError(again ? "unavailable" : "internal", whatFailed(baseUrl, error));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* A send's failure, by how far it got (§5.2), the one place that says so. Refused before it was recorded, it is the
|
|
71
|
+
* refusal; recorded, or perhaps recorded, it is `unconfirmed` with what finds it: the key, the client's own when the
|
|
72
|
+
* Caller gave none, and the message's id once known.
|
|
73
|
+
*/
|
|
74
|
+
function sendFailure(baseUrl, stage, error) {
|
|
75
|
+
const { sessionId, key, messageId } = stage;
|
|
76
|
+
const finds = { sessionId, idempotencyKey: key, ...(messageId === undefined ? {} : { messageId }) };
|
|
77
|
+
if (error instanceof AgentError && error.code === "unconfirmed") {
|
|
78
|
+
const known = typeof error.details === "object" && error.details !== null ? error.details : {};
|
|
79
|
+
return new AgentError({ ...errorData(error), details: { ...known, ...finds } });
|
|
80
|
+
}
|
|
81
|
+
if (messageId !== undefined) {
|
|
82
|
+
return agentError("unconfirmed", `The message was recorded, and waiting for it failed: ${said(error)}`, finds);
|
|
83
|
+
}
|
|
84
|
+
if (error instanceof AgentError)
|
|
85
|
+
return error;
|
|
86
|
+
if (unsent(error))
|
|
87
|
+
return readFailure(baseUrl, error);
|
|
88
|
+
return agentError("unconfirmed", `${whatFailed(baseUrl, error)}; the message may have been recorded`, finds);
|
|
89
|
+
}
|
|
90
|
+
export function connectAgent(url, options) {
|
|
91
|
+
const client = Effect.runSync(HttpApiClient.make(AgentHttpApi, {
|
|
92
|
+
baseUrl: url,
|
|
93
|
+
transformClient: HttpClient.mapRequest(HttpClientRequest.bearerToken(options.apiKey)),
|
|
94
|
+
}).pipe(Effect.provide(FetchHttpClient.layer))).agent;
|
|
95
|
+
const read = (error) => readFailure(url, error);
|
|
96
|
+
const sent = (stage) => (error) => sendFailure(url, stage, error);
|
|
97
|
+
/**
|
|
98
|
+
* A request: rejected with its signal's reason once its Caller lets go, and otherwise with what `failure` makes of
|
|
99
|
+
* the failure, as it met it.
|
|
100
|
+
*/
|
|
101
|
+
const request = async (effect, signal, failure = read) => {
|
|
102
|
+
if (signal?.aborted)
|
|
103
|
+
throw signal.reason;
|
|
104
|
+
const answered = effect.pipe(Effect.catch(refusalIn));
|
|
105
|
+
const exit = await Effect.runPromiseExit((signal === undefined ? answered : Effect.raceFirst(answered, rejected(signal))).pipe(Effect.provideService(HttpClient.TracerPropagationEnabled, false)));
|
|
106
|
+
if (Exit.isSuccess(exit))
|
|
107
|
+
return exit.value;
|
|
108
|
+
if (signal?.aborted)
|
|
109
|
+
throw signal.reason;
|
|
110
|
+
throw failure(Cause.squash(exit.cause));
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Asks again until the message ends or the Caller's `wait` is over: a request waits at most a minute (§7). What a
|
|
114
|
+
* request after the first that fails means is `failureAfter`'s to say: for a send, the message is recorded by then.
|
|
115
|
+
*/
|
|
116
|
+
const waited = async (first, options, failureAfter = () => read) => {
|
|
117
|
+
const wait = options?.wait === undefined ? undefined : checked(Wait, options.wait, "wait");
|
|
118
|
+
const deadline = wait === undefined ? undefined : Date.now() + wait * 1000;
|
|
119
|
+
const remaining = () => (deadline === undefined ? 0 : Math.max(0, deadline - Date.now()) / 1000);
|
|
120
|
+
const capped = () => Math.min(remaining(), LIMITS.httpWaitSeconds);
|
|
121
|
+
let message = await first(wait === undefined ? undefined : capped());
|
|
122
|
+
while (!hasEnded(message) && remaining() > 0) {
|
|
123
|
+
const { sessionId, id: messageId } = message;
|
|
124
|
+
message = await request(client.getMessage({ params: { sessionId, messageId }, query: { wait: capped() } }), options?.signal, failureAfter(message));
|
|
125
|
+
}
|
|
126
|
+
return message;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* An event stream. Until it has delivered an event, a failure rejects its first read with what `refused` makes of
|
|
130
|
+
* it, an answer that ends before its first event included; once it has, a connection that fails or ends before the
|
|
131
|
+
* stream's own end ends it with `stream_error` (§6). A signal ends it, rejecting the read waiting then with its reason.
|
|
132
|
+
*/
|
|
133
|
+
const watched = (opened, stream) => {
|
|
134
|
+
const { known, isLast, refused, signal } = stream;
|
|
135
|
+
const lostWith = (why) => ({ type: "stream_error", error: errorData(agentError("unavailable", why)) });
|
|
136
|
+
let delivered = false;
|
|
137
|
+
let ended = false;
|
|
138
|
+
const events = Stream.unwrap(opened.pipe(Effect.catch(refusalIn), Effect.provideService(HttpClient.TracerPropagationEnabled, false))).pipe(
|
|
139
|
+
// A type a later server sends is not one this Caller can be handed (§7.1).
|
|
140
|
+
Stream.filter((event) => known.has(event.type)), Stream.tap(() => Effect.sync(() => {
|
|
141
|
+
delivered = true;
|
|
142
|
+
})), Stream.catchCause((cause) => delivered
|
|
143
|
+
? Stream.make(lostWith(`the connection to the agent failed: ${said(Cause.squash(cause))}`))
|
|
144
|
+
: Stream.fail(refused(Cause.squash(cause)))), Stream.takeUntil((event) => {
|
|
145
|
+
ended = event.type === "stream_error" || isLast(event);
|
|
146
|
+
return ended;
|
|
147
|
+
}), Stream.concat(Stream.suspend(() => {
|
|
148
|
+
if (ended)
|
|
149
|
+
return Stream.empty;
|
|
150
|
+
if (delivered)
|
|
151
|
+
return Stream.make(lostWith("the agent ended the stream"));
|
|
152
|
+
return Stream.fail(refused(new Error("the answer ended before its first event")));
|
|
153
|
+
})));
|
|
154
|
+
if (signal === undefined)
|
|
155
|
+
return Stream.toAsyncIterable(events);
|
|
156
|
+
const iterable = Stream.toAsyncIterable(events.pipe(Stream.interruptWhen(rejected(signal))));
|
|
157
|
+
return {
|
|
158
|
+
[Symbol.asyncIterator]: () => {
|
|
159
|
+
const iterator = iterable[Symbol.asyncIterator]();
|
|
160
|
+
return {
|
|
161
|
+
// The read waiting when the signal fires rejects with its reason, and so does every read after it.
|
|
162
|
+
next: async () => {
|
|
163
|
+
if (signal.aborted)
|
|
164
|
+
throw signal.reason;
|
|
165
|
+
return iterator.next();
|
|
166
|
+
},
|
|
167
|
+
return: async () => (await iterator.return?.()) ?? { done: true, value: undefined },
|
|
168
|
+
};
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
/** A send carries a key, the Caller's or one of its own, so that one whose answer was lost can be found (§5.2). */
|
|
173
|
+
const keyed = (sendRequest, what) => {
|
|
174
|
+
const { sessionId, idempotencyKey, ...body } = checked(SendRequest, sendRequest, what);
|
|
175
|
+
return { stage: { sessionId, key: idempotencyKey ?? crypto.randomUUID() }, body };
|
|
176
|
+
};
|
|
177
|
+
return {
|
|
178
|
+
info: () => request(client.info()),
|
|
179
|
+
usage: () => request(client.usage()),
|
|
180
|
+
sessions: {
|
|
181
|
+
create: async (createOptions) => request(client.createSession({ payload: checked(CreateSessionOptions, createOptions ?? {}, "sessions.create") })),
|
|
182
|
+
get: (sessionId) => request(client.getSession({ params: { sessionId } })),
|
|
183
|
+
list: async (listOptions) => (await request(client.listSessions({ query: checked(ListOptions, listOptions ?? {}, "sessions.list") }))),
|
|
184
|
+
update: async (sessionId, changes) => request(client.updateSession({ params: { sessionId }, payload: checked(SessionChanges, changes, "sessions.update") })),
|
|
185
|
+
entries: async (sessionId, entriesOptions) => (await request(client.entries({
|
|
186
|
+
params: { sessionId },
|
|
187
|
+
query: checked(EntriesOptions, entriesOptions ?? {}, "sessions.entries"),
|
|
188
|
+
}))),
|
|
189
|
+
events: (sessionId, eventsOptions) => watched(client.events({
|
|
190
|
+
params: { sessionId },
|
|
191
|
+
query: { after: eventsOptions?.after },
|
|
192
|
+
headers: { "last-event-id": undefined },
|
|
193
|
+
}), { known: SESSION_EVENT_TYPES, isLast: () => false, refused: read, signal: eventsOptions?.signal }),
|
|
194
|
+
cancel: async (sessionId) => {
|
|
195
|
+
const { stopped } = await request(client.cancel({ params: { sessionId } }));
|
|
196
|
+
return { stopped: [...stopped] };
|
|
197
|
+
},
|
|
198
|
+
compact: async (sessionId, compactOptions) => {
|
|
199
|
+
await request(client.compact({
|
|
200
|
+
params: { sessionId },
|
|
201
|
+
payload: checked(CompactOptions, compactOptions ?? {}, "sessions.compact"),
|
|
202
|
+
}));
|
|
203
|
+
},
|
|
204
|
+
attachment: (sessionId, ref) => request(Effect.gen(function* () {
|
|
205
|
+
const response = yield* client.attachment({ params: { sessionId, ref }, responseMode: "response-only" });
|
|
206
|
+
if (response.status !== 200) {
|
|
207
|
+
// A refusal fails here, decoded; a body this endpoint never answers a refusal with is said as such.
|
|
208
|
+
yield* decodeAttachmentRefusal(response);
|
|
209
|
+
return yield* Effect.fail(agentError("internal", `the agent answered ${response.status} with an image`));
|
|
210
|
+
}
|
|
211
|
+
const data = new Uint8Array(yield* response.arrayBuffer);
|
|
212
|
+
return { mimeType: response.headers["content-type"] ?? "application/octet-stream", data };
|
|
213
|
+
})),
|
|
214
|
+
},
|
|
215
|
+
messages: {
|
|
216
|
+
send: async (sendRequest, sendOptions) => {
|
|
217
|
+
const { stage, body } = keyed(sendRequest, "messages.send");
|
|
218
|
+
return waited((wait) => request(client.send({
|
|
219
|
+
params: { sessionId: stage.sessionId },
|
|
220
|
+
headers: { "idempotency-key": stage.key },
|
|
221
|
+
payload: { ...body, wait },
|
|
222
|
+
}), sendOptions?.signal, sent(stage)), sendOptions, (message) => sent({ ...stage, messageId: message.id }));
|
|
223
|
+
},
|
|
224
|
+
stream: (sendRequest, streamOptions) => {
|
|
225
|
+
// Checked on the first read, which a refusal rejects (§6.2): until then there is no stage to fail at.
|
|
226
|
+
let stage;
|
|
227
|
+
let messageId;
|
|
228
|
+
return watched(Effect.try({ try: () => keyed(sendRequest, "messages.stream"), catch: (error) => error }).pipe(Effect.flatMap((keying) => {
|
|
229
|
+
stage = keying.stage;
|
|
230
|
+
return client.send({
|
|
231
|
+
params: { sessionId: keying.stage.sessionId },
|
|
232
|
+
headers: { "idempotency-key": keying.stage.key },
|
|
233
|
+
payload: { ...keying.body, stream: true },
|
|
234
|
+
});
|
|
235
|
+
})), {
|
|
236
|
+
known: MESSAGE_STREAM_EVENT_TYPES,
|
|
237
|
+
isLast: (event) => {
|
|
238
|
+
if (event.type === "message")
|
|
239
|
+
messageId = event.message.id;
|
|
240
|
+
return event.type === "done" && event.message.id === messageId;
|
|
241
|
+
},
|
|
242
|
+
// The answer begins once the message is recorded, so a failure before its first event is a send's.
|
|
243
|
+
refused: (error) => (stage === undefined ? read(error) : sent(stage)(error)),
|
|
244
|
+
signal: streamOptions?.signal,
|
|
245
|
+
});
|
|
246
|
+
},
|
|
247
|
+
get: async (key, getOptions) => {
|
|
248
|
+
const at = checked(MessageKey, key, "messages.get");
|
|
249
|
+
return waited((wait) => request("messageId" in at
|
|
250
|
+
? client.getMessage({ params: at, query: { wait } })
|
|
251
|
+
: client.getMessageByKey({ params: at, query: { wait } }), getOptions?.signal), getOptions);
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
const decodeAttachmentRefusal = HttpApiClient.decodeResponse(AgentHttpApi, { group: "agent", endpoint: "attachment" });
|