@stage-labs/metro 0.1.0-beta.26 → 0.1.0-beta.261
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 +128 -0
- package/dist/api.js +9 -129
- package/dist/background.js +141 -0
- package/dist/claude-settings.js +40 -0
- package/dist/claude.js +201 -0
- package/dist/cli.js +67 -117
- package/dist/control.js +19 -103
- package/dist/hold.js +210 -0
- package/dist/local.js +43 -0
- package/dist/mcp-config.js +27 -0
- package/dist/memory.js +222 -0
- package/dist/node-name.js +71 -0
- package/dist/onboarding.js +44 -0
- package/dist/provider-flags.js +9 -0
- package/dist/root-release-io.js +161 -0
- package/dist/root-release.js +74 -0
- package/dist/route.js +66 -0
- package/dist/runtime-install.js +97 -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/dist/voice.js +56 -0
- package/package.json +3 -24
- package/runtime/marketplace/.claude-plugin/marketplace.json +12 -0
- package/runtime/marketplace/plugin/.claude-plugin/plugin.json +17 -0
- package/runtime/marketplace/plugin/.mcp.json +1 -0
- package/runtime/marketplace/plugin/MEMORY.md +78 -0
- package/runtime/marketplace/plugin/METRO.md +26 -0
- package/runtime/marketplace/plugin/STAGE.md +95 -0
- package/runtime/marketplace/plugin/bin/guard.mjs +75 -0
- package/runtime/marketplace/plugin/bin/metro-plugin.mjs +30 -0
- package/runtime/marketplace/plugin/bin/policy.mjs +97 -0
- package/runtime/marketplace/plugin/bin/session-start.mjs +31 -0
- package/runtime/marketplace/plugin/hooks/hooks.json +25 -0
- package/runtime/node_modules/@metro-labs/core/package.json +52 -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 +11 -7
- 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 +103 -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/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 +0 -1
- 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 +42 -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 +19 -1
- package/runtime/node_modules/@metro-labs/core/src/tickets.ts +37 -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 +113 -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 +81 -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 +91 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/view.ts +93 -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 +357 -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 +132 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/file-admin.ts +305 -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 +133 -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/pending.ts +150 -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 +238 -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 +75 -45
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/media-note.ts +11 -7
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/pending.ts +4 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +2 -2
- package/runtime/node_modules/@metro-labs/daemon/src/claude/api.ts +285 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/files.ts +359 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/login.ts +242 -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 +60 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/plugin-install.ts +149 -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 +50 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/runner.ts +45 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/session-continuity.ts +48 -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 +358 -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 +161 -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 +343 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/skills.ts +120 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/usage-probe.ts +128 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/version.ts +113 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-api.ts → daemon/src/connectors/api.ts} +79 -114
- package/runtime/node_modules/@metro-labs/{mcp/src/db/connector-config.ts → daemon/src/connectors/config.ts} +67 -41
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/gates.ts +72 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/health.ts +18 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-client.ts +14 -17
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-discovery.ts +33 -20
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth-routes.ts → daemon/src/connectors/oauth-routes.ts} +30 -32
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth.ts → daemon/src/connectors/oauth.ts} +60 -21
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/plugin-sync.ts +131 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/reach.ts +27 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-policy.ts +90 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/relay.ts +80 -35
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/store.ts +385 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/tools.ts +81 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/transfer-api.ts +116 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/transfer-crypto.ts +44 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/transfer-store.ts +48 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/url.ts +37 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/verify.ts +106 -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 +233 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/claude-logins.ts +168 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-auth.ts +219 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-device.ts +119 -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 +143 -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 +147 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/forward.ts +285 -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 +396 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-auth.ts +160 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-client.ts +46 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-setup.ts +150 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-stream.ts +139 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-translate.ts +236 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini.ts +208 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-api.ts +256 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-config.ts +353 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-lists.ts +57 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-signin.ts +157 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-store.ts +83 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter-login.ts +192 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter-signin.ts +64 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter.ts +104 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/pkce.ts +36 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/provider-models.ts +117 -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 +35 -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 +115 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage.ts +343 -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/{mcp → daemon}/src/mcp/call-tools.ts +86 -38
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +15 -16
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/group-tools.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/index.ts +49 -77
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/instructions.ts +30 -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 +92 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-relay.ts +88 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-gate.ts +82 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-snapshot.ts +79 -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/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/session-slot.ts +75 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session.ts +61 -57
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-catalog.ts +93 -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 +53 -40
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +115 -114
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +6 -11
- 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/net/tunnel.ts +316 -0
- package/runtime/node_modules/@metro-labs/daemon/src/policy/policy.ts +118 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/bearer.ts +38 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/body.ts +24 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +64 -53
- package/runtime/node_modules/@metro-labs/daemon/src/routes/local-mode.ts +210 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/session-apis.ts +71 -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 +102 -0
- package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-driver.ts +42 -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 +32 -22
- 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 +60 -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 +82 -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/approvals.ts +38 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/audio.ts +153 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/brain.ts +135 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/call.ts +200 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/calls.ts +130 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/peer.ts +84 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/scribe.ts +103 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/speakable.ts +54 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/speech.ts +104 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/store.ts +116 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/talk.ts +256 -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 +19 -187
- package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +2 -2
- 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 +5 -1
- package/runtime/node_modules/@metro-labs/gmail/package.json +25 -0
- package/runtime/node_modules/@metro-labs/gmail/src/accounts.ts +81 -0
- package/runtime/node_modules/@metro-labs/gmail/src/actions.ts +14 -0
- package/runtime/node_modules/@metro-labs/gmail/src/api.ts +31 -0
- package/runtime/node_modules/@metro-labs/gmail/src/attachments.ts +35 -0
- package/runtime/node_modules/@metro-labs/gmail/src/auth.ts +105 -0
- package/runtime/node_modules/@metro-labs/gmail/src/config.ts +13 -0
- package/runtime/node_modules/@metro-labs/gmail/src/inbound.ts +96 -0
- package/runtime/node_modules/@metro-labs/gmail/src/index.ts +12 -0
- package/runtime/node_modules/@metro-labs/gmail/src/login.ts +37 -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 +124 -0
- package/runtime/node_modules/@metro-labs/gmail/src/query.ts +99 -0
- package/runtime/node_modules/@metro-labs/gmail/src/state.ts +24 -0
- package/runtime/node_modules/@metro-labs/gmail/src/station.ts +15 -0
- package/runtime/node_modules/@metro-labs/gmail/src/trust.ts +42 -0
- package/runtime/node_modules/@metro-labs/http/package.json +30 -0
- package/runtime/node_modules/@metro-labs/http/src/api-http.ts +141 -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 +14 -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/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 +15 -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 +8 -6
- package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +1 -1
- 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 +4 -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 +22 -77
- package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +2 -2
- 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 -15
- 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/profile.ts +85 -0
- package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +5 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/src/types.ts +20 -12
- package/runtime/node_modules/@metro-labs/threema/package.json +26 -0
- package/runtime/node_modules/@metro-labs/threema/src/accounts.ts +96 -0
- package/runtime/node_modules/@metro-labs/threema/src/actions.ts +124 -0
- package/runtime/node_modules/@metro-labs/threema/src/api.ts +152 -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 +87 -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 +160 -0
- package/runtime/node_modules/@metro-labs/threema/src/station.ts +13 -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 +54 -11
- 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/client.ts +86 -4
- package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +7 -58
- 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/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/station.ts +16 -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 +39 -223
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +47 -53
- package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +112 -223
- package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +3 -3
- package/runtime/node_modules/@metro-labs/xmtp/src/call-leftovers.ts +48 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/codecs.ts +113 -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 +37 -25
- package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +8 -18
- package/runtime/node_modules/@metro-labs/xmtp/src/frames.ts +178 -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 +110 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/profile.ts +160 -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 +8 -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/runtime.json +1 -1
- package/runtime/sdk-runner/node_modules/@metro-labs/core/package.json +52 -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 +121 -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 +103 -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/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 +195 -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 +42 -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 +125 -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 +37 -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 +142 -0
- package/runtime/sdk-runner/src/activity.ts +293 -0
- package/runtime/sdk-runner/src/app.ts +77 -0
- package/runtime/sdk-runner/src/approvals.ts +28 -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/inbox.ts +94 -0
- package/runtime/sdk-runner/src/link.ts +130 -0
- package/runtime/sdk-runner/src/main.ts +44 -0
- package/runtime/sdk-runner/src/rules.ts +11 -0
- package/runtime/sdk-runner/src/runner.ts +251 -0
- package/runtime/sdk-runner/src/session-store.ts +71 -0
- package/runtime/sdk-runner/src/session-watch.ts +111 -0
- package/runtime/sdk-runner/src/singleton.ts +15 -0
- package/runtime/sdk-runner/src/speech.ts +79 -0
- package/runtime/sdk-runner/src/tool-proxy.ts +40 -0
- package/runtime/server.ts +1 -0
- package/runtime/stations.json +40 -0
- package/dist/plugin.js +0 -82
- package/dist/prompt.js +0 -61
- package/dist/store.js +0 -70
- 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 -341
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/api-http.ts +0 -129
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/boot.ts +0 -321
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair-api.ts +0 -118
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair.ts +0 -20
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/collection-api.ts +0 -202
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-json.ts +0 -21
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-tools.ts +0 -100
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-url.ts +0 -57
- 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/run-api.ts +0 -125
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-pair.ts +0 -18
- 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 -43
- 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-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-collections.ts +0 -218
- 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 -31
- 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 -131
- 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 -57
- 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/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 → daemon}/src/mcp/raw-get-stream.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
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { storedPolicy } from '../policy/policy.js';
|
|
2
|
+
import { forwardTrainCall } from '../stations/train-call.js';
|
|
2
3
|
import {
|
|
3
4
|
accountStationNames,
|
|
4
5
|
stationByName,
|
|
5
6
|
} from '../stations/registry.js';
|
|
6
|
-
import { listEndpoints } from '../
|
|
7
|
-
import { hookUrl } from '../stations/attach.js';
|
|
8
|
-
import { agentIdForAccount } from '../
|
|
9
|
-
import {
|
|
10
|
-
listAllStations,
|
|
11
|
-
stationRunsHere,
|
|
12
|
-
type StationRecord,
|
|
13
|
-
} from '../db/materialize.js';
|
|
14
|
-
import { type StationName } from '../db/schema.js';
|
|
7
|
+
import { listEndpoints } from '../stations/webhook-endpoints.js';
|
|
8
|
+
import { hookUrl, threemaCallbackUrl } from '../stations/attach.js';
|
|
9
|
+
import { accountEnabled, agentIdForAccount, allowlistForAccount, approversForAccount, knownAccounts, type KnownAccount } from '../agents/map.js';
|
|
15
10
|
|
|
16
11
|
const accountId = (acc: unknown): string | undefined => {
|
|
17
12
|
const id = (acc as { id?: unknown }).id;
|
|
@@ -29,7 +24,14 @@ function withAgentId(station: string, acc: unknown): unknown {
|
|
|
29
24
|
const id = typeof rec.id === 'string' ? rec.id : undefined;
|
|
30
25
|
if (id === undefined) return acc;
|
|
31
26
|
const agentId = agentIdForAccount(station, id);
|
|
32
|
-
|
|
27
|
+
if (agentId === undefined) return acc;
|
|
28
|
+
const allowlist = allowlistForAccount(station, id);
|
|
29
|
+
const stored = storedPolicy({ kind: 'channel', station, account: id });
|
|
30
|
+
const policy = stored === undefined ? {} : { policy: stored };
|
|
31
|
+
const approvers = approversForAccount(station, id);
|
|
32
|
+
const extra = approvers.length === 0 ? policy : { ...policy, approvers };
|
|
33
|
+
const tagged = allowlist === undefined ? { ...rec, agentId, ...extra } : { ...rec, agentId, allowlist, ...extra };
|
|
34
|
+
return accountEnabled(station, id) ? tagged : { ...tagged, enabled: false };
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
export function attachAgentIds(
|
|
@@ -75,6 +77,17 @@ function inCoreAccounts(station: string): unknown[] {
|
|
|
75
77
|
);
|
|
76
78
|
}
|
|
77
79
|
|
|
80
|
+
function withCallbackUrl(acc: unknown): unknown {
|
|
81
|
+
const rec = asRecord(acc);
|
|
82
|
+
if (rec === undefined) return acc;
|
|
83
|
+
const { callbackId, callbackToken, ...rest } = rec;
|
|
84
|
+
if (typeof callbackId !== 'string' || typeof callbackToken !== 'string') return rest;
|
|
85
|
+
return { ...rest, callback: threemaCallbackUrl(callbackId, callbackToken) };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const decorate = (station: string, rows: unknown[]): unknown[] =>
|
|
89
|
+
station === 'threema' ? rows.map(withCallbackUrl) : rows;
|
|
90
|
+
|
|
78
91
|
export interface ScopedAccounts {
|
|
79
92
|
accounts: Record<string, unknown[]>;
|
|
80
93
|
unavailable: string[];
|
|
@@ -85,12 +98,10 @@ async function liveAccounts(
|
|
|
85
98
|
): Promise<{ rows: unknown[]; reachable: boolean }> {
|
|
86
99
|
if (!hasTrain(station))
|
|
87
100
|
return { rows: inCoreAccounts(station), reachable: true };
|
|
88
|
-
if (!stationRunsHere(station as StationName))
|
|
89
|
-
return { rows: [], reachable: true };
|
|
90
101
|
try {
|
|
91
102
|
const resp = await forwardTrainCall(station, 'accounts', {});
|
|
92
103
|
const list = (resp.result as { accounts?: unknown[] } | undefined)?.accounts;
|
|
93
|
-
return { rows: Array.isArray(list) ? list : [], reachable: true };
|
|
104
|
+
return { rows: decorate(station, Array.isArray(list) ? list : []), reachable: true };
|
|
94
105
|
} catch {
|
|
95
106
|
return { rows: [], reachable: false };
|
|
96
107
|
}
|
|
@@ -99,7 +110,7 @@ async function liveAccounts(
|
|
|
99
110
|
function mergeKnown(
|
|
100
111
|
station: string,
|
|
101
112
|
live: unknown[],
|
|
102
|
-
known:
|
|
113
|
+
known: KnownAccount[],
|
|
103
114
|
): unknown[] {
|
|
104
115
|
const seen = new Set(
|
|
105
116
|
live.flatMap((row) => {
|
|
@@ -116,22 +127,31 @@ function mergeKnown(
|
|
|
116
127
|
async function loadStations(): Promise<ScopedAccounts> {
|
|
117
128
|
const unavailable: string[] = [];
|
|
118
129
|
const accounts: Record<string, unknown[]> = {};
|
|
119
|
-
const known =
|
|
130
|
+
const known = knownAccounts();
|
|
120
131
|
await Promise.all(
|
|
121
132
|
accountStationNames().map(async (station) => {
|
|
122
133
|
const { rows, reachable } = await liveAccounts(station);
|
|
123
134
|
if (!reachable) unavailable.push(station);
|
|
124
|
-
accounts[station] = mergeKnown(station, rows, known);
|
|
135
|
+
accounts[station] = hasTrain(station) ? mergeKnown(station, rows, known) : rows;
|
|
125
136
|
}),
|
|
126
137
|
);
|
|
127
138
|
return { accounts, unavailable };
|
|
128
139
|
}
|
|
129
140
|
|
|
141
|
+
const URL_SECRETS = new Set(['endpoint', 'callback']);
|
|
142
|
+
|
|
143
|
+
function withoutUrlSecrets(acc: unknown): unknown {
|
|
144
|
+
const rec = asRecord(acc);
|
|
145
|
+
if (rec === undefined) return acc;
|
|
146
|
+
return Object.fromEntries(Object.entries(rec).filter(([key]) => !URL_SECRETS.has(key)));
|
|
147
|
+
}
|
|
148
|
+
|
|
130
149
|
export async function gatherAccounts(
|
|
131
150
|
allowedAgents?: Set<string>,
|
|
132
151
|
): Promise<Record<string, unknown[]>> {
|
|
133
152
|
const { accounts } = await loadStations();
|
|
134
|
-
|
|
153
|
+
const scoped = allowedAgents ? scopeAccountsByAgent(accounts, allowedAgents) : accounts;
|
|
154
|
+
return Object.fromEntries(Object.entries(scoped).map(([station, rows]) => [station, rows.map(withoutUrlSecrets)]));
|
|
135
155
|
}
|
|
136
156
|
|
|
137
157
|
export async function gatherAccountsForAgents(
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { ToolDef } from './tool-def.js';
|
|
2
|
+
|
|
3
|
+
export const attachmentItem = {
|
|
4
|
+
type: 'object',
|
|
5
|
+
description:
|
|
6
|
+
'A file to attach. Provide EXACTLY ONE source; naming two is an error and so is naming ' +
|
|
7
|
+
'none. Which one to use: `upload` for any real file on your own machine, including a ' +
|
|
8
|
+
'confidential one (call `create_upload` first, push the bytes over HTTP, then name the ' +
|
|
9
|
+
'id here); `data` ONLY for a tiny file, a few KB at most, because the base64 has to be ' +
|
|
10
|
+
'written out verbatim in this tool call and long base64 gets corrupted in the writing; ' +
|
|
11
|
+
'`url` when the file is ALREADY published somewhere the daemon can fetch it; `path` ONLY ' +
|
|
12
|
+
'for a file that is already sitting on the daemon host, which is almost never your ' +
|
|
13
|
+
'machine.',
|
|
14
|
+
properties: {
|
|
15
|
+
upload: {
|
|
16
|
+
type: 'string',
|
|
17
|
+
description:
|
|
18
|
+
'The `upload_id` of a file already pushed to metro over HTTP (`create_upload` mints ' +
|
|
19
|
+
'the slot and the one-line command; the bytes never pass through this conversation). ' +
|
|
20
|
+
'THIS IS THE ROUTE FOR ANYTHING REAL: it takes files up to 64 MiB, works for a file on ' +
|
|
21
|
+
'your own machine, and publishes nothing. The upload belongs to your agent, expires ' +
|
|
22
|
+
'30 minutes after it is created, and no other agent can name it.',
|
|
23
|
+
},
|
|
24
|
+
data: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description:
|
|
27
|
+
'Base64-encoded file bytes, inline in this call. ONLY FOR TINY FILES. The hard cap is ' +
|
|
28
|
+
'8 MiB decoded, but the real ceiling is far lower and is not enforced by the daemon: ' +
|
|
29
|
+
'this base64 has to be emitted verbatim as part of the tool call, and past roughly ' +
|
|
30
|
+
'10 KB (~13 KB of base64) it comes out corrupted, so the file arrives silently ' +
|
|
31
|
+
'damaged or fails to decode. Use `upload` instead for anything bigger. A ' +
|
|
32
|
+
'`data:<mime>;base64,` prefix is accepted and supplies the mime when `mime` is ' +
|
|
33
|
+
'omitted. Stations impose their own, lower limits (xmtp refuses non-image files over ' +
|
|
34
|
+
'~190 KiB).',
|
|
35
|
+
},
|
|
36
|
+
url: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description:
|
|
39
|
+
'http(s) URL fetched BY THE DAEMON, so it must already be publicly reachable from the ' +
|
|
40
|
+
'daemon host. Right when the file is already published; never for anything ' +
|
|
41
|
+
'confidential, because it has to be public for this to work at all. Use `upload` for ' +
|
|
42
|
+
'a confidential file.',
|
|
43
|
+
},
|
|
44
|
+
path: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
description:
|
|
47
|
+
'Absolute path resolved ON THE DAEMON HOST, which is a different machine from yours. ' +
|
|
48
|
+
'A path on your own disk does NOT resolve here and is refused, however local it ' +
|
|
49
|
+
'looks. Use `upload` for a file on your machine.',
|
|
50
|
+
},
|
|
51
|
+
mime: {
|
|
52
|
+
type: 'string',
|
|
53
|
+
description: 'MIME type (guessed from the name/extension if omitted).',
|
|
54
|
+
},
|
|
55
|
+
name: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
description:
|
|
58
|
+
'Filename to present (defaults to the basename, or to the name given at upload time).',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
} as const;
|
|
62
|
+
|
|
63
|
+
export const CREATE_UPLOAD_TOOL: ToolDef = {
|
|
64
|
+
name: 'create_upload',
|
|
65
|
+
group: 'write',
|
|
66
|
+
description:
|
|
67
|
+
'Reserve a slot to push a file to metro over HTTP so you can attach it with `send`. Use ' +
|
|
68
|
+
'this for any file that actually matters: it is the only attachment route that carries a ' +
|
|
69
|
+
'file from YOUR machine without publishing it and without the bytes passing through this ' +
|
|
70
|
+
'conversation. Args: name? (the filename to present), mime?. Returns `upload_id`, a ' +
|
|
71
|
+
'single-use `upload_url` and a ready-to-run `curl` line. ONE STEP NEEDS A SHELL: run that ' +
|
|
72
|
+
'command (or any HTTP client) to push the bytes; there is no way to move a local file to ' +
|
|
73
|
+
'the daemon over MCP alone, because anything in an MCP call has to be written out by the ' +
|
|
74
|
+
'model first. If you have no shell, hand the single command to a subagent that does and ' +
|
|
75
|
+
'keep the `upload_id` -- the slot belongs to this metro agent, not to whoever runs the ' +
|
|
76
|
+
'command. Then: send({line, attachments:[{upload:"<upload_id>"}]}). Up to 64 MiB, expires ' +
|
|
77
|
+
'30 minutes after it is created, and no other agent can reference it.',
|
|
78
|
+
inputSchema: {
|
|
79
|
+
type: 'object',
|
|
80
|
+
properties: {
|
|
81
|
+
name: {
|
|
82
|
+
type: 'string',
|
|
83
|
+
description: 'Filename to present to the recipient (e.g. `report.pdf`).',
|
|
84
|
+
},
|
|
85
|
+
mime: {
|
|
86
|
+
type: 'string',
|
|
87
|
+
description: 'MIME type (guessed from the name/extension if omitted).',
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
};
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { stationForLine } from '../stations/registry.js';
|
|
2
|
-
import { kindOf, toCanonical } from '
|
|
2
|
+
import { kindOf, toCanonical } from '@metro-labs/core/stations/attachments';
|
|
3
3
|
import {
|
|
4
4
|
cleanupAttachments,
|
|
5
5
|
resolveAttachments,
|
|
6
6
|
type ResolvedAttachment,
|
|
7
7
|
} from '../stations/attach-resolve.js';
|
|
8
|
-
import type { CanonicalAttachment, ToolResult } from '
|
|
9
|
-
import { errResult, makeCtx, ok,
|
|
8
|
+
import type { CanonicalAttachment, ToolResult } from '@metro-labs/core/stations/types';
|
|
9
|
+
import { errResult, makeCtx, ok, toErr } from './ctx.js';
|
|
10
|
+
import { runRead } from './read-tool.js';
|
|
10
11
|
import { allowedAgents, currentIdentity } from './request-identity.js';
|
|
11
|
-
import { str } from '
|
|
12
|
+
import { str } from '@metro-labs/core/str';
|
|
12
13
|
|
|
13
14
|
type Station = NonNullable<ReturnType<typeof stationForLine>>;
|
|
14
15
|
|
|
@@ -16,6 +17,7 @@ interface MessageArgs {
|
|
|
16
17
|
line: string;
|
|
17
18
|
a: Record<string, unknown>;
|
|
18
19
|
ctx: ReturnType<typeof makeCtx>;
|
|
20
|
+
onSent?: (messageId: string) => void;
|
|
19
21
|
station: Station;
|
|
20
22
|
}
|
|
21
23
|
|
|
@@ -30,8 +32,14 @@ const withId = (text: string, messageId: string | undefined): string =>
|
|
|
30
32
|
interface Sent {
|
|
31
33
|
labels: string[];
|
|
32
34
|
messageId?: string;
|
|
35
|
+
thread?: string;
|
|
33
36
|
}
|
|
34
37
|
|
|
38
|
+
const threadOf = (response: { result: unknown }, asked: string): string | undefined => {
|
|
39
|
+
const line = (response.result as { line?: unknown } | null)?.line;
|
|
40
|
+
return typeof line === 'string' && line !== '' && line !== asked ? line : undefined;
|
|
41
|
+
};
|
|
42
|
+
|
|
35
43
|
const deliveredLabels = (response: { result: unknown }): string[] => {
|
|
36
44
|
const list = (response.result as { attachments?: unknown } | null)
|
|
37
45
|
?.attachments;
|
|
@@ -52,6 +60,25 @@ function assertDelivered(
|
|
|
52
60
|
);
|
|
53
61
|
}
|
|
54
62
|
|
|
63
|
+
const STAGE_PARTS = ['frame', 'wallet'] as const;
|
|
64
|
+
|
|
65
|
+
const stagePartsIn = (m: MessageArgs): string[] => STAGE_PARTS.filter((key) => m.a[key] !== undefined);
|
|
66
|
+
|
|
67
|
+
const stagePartArgs = (m: MessageArgs): Record<string, unknown> =>
|
|
68
|
+
Object.fromEntries(stagePartsIn(m).map((key) => [key, m.a[key]]));
|
|
69
|
+
|
|
70
|
+
const sentLabels = (m: MessageArgs, text: string | undefined): string[] => [
|
|
71
|
+
...(text ? ['text'] : []),
|
|
72
|
+
...stagePartsIn(m),
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
function nativeBody(m: MessageArgs, text: string | undefined, replyTo: string | undefined): Record<string, unknown> {
|
|
76
|
+
const body: Record<string, unknown> = { line: m.line, ...stagePartArgs(m) };
|
|
77
|
+
if (text) body.text = text;
|
|
78
|
+
if (text && replyTo) body.replyTo = replyTo;
|
|
79
|
+
return body;
|
|
80
|
+
}
|
|
81
|
+
|
|
55
82
|
async function sendNative(
|
|
56
83
|
m: MessageArgs,
|
|
57
84
|
text: string | undefined,
|
|
@@ -59,16 +86,9 @@ async function sendNative(
|
|
|
59
86
|
atts: ResolvedAttachment[],
|
|
60
87
|
): Promise<Sent> {
|
|
61
88
|
const { line, ctx, station } = m;
|
|
62
|
-
const labels
|
|
89
|
+
const labels = sentLabels(m, text);
|
|
63
90
|
let messageId: string | undefined;
|
|
64
|
-
if (text)
|
|
65
|
-
const response = await ctx.call(
|
|
66
|
-
'send',
|
|
67
|
-
replyTo ? { line, text, replyTo } : { line, text },
|
|
68
|
-
);
|
|
69
|
-
messageId = messageIdOf(response);
|
|
70
|
-
labels.push('text');
|
|
71
|
-
}
|
|
91
|
+
if (labels.length) messageId = messageIdOf(await ctx.call('send', nativeBody(m, text, replyTo)));
|
|
72
92
|
if (!atts.length) return { labels, messageId };
|
|
73
93
|
const delivered = station.sendAttachments
|
|
74
94
|
? await station.sendAttachments(line, atts, ctx)
|
|
@@ -85,19 +105,21 @@ async function sendForwarded(
|
|
|
85
105
|
atts: ResolvedAttachment[],
|
|
86
106
|
): Promise<Sent> {
|
|
87
107
|
const { line, ctx, station } = m;
|
|
88
|
-
const args: Record<string, unknown> = { line };
|
|
108
|
+
const args: Record<string, unknown> = { line, ...stagePartArgs(m) };
|
|
89
109
|
if (text) args.text = text;
|
|
110
|
+
if (typeof m.a.subject === 'string' && m.a.subject.trim() !== '') args.subject = m.a.subject;
|
|
90
111
|
if (replyTo) args.replyTo = replyTo;
|
|
91
112
|
if (atts.length) args.attachments = atts.map(toCanonical);
|
|
92
113
|
const response = await ctx.call('send', args);
|
|
93
114
|
const messageId = messageIdOf(response);
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
if (
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
115
|
+
const thread = threadOf(response, line);
|
|
116
|
+
const labels = sentLabels(m, text);
|
|
117
|
+
if (atts.length) {
|
|
118
|
+
const delivered = deliveredLabels(response);
|
|
119
|
+
assertDelivered(station, delivered, atts);
|
|
120
|
+
labels.push(...delivered);
|
|
121
|
+
}
|
|
122
|
+
return thread === undefined ? { labels, messageId } : { labels, messageId, thread };
|
|
101
123
|
}
|
|
102
124
|
|
|
103
125
|
const unsupported = (station: Station, atts: CanonicalAttachment[]): string =>
|
|
@@ -105,14 +127,27 @@ const unsupported = (station: Station, atts: CanonicalAttachment[]): string =>
|
|
|
105
127
|
.map((a) => kindOf(a.mime ?? '', a.path ?? a.url ?? a.name ?? ''))
|
|
106
128
|
.join(', ')}); send a link in \`text\` instead`;
|
|
107
129
|
|
|
130
|
+
const NOTHING_TO_SEND = 'send requires `text`, `attachments`, `frame` or `wallet`';
|
|
131
|
+
|
|
132
|
+
function refusal(m: MessageArgs, text: string | undefined, requested: CanonicalAttachment[]): string | undefined {
|
|
133
|
+
const stageOnly = stagePartsIn(m);
|
|
134
|
+
if (!text && !requested.length && !stageOnly.length) return NOTHING_TO_SEND;
|
|
135
|
+
if (stageOnly.length && m.station.sendsFrames !== true)
|
|
136
|
+
return `${m.station.name} cannot send \`${stageOnly.join('` or `')}\`; that is Stage (XMTP) only`;
|
|
137
|
+
if (requested.length && m.station.attachmentMode === 'none') return unsupported(m.station, requested);
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function noteSent(m: MessageArgs, messageId: string | undefined): void {
|
|
142
|
+
if (messageId !== undefined) m.onSent?.(messageId);
|
|
143
|
+
}
|
|
144
|
+
|
|
108
145
|
async function handleSend(m: MessageArgs): Promise<ToolResult> {
|
|
109
146
|
const text = m.a.text as string | undefined;
|
|
110
147
|
const replyTo = m.a.reply_to as string | undefined;
|
|
111
148
|
const requested = (m.a.attachments as CanonicalAttachment[] | undefined) ?? [];
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
if (requested.length && m.station.attachmentMode === 'none')
|
|
115
|
-
return errResult(unsupported(m.station, requested));
|
|
149
|
+
const refused = refusal(m, text, requested);
|
|
150
|
+
if (refused !== undefined) return errResult(refused);
|
|
116
151
|
const atts = await resolveAttachments(requested, {
|
|
117
152
|
allowed: allowedAgents(currentIdentity()),
|
|
118
153
|
});
|
|
@@ -123,21 +158,16 @@ async function handleSend(m: MessageArgs): Promise<ToolResult> {
|
|
|
123
158
|
const sent = native
|
|
124
159
|
? await sendNative(m, text, replyTo, atts)
|
|
125
160
|
: await sendForwarded(m, text, replyTo, atts);
|
|
126
|
-
if (!sent.labels.length)
|
|
127
|
-
|
|
128
|
-
|
|
161
|
+
if (!sent.labels.length) return errResult(NOTHING_TO_SEND);
|
|
162
|
+
noteSent(m, sent.messageId);
|
|
163
|
+
const done = withId(`sent: ${sent.labels.join(', ')}`, sent.messageId);
|
|
164
|
+
return ok(sent.thread === undefined ? done : `${done} — new thread line: ${sent.thread}`);
|
|
129
165
|
} finally {
|
|
130
166
|
await cleanupAttachments(atts);
|
|
131
167
|
}
|
|
132
168
|
}
|
|
133
169
|
|
|
134
|
-
|
|
135
|
-
const args: Record<string, unknown> = { line };
|
|
136
|
-
if (typeof a.limit === 'number') args.limit = a.limit;
|
|
137
|
-
if (a.before) args.before = str(a.before);
|
|
138
|
-
if (a.since) args.since = str(a.since);
|
|
139
|
-
return okJson(await ctx.call('read', args));
|
|
140
|
-
}
|
|
170
|
+
const handleRead = ({ a, station }: MessageArgs): Promise<ToolResult> => runRead(station, a);
|
|
141
171
|
|
|
142
172
|
type MessageHandler = (m: MessageArgs) => Promise<ToolResult>;
|
|
143
173
|
|
|
@@ -158,7 +188,7 @@ const MESSAGE_VERBS: Record<string, VerbSpec> = {
|
|
|
158
188
|
};
|
|
159
189
|
|
|
160
190
|
function makeVerbHandler(verb: string, spec: VerbSpec): MessageHandler {
|
|
161
|
-
return async ({ line, a, ctx }) => {
|
|
191
|
+
return async ({ line, a, ctx, onSent }) => {
|
|
162
192
|
const payload: Record<string, unknown> = { line };
|
|
163
193
|
for (const [snake, camel] of spec.args) {
|
|
164
194
|
const value = str(a[snake]);
|
|
@@ -169,21 +199,34 @@ function makeVerbHandler(verb: string, spec: VerbSpec): MessageHandler {
|
|
|
169
199
|
payload[camel] = value;
|
|
170
200
|
}
|
|
171
201
|
const response = await ctx.call(verb, payload);
|
|
172
|
-
|
|
202
|
+
const messageId = messageIdOf(response);
|
|
203
|
+
if (verb === 'reply' && messageId !== undefined) onSent?.(messageId);
|
|
204
|
+
return ok(withId(spec.success, messageId));
|
|
173
205
|
};
|
|
174
206
|
}
|
|
175
207
|
|
|
208
|
+
const handleTyping = async ({ line, ctx }: MessageArgs): Promise<ToolResult> => {
|
|
209
|
+
await ctx.call('typing', { line });
|
|
210
|
+
return ok('typing shown');
|
|
211
|
+
};
|
|
212
|
+
|
|
176
213
|
const MESSAGE_HANDLERS: Record<string, MessageHandler> = {
|
|
177
214
|
send: handleSend,
|
|
178
215
|
read: handleRead,
|
|
216
|
+
typing: handleTyping,
|
|
179
217
|
...Object.fromEntries(
|
|
180
218
|
Object.entries(MESSAGE_VERBS).map(([verb, spec]) => [verb, makeVerbHandler(verb, spec)]),
|
|
181
219
|
),
|
|
182
220
|
};
|
|
183
221
|
|
|
222
|
+
export interface ToolHooks {
|
|
223
|
+
onSent?: (messageId: string) => void;
|
|
224
|
+
}
|
|
225
|
+
|
|
184
226
|
export async function dispatchMessageTool(
|
|
185
227
|
name: string,
|
|
186
228
|
a: Record<string, unknown>,
|
|
229
|
+
hooks: ToolHooks = {},
|
|
187
230
|
): Promise<ToolResult> {
|
|
188
231
|
const line = str(a.line);
|
|
189
232
|
if (!line) return errResult(`${name} requires \`line\``);
|
|
@@ -195,8 +238,13 @@ export async function dispatchMessageTool(
|
|
|
195
238
|
}
|
|
196
239
|
const handler = MESSAGE_HANDLERS[name];
|
|
197
240
|
if (!handler) return errResult(`unknown tool: ${name}`);
|
|
241
|
+
const verbs: ReadonlySet<string> = station.messageVerbs;
|
|
242
|
+
if (!verbs.has(name))
|
|
243
|
+
return errResult(
|
|
244
|
+
`${station.name} does not support ${name}; it supports ${[...verbs].join(', ')}.`,
|
|
245
|
+
);
|
|
198
246
|
try {
|
|
199
|
-
return await handler({ line, a, ctx: makeCtx(station.name), station });
|
|
247
|
+
return await handler({ line, a, ctx: makeCtx(station.name), station, onSent: hooks.onSent });
|
|
200
248
|
} catch (e) {
|
|
201
249
|
return toErr(name, e);
|
|
202
250
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import { forwardTrainCall } from '../
|
|
3
|
-
import { errMsg, log } from '
|
|
4
|
-
import { TrainError } from '
|
|
5
|
-
import { type ToolContext, type ToolResult } from '
|
|
2
|
+
import { forwardTrainCall } from '../stations/train-call.js';
|
|
3
|
+
import { errMsg, log } from '@metro-labs/core/log';
|
|
4
|
+
import { TrainError } from '@metro-labs/core/train-error';
|
|
5
|
+
import { type ToolContext, type ToolResult } from '@metro-labs/core/stations/types';
|
|
6
6
|
|
|
7
7
|
export async function metroCall(
|
|
8
8
|
train: string,
|
|
@@ -4,31 +4,34 @@ import type {
|
|
|
4
4
|
StreamId,
|
|
5
5
|
} from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
6
6
|
import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
-
import {
|
|
7
|
+
import { str } from '@metro-labs/core/str';
|
|
8
|
+
import { eventInScope } from '../agents/scope.js';
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
const EVENT_STORE_MAX = 500;
|
|
10
11
|
|
|
11
12
|
interface StoredEvent {
|
|
12
13
|
eventId: EventId;
|
|
13
14
|
streamId: StreamId;
|
|
14
15
|
message: JSONRPCMessage;
|
|
15
16
|
line: string | undefined;
|
|
16
|
-
owner: Set<string>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface EventStoreDeps {
|
|
20
|
-
scopeOf: () => Set<string>;
|
|
21
|
-
max?: number;
|
|
22
17
|
}
|
|
23
18
|
|
|
24
19
|
export interface ScopedReplay {
|
|
25
20
|
send: (eventId: EventId, message: JSONRPCMessage) => Promise<void>;
|
|
26
|
-
scope: Set<string
|
|
21
|
+
scope: Set<string>;
|
|
27
22
|
onWithheld?: (eventId: EventId, line: string | undefined) => void;
|
|
28
23
|
}
|
|
29
24
|
|
|
30
25
|
const SEP = '_';
|
|
31
26
|
|
|
27
|
+
function frameLine(message: JSONRPCMessage): string | undefined {
|
|
28
|
+
const params: unknown = (message as { params?: unknown }).params;
|
|
29
|
+
if (typeof params !== 'object' || params === null) return undefined;
|
|
30
|
+
const meta: unknown = (params as { meta?: unknown }).meta;
|
|
31
|
+
if (typeof meta !== 'object' || meta === null) return undefined;
|
|
32
|
+
return str((meta as { line?: unknown }).line) || undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
32
35
|
const encodeEventId = (streamId: StreamId, seq: number): EventId =>
|
|
33
36
|
`${streamId}${SEP}${seq}`;
|
|
34
37
|
|
|
@@ -40,13 +43,11 @@ const decodeStreamId = (eventId: EventId): StreamId | undefined => {
|
|
|
40
43
|
|
|
41
44
|
export class BoundedEventStore implements EventStore {
|
|
42
45
|
private readonly max: number;
|
|
43
|
-
private readonly scopeOf: () => Set<string>;
|
|
44
46
|
private readonly events: StoredEvent[] = [];
|
|
45
47
|
private seq = 0;
|
|
46
48
|
|
|
47
|
-
constructor(
|
|
48
|
-
this.
|
|
49
|
-
this.max = deps.max ?? EVENT_STORE_MAX;
|
|
49
|
+
constructor(max = EVENT_STORE_MAX) {
|
|
50
|
+
this.max = max;
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
storeEvent(streamId: StreamId, message: JSONRPCMessage): Promise<EventId> {
|
|
@@ -56,7 +57,6 @@ export class BoundedEventStore implements EventStore {
|
|
|
56
57
|
streamId,
|
|
57
58
|
message,
|
|
58
59
|
line: frameLine(message),
|
|
59
|
-
owner: new Set(this.scopeOf()),
|
|
60
60
|
});
|
|
61
61
|
if (this.events.length > this.max) this.events.shift();
|
|
62
62
|
return Promise.resolve(eventId);
|
|
@@ -72,7 +72,6 @@ export class BoundedEventStore implements EventStore {
|
|
|
72
72
|
): Promise<StreamId> {
|
|
73
73
|
const streamId = decodeStreamId(lastEventId);
|
|
74
74
|
if (streamId === undefined) return '';
|
|
75
|
-
const allowed = scope ?? new Set<string>();
|
|
76
75
|
let seen = false;
|
|
77
76
|
for (const e of this.events) {
|
|
78
77
|
if (e.streamId !== streamId) continue;
|
|
@@ -80,7 +79,7 @@ export class BoundedEventStore implements EventStore {
|
|
|
80
79
|
if (e.eventId === lastEventId) seen = true;
|
|
81
80
|
continue;
|
|
82
81
|
}
|
|
83
|
-
if (!
|
|
82
|
+
if (e.line !== undefined && !eventInScope(scope, e.line)) {
|
|
84
83
|
onWithheld?.(e.eventId, e.line);
|
|
85
84
|
continue;
|
|
86
85
|
}
|
|
@@ -5,9 +5,9 @@ import type {
|
|
|
5
5
|
MemberOutcome,
|
|
6
6
|
Station,
|
|
7
7
|
ToolResult,
|
|
8
|
-
} from '
|
|
8
|
+
} from '@metro-labs/core/stations/types';
|
|
9
9
|
import { makeCtx, okJson, toErr } from './ctx.js';
|
|
10
|
-
import { str } from '
|
|
10
|
+
import { str } from '@metro-labs/core/str';
|
|
11
11
|
|
|
12
12
|
export interface GroupOpResult {
|
|
13
13
|
op: GroupOp;
|