@stage-labs/metro 0.1.0-beta.31 → 0.1.0-beta.310
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/dist/agent.js +123 -0
- package/dist/api.js +9 -129
- package/dist/automation.js +56 -0
- package/dist/child.js +33 -0
- package/dist/claude-env.js +104 -0
- package/dist/claude-settings.js +40 -0
- package/dist/cli.js +62 -136
- package/dist/control.js +19 -103
- package/dist/hold.js +210 -0
- package/dist/local.js +43 -0
- package/dist/lock.js +62 -0
- package/dist/memory.js +206 -0
- package/dist/node-name.js +71 -0
- package/dist/provider-flags.js +9 -0
- package/dist/root-release-io.js +160 -0
- package/dist/root-release.js +74 -0
- package/dist/route.js +65 -0
- package/dist/runtime-install.js +106 -0
- package/dist/runtime.js +29 -52
- package/dist/serve.js +157 -0
- package/dist/service.js +328 -0
- package/dist/tail.js +10 -11
- package/dist/update.js +13 -1
- package/hooks/guard.mjs +77 -0
- package/hooks/policy.mjs +74 -0
- package/hooks/session-start.mjs +31 -0
- package/package.json +6 -25
- package/runtime/node_modules/@metro-labs/core/package.json +58 -0
- package/runtime/node_modules/@metro-labs/core/src/automation-files.ts +216 -0
- package/runtime/node_modules/@metro-labs/core/src/automation-store.ts +171 -0
- package/runtime/node_modules/@metro-labs/core/src/automation-types.ts +141 -0
- package/runtime/node_modules/@metro-labs/core/src/call.ts +81 -0
- package/runtime/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/events.ts +54 -6
- package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/ids.ts +10 -1
- package/runtime/node_modules/@metro-labs/core/src/is-record.ts +2 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/stations → core/src}/lines.ts +22 -26
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/protocol.ts +7 -4
- package/runtime/node_modules/@metro-labs/core/src/runner-activity.ts +270 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/secure-fs.ts +17 -0
- package/runtime/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
- package/runtime/node_modules/@metro-labs/core/src/station-names.ts +14 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
- package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/attachments.ts +9 -3
- package/runtime/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
- package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/station-runtime.ts +6 -11
- package/runtime/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
- package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/types.ts +20 -1
- package/runtime/node_modules/@metro-labs/core/src/tickets.ts +44 -0
- package/runtime/node_modules/@metro-labs/core/src/version.ts +2 -0
- package/runtime/node_modules/@metro-labs/daemon/package.json +51 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/agent-fs.ts +246 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/crontab.ts +44 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files-api.ts +12 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files.ts +89 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/home-fs.ts +86 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/job-env.ts +39 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/metro-home.ts +42 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/provision.ts +57 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedule-detail.ts +93 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules-api.ts +27 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules.ts +144 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/unit-files.ts +43 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/user.ts +110 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/view.ts +90 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/account-attach.ts +19 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/account-lookups.ts +55 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/account-routes.ts +76 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/accounts-api.ts +362 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/admin.ts +30 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/allowlist.ts +59 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/api.ts +131 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/bundle.ts +124 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/file-admin.ts +317 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/files.ts +142 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/db/key-map.ts → daemon/src/agents/keys.ts} +1 -11
- package/runtime/node_modules/@metro-labs/daemon/src/agents/map.ts +135 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/policy-route.ts +27 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-scope.ts → daemon/src/agents/scope.ts} +2 -2
- package/runtime/node_modules/@metro-labs/daemon/src/agents/sender-cards.ts +94 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/senders.ts +38 -0
- package/runtime/node_modules/@metro-labs/daemon/src/approvals/api.ts +55 -0
- package/runtime/node_modules/@metro-labs/daemon/src/approvals/owner-line.ts +45 -0
- package/runtime/node_modules/@metro-labs/daemon/src/approvals/pending.ts +190 -0
- package/runtime/node_modules/@metro-labs/daemon/src/approvals/preview.ts +66 -0
- package/runtime/node_modules/@metro-labs/daemon/src/boot/boot.ts +264 -0
- package/runtime/node_modules/@metro-labs/daemon/src/boot/connect-hint.ts +36 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/crash-guard.ts +1 -1
- package/runtime/node_modules/@metro-labs/daemon/src/boot/local-owner.ts +21 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/paths.ts +8 -36
- package/runtime/node_modules/@metro-labs/daemon/src/channels/addressed.ts +26 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/inbound.ts +99 -73
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/media-note.ts +11 -7
- package/runtime/node_modules/@metro-labs/daemon/src/channels/notice.ts +22 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/pending.ts +13 -1
- package/runtime/node_modules/@metro-labs/daemon/src/channels/react-note.ts +13 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +6 -2
- package/runtime/node_modules/@metro-labs/daemon/src/claude/api.ts +304 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/cli-files.ts +28 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/files.ts +359 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/github-api.ts +12 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/github-fetch.ts +160 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/github-skills.ts +255 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/github-validate.ts +53 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/hooks.ts +60 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/login.ts +243 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/memory-routine.ts +123 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/memory.ts +32 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/onboarding.ts +38 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/runner-activity.ts +17 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/runner-process.ts +52 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/session-files.ts +75 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/session.ts +303 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/settings.ts +109 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/setup-api.ts +114 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/setup-state.ts +18 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/setup.ts +323 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/skills.ts +123 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/usage-probe.ts +128 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/agent-key.ts +145 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/enroll-api.ts +99 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/leftovers.ts +59 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/metro-api.ts +93 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-grant.ts +4 -4
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-owner.ts +3 -3
- package/runtime/node_modules/@metro-labs/daemon/src/files/attach-reaper.ts +174 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-serve.ts +11 -17
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-api.ts +10 -27
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-store.ts +4 -4
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/bedrock.ts +228 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/claude-logins.ts +192 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/claude-store.ts +59 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-stream.ts +179 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-translate.ts +209 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-version.ts +44 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex.ts +121 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/delivered.ts +82 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/effective.ts +43 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/effort.ts +103 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/eventstream.ts +123 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/fallback.ts +146 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/forward.ts +284 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/frames.ts +118 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/gateway.ts +356 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-api.ts +125 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-config.ts +159 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-leftovers.ts +42 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-lists.ts +40 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter.ts +25 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/org-models.ts +203 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/provider-models.ts +77 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/served.ts +18 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/subscription.ts +120 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/text.ts +33 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/tool-search.ts +126 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage-refresh.ts +95 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage.ts +330 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/accounts.ts +38 -18
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/attachment-schema.ts +91 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-bridge.ts +45 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-permission.ts +25 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/call-tools.ts +88 -38
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/channel-tool.ts +80 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/diagnostics.ts +102 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +24 -18
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/frame-schema.ts +44 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/group-tools.ts +2 -2
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/index.ts +167 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/instructions.ts +21 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/member-tools.ts +2 -2
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-prompt.ts +115 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-relay.ts +111 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-gate.ts +88 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-snapshot.ts +65 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-lookup.ts +60 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-tool.ts +96 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/raw-get-stream.ts +54 -16
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/read-tool.ts +87 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/request-identity.ts +48 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/server-approvals.ts +108 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/session-slot.ts +137 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session.ts +103 -52
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-schema.ts +11 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-send.ts +15 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-catalog.ts +108 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-def.ts +9 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-dispatch.ts +74 -48
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +87 -114
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +6 -11
- package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/announced.ts +68 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/config.ts +29 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/connector-tools.ts +114 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/link.ts +197 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/rpc.ts +67 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/token.ts +50 -0
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/helper-script.ts +183 -0
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/imds.ts +16 -0
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/install.ts +78 -0
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/privilege.ts +50 -0
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/root-follow.ts +16 -0
- package/runtime/node_modules/@metro-labs/daemon/src/monitor/api.ts +132 -0
- package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-event.ts +139 -0
- package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-events.ts +101 -0
- package/runtime/node_modules/@metro-labs/daemon/src/net/tunnel.ts +323 -0
- package/runtime/node_modules/@metro-labs/daemon/src/policy/policy.ts +120 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/bearer.ts +35 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/body.ts +24 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/gmail-attach.ts +67 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/gmail-detach.ts +37 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +63 -54
- package/runtime/node_modules/@metro-labs/daemon/src/routes/local-mode.ts +149 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/session-apis.ts +65 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/session.ts +29 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/threema-callback.ts +103 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server/cloudwatch.ts +178 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server/control.ts +39 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server/machine.ts +58 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server/owner.ts +26 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server/update.ts +90 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
- package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-browser.ts +107 -0
- package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-driver.ts +42 -0
- package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-gmail.ts +78 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-inline.ts +29 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-interactive.ts +5 -31
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-resolve.ts +84 -13
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/attach-session.ts +61 -25
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-xmtp.ts +8 -9
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach.ts +69 -3
- package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/stations}/materialize.ts +53 -175
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/registry.ts +20 -2
- package/runtime/node_modules/@metro-labs/daemon/src/stations/runtime-deps.ts +135 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor-io.ts +3 -3
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor.ts +6 -9
- package/runtime/node_modules/@metro-labs/daemon/src/stations/threema-callbacks.ts +32 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/train-call.ts +1 -1
- package/runtime/node_modules/@metro-labs/daemon/src/stations/webhook-endpoints.ts +51 -0
- package/runtime/node_modules/@metro-labs/daemon/src/terminal/api.ts +84 -0
- package/runtime/node_modules/@metro-labs/daemon/src/terminal/socket.ts +124 -0
- package/runtime/node_modules/@metro-labs/daemon/src/terminal/tickets.ts +15 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/api.ts +45 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/config.ts +51 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/firewall.ts +9 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/index.ts +96 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/install.ts +56 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/paths.ts +26 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/proxy.ts +147 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/store.ts +129 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/trust.ts +44 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/api.ts +14 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/audio.ts +193 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/call.ts +191 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/calls.ts +153 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/peer.ts +85 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/scribe.ts +115 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/shared-talk.ts +85 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/shared.ts +198 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/speech-queue.ts +200 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/speech.ts +125 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/store.ts +103 -0
- package/runtime/node_modules/@metro-labs/discord-bot/package.json +3 -5
- package/runtime/node_modules/@metro-labs/discord-bot/src/accounts.ts +3 -23
- package/runtime/node_modules/@metro-labs/discord-bot/src/actions.ts +21 -187
- package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +2 -2
- package/runtime/node_modules/@metro-labs/discord-bot/src/channel-source.ts +79 -0
- package/runtime/node_modules/@metro-labs/discord-bot/src/channels.ts +186 -0
- package/runtime/node_modules/@metro-labs/discord-bot/src/format.ts +26 -67
- package/runtime/node_modules/@metro-labs/discord-bot/src/group-actions.ts +1 -1
- package/runtime/node_modules/@metro-labs/discord-bot/src/group.ts +2 -2
- package/runtime/node_modules/@metro-labs/discord-bot/src/index.ts +8 -14
- package/runtime/node_modules/@metro-labs/discord-bot/src/members.ts +2 -2
- package/runtime/node_modules/@metro-labs/discord-bot/src/profile.ts +68 -0
- package/runtime/node_modules/@metro-labs/discord-bot/src/send-files.ts +12 -13
- package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +6 -1
- package/runtime/node_modules/@metro-labs/gmail/package.json +27 -0
- package/runtime/node_modules/@metro-labs/gmail/src/accounts.ts +133 -0
- package/runtime/node_modules/@metro-labs/gmail/src/actions.ts +20 -0
- package/runtime/node_modules/@metro-labs/gmail/src/api.ts +34 -0
- package/runtime/node_modules/@metro-labs/gmail/src/attachments.ts +38 -0
- package/runtime/node_modules/@metro-labs/gmail/src/auth.ts +115 -0
- package/runtime/node_modules/@metro-labs/gmail/src/channels.ts +66 -0
- package/runtime/node_modules/@metro-labs/gmail/src/config.ts +15 -0
- package/runtime/node_modules/@metro-labs/gmail/src/inbound.ts +97 -0
- package/runtime/node_modules/@metro-labs/gmail/src/index.ts +12 -0
- package/runtime/node_modules/@metro-labs/gmail/src/login.ts +39 -0
- package/runtime/node_modules/@metro-labs/gmail/src/managed-binding.ts +33 -0
- package/runtime/node_modules/@metro-labs/gmail/src/managed.ts +45 -0
- package/runtime/node_modules/@metro-labs/gmail/src/message.ts +125 -0
- package/runtime/node_modules/@metro-labs/gmail/src/mime.ts +70 -0
- package/runtime/node_modules/@metro-labs/gmail/src/outbound.ts +125 -0
- package/runtime/node_modules/@metro-labs/gmail/src/query.ts +101 -0
- package/runtime/node_modules/@metro-labs/gmail/src/state.ts +30 -0
- package/runtime/node_modules/@metro-labs/gmail/src/station.ts +16 -0
- package/runtime/node_modules/@metro-labs/gmail/src/trust.ts +42 -0
- package/runtime/node_modules/@metro-labs/http/package.json +44 -0
- package/runtime/node_modules/@metro-labs/http/src/agent-signature.ts +95 -0
- package/runtime/node_modules/@metro-labs/http/src/api-http.ts +146 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-discovery.ts → http/src/connector-discovery.ts} +57 -27
- package/runtime/node_modules/@metro-labs/http/src/connector-grant.ts +8 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-input.ts +73 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-mcp.ts +108 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-client.ts → http/src/connector-oauth.ts} +48 -28
- package/runtime/node_modules/@metro-labs/http/src/connector-policy.ts +92 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-public-url.ts +64 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-reach.ts +27 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-resource.ts +108 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-tools.ts +95 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/connector-url.ts +8 -28
- package/runtime/node_modules/@metro-labs/http/src/ed25519.ts +56 -0
- package/runtime/node_modules/@metro-labs/http/src/mcp-server-protocol.ts +86 -0
- package/runtime/node_modules/@metro-labs/http/src/mcp-server-tools.ts +93 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-api.ts → http/src/mode-api.ts} +13 -9
- package/runtime/node_modules/@metro-labs/http/src/return-to.ts +25 -0
- package/runtime/node_modules/@metro-labs/http/src/sigv4.ts +90 -0
- package/runtime/node_modules/@metro-labs/http/src/workos-token.ts +149 -0
- package/runtime/node_modules/@metro-labs/outlook/package.json +25 -0
- package/runtime/node_modules/@metro-labs/outlook/src/accounts.ts +78 -0
- package/runtime/node_modules/@metro-labs/outlook/src/actions.ts +15 -0
- package/runtime/node_modules/@metro-labs/outlook/src/attachments.ts +81 -0
- package/runtime/node_modules/@metro-labs/outlook/src/auth.ts +120 -0
- package/runtime/node_modules/@metro-labs/outlook/src/browser.ts +42 -0
- package/runtime/node_modules/@metro-labs/outlook/src/channels.ts +60 -0
- package/runtime/node_modules/@metro-labs/outlook/src/config.ts +23 -0
- package/runtime/node_modules/@metro-labs/outlook/src/format.ts +59 -0
- package/runtime/node_modules/@metro-labs/outlook/src/graph.ts +55 -0
- package/runtime/node_modules/@metro-labs/outlook/src/inbound.ts +96 -0
- package/runtime/node_modules/@metro-labs/outlook/src/index.ts +12 -0
- package/runtime/node_modules/@metro-labs/outlook/src/login.ts +129 -0
- package/runtime/node_modules/@metro-labs/outlook/src/me.ts +31 -0
- package/runtime/node_modules/@metro-labs/outlook/src/outbound.ts +103 -0
- package/runtime/node_modules/@metro-labs/outlook/src/query.ts +84 -0
- package/runtime/node_modules/@metro-labs/outlook/src/state.ts +28 -0
- package/runtime/node_modules/@metro-labs/outlook/src/station.ts +16 -0
- package/runtime/node_modules/@metro-labs/outlook/src/trust.ts +41 -0
- package/runtime/node_modules/@metro-labs/telegram/package.json +2 -4
- package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +5 -24
- package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +27 -6
- package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/channels.ts +58 -0
- package/runtime/node_modules/@metro-labs/telegram/src/client.ts +4 -4
- package/runtime/node_modules/@metro-labs/telegram/src/format.ts +19 -34
- package/runtime/node_modules/@metro-labs/telegram/src/group.ts +3 -3
- package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +13 -34
- package/runtime/node_modules/@metro-labs/telegram/src/index.ts +4 -43
- package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +2 -3
- package/runtime/node_modules/@metro-labs/telegram/src/members.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/profile.ts +70 -0
- package/runtime/node_modules/@metro-labs/telegram/src/reactions.ts +2 -2
- package/runtime/node_modules/@metro-labs/telegram/src/station.ts +5 -1
- package/runtime/node_modules/@metro-labs/telegram/src/types.ts +0 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/package.json +2 -2
- package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +7 -41
- package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +24 -77
- package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +2 -2
- package/runtime/node_modules/@metro-labs/telegram-bot/src/channel-files.ts +3 -0
- package/runtime/node_modules/@metro-labs/telegram-bot/src/channels.ts +43 -0
- package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +46 -48
- package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +15 -44
- package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +6 -82
- package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/src/observed-chats.ts +172 -0
- package/runtime/node_modules/@metro-labs/telegram-bot/src/profile.ts +85 -0
- package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +9 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/src/types.ts +50 -15
- package/runtime/node_modules/@metro-labs/telegram-bot/src/updates.ts +26 -0
- package/runtime/node_modules/@metro-labs/threema/package.json +26 -0
- package/runtime/node_modules/@metro-labs/threema/src/accounts.ts +108 -0
- package/runtime/node_modules/@metro-labs/threema/src/actions.ts +130 -0
- package/runtime/node_modules/@metro-labs/threema/src/api.ts +152 -0
- package/runtime/node_modules/@metro-labs/threema/src/channels.ts +37 -0
- package/runtime/node_modules/@metro-labs/threema/src/chats.ts +88 -0
- package/runtime/node_modules/@metro-labs/threema/src/crypto.ts +100 -0
- package/runtime/node_modules/@metro-labs/threema/src/files.ts +47 -0
- package/runtime/node_modules/@metro-labs/threema/src/format.ts +164 -0
- package/runtime/node_modules/@metro-labs/threema/src/groups.ts +96 -0
- package/runtime/node_modules/@metro-labs/threema/src/ids.ts +21 -0
- package/runtime/node_modules/@metro-labs/threema/src/inbound.ts +92 -0
- package/runtime/node_modules/@metro-labs/threema/src/index.ts +24 -0
- package/runtime/node_modules/@metro-labs/threema/src/messages.ts +264 -0
- package/runtime/node_modules/@metro-labs/threema/src/outbound.ts +161 -0
- package/runtime/node_modules/@metro-labs/threema/src/station.ts +21 -0
- package/runtime/node_modules/@metro-labs/threema/src/verify.ts +117 -0
- package/runtime/node_modules/@metro-labs/webhook/package.json +2 -2
- package/runtime/node_modules/@metro-labs/webhook/src/station.ts +5 -8
- package/runtime/node_modules/@metro-labs/whatsapp/package.json +3 -6
- package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +6 -28
- package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +97 -12
- package/runtime/node_modules/@metro-labs/whatsapp/src/app-state.ts +49 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +2 -2
- package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/channel-chats.ts +137 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/channels.ts +48 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/client-history.ts +31 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/client-types.ts +48 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +145 -63
- package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +7 -58
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-events.ts +127 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-files.ts +39 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-identity.ts +58 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-message.ts +161 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-state.ts +344 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-types.ts +91 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history.ts +195 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +11 -28
- package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +4 -37
- package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/members.ts +94 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/messages.ts +70 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/names.ts +75 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/parse.ts +44 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/resolve.ts +52 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/send-expiry.ts +65 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +24 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +5 -9
- package/runtime/node_modules/@metro-labs/whatsapp/src/types.ts +0 -1
- package/runtime/node_modules/@metro-labs/xmtp/package.json +4 -3
- package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +10 -20
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +2 -2
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +55 -224
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +47 -53
- package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +114 -223
- package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +58 -15
- package/runtime/node_modules/@metro-labs/xmtp/src/call-leftovers.ts +48 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/channels.ts +56 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/codecs.ts +114 -3
- package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +35 -20
- package/runtime/node_modules/@metro-labs/xmtp/src/delete-requests.ts +34 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +38 -25
- package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +8 -18
- package/runtime/node_modules/@metro-labs/xmtp/src/frames.ts +190 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +2 -2
- package/runtime/node_modules/@metro-labs/xmtp/src/identity.ts +30 -16
- package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +18 -70
- package/runtime/node_modules/@metro-labs/xmtp/src/labels.ts +102 -50
- package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/names.ts +61 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/network.ts +114 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/profile.ts +160 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/read-attachments.ts +37 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/resolve.ts +44 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/sender.ts +112 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/smart.ts +79 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +10 -2
- package/runtime/node_modules/@metro-labs/xmtp/src/stream.ts +66 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +22 -58
- package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +72 -49
- package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +4 -6
- package/runtime/node_modules/@metro-labs/xmtp/src/verify.ts +19 -5
- package/runtime/node_modules/@metro-labs/xmtp/src/wallet.ts +28 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +14 -4
- package/runtime/patches/5bca2c07d5852d3f58453cff0448dd85da13d3665b61e3d758905b298d432d7c.patch +31 -0
- package/runtime/runtime.json +1 -1
- package/runtime/sdk-runner/node_modules/@metro-labs/core/package.json +58 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-files.ts +216 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-store.ts +171 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-types.ts +141 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/call.ts +81 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/events.ts +165 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/ids.ts +28 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/is-record.ts +2 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/lines.ts +78 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/log.ts +42 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/protocol.ts +227 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/runner-activity.ts +270 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/secure-fs.ts +74 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/station-names.ts +14 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/attachments.ts +202 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/station-runtime.ts +59 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/types.ts +126 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/str.ts +5 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/tickets.ts +44 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/train-error.ts +53 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/version.ts +2 -0
- package/runtime/sdk-runner/runner.json +10 -0
- package/runtime/sdk-runner/src/activity-tasks.ts +194 -0
- package/runtime/sdk-runner/src/activity.ts +391 -0
- package/runtime/sdk-runner/src/app.ts +87 -0
- package/runtime/sdk-runner/src/approvals.ts +37 -0
- package/runtime/sdk-runner/src/automation-cli.ts +10 -0
- package/runtime/sdk-runner/src/automation-command.ts +151 -0
- package/runtime/sdk-runner/src/automation.ts +145 -0
- package/runtime/sdk-runner/src/calls.ts +133 -0
- package/runtime/sdk-runner/src/channel-text.ts +26 -0
- package/runtime/sdk-runner/src/config.ts +50 -0
- package/runtime/sdk-runner/src/errors.ts +142 -0
- package/runtime/sdk-runner/src/inbox.ts +168 -0
- package/runtime/sdk-runner/src/input-queue.ts +77 -0
- package/runtime/sdk-runner/src/input-timing.ts +68 -0
- package/runtime/sdk-runner/src/link.ts +154 -0
- package/runtime/sdk-runner/src/main.ts +57 -0
- package/runtime/sdk-runner/src/recovery.ts +46 -0
- package/runtime/sdk-runner/src/rules.ts +28 -0
- package/runtime/sdk-runner/src/runner.ts +358 -0
- package/runtime/sdk-runner/src/session-store.ts +129 -0
- package/runtime/sdk-runner/src/session-watch.ts +158 -0
- package/runtime/sdk-runner/src/singleton.ts +15 -0
- package/runtime/sdk-runner/src/skill-work.ts +76 -0
- package/runtime/sdk-runner/src/skills-files.ts +169 -0
- package/runtime/sdk-runner/src/skills.ts +150 -0
- package/runtime/sdk-runner/src/task-ledger.ts +229 -0
- package/runtime/sdk-runner/src/task-recovery.ts +203 -0
- package/runtime/sdk-runner/src/task-state.ts +71 -0
- package/runtime/sdk-runner/src/tool-proxy.ts +40 -0
- package/runtime/server.ts +1 -0
- package/runtime/stations.json +43 -0
- package/skills/MEMORY.md +78 -0
- package/skills/METRO.md +33 -0
- package/skills/STAGE.md +109 -0
- package/dist/bedrock-eventstream.js +0 -120
- package/dist/bedrock-proxy.js +0 -260
- package/dist/bedrock-upstream.js +0 -72
- package/dist/bedrock.js +0 -106
- package/dist/claude.js +0 -15
- package/dist/plugin.js +0 -82
- package/dist/prompt.js +0 -61
- package/dist/store.js +0 -93
- package/runtime/node_modules/@metro-labs/discord-bot/src/voice-speak.ts +0 -195
- package/runtime/node_modules/@metro-labs/discord-bot/src/voice-transcribe.ts +0 -292
- package/runtime/node_modules/@metro-labs/discord-bot/src/voice.ts +0 -197
- package/runtime/node_modules/@metro-labs/discord-bot/src/wire.ts +0 -5
- package/runtime/node_modules/@metro-labs/mcp/package.json +0 -66
- package/runtime/node_modules/@metro-labs/mcp/src/channels/dedupe.ts +0 -24
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/account-api.ts +0 -311
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-api.ts +0 -332
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-connector-api.ts +0 -150
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-pair.ts +0 -20
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/api-http.ts +0 -152
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/boot.ts +0 -330
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair-api.ts +0 -125
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-api.ts +0 -313
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-json.ts +0 -21
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-oauth-routes.ts +0 -157
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-oauth.ts +0 -127
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-tools.ts +0 -100
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-verify.ts +0 -333
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-auth.ts +0 -164
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-oauth.ts +0 -208
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity.ts +0 -79
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/oauth-pending.ts +0 -65
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/pair-codes.ts +0 -58
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/project-api.ts +0 -214
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/relay.ts +0 -303
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-api.ts +0 -139
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/runtime-source.ts +0 -105
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/session-apis.ts +0 -48
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/session.ts +0 -218
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/tunnel.ts +0 -169
- package/runtime/node_modules/@metro-labs/mcp/src/db/account-attach.ts +0 -91
- package/runtime/node_modules/@metro-labs/mcp/src/db/agent-admin.ts +0 -215
- package/runtime/node_modules/@metro-labs/mcp/src/db/agent-connectors.ts +0 -143
- package/runtime/node_modules/@metro-labs/mcp/src/db/agent-map.ts +0 -71
- package/runtime/node_modules/@metro-labs/mcp/src/db/client.ts +0 -37
- package/runtime/node_modules/@metro-labs/mcp/src/db/connector-config.ts +0 -147
- package/runtime/node_modules/@metro-labs/mcp/src/db/connector-relay.ts +0 -126
- package/runtime/node_modules/@metro-labs/mcp/src/db/connectors.ts +0 -308
- package/runtime/node_modules/@metro-labs/mcp/src/db/projects.ts +0 -300
- package/runtime/node_modules/@metro-labs/mcp/src/db/runtime-admin.ts +0 -24
- package/runtime/node_modules/@metro-labs/mcp/src/db/runtimes.ts +0 -105
- package/runtime/node_modules/@metro-labs/mcp/src/db/schema.ts +0 -117
- package/runtime/node_modules/@metro-labs/mcp/src/db/token-carry.ts +0 -45
- package/runtime/node_modules/@metro-labs/mcp/src/db/users.ts +0 -62
- package/runtime/node_modules/@metro-labs/mcp/src/db/whatsapp-login.ts +0 -18
- package/runtime/node_modules/@metro-labs/mcp/src/mcp/channel-owner.ts +0 -29
- package/runtime/node_modules/@metro-labs/mcp/src/mcp/frame-scope.ts +0 -21
- package/runtime/node_modules/@metro-labs/mcp/src/mcp/index.ts +0 -192
- package/runtime/node_modules/@metro-labs/mcp/src/mcp/permission-relay.ts +0 -66
- package/runtime/node_modules/@metro-labs/mcp/src/mcp/request-identity.ts +0 -73
- package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-registry.ts +0 -172
- package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-route.ts +0 -43
- package/runtime/node_modules/@metro-labs/mcp/src/monitor/api.ts +0 -240
- package/runtime/node_modules/@metro-labs/mcp/src/server.ts +0 -2
- package/runtime/node_modules/@metro-labs/mcp/src/stations/account-store.ts +0 -80
- package/runtime/node_modules/@metro-labs/mcp/src/stations/messaging-normalize.ts +0 -88
- package/runtime/node_modules/@metro-labs/telegram/src/normalize.ts +0 -22
- package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +0 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/src/wire.ts +0 -3
- package/runtime/node_modules/@metro-labs/whatsapp/src/normalize.ts +0 -22
- package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +0 -5
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-push.ts +0 -87
- package/runtime/node_modules/@metro-labs/xmtp/src/emit-core.ts +0 -55
- package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +0 -349
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/log.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/mcp → core/src}/str.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/train-error.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/webhook-note.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-error.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/cors.ts +0 -0
package/skills/METRO.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: metro
|
|
3
|
+
description: How this box's agent works on metro. Acknowledge, delegate, relay, answer over chat, never block on the terminal. Loaded at every session start by a metro hook; edit it here to change the rules on this box.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are the main thread of a Claude Code session that is connected to chat through metro, on a machine nobody watches. The main thread is an orchestrator: it may only delegate and talk. A guard metro installs denies every other tool on this thread, so this is the shape of the work, not a preference.
|
|
7
|
+
|
|
8
|
+
**Inbound.** A message arrives as a `<channel source="metro" …>` block. Read `addressed` first: `direct`, `mention` or `reply` means it is for you; without it the message merely happened in a room you watch, so treat it as context and stay silent unless the person plainly wants you. For a message that is for you, the first tool call is `react` on it (👀, then 👍 or ✅ once done) so the person knows you saw it, and any reply goes on the same `line`, passed verbatim. Exception: when the person asks you to close something ("mark as done"), skip the reaction and the acknowledgement: close it directly and confirm once when it is finished.
|
|
9
|
+
|
|
10
|
+
**Typing.** Whenever you are about to send a message on a line within the next 10 seconds, call `typing` on that `line` first, so the person sees "typing…" while you write. It shows once and fades by itself (about 5 s on the Telegram bot, 10 s on Discord, 25 s on WhatsApp) or when your message arrives, so there is nothing to stop. Only WhatsApp, the Telegram bot and Discord support it; on other channels skip it.
|
|
11
|
+
|
|
12
|
+
**Delegate everything that is work.** Reading files, running commands, searching, fetching pages, editing, and every connector tool: hand it to a subagent with the `Agent` tool, `subagent_type: "worker"`, always `run_in_background: true`, then keep answering chat while it runs and relay the result when the task notification arrives. A foreground subagent blinds you to chat and the guard refuses it. You may read image files yourself, so a screenshot someone sends is yours to look at.
|
|
13
|
+
|
|
14
|
+
**Never wait on the terminal.** `AskUserQuestion`, plan mode and anything that blocks for a person at the keyboard are denied everywhere, main thread and subagents alike. When something is ambiguous, do what does not depend on it, choose the most reasonable reading, say so in your reply, and if a real decision is needed ask over chat with `send` and carry on. Tool-approval prompts reach the chat too; the person answers `yes <id>` or `no <id>` there.
|
|
15
|
+
|
|
16
|
+
**Calls that need the owner's approval run in a worker.** The owner can make a metro tool on a channel wait for approval. On the main thread such a call is refused, because waiting for the answer would stop the whole session: hand that exact call to a background worker (`run_in_background: true`) and keep answering. The worker waits for the owner's answer on its own.
|
|
17
|
+
|
|
18
|
+
**Connectors.** Third-party tools the organization gave this agent (Notion, n8n, Linear, Gmail and the like) are reached only through two metro tools, in two steps:
|
|
19
|
+
|
|
20
|
+
1. `tool_search` finds a tool and returns its full definition: `select:notion.search` for an exact name, words (`notion create page`) to rank, or `+linear issue` to require `linear` in the name. Each name is `<connector>.<tool>`.
|
|
21
|
+
2. `tool_call` runs it, with the name exactly as found and arguments that match its schema. After `tool_search` with `select:notion.search` returned `notion.search`: `{"calls": [{"tool": "notion.search", "arguments": {"query": "roadmap"}}]}`.
|
|
22
|
+
|
|
23
|
+
Put up to 10 independent calls in one `tool_call`; they run in parallel and come back in order, each under `[n] <tool>`. `tool_search` may run on this thread, but never call `tool_call` here: delegate it to a worker, as all other work. When a call answers `needs_approval`, the owner is asked in chat and on the page: tell the person what is waiting, then wait for the channel message `Approved: <tool> (<id>)` or `Denied: <tool> (<id>)`. After an approval, have a worker repeat the same call with `"approval": "<id>"` added to it.
|
|
24
|
+
|
|
25
|
+
**Finish what was asked.** You work on your own. Nobody is watching a screen, and a question sent to chat may go unanswered for hours, so asking "Shall I?" about work already requested simply stops it. Anything reversible that follows from the request, do. Stop only for a destructive action or a genuine change of scope. Before you end a turn, read your own last paragraph: if it is a plan, a question, a list of next steps or a promise ("I'll…", "Next…"), then the work is not done, so do it now, retries and missing information included. End the turn when the task is finished, or when you are truly blocked on something only the person can give you.
|
|
26
|
+
|
|
27
|
+
The exception is a person describing a problem, asking a question or thinking out loud. There the answer IS the deliverable: reply, and change nothing until they ask.
|
|
28
|
+
|
|
29
|
+
**The whole request is the deliverable.** Do not quietly make it smaller, larger or different. Read an ambiguity the way a careful colleague would, make the ordinary judgement calls yourself, and name the assumption in your reply. If one part turns out to be blocked, finish every other part and say plainly what you left out and why: scaling the work down is the person's call, not yours. Something else you notice on the way is a suggestion at the end of the reply, not extra work to do now.
|
|
30
|
+
|
|
31
|
+
**Report like a relay.** A worker's report is the only evidence you have, so pass on what it verified and say plainly what it did not. Short messages on chat: lead with the outcome, one idea per sentence, no tool names, no file paths unless the person needs them. Send a file out with `create_upload` (the curl line it hands back runs in a worker) and then `send` with the upload id.
|
|
32
|
+
|
|
33
|
+
**Keep going.** Long tasks run as background agents and loops; check in over chat when something lands rather than going quiet. The session is restarted by the daemon if it exits, so an interrupted task is resumed from chat, not from memory.
|
package/skills/STAGE.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stage
|
|
3
|
+
description: How to use Stage channels (XMTP groups, https://stage.box) through metro. Create a channel, rename it, add or remove members, set labels and assignees, read its info, and send, reply, react, unreact, delete and read messages, and post frames (interactive ChatKit widget views) and wallet cards (payment and signature requests, receipts). Works only when this agent has an XMTP account in metro.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Stage (https://stage.box) is a messenger built on XMTP. A Stage channel is an XMTP group. You use it with the metro tools below (`mcp__metro__<name>`).
|
|
7
|
+
|
|
8
|
+
**XMTP only.** All of this needs an XMTP account connected to this agent in metro. Check with `list_accounts`: it must show an account under `xmtp`. Many agents have none. Then none of this works: say so plainly and do not try another channel. The owner can add an XMTP channel on https://metro.box.
|
|
9
|
+
|
|
10
|
+
**Lines and links.** A channel's line is `metro://xmtp/<account>/<channel id>`. Pass it verbatim as `line`. Its link is `https://stage.box/#/channel/<channel id>`, the last part of the line. Stage shows Markdown, so `[#Launch plan](https://stage.box/#/channel/<channel id>)` is a clickable link. A `message_id` comes from the inbound message or from `read`.
|
|
11
|
+
|
|
12
|
+
**Channels.**
|
|
13
|
+
- Create: `create_group {"station": "xmtp", "name": "Launch plan", "members": ["0x…"]}`. Members are 0x addresses or XMTP inbox ids. It returns the new `line` and `id`.
|
|
14
|
+
- Rename: `set_channel_metadata {"line": "…", "name": "New title"}`. No tool sets the description or the picture.
|
|
15
|
+
- Add or remove people: `add_members {"line": "…", "members": ["0x…"]}`. `remove_members` takes the same shape.
|
|
16
|
+
- Leave: `close_channel {"line": "…", "removeSelf": true}`.
|
|
17
|
+
- Read: `group_info {"line": "…"}` gives the name, `labels`, `assigned`, `category`, `status`, `priority`, `appData` and the members (`inboxId`, `address`). `list_members {"line": "…"}` gives the members only.
|
|
18
|
+
- Direct chat: `dm {"address": "0x…"}` opens a 1:1 chat and returns its line.
|
|
19
|
+
- With several XMTP accounts, add `"account": "<id>"` to `create_group` and `dm`.
|
|
20
|
+
|
|
21
|
+
**Labels, assignees, category, status and priority.** They live in the channel's metadata, and Stage shows them on the channel.
|
|
22
|
+
- Labels: `set_channel_metadata {"line": "…", "metadata": {"labels": ["Bug"]}}`. At most 16 labels of 24 characters each.
|
|
23
|
+
- Assignees: `set_channel_metadata {"line": "…", "metadata": {"assigned": ["0x…"]}}`. Only 0x addresses of current members.
|
|
24
|
+
- Category: `set_channel_metadata {"line": "…", "metadata": {"category": "Clients"}}`.
|
|
25
|
+
- Status: `set_channel_metadata {"line": "…", "metadata": {"status": "In review"}}`.
|
|
26
|
+
- Category and status are each one free-form string per channel. Both are trimmed, whitespace is collapsed, and text is truncated to 24 characters. `""` or `null` clears either field. `group_info` returns them as `category` and `status`.
|
|
27
|
+
- Priority: `set_channel_metadata {"line": "…", "metadata": {"priority": "High"}}`. Exactly `Urgent`, `High`, `Medium` or `Low` after trimming surrounding whitespace; empty text or `null` clears it. `group_info` returns it as `priority`.
|
|
28
|
+
- Each key you send replaces that whole value. Keys you leave out stay as they are. To add one label or one assignee, read `group_info` first and send the old list plus the new one. `[]` clears a list. Read `group_info` again to check it saved.
|
|
29
|
+
|
|
30
|
+
**Task status labels.** Keep the owner's existing workflow. For a label-based task workflow, keep exactly one of these status labels, plus any project labels:
|
|
31
|
+
- `🗒️ Backlog`
|
|
32
|
+
- `🎯 To-do`
|
|
33
|
+
- `🚧 In progress`
|
|
34
|
+
- `🔍 In review`
|
|
35
|
+
- `✅ Done`
|
|
36
|
+
- `🚫 Blocked`
|
|
37
|
+
|
|
38
|
+
Move it from Backlog or To-do to In progress, then In review, then Done. Use Blocked while you wait on someone. To change it, read `group_info`, swap the old status for the new one in `labels`, keep the other labels, and send the whole list with `set_channel_metadata` `metadata.labels`.
|
|
39
|
+
|
|
40
|
+
The separate `metadata.status` and `metadata.priority` fields are optional. Status is free-form, not limited to the label names above. Do not migrate or remove existing labels unless asked.
|
|
41
|
+
|
|
42
|
+
**Messages.**
|
|
43
|
+
- Send: `send {"line": "…", "text": "Hello"}`. Reply with a quote: `reply {"line": "…", "message_id": "…", "text": "…"}`.
|
|
44
|
+
- React: `react {"line": "…", "message_id": "…", "emoji": "👍"}`. `unreact` takes the same shape.
|
|
45
|
+
- Delete one of your own messages: `delete {"line": "…", "message_id": "…"}`. XMTP has no edit and no typing.
|
|
46
|
+
- History: `read {"line": "…", "limit": 20}`.
|
|
47
|
+
- Poll: `ask {"line": "…", "question": "Ship today?", "options": ["Yes", "No"]}`.
|
|
48
|
+
- Poll votes are numeric reactions with zero-based indexes: `0` is the first option, `1` is the second, and so on, in the poll's stored option order. For the poll above, `0` means Yes and `1` means No. Never use a one-based guess. Match the inbound reaction's `target_id` to the poll's `messageId` returned by `ask`, not its `pollId` or the reaction's own `message_id`.
|
|
49
|
+
- With several questions, the first question still uses bare option indexes (`0`, `1`, …); later questions use `q:o`, with both indexes zero-based. `1:0` means the first option of the second question. Explicit `0:0` also means the first option of the first question.
|
|
50
|
+
- Keep the poll's questions, options and `messageId`: `read` shows `[poll]` and `[reaction]`, not their choices or vote values. If the original mapping is unavailable, do not guess.
|
|
51
|
+
- File: `create_upload {"name": "report.pdf"}`, run the `curl` line it returns in a shell, then `send {"line": "…", "attachments": [{"upload": "<upload_id>"}]}`. Files that are not images are refused over about 190 KiB.
|
|
52
|
+
|
|
53
|
+
**Frames.** A frame is a small interactive view: a report, a choice, a form. Stage shows the frame itself in the chat (its `start` screen when it has screens), at image size, at most 400 x 400, clipped with a fade when taller. A tap opens it full screen. Its buttons do nothing in the chat: they work in the full view.
|
|
54
|
+
- Send: `send {"line": "…", "frame": {"title": "Deploy", "description": "Version 2.4 is ready", "widget": {…}}}`. A frame goes with `send`, like a file: there is no separate tool. `title` and `description` are optional: they come from the first `Title` and text in the widget when missing. With `text` as well, the text goes first, and the `message_id` you get back is the frame's.
|
|
55
|
+
- `widget` is OpenAI ChatKit widget JSON, with ChatKit's names and props (https://openai.github.io/chatkit-js/): a `Card`, `ListView` or `Basic` root, with `Row`, `Col`, `Box`, `Text`, `Title`, `Caption`, `Markdown`, `Badge`, `Icon`, `Image`, `Button`, `Divider`, `Spacer`, `Form`, `Input`, `Textarea`, `Select`, `DatePicker`, `Checkbox`, `RadioGroup` and `Table`. Images must be `https://`. Number spacing is in steps of 4px. At most 64K characters, 16 levels deep and 500 nodes. Stage shows a small notice for anything it does not know.
|
|
56
|
+
- Example, the arguments of one `send`:
|
|
57
|
+
```json
|
|
58
|
+
{"line": "…", "frame": {"widget": {"type": "Card", "children": [
|
|
59
|
+
{"type": "Title", "value": "Deploy version 2.4?"},
|
|
60
|
+
{"type": "Text", "value": "3 fixes, no migration.", "color": "secondary"},
|
|
61
|
+
{"type": "Input", "name": "note", "placeholder": "Note (optional)"},
|
|
62
|
+
{"type": "Row", "children": [
|
|
63
|
+
{"type": "Button", "label": "Deploy", "onClickAction": {"type": "deploy", "payload": {"version": "2.4"}}},
|
|
64
|
+
{"type": "Button", "label": "Not now", "color": "secondary", "onClickAction": {"type": "deploy.cancel"}}
|
|
65
|
+
]}
|
|
66
|
+
]}}}
|
|
67
|
+
```
|
|
68
|
+
- A tap comes back to you as a reply to the frame: `Frame action: deploy {"version":"2.4","note":"…"} (tapped "Deploy")`. The values of the fields (`Input`, `Select`, `Checkbox`, …) are added to the payload by their `name`. `Button.onClickAction`, `ListViewItem.onClickAction`, a `Card` `confirm`/`cancel` (`{"label", "action"}`) and a `Form` `onSubmitAction` send one. Answer it like any message.
|
|
69
|
+
- Screens: send `screens` instead of `widget` to put several screens in one frame, e.g. a list and a page per item. Each screen is a widget, or `{"title", "widget"}` for its own title in Stage's top bar. `start` names the first screen and is required. The action `{"type": "frame.open", "payload": {"screen": "<id>"}}` opens a screen and `{"type": "frame.back"}` goes back. They stay in Stage: no message comes to you. Stage's back arrow goes to the previous screen, and to the chat from the first one. Every other action comes to you as usual, with `screen` (the screen it was tapped on) in its payload. At most 50 screens and 64K characters for all of them; `start` and every `frame.open` must name a screen. Example:
|
|
70
|
+
```json
|
|
71
|
+
{"line": "…", "frame": {"title": "Open invoices", "start": "home", "screens": {
|
|
72
|
+
"home": {"type": "ListView", "children": [
|
|
73
|
+
{"type": "ListViewItem", "onClickAction": {"type": "frame.open", "payload": {"screen": "inv-1"}},
|
|
74
|
+
"children": [{"type": "Text", "value": "Acme, CHF 420"}]}
|
|
75
|
+
]},
|
|
76
|
+
"inv-1": {"title": "Acme", "widget": {"type": "Card", "children": [
|
|
77
|
+
{"type": "Title", "value": "Invoice 1040, CHF 420"},
|
|
78
|
+
{"type": "Row", "children": [
|
|
79
|
+
{"type": "Button", "label": "Back", "color": "secondary", "onClickAction": {"type": "frame.back"}},
|
|
80
|
+
{"type": "Button", "label": "Pay", "onClickAction": {"type": "invoice.pay", "payload": {"id": 1040}}}
|
|
81
|
+
]}
|
|
82
|
+
]}}
|
|
83
|
+
}}}
|
|
84
|
+
```
|
|
85
|
+
- Live frames: add `"source": {"url": "https://…"}` to the frame to name the node that serves its widget, an https URL that answers with ChatKit widget JSON (Stage's node protocol: https://github.com/bonustrack/stage/blob/main/NODES.md). Stage then sends the frame's actions to that node, not to you. The node's reply replaces the frame in place, on that person's device only, and no message comes to you. Only an action with ChatKit's `"handler": "client"` still comes to you as a frame action, like every action of a frame without `source`. `frame.open` and `frame.back` stay in Stage. Here `24h` goes to the node, and `Ask` comes to you as `Frame action: ask (tapped "Ask")`:
|
|
86
|
+
```json
|
|
87
|
+
{"line": "…", "frame": {"source": {"url": "https://eth.example.com/"}, "widget": {"type": "Card", "children": [
|
|
88
|
+
{"type": "Title", "value": "ETH 2,410 USD"},
|
|
89
|
+
{"type": "Row", "children": [
|
|
90
|
+
{"type": "Button", "label": "24h", "onClickAction": {"type": "range", "payload": {"days": 1}}},
|
|
91
|
+
{"type": "Button", "label": "Ask", "color": "secondary", "onClickAction": {"type": "ask", "handler": "client"}}
|
|
92
|
+
]}
|
|
93
|
+
]}}}
|
|
94
|
+
```
|
|
95
|
+
Stage calls the node only on a tap or on Refresh in the frame's three-dot menu, and only once the person has accepted the chat. Until then, and again after the app restarts, it shows the widget as you sent it. Do not add a Refresh button to a node: every live frame and Dashboard widget has Refresh in its menu. Add to dashboard on the frame adds a live widget loaded from that URL, and its `"handler": "client"` actions still come to this chat.
|
|
96
|
+
|
|
97
|
+
**Wallet cards.** The payment and signature cards Stage's own Request payment and Request signature send. Sending one moves nothing and signs nothing: the person taps Pay or Sign and confirms in Stage. Send one only when you were asked to.
|
|
98
|
+
- Send: `send {"line": "…", "wallet": {"type": "<type>", "content": {…}}}`. With `text` or a `frame` as well, the card goes last, and the `message_id` you get back is the card's.
|
|
99
|
+
- Payment request, `walletSendCalls`, a card with a Pay button. Stage pays a request with one call; a Stage wallet pays on Base only.
|
|
100
|
+
```json
|
|
101
|
+
{"type": "walletSendCalls", "content": {"version": "1.0", "chainId": "0x2105", "from": "0x<your address>", "calls": [
|
|
102
|
+
{"to": "0x<who gets paid>", "value": "0x38d7ea4c68000", "metadata": {"description": "Dinner", "transactionType": "transfer",
|
|
103
|
+
"currency": "ETH", "amount": 0.001, "decimals": 18, "toAddress": "0x<who gets paid>"}}
|
|
104
|
+
]}}
|
|
105
|
+
```
|
|
106
|
+
`chainId` is a hex string (`0x2105` is Base) and `value` is in wei, hex. For a token, `to` is the token contract, `data` its `transfer(address,uint256)` call data, `value` is left out, and `metadata` has `currency`, `amount` and `toAddress` (who gets paid).
|
|
107
|
+
- Receipt, `transactionReference`: `{"networkId": 8453, "reference": "0x<tx hash>", "metadata": {"currency": "USDC", "amount": 5}}`. Stage shows "Payment sent · 5 USDC" (or "Transaction sent" without an amount) and a link to the explorer. Only post a real transaction hash.
|
|
108
|
+
- Signature request, `signatureRequest`, a card with a Sign button: `{"id": "<any id>", "kind": "personal", "message": "The text to sign", "description": "Why"}`, or `"kind": "eip712"` with `"eip712": {"domain", "types", "primaryType", "message"}` instead of `message`.
|
|
109
|
+
- Signature, `signatureReference`: `{"requestId": "<message_id of the request>", "signature": "0x…", "signer": "0x…"}`. Stage shows it as Signed.
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
const PRELUDE_BYTES = 12;
|
|
2
|
-
const CRC_BYTES = 4;
|
|
3
|
-
const HEADER_TRUE = 0;
|
|
4
|
-
const HEADER_FALSE = 1;
|
|
5
|
-
const HEADER_BYTE = 2;
|
|
6
|
-
const HEADER_SHORT = 3;
|
|
7
|
-
const HEADER_INT = 4;
|
|
8
|
-
const HEADER_LONG = 5;
|
|
9
|
-
const HEADER_BYTES = 6;
|
|
10
|
-
const HEADER_STRING = 7;
|
|
11
|
-
const HEADER_TIMESTAMP = 8;
|
|
12
|
-
const HEADER_UUID = 9;
|
|
13
|
-
const FIXED_WIDTH = {
|
|
14
|
-
[HEADER_TRUE]: 0,
|
|
15
|
-
[HEADER_FALSE]: 0,
|
|
16
|
-
[HEADER_BYTE]: 1,
|
|
17
|
-
[HEADER_SHORT]: 2,
|
|
18
|
-
[HEADER_INT]: 4,
|
|
19
|
-
[HEADER_LONG]: 8,
|
|
20
|
-
[HEADER_TIMESTAMP]: 8,
|
|
21
|
-
[HEADER_UUID]: 16,
|
|
22
|
-
};
|
|
23
|
-
function readHeaderValue(buf, at, type) {
|
|
24
|
-
if (type === HEADER_BYTES || type === HEADER_STRING) {
|
|
25
|
-
const len = buf.readUInt16BE(at);
|
|
26
|
-
const raw = buf.subarray(at + 2, at + 2 + len);
|
|
27
|
-
const value = type === HEADER_STRING ? raw.toString('utf8') : raw.toString('base64');
|
|
28
|
-
return { value, next: at + 2 + len };
|
|
29
|
-
}
|
|
30
|
-
const width = FIXED_WIDTH[type];
|
|
31
|
-
if (width === undefined)
|
|
32
|
-
throw new Error(`eventstream: unknown header type ${String(type)}`);
|
|
33
|
-
if (type === HEADER_TRUE)
|
|
34
|
-
return { value: 'true', next: at };
|
|
35
|
-
if (type === HEADER_FALSE)
|
|
36
|
-
return { value: 'false', next: at };
|
|
37
|
-
return { value: buf.subarray(at, at + width).toString('hex'), next: at + width };
|
|
38
|
-
}
|
|
39
|
-
function readHeaders(buf) {
|
|
40
|
-
const out = {};
|
|
41
|
-
let at = 0;
|
|
42
|
-
while (at < buf.length) {
|
|
43
|
-
const nameLen = buf.readUInt8(at);
|
|
44
|
-
const name = buf.subarray(at + 1, at + 1 + nameLen).toString('utf8');
|
|
45
|
-
const type = buf.readUInt8(at + 1 + nameLen);
|
|
46
|
-
const parsed = readHeaderValue(buf, at + 2 + nameLen, type);
|
|
47
|
-
out[name] = parsed.value;
|
|
48
|
-
at = parsed.next;
|
|
49
|
-
}
|
|
50
|
-
return out;
|
|
51
|
-
}
|
|
52
|
-
export function decodeFrame(buf, offset) {
|
|
53
|
-
if (buf.length - offset < PRELUDE_BYTES)
|
|
54
|
-
return null;
|
|
55
|
-
const total = buf.readUInt32BE(offset);
|
|
56
|
-
const headersLen = buf.readUInt32BE(offset + 4);
|
|
57
|
-
if (total < PRELUDE_BYTES + CRC_BYTES || headersLen > total)
|
|
58
|
-
throw new Error('eventstream: malformed frame prelude');
|
|
59
|
-
if (buf.length - offset < total)
|
|
60
|
-
return null;
|
|
61
|
-
const headersStart = offset + PRELUDE_BYTES;
|
|
62
|
-
const payloadStart = headersStart + headersLen;
|
|
63
|
-
const payloadEnd = offset + total - CRC_BYTES;
|
|
64
|
-
return {
|
|
65
|
-
message: {
|
|
66
|
-
headers: readHeaders(buf.subarray(headersStart, payloadStart)),
|
|
67
|
-
payload: Buffer.from(buf.subarray(payloadStart, payloadEnd)),
|
|
68
|
-
},
|
|
69
|
-
end: offset + total,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
export class EventStreamDecoder {
|
|
73
|
-
pending = Buffer.alloc(0);
|
|
74
|
-
push(chunk) {
|
|
75
|
-
this.pending =
|
|
76
|
-
this.pending.length === 0 ? chunk : Buffer.concat([this.pending, chunk]);
|
|
77
|
-
const out = [];
|
|
78
|
-
let offset = 0;
|
|
79
|
-
for (;;) {
|
|
80
|
-
const frame = decodeFrame(this.pending, offset);
|
|
81
|
-
if (frame === null)
|
|
82
|
-
break;
|
|
83
|
-
out.push(frame.message);
|
|
84
|
-
offset = frame.end;
|
|
85
|
-
}
|
|
86
|
-
this.pending = this.pending.subarray(offset);
|
|
87
|
-
return out;
|
|
88
|
-
}
|
|
89
|
-
leftover() {
|
|
90
|
-
return this.pending.length;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
function encodeHeader(name, value) {
|
|
94
|
-
const nameBuf = Buffer.from(name, 'utf8');
|
|
95
|
-
const valueBuf = Buffer.from(value, 'utf8');
|
|
96
|
-
const out = Buffer.alloc(1 + nameBuf.length + 1 + 2 + valueBuf.length);
|
|
97
|
-
let at = 0;
|
|
98
|
-
out.writeUInt8(nameBuf.length, at);
|
|
99
|
-
at += 1;
|
|
100
|
-
nameBuf.copy(out, at);
|
|
101
|
-
at += nameBuf.length;
|
|
102
|
-
out.writeUInt8(HEADER_STRING, at);
|
|
103
|
-
at += 1;
|
|
104
|
-
out.writeUInt16BE(valueBuf.length, at);
|
|
105
|
-
at += 2;
|
|
106
|
-
valueBuf.copy(out, at);
|
|
107
|
-
return out;
|
|
108
|
-
}
|
|
109
|
-
export function encodeFrame(headers, payload) {
|
|
110
|
-
const headerBuf = Buffer.concat(Object.entries(headers).map(([name, value]) => encodeHeader(name, value)));
|
|
111
|
-
const total = PRELUDE_BYTES + headerBuf.length + payload.length + CRC_BYTES;
|
|
112
|
-
const out = Buffer.alloc(total);
|
|
113
|
-
out.writeUInt32BE(total, 0);
|
|
114
|
-
out.writeUInt32BE(headerBuf.length, 4);
|
|
115
|
-
out.writeUInt32BE(0, 8);
|
|
116
|
-
headerBuf.copy(out, PRELUDE_BYTES);
|
|
117
|
-
payload.copy(out, PRELUDE_BYTES + headerBuf.length);
|
|
118
|
-
out.writeUInt32BE(0, total - CRC_BYTES);
|
|
119
|
-
return out;
|
|
120
|
-
}
|
package/dist/bedrock-proxy.js
DELETED
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
import { createServer, } from 'node:http';
|
|
2
|
-
import { EventStreamDecoder } from './bedrock-eventstream.js';
|
|
3
|
-
import { callBedrock, freshAdaptations, invoke, invokeUrl, upstreamMessage, } from './bedrock-upstream.js';
|
|
4
|
-
export class BedrockConfigError extends Error {
|
|
5
|
-
}
|
|
6
|
-
export class ProxyError extends Error {
|
|
7
|
-
status;
|
|
8
|
-
kind;
|
|
9
|
-
constructor(status, kind, message) {
|
|
10
|
-
super(message);
|
|
11
|
-
this.status = status;
|
|
12
|
-
this.kind = kind;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
const ANTHROPIC_VERSION = 'bedrock-2023-05-31';
|
|
16
|
-
const BODY_MAX = 64 * 1024 * 1024;
|
|
17
|
-
const MESSAGES_PATH = '/v1/messages';
|
|
18
|
-
const COUNT_PATH = '/v1/messages/count_tokens';
|
|
19
|
-
function firstEnv(env, names) {
|
|
20
|
-
for (const name of names) {
|
|
21
|
-
const value = env[name]?.trim() ?? '';
|
|
22
|
-
if (value !== '')
|
|
23
|
-
return value;
|
|
24
|
-
}
|
|
25
|
-
return '';
|
|
26
|
-
}
|
|
27
|
-
export function bedrockConfigFromEnv(env = process.env) {
|
|
28
|
-
const bearerToken = firstEnv(env, ['AWS_BEARER_TOKEN_BEDROCK']);
|
|
29
|
-
if (bearerToken === '')
|
|
30
|
-
throw new BedrockConfigError('AWS_BEARER_TOKEN_BEDROCK is not set. Create an Amazon Bedrock API key in the AWS console (Bedrock → API keys) and export it.');
|
|
31
|
-
const region = firstEnv(env, ['METRO_BEDROCK_REGION', 'AWS_REGION', 'AWS_DEFAULT_REGION']);
|
|
32
|
-
if (region === '')
|
|
33
|
-
throw new BedrockConfigError('no AWS region: set AWS_REGION (or METRO_BEDROCK_REGION) to the region your Bedrock API key belongs to');
|
|
34
|
-
const model = firstEnv(env, ['METRO_BEDROCK_MODEL']);
|
|
35
|
-
return { region, bearerToken, model: model === '' ? null : model };
|
|
36
|
-
}
|
|
37
|
-
const PREFIXES = [
|
|
38
|
-
[/^us-gov-/, 'us-gov'],
|
|
39
|
-
[/^us-/, 'us'],
|
|
40
|
-
[/^eu-/, 'eu'],
|
|
41
|
-
[/^ap-/, 'apac'],
|
|
42
|
-
];
|
|
43
|
-
export function regionPrefix(region) {
|
|
44
|
-
for (const [pattern, prefix] of PREFIXES)
|
|
45
|
-
if (pattern.test(region))
|
|
46
|
-
return prefix;
|
|
47
|
-
return 'global';
|
|
48
|
-
}
|
|
49
|
-
export function mapModel(requested, cfg) {
|
|
50
|
-
if (cfg.model !== null)
|
|
51
|
-
return cfg.model;
|
|
52
|
-
if (requested.includes('anthropic.'))
|
|
53
|
-
return requested;
|
|
54
|
-
return `${regionPrefix(cfg.region)}.anthropic.${requested}`;
|
|
55
|
-
}
|
|
56
|
-
export const upstreamBase = (cfg, override) => override ?? `https://bedrock-runtime.${cfg.region}.amazonaws.com`;
|
|
57
|
-
function splitBetas(header) {
|
|
58
|
-
const raw = Array.isArray(header) ? header.join(',') : (header ?? '');
|
|
59
|
-
return raw
|
|
60
|
-
.split(',')
|
|
61
|
-
.map((b) => b.trim())
|
|
62
|
-
.filter((b) => b !== '');
|
|
63
|
-
}
|
|
64
|
-
export function rewriteBody(raw, betaHeader, cfg) {
|
|
65
|
-
if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
|
|
66
|
-
throw new ProxyError(400, 'invalid_request_error', 'body must be a JSON object');
|
|
67
|
-
const { model, stream, ...rest } = raw;
|
|
68
|
-
if (typeof model !== 'string' || model === '')
|
|
69
|
-
throw new ProxyError(400, 'invalid_request_error', 'model is required');
|
|
70
|
-
const betas = splitBetas(betaHeader);
|
|
71
|
-
const body = { ...rest, anthropic_version: ANTHROPIC_VERSION };
|
|
72
|
-
if (betas.length > 0)
|
|
73
|
-
body.anthropic_beta = betas;
|
|
74
|
-
return { modelId: mapModel(model, cfg), stream: stream === true, body, betas };
|
|
75
|
-
}
|
|
76
|
-
export function errorKind(status, errorType) {
|
|
77
|
-
if (status === 429 || errorType === 'ThrottlingException')
|
|
78
|
-
return 'rate_limit_error';
|
|
79
|
-
if (status === 400)
|
|
80
|
-
return 'invalid_request_error';
|
|
81
|
-
if (status === 401)
|
|
82
|
-
return 'authentication_error';
|
|
83
|
-
if (status === 403)
|
|
84
|
-
return 'permission_error';
|
|
85
|
-
if (status === 404)
|
|
86
|
-
return 'not_found_error';
|
|
87
|
-
if (status === 503)
|
|
88
|
-
return 'overloaded_error';
|
|
89
|
-
return 'api_error';
|
|
90
|
-
}
|
|
91
|
-
function sendError(res, status, kind, message) {
|
|
92
|
-
res.writeHead(status, { 'content-type': 'application/json' });
|
|
93
|
-
res.end(JSON.stringify({ type: 'error', error: { type: kind, message } }));
|
|
94
|
-
}
|
|
95
|
-
async function readBody(req) {
|
|
96
|
-
const chunks = [];
|
|
97
|
-
let total = 0;
|
|
98
|
-
for await (const chunk of req) {
|
|
99
|
-
const buf = chunk;
|
|
100
|
-
total += buf.length;
|
|
101
|
-
if (total > BODY_MAX)
|
|
102
|
-
throw new ProxyError(413, 'invalid_request_error', 'request too large');
|
|
103
|
-
chunks.push(buf);
|
|
104
|
-
}
|
|
105
|
-
try {
|
|
106
|
-
return JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
107
|
-
}
|
|
108
|
-
catch {
|
|
109
|
-
throw new ProxyError(400, 'invalid_request_error', 'body must be JSON');
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
async function relayError(upstream, res) {
|
|
113
|
-
const text = await upstream.text();
|
|
114
|
-
const kind = errorKind(upstream.status, upstream.headers.get('x-amzn-errortype'));
|
|
115
|
-
sendError(res, upstream.status, kind, upstreamMessage(text));
|
|
116
|
-
}
|
|
117
|
-
function eventTypeOf(event) {
|
|
118
|
-
try {
|
|
119
|
-
const parsed = JSON.parse(event);
|
|
120
|
-
return typeof parsed.type === 'string' ? parsed.type : 'message';
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
return 'message';
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
function writeEvent(res, message) {
|
|
127
|
-
if (message.headers[':message-type'] === 'event') {
|
|
128
|
-
const parsed = JSON.parse(message.payload.toString('utf8'));
|
|
129
|
-
if (typeof parsed.bytes !== 'string')
|
|
130
|
-
return;
|
|
131
|
-
const event = Buffer.from(parsed.bytes, 'base64').toString('utf8');
|
|
132
|
-
res.write(`event: ${eventTypeOf(event)}\ndata: ${event}\n\n`);
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
const errorType = message.headers[':exception-type'] ?? message.headers[':error-code'] ?? null;
|
|
136
|
-
const body = {
|
|
137
|
-
type: 'error',
|
|
138
|
-
error: {
|
|
139
|
-
type: errorKind(500, errorType),
|
|
140
|
-
message: upstreamMessage(message.payload.toString('utf8')),
|
|
141
|
-
},
|
|
142
|
-
};
|
|
143
|
-
res.write(`event: error\ndata: ${JSON.stringify(body)}\n\n`);
|
|
144
|
-
}
|
|
145
|
-
async function relayStream(upstream, res) {
|
|
146
|
-
res.writeHead(200, {
|
|
147
|
-
'content-type': 'text/event-stream',
|
|
148
|
-
'cache-control': 'no-store',
|
|
149
|
-
connection: 'keep-alive',
|
|
150
|
-
});
|
|
151
|
-
const body = upstream.body;
|
|
152
|
-
if (body === null) {
|
|
153
|
-
res.end();
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
const decoder = new EventStreamDecoder();
|
|
157
|
-
const reader = body.getReader();
|
|
158
|
-
for (;;) {
|
|
159
|
-
const { done, value } = await reader.read();
|
|
160
|
-
if (done)
|
|
161
|
-
break;
|
|
162
|
-
for (const message of decoder.push(Buffer.from(value)))
|
|
163
|
-
writeEvent(res, message);
|
|
164
|
-
}
|
|
165
|
-
res.end();
|
|
166
|
-
}
|
|
167
|
-
async function relayJson(upstream, res) {
|
|
168
|
-
const text = await upstream.text();
|
|
169
|
-
res.writeHead(200, { 'content-type': 'application/json' });
|
|
170
|
-
res.end(text);
|
|
171
|
-
}
|
|
172
|
-
async function handleMessages(req, res, up) {
|
|
173
|
-
const rewritten = rewriteBody(await readBody(req), req.headers['anthropic-beta'], up.cfg);
|
|
174
|
-
const controller = new AbortController();
|
|
175
|
-
res.on('close', () => {
|
|
176
|
-
if (!res.writableEnded)
|
|
177
|
-
controller.abort();
|
|
178
|
-
});
|
|
179
|
-
const upstream = await invoke(up, rewritten, controller.signal);
|
|
180
|
-
if (!upstream.ok) {
|
|
181
|
-
await relayError(upstream, res);
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
if (rewritten.stream)
|
|
185
|
-
await relayStream(upstream, res);
|
|
186
|
-
else
|
|
187
|
-
await relayJson(upstream, res);
|
|
188
|
-
}
|
|
189
|
-
function estimateTokens(body) {
|
|
190
|
-
return Math.ceil(JSON.stringify(body).length / 4);
|
|
191
|
-
}
|
|
192
|
-
async function handleCount(req, res, up) {
|
|
193
|
-
const rewritten = rewriteBody(await readBody(req), req.headers['anthropic-beta'], up.cfg);
|
|
194
|
-
const controller = new AbortController();
|
|
195
|
-
const upstream = await callBedrock(up, invokeUrl(up, rewritten.modelId, 'count-tokens'), { input: { invokeModel: { body: JSON.stringify(rewritten.body) } } }, 'application/json', controller.signal);
|
|
196
|
-
const text = await upstream.text();
|
|
197
|
-
let counted = null;
|
|
198
|
-
if (upstream.ok) {
|
|
199
|
-
const parsed = JSON.parse(text);
|
|
200
|
-
if (typeof parsed.inputTokens === 'number')
|
|
201
|
-
counted = parsed.inputTokens;
|
|
202
|
-
}
|
|
203
|
-
res.writeHead(200, { 'content-type': 'application/json' });
|
|
204
|
-
res.end(JSON.stringify({ input_tokens: counted ?? estimateTokens(rewritten.body) }));
|
|
205
|
-
}
|
|
206
|
-
function presentedToken(req) {
|
|
207
|
-
const auth = req.headers.authorization ?? '';
|
|
208
|
-
if (auth.toLowerCase().startsWith('bearer '))
|
|
209
|
-
return auth.slice(7).trim();
|
|
210
|
-
const key = req.headers['x-api-key'];
|
|
211
|
-
return Array.isArray(key) ? (key[0] ?? '') : (key ?? '');
|
|
212
|
-
}
|
|
213
|
-
async function route(req, res, cfg, opts, learned) {
|
|
214
|
-
if (presentedToken(req) !== opts.token)
|
|
215
|
-
throw new ProxyError(401, 'authentication_error', 'unauthorized');
|
|
216
|
-
const path = (req.url ?? '').split('?')[0] ?? '';
|
|
217
|
-
const up = { cfg, base: upstreamBase(cfg, opts.upstream), learned };
|
|
218
|
-
if (req.method === 'POST' && path === MESSAGES_PATH)
|
|
219
|
-
return handleMessages(req, res, up);
|
|
220
|
-
if (req.method === 'POST' && path === COUNT_PATH)
|
|
221
|
-
return handleCount(req, res, up);
|
|
222
|
-
throw new ProxyError(404, 'not_found_error', 'not found');
|
|
223
|
-
}
|
|
224
|
-
function failed(res, err) {
|
|
225
|
-
if (res.headersSent) {
|
|
226
|
-
res.end();
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
if (err instanceof ProxyError) {
|
|
230
|
-
sendError(res, err.status, err.kind, err.message);
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
const message = err instanceof Error ? err.message : 'proxy failure';
|
|
234
|
-
sendError(res, 502, 'api_error', `metro bedrock proxy: ${message}`);
|
|
235
|
-
}
|
|
236
|
-
export function startBedrockProxy(cfg, opts) {
|
|
237
|
-
const learned = freshAdaptations();
|
|
238
|
-
const server = createServer((req, res) => {
|
|
239
|
-
route(req, res, cfg, opts, learned).catch((err) => {
|
|
240
|
-
failed(res, err);
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
return new Promise((resolve, reject) => {
|
|
244
|
-
server.once('error', reject);
|
|
245
|
-
server.listen(opts.port ?? 0, '127.0.0.1', () => {
|
|
246
|
-
const address = server.address();
|
|
247
|
-
const port = typeof address === 'object' && address !== null ? address.port : 0;
|
|
248
|
-
resolve({
|
|
249
|
-
port,
|
|
250
|
-
server,
|
|
251
|
-
learned,
|
|
252
|
-
close: () => new Promise((done) => {
|
|
253
|
-
server.close(() => {
|
|
254
|
-
done();
|
|
255
|
-
});
|
|
256
|
-
}),
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
}
|
package/dist/bedrock-upstream.js
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
export const freshAdaptations = () => ({
|
|
2
|
-
fields: new Set(),
|
|
3
|
-
dropBetas: false,
|
|
4
|
-
});
|
|
5
|
-
const EXTRA_INPUT_RE = /^([A-Za-z0-9_]+)(?:\.[^:]*)?: Extra inputs are not permitted/;
|
|
6
|
-
const MAX_REPAIRS = 4;
|
|
7
|
-
export function invokeUrl(up, modelId, action) {
|
|
8
|
-
return `${up.base}/model/${encodeURIComponent(modelId)}/${action}`;
|
|
9
|
-
}
|
|
10
|
-
export function callBedrock(up, url, body, accept, signal) {
|
|
11
|
-
return fetch(url, {
|
|
12
|
-
method: 'POST',
|
|
13
|
-
headers: {
|
|
14
|
-
authorization: `Bearer ${up.cfg.bearerToken}`,
|
|
15
|
-
'content-type': 'application/json',
|
|
16
|
-
accept,
|
|
17
|
-
},
|
|
18
|
-
body: JSON.stringify(body),
|
|
19
|
-
signal,
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
export function upstreamMessage(text) {
|
|
23
|
-
const fallback = text === '' ? 'Bedrock returned no body' : text;
|
|
24
|
-
try {
|
|
25
|
-
const parsed = JSON.parse(text);
|
|
26
|
-
const message = parsed.message ?? parsed.Message;
|
|
27
|
-
return typeof message === 'string' && message !== '' ? message : fallback;
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
return fallback;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
const without = (body, keys) => Object.fromEntries(Object.entries(body).filter(([key]) => !keys.has(key)));
|
|
34
|
-
function applyLearned(req, learned) {
|
|
35
|
-
const dropped = new Set(learned.fields);
|
|
36
|
-
if (learned.dropBetas)
|
|
37
|
-
dropped.add('anthropic_beta');
|
|
38
|
-
return {
|
|
39
|
-
body: without(req.body, dropped),
|
|
40
|
-
betas: learned.dropBetas ? [] : req.betas,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
function repair(attempt, learned, message) {
|
|
44
|
-
const named = EXTRA_INPUT_RE.exec(message)?.[1];
|
|
45
|
-
if (named !== undefined && named in attempt.body) {
|
|
46
|
-
learned.fields.add(named);
|
|
47
|
-
process.stderr.write(`metro bedrock: Bedrock refused "${named}" (extra input); dropping it from every request\n`);
|
|
48
|
-
return { body: without(attempt.body, new Set([named])), betas: attempt.betas };
|
|
49
|
-
}
|
|
50
|
-
if (attempt.betas.length > 0) {
|
|
51
|
-
learned.dropBetas = true;
|
|
52
|
-
process.stderr.write(`metro bedrock: retrying without anthropic_beta [${attempt.betas.join(', ')}]\n`);
|
|
53
|
-
return { body: without(attempt.body, new Set(['anthropic_beta'])), betas: [] };
|
|
54
|
-
}
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
export async function invoke(up, req, signal) {
|
|
58
|
-
const action = req.stream ? 'invoke-with-response-stream' : 'invoke';
|
|
59
|
-
const accept = req.stream ? 'application/vnd.amazon.eventstream' : 'application/json';
|
|
60
|
-
const url = invokeUrl(up, req.modelId, action);
|
|
61
|
-
let attempt = applyLearned(req, up.learned);
|
|
62
|
-
for (let repairs = 0;; repairs += 1) {
|
|
63
|
-
const res = await callBedrock(up, url, attempt.body, accept, signal);
|
|
64
|
-
if (res.status !== 400 || repairs >= MAX_REPAIRS)
|
|
65
|
-
return res;
|
|
66
|
-
const text = await res.text();
|
|
67
|
-
const next = repair(attempt, up.learned, upstreamMessage(text));
|
|
68
|
-
if (next === null)
|
|
69
|
-
return new Response(text, { status: 400, headers: res.headers });
|
|
70
|
-
attempt = next;
|
|
71
|
-
}
|
|
72
|
-
}
|