@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
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { errMsg } from '@metro-labs/core/log';
|
|
2
|
+
|
|
3
|
+
const HINTS: Record<string, string> = {
|
|
4
|
+
ENOTFOUND: 'the name does not resolve',
|
|
5
|
+
EAI_AGAIN: 'the name did not resolve in time',
|
|
6
|
+
ECONNREFUSED: 'nothing is listening there',
|
|
7
|
+
ECONNRESET: 'the server dropped the connection',
|
|
8
|
+
ETIMEDOUT: 'the server did not answer in time',
|
|
9
|
+
ConnectionRefused: 'nothing is listening there',
|
|
10
|
+
CERT_HAS_EXPIRED: 'its certificate has expired',
|
|
11
|
+
DEPTH_ZERO_SELF_SIGNED_CERT: 'its certificate is self-signed',
|
|
12
|
+
UNABLE_TO_VERIFY_LEAF_SIGNATURE: 'its certificate could not be verified',
|
|
13
|
+
ERR_TLS_CERT_ALTNAME_INVALID: 'its certificate is for another name',
|
|
14
|
+
SELF_SIGNED_CERT_IN_CHAIN: 'its certificate chain is not trusted',
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const codeOf = (err: unknown): string =>
|
|
18
|
+
err !== null && typeof err === 'object' && 'code' in err && typeof err.code === 'string' ? err.code : '';
|
|
19
|
+
|
|
20
|
+
export function whyUnreachable(err: unknown): string {
|
|
21
|
+
const inner = err instanceof Error && err.cause instanceof Error ? err.cause : err;
|
|
22
|
+
const message = errMsg(inner).trim();
|
|
23
|
+
const code = codeOf(inner) || codeOf(err);
|
|
24
|
+
const said = message !== '' && message !== 'fetch failed' ? message : code || 'no answer';
|
|
25
|
+
const hint = HINTS[code];
|
|
26
|
+
return hint === undefined ? said : `${said} (${hint})`;
|
|
27
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { isRecord } from '@metro-labs/core/is-record';
|
|
2
|
+
import type { FetchLike } from '@metro-labs/core/stations/oauth';
|
|
3
|
+
import { authServerMetadataUrls, resourceMetadataUrls, type OAuthServer } from './connector-discovery.js';
|
|
4
|
+
import { boundOAuthResource, optionalOAuthResource, parsePublicConnectorUrl, publicOAuthResource } from './connector-public-url.js';
|
|
5
|
+
import { refused, ConnectorVerifyError } from './connector-url.js';
|
|
6
|
+
|
|
7
|
+
const METADATA_MAX = 1024 * 1024;
|
|
8
|
+
const metadataError = (): Error => refused('The provider returned invalid or unavailable public OAuth metadata. Check its public OAuth resource and try again.');
|
|
9
|
+
export class OAuthResourceRequired extends ConnectorVerifyError {
|
|
10
|
+
constructor() { super('Enter the provider’s public OAuth resource before continuing. It is shown in the sign-in page; never enter a private endpoint or credentials.', 400); }
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async function metadataBody(res: Response): Promise<Record<string, unknown>> {
|
|
14
|
+
if (res.body === null) throw metadataError();
|
|
15
|
+
const reader = res.body.getReader();
|
|
16
|
+
const chunks: Uint8Array[] = [];
|
|
17
|
+
let size = 0;
|
|
18
|
+
try {
|
|
19
|
+
for (;;) {
|
|
20
|
+
const { done, value } = await reader.read();
|
|
21
|
+
if (done) break;
|
|
22
|
+
size += value.length;
|
|
23
|
+
if (size > METADATA_MAX) throw metadataError();
|
|
24
|
+
chunks.push(value);
|
|
25
|
+
}
|
|
26
|
+
const body: unknown = JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
27
|
+
if (!isRecord(body)) throw metadataError();
|
|
28
|
+
return body;
|
|
29
|
+
} finally {
|
|
30
|
+
await reader.cancel().catch(() => undefined);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function metadata(url: URL, send: FetchLike): Promise<Record<string, unknown> | null> {
|
|
35
|
+
try {
|
|
36
|
+
const res = await send(url.toString(), { redirect: 'manual', signal: AbortSignal.timeout(10_000), headers: { accept: 'application/json' } });
|
|
37
|
+
if (res.status === 404) {
|
|
38
|
+
await res.body?.cancel();
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
if (!res.ok) {
|
|
42
|
+
await res.body?.cancel();
|
|
43
|
+
throw metadataError();
|
|
44
|
+
}
|
|
45
|
+
return await metadataBody(res);
|
|
46
|
+
} catch {
|
|
47
|
+
throw metadataError();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function selectedResource(transport: URL, offered: string | undefined, body: Record<string, unknown> | null): string {
|
|
52
|
+
const advertised = body !== null && Object.hasOwn(body, 'resource') ? publicOAuthResource(body.resource) : undefined;
|
|
53
|
+
if (advertised !== undefined && offered !== undefined && advertised !== offered) throw metadataError();
|
|
54
|
+
const resource = advertised ?? offered;
|
|
55
|
+
if (resource === undefined) throw new OAuthResourceRequired();
|
|
56
|
+
return boundOAuthResource(transport.toString(), resource);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function issuerOf(body: Record<string, unknown> | null, transport: URL): string {
|
|
60
|
+
if (body === null || !Object.hasOwn(body, 'authorization_servers')) return transport.origin;
|
|
61
|
+
const servers = body.authorization_servers;
|
|
62
|
+
if (!Array.isArray(servers) || servers.length === 0 || servers.length > 20) throw metadataError();
|
|
63
|
+
const values = servers.map((value: unknown) => publicOAuthResource(value));
|
|
64
|
+
return values[0] ?? '';
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function scopesOf(body: Record<string, unknown> | null): string[] {
|
|
68
|
+
if (body === null || !Object.hasOwn(body, 'scopes_supported')) return [];
|
|
69
|
+
const scopes = body.scopes_supported;
|
|
70
|
+
if (!Array.isArray(scopes) || scopes.length > 100 || scopes.some((scope: unknown) => typeof scope !== 'string' || !/^[\x21\x23-\x5b\x5d-\x7e]{1,128}$/.test(scope))) throw metadataError();
|
|
71
|
+
return [...new Set(scopes as string[])];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function serverOf(body: Record<string, unknown>, issuer: string, scopes: string[]): OAuthServer {
|
|
75
|
+
if (typeof body.issuer !== 'string' || publicOAuthResource(body.issuer) !== issuer) throw metadataError();
|
|
76
|
+
const endpoint = (raw: unknown): string => parsePublicConnectorUrl(raw).toString();
|
|
77
|
+
return {
|
|
78
|
+
issuer,
|
|
79
|
+
authorizationEndpoint: endpoint(body.authorization_endpoint),
|
|
80
|
+
tokenEndpoint: endpoint(body.token_endpoint),
|
|
81
|
+
registrationEndpoint: body.registration_endpoint === undefined ? null : endpoint(body.registration_endpoint),
|
|
82
|
+
supportsS256: Array.isArray(body.code_challenge_methods_supported) && body.code_challenge_methods_supported.includes('S256'),
|
|
83
|
+
scopes,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function protectedMetadata(base: URL, send: FetchLike): Promise<Record<string, unknown> | null> {
|
|
88
|
+
for (const candidate of resourceMetadataUrls(base)) {
|
|
89
|
+
const body = await metadata(candidate, send);
|
|
90
|
+
if (body !== null) return body;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export async function discoverPublicOAuth(target: string, offered: unknown, send: FetchLike = fetch): Promise<{ server: OAuthServer; resource: string }> {
|
|
96
|
+
const transport = parsePublicConnectorUrl(target);
|
|
97
|
+
const explicit = optionalOAuthResource(offered);
|
|
98
|
+
if (explicit !== undefined) boundOAuthResource(target, explicit);
|
|
99
|
+
const body = await protectedMetadata(new URL(explicit ?? transport.origin), send);
|
|
100
|
+
const resource = selectedResource(transport, explicit, body);
|
|
101
|
+
const issuer = issuerOf(body, transport);
|
|
102
|
+
const scopes = scopesOf(body);
|
|
103
|
+
for (const candidate of authServerMetadataUrls(new URL(issuer))) {
|
|
104
|
+
const authorization = await metadata(candidate, send);
|
|
105
|
+
if (authorization !== null) return { server: serverOf(authorization, issuer, scopes), resource };
|
|
106
|
+
}
|
|
107
|
+
throw metadataError();
|
|
108
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { isRecord } from '@metro-labs/core/is-record';
|
|
2
|
+
import { errMsg, log } from '@metro-labs/core/log';
|
|
3
|
+
import type { FetchLike } from '@metro-labs/core/stations/oauth';
|
|
4
|
+
import { authHeaders, INITIALIZE, mcpPost, payloadOf, type ConnectorAuth } from './connector-mcp.js';
|
|
5
|
+
import { ConnectorUnauthorized, refused } from './connector-url.js';
|
|
6
|
+
|
|
7
|
+
export interface RemoteTool {
|
|
8
|
+
name: string;
|
|
9
|
+
title: string;
|
|
10
|
+
description: string;
|
|
11
|
+
readOnly: boolean;
|
|
12
|
+
inputSchema?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const TIMEOUT_MS = 15_000;
|
|
16
|
+
const MAX_PAGES = 100;
|
|
17
|
+
const MAX_TOOLS = 2000;
|
|
18
|
+
|
|
19
|
+
function resultOf(text: string, contentType: string): Record<string, unknown> | null {
|
|
20
|
+
let parsed: unknown = null;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(payloadOf(text, contentType));
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return isRecord(parsed) && isRecord(parsed.result) ? parsed.result : null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function rpc(url: URL, auth: ConnectorAuth, session: Map<string, string>, body: unknown, fetchImpl?: FetchLike): Promise<Record<string, unknown> | null> {
|
|
30
|
+
const res = await mcpPost(url, auth, body, { timeoutMs: TIMEOUT_MS, headers: Object.fromEntries(session), fetch: fetchImpl });
|
|
31
|
+
const id = res.headers.get('mcp-session-id');
|
|
32
|
+
if (id !== null && id !== '') session.set('mcp-session-id', id);
|
|
33
|
+
const text = await res.text().catch(() => '');
|
|
34
|
+
if (res.status === 401 || res.status === 403) throw new ConnectorUnauthorized(`${url.hostname} rejected the credential; connect it again`, 400);
|
|
35
|
+
if (!res.ok) throw refused(`${url.hostname} answered ${String(res.status)}`);
|
|
36
|
+
return resultOf(text, res.headers.get('content-type') ?? '');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function toTool(raw: unknown): RemoteTool | null {
|
|
40
|
+
if (!isRecord(raw) || typeof raw.name !== 'string') return null;
|
|
41
|
+
const annotations = isRecord(raw.annotations) ? raw.annotations : {};
|
|
42
|
+
const title = typeof raw.title === 'string' && raw.title !== '' ? raw.title : raw.name;
|
|
43
|
+
return { name: raw.name, title, description: typeof raw.description === 'string' ? raw.description : '', readOnly: annotations.readOnlyHint === true, ...(isRecord(raw.inputSchema) ? { inputSchema: raw.inputSchema } : {}) };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function endSession(url: URL, auth: ConnectorAuth, session: Map<string, string>, fetchImpl?: FetchLike): Promise<void> {
|
|
47
|
+
if (!session.has('mcp-session-id')) return;
|
|
48
|
+
try {
|
|
49
|
+
const send = fetchImpl ?? fetch;
|
|
50
|
+
const res = await send(url.toString(), { method: 'DELETE', redirect: 'manual', signal: AbortSignal.timeout(TIMEOUT_MS), headers: { ...authHeaders(auth), ...Object.fromEntries(session) } });
|
|
51
|
+
if (res.ok) await res.body?.pipeTo(new WritableStream<Uint8Array>());
|
|
52
|
+
else await res.body?.cancel();
|
|
53
|
+
} catch (err) {
|
|
54
|
+
log.debug(fetchImpl === undefined ? { host: url.hostname, err: errMsg(err) } : {}, 'connector-tools: the remote declined to end the session');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function addTools(result: Record<string, unknown> | null, tools: Map<string, RemoteTool>): unknown {
|
|
59
|
+
if (result === null || !Array.isArray(result.tools)) throw refused('The provider did not return a complete tool list.');
|
|
60
|
+
for (const raw of result.tools) {
|
|
61
|
+
const tool = toTool(raw);
|
|
62
|
+
if (tool === null || tools.has(tool.name)) throw refused('The provider returned an invalid tool list.');
|
|
63
|
+
tools.set(tool.name, tool);
|
|
64
|
+
if (tools.size > MAX_TOOLS) throw refused('The provider returned too many tools.');
|
|
65
|
+
}
|
|
66
|
+
return result.nextCursor;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function walkTools(url: URL, auth: ConnectorAuth, session: Map<string, string>, fetchImpl?: FetchLike): Promise<RemoteTool[]> {
|
|
70
|
+
const tools = new Map<string, RemoteTool>();
|
|
71
|
+
const cursors = new Set<string>();
|
|
72
|
+
let cursor = '';
|
|
73
|
+
for (let page = 0; page < MAX_PAGES; page += 1) {
|
|
74
|
+
const result = await rpc(url, auth, session, { jsonrpc: '2.0', id: 2 + page, method: 'tools/list', params: cursor === '' ? {} : { cursor } }, fetchImpl);
|
|
75
|
+
const next = addTools(result, tools);
|
|
76
|
+
if (next === undefined || next === null || next === '') return [...tools.values()];
|
|
77
|
+
if (typeof next !== 'string' || cursors.has(next)) throw refused('The provider did not return a complete tool list.');
|
|
78
|
+
cursors.add(next);
|
|
79
|
+
cursor = next;
|
|
80
|
+
}
|
|
81
|
+
throw refused('The provider did not return a complete tool list.');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export async function listRemoteTools(url: URL, auth: ConnectorAuth, fetchImpl?: FetchLike): Promise<RemoteTool[]> {
|
|
85
|
+
const session = new Map<string, string>();
|
|
86
|
+
try {
|
|
87
|
+
const init = await rpc(url, auth, session, INITIALIZE, fetchImpl);
|
|
88
|
+
if (init === null || typeof init.protocolVersion !== 'string') throw refused(`${url.hostname} answered, but it does not speak MCP.`);
|
|
89
|
+
session.set('mcp-protocol-version', init.protocolVersion);
|
|
90
|
+
await rpc(url, auth, session, { jsonrpc: '2.0', method: 'notifications/initialized' }, fetchImpl);
|
|
91
|
+
return await walkTools(url, auth, session, fetchImpl);
|
|
92
|
+
} finally {
|
|
93
|
+
await endSession(url, auth, session, fetchImpl);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -4,22 +4,17 @@ export class ConnectorVerifyError extends ApiError {}
|
|
|
4
4
|
|
|
5
5
|
export class ConnectorUnauthorized extends ConnectorVerifyError {}
|
|
6
6
|
|
|
7
|
-
export class ConnectorNotMcp extends ConnectorVerifyError {}
|
|
8
|
-
|
|
9
|
-
export const POLICY_MESSAGE =
|
|
10
|
-
'Metro connects from its own server, so it cannot reach a URL on your machine. localhost and private addresses are not usable as connectors.';
|
|
11
|
-
|
|
12
|
-
const IPV4 = /^\d{1,3}(?:\.\d{1,3}){3}$/;
|
|
13
|
-
const PRIVATE_SUFFIX = /(?:^|\.)(?:localhost|local|internal|flycast)$/;
|
|
14
|
-
|
|
15
7
|
export function refused(message: string): ConnectorVerifyError {
|
|
16
8
|
return new ConnectorVerifyError(message, 400);
|
|
17
9
|
}
|
|
18
10
|
|
|
19
|
-
function
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
-
|
|
11
|
+
function refuseShape(url: URL): void {
|
|
12
|
+
if (url.protocol !== 'https:' && url.protocol !== 'http:')
|
|
13
|
+
throw refused('a connector url must start with https:// or http://');
|
|
14
|
+
if (url.username !== '' || url.password !== '')
|
|
15
|
+
throw refused('a connector url must not carry a user:password');
|
|
16
|
+
if (url.hash !== '')
|
|
17
|
+
throw refused('a connector url must not carry a #fragment');
|
|
23
18
|
}
|
|
24
19
|
|
|
25
20
|
export function parseConnectorUrl(raw: unknown): URL {
|
|
@@ -31,13 +26,7 @@ export function parseConnectorUrl(raw: unknown): URL {
|
|
|
31
26
|
} catch {
|
|
32
27
|
throw refused('that is not a valid url');
|
|
33
28
|
}
|
|
34
|
-
|
|
35
|
-
throw refused('a connector url must start with https://');
|
|
36
|
-
if (url.username !== '' || url.password !== '')
|
|
37
|
-
throw refused('a connector url must not carry a user:password');
|
|
38
|
-
if (url.hash !== '')
|
|
39
|
-
throw refused('a connector url must not carry a #fragment');
|
|
40
|
-
if (!hostAllowed(url.hostname.toLowerCase())) throw refused(POLICY_MESSAGE);
|
|
29
|
+
refuseShape(url);
|
|
41
30
|
return url;
|
|
42
31
|
}
|
|
43
32
|
|
|
@@ -46,12 +35,3 @@ export function connectorUrlText(url: URL): string {
|
|
|
46
35
|
if (url.pathname !== '/' || url.search !== '') return text;
|
|
47
36
|
return text.endsWith('/') ? text.slice(0, -1) : text;
|
|
48
37
|
}
|
|
49
|
-
|
|
50
|
-
export function safeIconSrc(raw: unknown): string {
|
|
51
|
-
if (typeof raw !== 'string' || raw === '') return '';
|
|
52
|
-
try {
|
|
53
|
-
return new URL(raw).protocol === 'https:' ? raw.slice(0, 500) : '';
|
|
54
|
-
} catch {
|
|
55
|
-
return '';
|
|
56
|
-
}
|
|
57
|
-
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const P = 2n ** 255n - 19n;
|
|
2
|
+
|
|
3
|
+
interface Point {
|
|
4
|
+
x: bigint;
|
|
5
|
+
y: bigint;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const mod = (a: bigint): bigint => ((a % P) + P) % P;
|
|
9
|
+
|
|
10
|
+
function pow(base: bigint, exp: bigint): bigint {
|
|
11
|
+
let result = 1n;
|
|
12
|
+
let b = mod(base);
|
|
13
|
+
for (let e = exp; e > 0n; e >>= 1n) {
|
|
14
|
+
if ((e & 1n) === 1n) result = (result * b) % P;
|
|
15
|
+
b = (b * b) % P;
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const inv = (a: bigint): bigint => pow(a, P - 2n);
|
|
21
|
+
const D = mod(-121665n * inv(121666n));
|
|
22
|
+
const SQRT_M1 = pow(2n, (P - 1n) / 4n);
|
|
23
|
+
|
|
24
|
+
function rootOf(u: bigint, v: bigint): bigint | null {
|
|
25
|
+
const x = mod(u * pow(v, 3n) * pow(mod(u * pow(v, 7n)), (P - 5n) / 8n));
|
|
26
|
+
const vx2 = mod(v * x * x);
|
|
27
|
+
if (vx2 === u) return x;
|
|
28
|
+
return vx2 === mod(-u) ? mod(x * SQRT_M1) : null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function decode(bytes: Buffer): Point | null {
|
|
32
|
+
if (bytes.length !== 32) return null;
|
|
33
|
+
const last = bytes[31] ?? 0;
|
|
34
|
+
const sign = BigInt(last >> 7);
|
|
35
|
+
const copy = Buffer.from(bytes);
|
|
36
|
+
copy[31] = last & 0x7f;
|
|
37
|
+
const y = BigInt(`0x${copy.reverse().toString('hex')}`);
|
|
38
|
+
if (y >= P) return null;
|
|
39
|
+
const y2 = (y * y) % P;
|
|
40
|
+
const x = rootOf(mod(y2 - 1n), mod(D * y2 + 1n));
|
|
41
|
+
if (x === null || (x === 0n && sign === 1n)) return null;
|
|
42
|
+
return { x: (x & 1n) === sign ? x : mod(-x), y };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function add(a: Point, b: Point): Point {
|
|
46
|
+
const t = mod(D * a.x * b.x * a.y * b.y);
|
|
47
|
+
return { x: mod((a.x * b.y + a.y * b.x) * inv(mod(1n + t))), y: mod((a.y * b.y + a.x * b.x) * inv(mod(1n - t))) };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function strongEd25519(raw: Buffer): boolean {
|
|
51
|
+
const point = decode(raw);
|
|
52
|
+
if (point === null) return false;
|
|
53
|
+
let eight = point;
|
|
54
|
+
for (let i = 0; i < 3; i += 1) eight = add(eight, eight);
|
|
55
|
+
return !(eight.x === 0n && eight.y === 1n);
|
|
56
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { isRecord } from '@metro-labs/core/is-record';
|
|
2
|
+
|
|
3
|
+
export const MCP_PATHS = { token: '/v1/token', approvals: '/v1/approvals', answer: '/v1/approvals/answer' } as const;
|
|
4
|
+
export const MCP_FIND_DEFAULT = 5;
|
|
5
|
+
export const MCP_FIND_MAX = 20;
|
|
6
|
+
export const MCP_CALLS_MAX = 10;
|
|
7
|
+
export const MCP_QUERY_MAX = 500;
|
|
8
|
+
export const MCP_APPROVAL_WAIT_MS = 25_000;
|
|
9
|
+
export const MCP_APPROVAL_ID_RE = /^[a-km-z]{5}$/;
|
|
10
|
+
export const TOOL_SEARCH = 'tool_search';
|
|
11
|
+
export const TOOL_CALL = 'tool_call';
|
|
12
|
+
export const TOOL_CALL_EXAMPLE = '{"calls":[{"tool":"notion.search","arguments":{"query":"roadmap"}}]}';
|
|
13
|
+
|
|
14
|
+
const EXPECTED = ` Expected: ${TOOL_CALL_EXAMPLE}, with names as tool_search returns them.`;
|
|
15
|
+
export const MCP_TOKEN_RE = /^mcp_[A-Za-z0-9_-]{43}$/;
|
|
16
|
+
|
|
17
|
+
export type McpErrorCode = 'blocked' | 'needs_approval' | 'denied' | 'not_found' | 'signin' | 'unavailable' | 'vendor_error' | 'invalid';
|
|
18
|
+
|
|
19
|
+
export interface McpFindRequest {
|
|
20
|
+
query: string;
|
|
21
|
+
max_results: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface McpCall {
|
|
25
|
+
tool: string;
|
|
26
|
+
arguments: Record<string, unknown>;
|
|
27
|
+
approval?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface McpApproval {
|
|
31
|
+
id: string;
|
|
32
|
+
connector: string;
|
|
33
|
+
tool: string;
|
|
34
|
+
preview: string;
|
|
35
|
+
requestedAt: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export type McpDecision = 'allow' | 'deny';
|
|
39
|
+
|
|
40
|
+
const TOOL_RE = /^([a-z0-9][a-z0-9-]{0,62})\.([A-Za-z0-9_][A-Za-z0-9_.:/-]{0,127})$/;
|
|
41
|
+
|
|
42
|
+
export function splitMcpTool(name: string): { connector: string; tool: string } | null {
|
|
43
|
+
const match = TOOL_RE.exec(name);
|
|
44
|
+
return match === null ? null : { connector: match[1] ?? '', tool: match[2] ?? '' };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function mcpFindRequestOf(raw: unknown): McpFindRequest {
|
|
48
|
+
if (!isRecord(raw) || typeof raw.query !== 'string' || raw.query.trim() === '' || raw.query.length > MCP_QUERY_MAX) throw new Error('tool_search needs a query of 1 to 500 characters.');
|
|
49
|
+
const wanted = raw.max_results ?? MCP_FIND_DEFAULT;
|
|
50
|
+
if (typeof wanted !== 'number' || !Number.isInteger(wanted) || wanted < 1) throw new Error('max_results must be a whole number from 1.');
|
|
51
|
+
return { query: raw.query.trim(), max_results: Math.min(wanted, MCP_FIND_MAX) };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function callOf(raw: unknown): McpCall {
|
|
55
|
+
if (!isRecord(raw) || typeof raw.tool !== 'string' || splitMcpTool(raw.tool) === null) throw new Error(`Each call needs a tool named <connector>.<tool>, as tool_search returns it.${EXPECTED}`);
|
|
56
|
+
const args = raw.arguments ?? {};
|
|
57
|
+
if (!isRecord(args)) throw new Error(`The arguments of ${raw.tool} must be an object.${EXPECTED}`);
|
|
58
|
+
if (raw.approval !== undefined && (typeof raw.approval !== 'string' || !MCP_APPROVAL_ID_RE.test(raw.approval))) throw new Error('approval must be the 5-letter id the approval request gave.');
|
|
59
|
+
return { tool: raw.tool, arguments: args, ...(typeof raw.approval === 'string' ? { approval: raw.approval } : {}) };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function mcpCallsOf(raw: unknown): McpCall[] {
|
|
63
|
+
const calls = isRecord(raw) ? raw.calls : undefined;
|
|
64
|
+
if (!Array.isArray(calls) || calls.length === 0 || calls.length > MCP_CALLS_MAX) throw new Error(`tool_call needs 1 to ${String(MCP_CALLS_MAX)} calls in "calls".${EXPECTED}`);
|
|
65
|
+
return calls.map(callOf);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function mcpTokenHashOf(raw: unknown): string {
|
|
69
|
+
if (!isRecord(raw) || typeof raw.tokenHash !== 'string' || !/^[A-Za-z0-9_-]{43}$/.test(raw.tokenHash)) throw new Error('tokenHash must be the base64url SHA-256 of the MCP token.');
|
|
70
|
+
return raw.tokenHash;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function approvalOf(raw: unknown): McpApproval | null {
|
|
74
|
+
if (!isRecord(raw) || typeof raw.id !== 'string' || !MCP_APPROVAL_ID_RE.test(raw.id) || typeof raw.connector !== 'string' || typeof raw.tool !== 'string' || typeof raw.preview !== 'string' || typeof raw.requestedAt !== 'number') return null;
|
|
75
|
+
return { id: raw.id, connector: raw.connector, tool: raw.tool, preview: raw.preview, requestedAt: raw.requestedAt };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function mcpApprovalsOf(raw: unknown): McpApproval[] {
|
|
79
|
+
if (!isRecord(raw) || !Array.isArray(raw.approvals)) throw new Error('Mcp sent an unreadable approval list.');
|
|
80
|
+
return raw.approvals.map(approvalOf).filter((row): row is McpApproval => row !== null);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function mcpAnswerOf(raw: unknown): { id: string; decision: McpDecision } {
|
|
84
|
+
if (!isRecord(raw) || typeof raw.id !== 'string' || !MCP_APPROVAL_ID_RE.test(raw.id) || (raw.decision !== 'allow' && raw.decision !== 'deny')) throw new Error('An answer needs the approval id and allow or deny.');
|
|
85
|
+
return { id: raw.id, decision: raw.decision };
|
|
86
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { MCP_CALLS_MAX, MCP_FIND_DEFAULT, MCP_FIND_MAX, TOOL_CALL, TOOL_CALL_EXAMPLE, TOOL_SEARCH } from './mcp-server-protocol.js';
|
|
2
|
+
|
|
3
|
+
export interface McpServerTool {
|
|
4
|
+
name: string;
|
|
5
|
+
title: string;
|
|
6
|
+
description: string;
|
|
7
|
+
inputSchema: Record<string, unknown>;
|
|
8
|
+
annotations: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const searchSchema = {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
query: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'What to look for: "select:<connector>.<tool>" (comma separated) loads exact tools, keywords rank tools, "+word" requires that word in the tool name.',
|
|
17
|
+
},
|
|
18
|
+
max_results: { type: 'number', description: `Maximum number of results to return (default: ${String(MCP_FIND_DEFAULT)}, at most ${String(MCP_FIND_MAX)})`, default: MCP_FIND_DEFAULT },
|
|
19
|
+
},
|
|
20
|
+
required: ['query'],
|
|
21
|
+
additionalProperties: false,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const callSchema = {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
calls: {
|
|
28
|
+
type: 'array',
|
|
29
|
+
minItems: 1,
|
|
30
|
+
maxItems: MCP_CALLS_MAX,
|
|
31
|
+
description: `1 to ${String(MCP_CALLS_MAX)} independent calls. They run in parallel and are answered in order.`,
|
|
32
|
+
items: {
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties: {
|
|
35
|
+
tool: { type: 'string', description: 'The tool name exactly as tool_search returned it: <connector>.<tool>.' },
|
|
36
|
+
arguments: { type: 'object', description: 'The tool\'s arguments, matching the parameters tool_search returned.', additionalProperties: true },
|
|
37
|
+
approval: { type: 'string', pattern: '^[a-km-z]{5}$', description: 'The 5-letter approval id, only when repeating a call the owner approved.' },
|
|
38
|
+
},
|
|
39
|
+
required: ['tool'],
|
|
40
|
+
additionalProperties: false,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
required: ['calls'],
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
function connectorsLine(keys: string[] | null): string {
|
|
49
|
+
if (keys === null) return 'The connectors of this agent are named here once Metro reaches mcp.metro.box.';
|
|
50
|
+
return keys.length === 0 ? 'This agent has no connectors it may use yet.' : `This agent's connectors: ${keys.join(', ')}.`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const toolSearchDescription = (keys: string[] | null): string =>
|
|
54
|
+
[
|
|
55
|
+
'Search the tools of every connector assigned to this agent: third-party services such as Notion, n8n, Linear or Gmail, run by mcp.metro.box. Same design as Claude Code\'s ToolSearch, for connectors.',
|
|
56
|
+
connectorsLine(keys),
|
|
57
|
+
'Three query forms, one example each:',
|
|
58
|
+
'- "select:notion.search" loads exact tools by name (comma separated for several).',
|
|
59
|
+
'- "notion create page" ranks tools by the words in their name and description.',
|
|
60
|
+
'- "+linear issue" requires "linear" in the tool name and ranks by the other words.',
|
|
61
|
+
'Results are full definitions (name, description and the JSON schema of the arguments) in a <functions> block. Each name is <connector>.<tool>: pass it exactly as "tool" to tool_call. Tools the owner blocked are never returned.',
|
|
62
|
+
].join('\n');
|
|
63
|
+
|
|
64
|
+
export const TOOL_CALL_DESCRIPTION = [
|
|
65
|
+
'Run connector tools that tool_search found. Always find a tool with tool_search first: its exact name and argument schema come from there.',
|
|
66
|
+
`Shape: ${TOOL_CALL_EXAMPLE}`,
|
|
67
|
+
`Up to ${String(MCP_CALLS_MAX)} independent calls run in parallel in one tool_call and are answered in order. Each result starts with "[n] <connector>.<tool>", then the tool's own content, or one line saying why it did not run:`,
|
|
68
|
+
'- not_found: no such connector or tool here. Run tool_search, then use a name it returned.',
|
|
69
|
+
'- needs_approval: the owner was asked in chat and on metro.box. Tell the person what is waiting, wait for the channel message "Approved: <tool> (<id>)", then call again with the same tool and arguments plus "approval": "<id>". An approval works once.',
|
|
70
|
+
'- denied or blocked: the owner refused or blocked this call. Do not retry it.',
|
|
71
|
+
'- signin: the connector must be signed in again. Tell the owner to do it on the organization\'s Connectors page on metro.box.',
|
|
72
|
+
'- unavailable: the connector or Metro could not be reached. Try again later.',
|
|
73
|
+
'- vendor_error: the connector answered with its own error, shown as it came.',
|
|
74
|
+
].join('\n');
|
|
75
|
+
|
|
76
|
+
export function mcpServerTools(keys: string[] | null): McpServerTool[] {
|
|
77
|
+
return [
|
|
78
|
+
{
|
|
79
|
+
name: TOOL_SEARCH,
|
|
80
|
+
title: 'Search connector tools',
|
|
81
|
+
description: toolSearchDescription(keys),
|
|
82
|
+
inputSchema: searchSchema,
|
|
83
|
+
annotations: { title: 'Search connector tools', readOnlyHint: true, openWorldHint: false },
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: TOOL_CALL,
|
|
87
|
+
title: 'Call connector tools',
|
|
88
|
+
description: TOOL_CALL_DESCRIPTION,
|
|
89
|
+
inputSchema: callSchema,
|
|
90
|
+
annotations: { title: 'Call connector tools', readOnlyHint: false, destructiveHint: true, openWorldHint: true },
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
}
|
package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-api.ts → http/src/mode-api.ts}
RENAMED
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
import {
|
|
2
|
+
import { cors, sendJson } from './api-http.js';
|
|
3
3
|
|
|
4
|
-
const PATH = '/api/
|
|
4
|
+
const PATH = '/api/mode';
|
|
5
5
|
|
|
6
|
-
export
|
|
6
|
+
export type DaemonMode = 'hosted' | 'local';
|
|
7
|
+
|
|
8
|
+
export interface ModeInfo {
|
|
9
|
+
mode: DaemonMode;
|
|
10
|
+
owner: string | null;
|
|
11
|
+
version: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function handleModeRequest(
|
|
7
15
|
req: IncomingMessage,
|
|
8
16
|
res: ServerResponse,
|
|
17
|
+
info: () => ModeInfo,
|
|
9
18
|
): boolean {
|
|
10
19
|
const path = (req.url ?? '').split('?')[0] ?? '';
|
|
11
20
|
if (path !== PATH) return false;
|
|
@@ -17,11 +26,6 @@ export function handleSessionApiRequest(
|
|
|
17
26
|
sendJson(req, res, 405, { error: 'method not allowed' });
|
|
18
27
|
return true;
|
|
19
28
|
}
|
|
20
|
-
|
|
21
|
-
if (!session) {
|
|
22
|
-
sendJson(req, res, 401, { error: 'unauthorized' });
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
sendJson(req, res, 200, { email: session.email });
|
|
29
|
+
sendJson(req, res, 200, info());
|
|
26
30
|
return true;
|
|
27
31
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const PREVIEW = /^([a-z0-9-]+--)?metro-ui\.netlify\.app$/;
|
|
2
|
+
|
|
3
|
+
export function allowedWebHost(host: string): boolean {
|
|
4
|
+
if (host === 'metro.box' || host === 'localhost' || host === '127.0.0.1')
|
|
5
|
+
return true;
|
|
6
|
+
return PREVIEW.test(host);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const APP_RETURN = 'metro://auth';
|
|
10
|
+
|
|
11
|
+
export const isAppReturn = (returnTo: string): boolean => returnTo === APP_RETURN;
|
|
12
|
+
|
|
13
|
+
export function validateReturnTo(returnTo: string): boolean {
|
|
14
|
+
let url: URL;
|
|
15
|
+
try {
|
|
16
|
+
url = new URL(returnTo);
|
|
17
|
+
} catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const host = url.hostname;
|
|
21
|
+
if (url.protocol === 'http:' && (host === 'localhost' || host === '127.0.0.1'))
|
|
22
|
+
return true;
|
|
23
|
+
if (url.protocol !== 'https:') return false;
|
|
24
|
+
return allowedWebHost(host);
|
|
25
|
+
}
|