@stage-labs/metro 0.1.0-beta.26 → 0.1.0-beta.260
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 +254 -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 +80 -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,3 +1,6 @@
|
|
|
1
|
+
import type { ToolDef } from './tool-def.js';
|
|
2
|
+
import { attachmentItem, CREATE_UPLOAD_TOOL } from './attachment-schema.js';
|
|
3
|
+
|
|
1
4
|
const lineProp = {
|
|
2
5
|
type: 'string',
|
|
3
6
|
description:
|
|
@@ -8,98 +11,10 @@ const msgIdProp = {
|
|
|
8
11
|
description: 'The target message_id.',
|
|
9
12
|
} as const;
|
|
10
13
|
|
|
11
|
-
const
|
|
12
|
-
type: 'object',
|
|
13
|
-
description:
|
|
14
|
-
'A file to attach. Provide EXACTLY ONE source; naming two is an error and so is naming ' +
|
|
15
|
-
'none. Which one to use: `upload` for any real file on your own machine, including a ' +
|
|
16
|
-
'confidential one (call `create_upload` first, push the bytes over HTTP, then name the ' +
|
|
17
|
-
'id here); `data` ONLY for a tiny file, a few KB at most, because the base64 has to be ' +
|
|
18
|
-
'written out verbatim in this tool call and long base64 gets corrupted in the writing; ' +
|
|
19
|
-
'`url` when the file is ALREADY published somewhere the daemon can fetch it; `path` ONLY ' +
|
|
20
|
-
'for a file that is already sitting on the daemon host, which is almost never your ' +
|
|
21
|
-
'machine.',
|
|
22
|
-
properties: {
|
|
23
|
-
upload: {
|
|
24
|
-
type: 'string',
|
|
25
|
-
description:
|
|
26
|
-
'The `upload_id` of a file already pushed to metro over HTTP (`create_upload` mints ' +
|
|
27
|
-
'the slot and the one-line command; the bytes never pass through this conversation). ' +
|
|
28
|
-
'THIS IS THE ROUTE FOR ANYTHING REAL: it takes files up to 64 MiB, works for a file on ' +
|
|
29
|
-
'your own machine, and publishes nothing. The upload belongs to your agent, expires ' +
|
|
30
|
-
'30 minutes after it is created, and no other agent can name it.',
|
|
31
|
-
},
|
|
32
|
-
data: {
|
|
33
|
-
type: 'string',
|
|
34
|
-
description:
|
|
35
|
-
'Base64-encoded file bytes, inline in this call. ONLY FOR TINY FILES. The hard cap is ' +
|
|
36
|
-
'8 MiB decoded, but the real ceiling is far lower and is not enforced by the daemon: ' +
|
|
37
|
-
'this base64 has to be emitted verbatim as part of the tool call, and past roughly ' +
|
|
38
|
-
'10 KB (~13 KB of base64) it comes out corrupted, so the file arrives silently ' +
|
|
39
|
-
'damaged or fails to decode. Use `upload` instead for anything bigger. A ' +
|
|
40
|
-
'`data:<mime>;base64,` prefix is accepted and supplies the mime when `mime` is ' +
|
|
41
|
-
'omitted. Stations impose their own, lower limits (xmtp refuses non-image files over ' +
|
|
42
|
-
'~190 KiB).',
|
|
43
|
-
},
|
|
44
|
-
url: {
|
|
45
|
-
type: 'string',
|
|
46
|
-
description:
|
|
47
|
-
'http(s) URL fetched BY THE DAEMON, so it must already be publicly reachable from the ' +
|
|
48
|
-
'daemon host. Right when the file is already published; never for anything ' +
|
|
49
|
-
'confidential, because it has to be public for this to work at all. Use `upload` for ' +
|
|
50
|
-
'a confidential file.',
|
|
51
|
-
},
|
|
52
|
-
path: {
|
|
53
|
-
type: 'string',
|
|
54
|
-
description:
|
|
55
|
-
'Absolute path resolved ON THE DAEMON HOST, which is a different machine from yours. ' +
|
|
56
|
-
'A path on your own disk does NOT resolve here and is refused, however local it ' +
|
|
57
|
-
'looks. Use `upload` for a file on your machine.',
|
|
58
|
-
},
|
|
59
|
-
mime: {
|
|
60
|
-
type: 'string',
|
|
61
|
-
description: 'MIME type (guessed from the name/extension if omitted).',
|
|
62
|
-
},
|
|
63
|
-
name: {
|
|
64
|
-
type: 'string',
|
|
65
|
-
description:
|
|
66
|
-
'Filename to present (defaults to the basename, or to the name given at upload time).',
|
|
67
|
-
},
|
|
68
|
-
},
|
|
69
|
-
} as const;
|
|
70
|
-
|
|
71
|
-
const CREATE_UPLOAD_TOOL = {
|
|
72
|
-
name: 'create_upload',
|
|
73
|
-
description:
|
|
74
|
-
'Reserve a slot to push a file to metro over HTTP so you can attach it with `send`. Use ' +
|
|
75
|
-
'this for any file that actually matters: it is the only attachment route that carries a ' +
|
|
76
|
-
'file from YOUR machine without publishing it and without the bytes passing through this ' +
|
|
77
|
-
'conversation. Args: name? (the filename to present), mime?. Returns `upload_id`, a ' +
|
|
78
|
-
'single-use `upload_url` and a ready-to-run `curl` line. ONE STEP NEEDS A SHELL: run that ' +
|
|
79
|
-
'command (or any HTTP client) to push the bytes; there is no way to move a local file to ' +
|
|
80
|
-
'the daemon over MCP alone, because anything in an MCP call has to be written out by the ' +
|
|
81
|
-
'model first. If you have no shell, hand the single command to a subagent that does and ' +
|
|
82
|
-
'keep the `upload_id` -- the slot belongs to this metro agent, not to whoever runs the ' +
|
|
83
|
-
'command. Then: send({line, attachments:[{upload:"<upload_id>"}]}). Up to 64 MiB, expires ' +
|
|
84
|
-
'30 minutes after it is created, and no other agent can reference it.',
|
|
85
|
-
inputSchema: {
|
|
86
|
-
type: 'object',
|
|
87
|
-
properties: {
|
|
88
|
-
name: {
|
|
89
|
-
type: 'string',
|
|
90
|
-
description: 'Filename to present to the recipient (e.g. `report.pdf`).',
|
|
91
|
-
},
|
|
92
|
-
mime: {
|
|
93
|
-
type: 'string',
|
|
94
|
-
description: 'MIME type (guessed from the name/extension if omitted).',
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
export const COMMON_TOOLS = [
|
|
14
|
+
export const COMMON_TOOLS: ToolDef[] = [
|
|
101
15
|
{
|
|
102
16
|
name: 'reply',
|
|
17
|
+
group: 'write',
|
|
103
18
|
description:
|
|
104
19
|
'Reply to a specific message in a Metro conversation (text quotes the target). Args: ' +
|
|
105
20
|
"line, message_id, text. The station is derived from the line. Returns the daemon's " +
|
|
@@ -116,15 +31,19 @@ export const COMMON_TOOLS = [
|
|
|
116
31
|
},
|
|
117
32
|
{
|
|
118
33
|
name: 'send',
|
|
34
|
+
group: 'write',
|
|
119
35
|
description:
|
|
120
36
|
'Send a message (and/or media) to a Metro conversation. Args: line, text?, reply_to?, ' +
|
|
121
|
-
'attachments?. The station is derived from the line.
|
|
37
|
+
'subject?, attachments?, frame?, wallet?. The station is derived from the line. Outlook and Gmail: send to ' +
|
|
38
|
+
'metro://<outlook|gmail>/<account>/<email address> to start a new email (subject defaults to the ' +
|
|
39
|
+
'first line of text); the result names the new thread line. Each attachment names EXACTLY ONE ' +
|
|
122
40
|
'source, and the choice matters: `upload` (an `upload_id` from `create_upload`, the ' +
|
|
123
41
|
'route for any real file on your own machine, confidential or not, up to 64 MiB); ' +
|
|
124
42
|
'`data` (base64 inline -- TINY FILES ONLY, a few KB, because the base64 has to be ' +
|
|
125
43
|
'written out verbatim in the call and longer than that it corrupts); `url` (the daemon ' +
|
|
126
44
|
'fetches it, so the file must already be public); `path` (resolved on the DAEMON host, ' +
|
|
127
|
-
'which is not your machine).
|
|
45
|
+
'which is not your machine). Stage (XMTP) only: `frame` posts an interactive view, `wallet` a payment ' +
|
|
46
|
+
'or signature card. At least one of text/attachments/frame/wallet is required. ' +
|
|
128
47
|
'The success line names each attachment the station actually delivered; a station that ' +
|
|
129
48
|
'cannot carry a file errors instead of reporting success.',
|
|
130
49
|
inputSchema: {
|
|
@@ -139,17 +58,71 @@ export const COMMON_TOOLS = [
|
|
|
139
58
|
type: 'string',
|
|
140
59
|
description: 'Optional message_id to quote/reply to.',
|
|
141
60
|
},
|
|
61
|
+
subject: {
|
|
62
|
+
type: 'string',
|
|
63
|
+
description: 'Outlook and Gmail only: the subject of a new email.',
|
|
64
|
+
},
|
|
142
65
|
attachments: {
|
|
143
66
|
type: 'array',
|
|
144
67
|
description: 'Optional files to attach.',
|
|
145
68
|
items: attachmentItem,
|
|
146
69
|
},
|
|
70
|
+
frame: {
|
|
71
|
+
type: 'object',
|
|
72
|
+
description:
|
|
73
|
+
'Stage (XMTP) only: a frame, a small interactive view. Stage shows it in the chat at image size ' +
|
|
74
|
+
'(400 x 400 at most, its start screen, clipped with a fade) and opens it full screen on a tap; its ' +
|
|
75
|
+
'buttons work only there. `widget` is OpenAI ChatKit widget JSON (a Card, ListView ' +
|
|
76
|
+
'or Basic root, 64K characters at most); a missing `title` or `description` is taken from the ' +
|
|
77
|
+
'widget. Or give `screens` instead of `widget` for several screens in one frame. A tap there comes back ' +
|
|
78
|
+
'to you as a reply to the frame: "Frame action: <type> <payload ' +
|
|
79
|
+
"JSON>\". It is sent after the text, and the message_id returned is the frame's. The stage " +
|
|
80
|
+
'skill lists the widget nodes, with an example.',
|
|
81
|
+
properties: {
|
|
82
|
+
widget: {
|
|
83
|
+
type: 'object',
|
|
84
|
+
description:
|
|
85
|
+
'ChatKit widget JSON, e.g. {"type":"Card","children":[{"type":"Title","value":"Deploy?"},' +
|
|
86
|
+
'{"type":"Button","label":"Ship it","onClickAction":{"type":"deploy","payload":{"env":"prod"}}}]}.',
|
|
87
|
+
additionalProperties: true,
|
|
88
|
+
},
|
|
89
|
+
screens: {
|
|
90
|
+
type: 'object',
|
|
91
|
+
description:
|
|
92
|
+
'Instead of `widget`: up to 50 screens by id, each a widget or {"title", "widget"}, 64K ' +
|
|
93
|
+
'characters in all. An action {"type":"frame.open","payload":{"screen":"<id>"}} opens a ' +
|
|
94
|
+
'screen and {"type":"frame.back"} goes back, in Stage, with no message to you.',
|
|
95
|
+
additionalProperties: true,
|
|
96
|
+
},
|
|
97
|
+
start: { type: 'string', description: 'Required with `screens`: the id of the first screen.' },
|
|
98
|
+
title: { type: 'string', description: 'Card title in the chat (200 characters at most).' },
|
|
99
|
+
description: { type: 'string', description: 'Card description in the chat (1000 characters at most).' },
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
wallet: {
|
|
103
|
+
type: 'object',
|
|
104
|
+
description:
|
|
105
|
+
'Stage (XMTP) only: a wallet card. `type` walletSendCalls is a payment request with a Pay button, ' +
|
|
106
|
+
'transactionReference a payment receipt with an explorer link, signatureRequest a Sign button, ' +
|
|
107
|
+
'signatureReference a signed proof. `content` is that type\'s JSON as Stage reads it; the stage skill ' +
|
|
108
|
+
'has an example of each. Sending it moves nothing: the person taps Pay or Sign and confirms in Stage. ' +
|
|
109
|
+
"It is sent after the text and any frame, and the message_id returned is the card's.",
|
|
110
|
+
properties: {
|
|
111
|
+
type: {
|
|
112
|
+
type: 'string',
|
|
113
|
+
enum: ['walletSendCalls', 'transactionReference', 'signatureRequest', 'signatureReference'],
|
|
114
|
+
},
|
|
115
|
+
content: { type: 'object', description: 'The JSON of that content type.', additionalProperties: true },
|
|
116
|
+
},
|
|
117
|
+
required: ['type', 'content'],
|
|
118
|
+
},
|
|
147
119
|
},
|
|
148
120
|
required: ['line'],
|
|
149
121
|
},
|
|
150
122
|
},
|
|
151
123
|
{
|
|
152
124
|
name: 'react',
|
|
125
|
+
group: 'write',
|
|
153
126
|
description:
|
|
154
127
|
'Add an emoji reaction to a message. Args: line, message_id, emoji. The station is derived from the line.',
|
|
155
128
|
inputSchema: {
|
|
@@ -162,8 +135,22 @@ export const COMMON_TOOLS = [
|
|
|
162
135
|
required: ['line', 'message_id', 'emoji'],
|
|
163
136
|
},
|
|
164
137
|
},
|
|
138
|
+
{
|
|
139
|
+
name: 'typing',
|
|
140
|
+
group: 'write',
|
|
141
|
+
description:
|
|
142
|
+
'Show "typing…" once in a chat while you prepare an answer. The network clears it by itself after its own time (about 5 s on the Telegram bot, 10 s on Discord, 25 s on WhatsApp) or when you send. Call it again to show it again. Args: line.',
|
|
143
|
+
inputSchema: {
|
|
144
|
+
type: 'object',
|
|
145
|
+
properties: {
|
|
146
|
+
line: lineProp,
|
|
147
|
+
},
|
|
148
|
+
required: ['line'],
|
|
149
|
+
},
|
|
150
|
+
},
|
|
165
151
|
{
|
|
166
152
|
name: 'unreact',
|
|
153
|
+
group: 'write',
|
|
167
154
|
description:
|
|
168
155
|
'Remove an emoji reaction from a message. Args: line, message_id, emoji. The station is derived from the line.',
|
|
169
156
|
inputSchema: {
|
|
@@ -181,6 +168,7 @@ export const COMMON_TOOLS = [
|
|
|
181
168
|
},
|
|
182
169
|
{
|
|
183
170
|
name: 'edit',
|
|
171
|
+
group: 'write',
|
|
184
172
|
description:
|
|
185
173
|
'Edit the text of a message you sent. Args: line, message_id, text. The station is ' +
|
|
186
174
|
"derived from the line. Returns the daemon's reason if the station does not support edits.",
|
|
@@ -196,6 +184,8 @@ export const COMMON_TOOLS = [
|
|
|
196
184
|
},
|
|
197
185
|
{
|
|
198
186
|
name: 'delete',
|
|
187
|
+
group: 'write',
|
|
188
|
+
destructive: true,
|
|
199
189
|
description:
|
|
200
190
|
'Delete a message you sent. Args: line, message_id. The station is derived from the line. ' +
|
|
201
191
|
"Returns the daemon's reason if the station does not support deletes.",
|
|
@@ -207,14 +197,28 @@ export const COMMON_TOOLS = [
|
|
|
207
197
|
},
|
|
208
198
|
{
|
|
209
199
|
name: 'read',
|
|
200
|
+
group: 'read',
|
|
210
201
|
description:
|
|
211
|
-
'Read
|
|
212
|
-
'
|
|
213
|
-
|
|
202
|
+
'Read message history. Args: line?, account?, limit?, before?, since?, until?, query?, ' +
|
|
203
|
+
'from?, unread_only?, message_id?. Give a line to read one conversation, or an account ' +
|
|
204
|
+
'(from list_accounts) instead of a line to read across that whole account, where the ' +
|
|
205
|
+
'station allows it. `message_id` returns that one message in full, with its files saved ' +
|
|
206
|
+
'like inbound media (url and local_path). Each station applies the filters it supports; ' +
|
|
207
|
+
'the answer lists any it did not apply in `ignored`, so check it. Returns the raw JSON ' +
|
|
208
|
+
"(shapes differ per station), or the daemon's reason if the station does not support " +
|
|
209
|
+
'reads. Outlook: `query` is a Microsoft search over all mail (with `from` folded into it; ' +
|
|
210
|
+
'line, since, until and unread_only then narrow what the search found), and without ' +
|
|
211
|
+
'`query` every filter is applied by Outlook itself, newest first. Gmail: `query` uses ' +
|
|
212
|
+
'Gmail search syntax (from:, subject:, has:attachment, newer_than:7d...), and the other ' +
|
|
213
|
+
'filters are added to it.',
|
|
214
214
|
inputSchema: {
|
|
215
215
|
type: 'object',
|
|
216
216
|
properties: {
|
|
217
217
|
line: lineProp,
|
|
218
|
+
account: {
|
|
219
|
+
type: 'string',
|
|
220
|
+
description: 'An account id from list_accounts, to read the whole account when you give no line.',
|
|
221
|
+
},
|
|
218
222
|
limit: { type: 'number', description: 'Max messages to return.' },
|
|
219
223
|
before: {
|
|
220
224
|
type: 'string',
|
|
@@ -224,12 +228,20 @@ export const COMMON_TOOLS = [
|
|
|
224
228
|
type: 'string',
|
|
225
229
|
description: 'Return messages since this timestamp.',
|
|
226
230
|
},
|
|
231
|
+
until: {
|
|
232
|
+
type: 'string',
|
|
233
|
+
description: 'Return messages before this timestamp.',
|
|
234
|
+
},
|
|
235
|
+
query: { type: 'string', description: 'Free text to search for.' },
|
|
236
|
+
from: { type: 'string', description: 'Only messages from this sender (an id or an address).' },
|
|
237
|
+
unread_only: { type: 'boolean', description: 'Only messages not read yet.' },
|
|
238
|
+
message_id: { type: 'string', description: 'Return this one message in full.' },
|
|
227
239
|
},
|
|
228
|
-
required: ['line'],
|
|
229
240
|
},
|
|
230
241
|
},
|
|
231
242
|
{
|
|
232
243
|
name: 'list_members',
|
|
244
|
+
group: 'read',
|
|
233
245
|
description:
|
|
234
246
|
'List the members of a Metro group/channel in a station-agnostic shape. Args: line, ' +
|
|
235
247
|
'limit?. The station is derived from the line. Returns {line, station, memberCount, ' +
|
|
@@ -253,6 +265,7 @@ export const COMMON_TOOLS = [
|
|
|
253
265
|
},
|
|
254
266
|
{
|
|
255
267
|
name: 'create_group',
|
|
268
|
+
group: 'write',
|
|
256
269
|
description:
|
|
257
270
|
'Create a new group/channel on a station and add members, in a station-agnostic shape. ' +
|
|
258
271
|
'Args: station (required, xmtp|telegram|discord-bot|telegram-bot), name (required), members? ' +
|
|
@@ -292,6 +305,7 @@ export const COMMON_TOOLS = [
|
|
|
292
305
|
},
|
|
293
306
|
{
|
|
294
307
|
name: 'add_members',
|
|
308
|
+
group: 'write',
|
|
295
309
|
description:
|
|
296
310
|
'Add members to an existing Metro group, in a station-agnostic shape. Args: line ' +
|
|
297
311
|
'(required), members? (string[]; station-specific identifiers). xmtp also accepts ' +
|
|
@@ -324,6 +338,8 @@ export const COMMON_TOOLS = [
|
|
|
324
338
|
},
|
|
325
339
|
{
|
|
326
340
|
name: 'remove_members',
|
|
341
|
+
group: 'write',
|
|
342
|
+
destructive: true,
|
|
327
343
|
description:
|
|
328
344
|
'Remove members from an existing Metro group, in a station-agnostic shape. Args: line ' +
|
|
329
345
|
'(required), members? (string[]). xmtp also accepts addresses?/inboxIds? for backward ' +
|
|
@@ -354,6 +370,7 @@ export const COMMON_TOOLS = [
|
|
|
354
370
|
},
|
|
355
371
|
{
|
|
356
372
|
name: 'export_invite',
|
|
373
|
+
group: 'write',
|
|
357
374
|
description:
|
|
358
375
|
'Get a join/invite link for a Metro group, for platforms where direct-add is not always ' +
|
|
359
376
|
'permitted. Args: line (required). The station is derived from the line. Returns {op, ' +
|
|
@@ -368,8 +385,9 @@ export const COMMON_TOOLS = [
|
|
|
368
385
|
CREATE_UPLOAD_TOOL,
|
|
369
386
|
];
|
|
370
387
|
|
|
371
|
-
export const LIST_ACCOUNTS_TOOL = {
|
|
388
|
+
export const LIST_ACCOUNTS_TOOL: ToolDef = {
|
|
372
389
|
name: 'list_accounts',
|
|
390
|
+
group: 'read',
|
|
373
391
|
description:
|
|
374
392
|
'List the configured messaging accounts across all stations (PUBLIC identity only: ' +
|
|
375
393
|
'addresses, bot ids/usernames). No args. Never returns tokens, private keys, or the ' +
|
|
@@ -378,20 +396,3 @@ export const LIST_ACCOUNTS_TOOL = {
|
|
|
378
396
|
'verb need not be discovered by trial and error.',
|
|
379
397
|
inputSchema: { type: 'object', properties: {} },
|
|
380
398
|
};
|
|
381
|
-
|
|
382
|
-
export const MCP_INSTRUCTIONS =
|
|
383
|
-
'Messages from Metro chat arrive as <channel source="metro" line="..." from="..." ' +
|
|
384
|
-
'station="..." message_id="...">. To respond, use the messaging tools, always passing the ' +
|
|
385
|
-
'`line` attribute verbatim (the station is derived from it): `send` (text and/or media via ' +
|
|
386
|
-
'`attachments`, optional `reply_to`), `reply` (quote a `message_id` with `text`), `react`/' +
|
|
387
|
-
'`unreact` (emoji on a `message_id`), `edit`/`delete` (a `message_id`), and `read` (recent ' +
|
|
388
|
-
"history). Station support varies - the tool returns the daemon's reason if a verb is " +
|
|
389
|
-
'unsupported on that line. An inbound attachment is surfaced as a note carrying the ' +
|
|
390
|
-
"sender's own text alongside a `Public URL` - fetch that url to read the file; the note's " +
|
|
391
|
-
'`local_path` resolves on the DAEMON host, not on yours, so the Read tool works on it only ' +
|
|
392
|
-
'for an agent running there. To send a file OUT, call `create_upload`, ' +
|
|
393
|
-
'run the one curl line it hands back (that step needs a shell; the bytes go from your disk ' +
|
|
394
|
-
'straight to metro and never through this conversation), then `send` with ' +
|
|
395
|
-
'attachments:[{upload:"<upload_id>"}]. Inline `data` is for tiny files only, `url` only for ' +
|
|
396
|
-
'an already-public file, and `path` is read on the DAEMON host, not yours. Tool-approval ' +
|
|
397
|
-
'prompts are relayed to the same chat - answer "yes <id>"/"no <id>".';
|
|
@@ -1,34 +1,29 @@
|
|
|
1
|
-
import { publicBaseOrDefault } from '../
|
|
1
|
+
import { publicBaseOrDefault } from '../files/attach-serve.js';
|
|
2
2
|
import { safeFileName } from '../stations/attach-inline.js';
|
|
3
|
-
import { guessMime } from '
|
|
3
|
+
import { guessMime } from '@metro-labs/core/stations/attachments';
|
|
4
4
|
import {
|
|
5
5
|
createUploadSlot,
|
|
6
6
|
issueUploadTicket,
|
|
7
7
|
MAX_UPLOAD_BYTES,
|
|
8
8
|
removeUpload,
|
|
9
9
|
UPLOAD_TTL_MS,
|
|
10
|
-
} from '../
|
|
11
|
-
import type { ToolResult } from '
|
|
10
|
+
} from '../files/upload-store.js';
|
|
11
|
+
import type { ToolResult } from '@metro-labs/core/stations/types';
|
|
12
12
|
import { errResult, okJson } from './ctx.js';
|
|
13
13
|
import { allowedAgents, currentIdentity } from './request-identity.js';
|
|
14
|
-
import { str } from '
|
|
14
|
+
import { str } from '@metro-labs/core/str';
|
|
15
15
|
|
|
16
16
|
const ttlMinutes = (): number => Math.round(UPLOAD_TTL_MS / 60_000);
|
|
17
17
|
|
|
18
18
|
const NO_AGENT =
|
|
19
19
|
'create_upload needs an agent credential; this session is not scoped to one agent';
|
|
20
20
|
|
|
21
|
-
const manyAgents = (n: number): string =>
|
|
22
|
-
`create_upload is scoped to one agent, but this session covers ${String(n)}` +
|
|
23
|
-
' (a multi-agent sign-in); use `POST /api/uploads?agent=<id>` directly instead';
|
|
24
|
-
|
|
25
21
|
type OwnerAgent = { agentId: string } | { error: string };
|
|
26
22
|
|
|
27
23
|
function ownerAgent(): OwnerAgent {
|
|
28
24
|
const allowed = allowedAgents(currentIdentity());
|
|
29
25
|
const [only] = [...allowed];
|
|
30
|
-
|
|
31
|
-
return { error: allowed.size === 0 ? NO_AGENT : manyAgents(allowed.size) };
|
|
26
|
+
return allowed.size === 1 && only !== undefined ? { agentId: only } : { error: NO_AGENT };
|
|
32
27
|
}
|
|
33
28
|
|
|
34
29
|
export function dispatchCreateUpload(
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
const ROOT_DIR = '/usr/local/lib/metro';
|
|
2
|
+
export const HELPER_PATH = `${ROOT_DIR}/root-helper`;
|
|
3
|
+
const HELPER_VERSION = 3;
|
|
4
|
+
export const SUDOERS_PATH = '/etc/sudoers.d/metro';
|
|
5
|
+
export const IMDS_UNIT = 'metro-imds.service';
|
|
6
|
+
export const IMDS_UNIT_PATH = `/etc/systemd/system/${IMDS_UNIT}`;
|
|
7
|
+
export const UPGRADE_UNIT = 'metro-root-upgrade@.service';
|
|
8
|
+
export const UPGRADE_UNIT_PATH = `/etc/systemd/system/${UPGRADE_UNIT}`;
|
|
9
|
+
const RELEASE_DIR = `${ROOT_DIR}/release`;
|
|
10
|
+
export const METRO_USER = 'metro';
|
|
11
|
+
const METRO_HOME = '/var/lib/metro';
|
|
12
|
+
const VAULT_DROP_IN = '11-metro-vault.conf';
|
|
13
|
+
const PRIVILEGED_EXEC = ['ExecConditionEx', 'ExecStartPreEx', 'ExecStartEx', 'ExecStartPostEx', 'ExecReloadEx', 'ExecStopEx', 'ExecStopPostEx'];
|
|
14
|
+
|
|
15
|
+
export const sudoersText = (agent: string): string =>
|
|
16
|
+
[
|
|
17
|
+
`${METRO_USER} ALL=(${agent}) NOPASSWD: ALL`,
|
|
18
|
+
`${METRO_USER} ALL=(root) NOPASSWD: ${HELPER_PATH} *`,
|
|
19
|
+
`Defaults:${METRO_USER} !requiretty`,
|
|
20
|
+
'',
|
|
21
|
+
].join('\n');
|
|
22
|
+
|
|
23
|
+
const lines = (...parts: string[]): string => parts.join('\n');
|
|
24
|
+
|
|
25
|
+
const CHECKS = lines(
|
|
26
|
+
'AGENT=agent',
|
|
27
|
+
'UNITS=/etc/systemd/system',
|
|
28
|
+
'die() { echo "root-helper: $*" >&2; exit 2; }',
|
|
29
|
+
'agent_uid() { id -u "$AGENT" 2>/dev/null || die "no agent user"; }',
|
|
30
|
+
'service_ok() {',
|
|
31
|
+
' case "$1" in [!A-Za-z0-9]*|*[!A-Za-z0-9@_.-]*|"") die "bad service name";; esac',
|
|
32
|
+
' case "$1" in *.service) ;; *) die "bad service name";; esac',
|
|
33
|
+
' case "$1" in metro*) die "not a metro unit";; esac',
|
|
34
|
+
' frag=$(systemctl show "$1" -p FragmentPath --value)',
|
|
35
|
+
' case "$frag" in "$UNITS"/*) ;; *) die "not a unit under $UNITS";; esac',
|
|
36
|
+
' systemctl show "$1" -p TriggeredBy --value | grep -q "\\.timer" || die "not started by a timer"',
|
|
37
|
+
'}',
|
|
38
|
+
'agent_only() {',
|
|
39
|
+
' [ "$(systemctl show "$1" -p User --value)" = "$AGENT" ] || die "that job does not run as $AGENT"',
|
|
40
|
+
' [ "$(systemctl show "$1" -p PermissionsStartOnly --value)" != yes ] || die "that job runs commands as root"',
|
|
41
|
+
' [ -n "$(systemctl show "$1" -p ExecStartEx --value)" ] || die "cannot read the commands of that job"',
|
|
42
|
+
` if systemctl show "$1" ${PRIVILEGED_EXEC.map((p) => `-p ${p}`).join(' ')} --value | grep -Eq "flags=[^;]*(privileged|no-setuid|ambient)"; then die "that job runs commands as root"; fi`,
|
|
43
|
+
'}',
|
|
44
|
+
'dropin_ok() {',
|
|
45
|
+
` [ "$1" = ${VAULT_DROP_IN} ] || die "bad drop-in name"`,
|
|
46
|
+
' home=$(getent passwd "$AGENT" | cut -d: -f6)',
|
|
47
|
+
' printf \'[Service]\\nEnvironmentFile=-%s/.metro/vault.env\\n\' "$home" | cmp -s - "$2" || die "only the vault environment file may be added"',
|
|
48
|
+
'}',
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const FIREWALL = lines(
|
|
52
|
+
'firewall_on() {',
|
|
53
|
+
' uid=$(agent_uid)',
|
|
54
|
+
' for t in iptables ip6tables; do',
|
|
55
|
+
' $t -w -N METRO_AGENT 2>/dev/null || true',
|
|
56
|
+
' $t -w -F METRO_AGENT',
|
|
57
|
+
' $t -w -A METRO_AGENT -o lo -j ACCEPT',
|
|
58
|
+
' $t -w -A METRO_AGENT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT',
|
|
59
|
+
' $t -w -A METRO_AGENT -p udp --dport 53 -j ACCEPT',
|
|
60
|
+
' $t -w -A METRO_AGENT -p tcp --dport 53 -j ACCEPT',
|
|
61
|
+
' $t -w -A METRO_AGENT -p tcp -j REJECT --reject-with tcp-reset',
|
|
62
|
+
' $t -w -A METRO_AGENT -j REJECT',
|
|
63
|
+
' $t -w -C OUTPUT -m owner --uid-owner "$uid" -j METRO_AGENT 2>/dev/null || $t -w -I OUTPUT -m owner --uid-owner "$uid" -j METRO_AGENT',
|
|
64
|
+
' done',
|
|
65
|
+
'}',
|
|
66
|
+
'firewall_off() {',
|
|
67
|
+
' uid=$(agent_uid)',
|
|
68
|
+
' for t in iptables ip6tables; do',
|
|
69
|
+
' while $t -w -C OUTPUT -m owner --uid-owner "$uid" -j METRO_AGENT 2>/dev/null; do $t -w -D OUTPUT -m owner --uid-owner "$uid" -j METRO_AGENT; done',
|
|
70
|
+
' $t -w -F METRO_AGENT 2>/dev/null || true',
|
|
71
|
+
' $t -w -X METRO_AGENT 2>/dev/null || true',
|
|
72
|
+
' done',
|
|
73
|
+
'}',
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const IMDS = lines(
|
|
77
|
+
'imds_block() {',
|
|
78
|
+
` metro_uid=$(id -u ${METRO_USER} 2>/dev/null) || die "no ${METRO_USER} user"`,
|
|
79
|
+
' for t in iptables ip6tables; do',
|
|
80
|
+
' if [ "$t" = iptables ]; then dst=169.254.169.254; else dst=fd00:ec2::254; fi',
|
|
81
|
+
' if ! $t -w -L OUTPUT -n >/dev/null 2>&1; then [ "$t" = ip6tables ] && continue; die "$t is not usable"; fi',
|
|
82
|
+
' $t -w -N METRO_IMDS 2>/dev/null || true',
|
|
83
|
+
' $t -w -F METRO_IMDS',
|
|
84
|
+
' $t -w -A METRO_IMDS -m owner --uid-owner 0 -j RETURN',
|
|
85
|
+
' $t -w -A METRO_IMDS -m owner --uid-owner "$metro_uid" -j RETURN',
|
|
86
|
+
' $t -w -A METRO_IMDS -p tcp -j REJECT --reject-with tcp-reset',
|
|
87
|
+
' $t -w -A METRO_IMDS -j REJECT',
|
|
88
|
+
' $t -w -C OUTPUT -d "$dst" -j METRO_IMDS 2>/dev/null || $t -w -I OUTPUT -d "$dst" -j METRO_IMDS',
|
|
89
|
+
' done',
|
|
90
|
+
'}',
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
export const imdsUnitText = (): string =>
|
|
94
|
+
lines(
|
|
95
|
+
'[Unit]',
|
|
96
|
+
`Description=Metro: only root and ${METRO_USER} reach the instance metadata service`,
|
|
97
|
+
'DefaultDependencies=no',
|
|
98
|
+
'After=local-fs.target',
|
|
99
|
+
'Before=network-pre.target shutdown.target',
|
|
100
|
+
'Wants=network-pre.target',
|
|
101
|
+
'Conflicts=shutdown.target',
|
|
102
|
+
'',
|
|
103
|
+
'[Service]',
|
|
104
|
+
'Type=oneshot',
|
|
105
|
+
'RemainAfterExit=yes',
|
|
106
|
+
`ExecStart=${HELPER_PATH} imds-block`,
|
|
107
|
+
'',
|
|
108
|
+
'[Install]',
|
|
109
|
+
'WantedBy=multi-user.target',
|
|
110
|
+
'',
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
export const upgradeUnitText = (node: string): string =>
|
|
114
|
+
lines(
|
|
115
|
+
'[Unit]',
|
|
116
|
+
'Description=Metro: bring the root side to Metro %i, checked against npm and its GitHub provenance',
|
|
117
|
+
'After=network-online.target',
|
|
118
|
+
'Wants=network-online.target',
|
|
119
|
+
'',
|
|
120
|
+
'[Service]',
|
|
121
|
+
'Type=oneshot',
|
|
122
|
+
`ExecStart=/usr/bin/flock ${ROOT_DIR} ${node} ${RELEASE_DIR}/dist/cli.js service root-upgrade %i`,
|
|
123
|
+
'TimeoutStartSec=900',
|
|
124
|
+
'',
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
const ACTIONS = lines(
|
|
128
|
+
'action="${1:-}"; [ "$#" -gt 0 ] && shift',
|
|
129
|
+
'case "$action" in',
|
|
130
|
+
` version) echo ${String(HELPER_VERSION)} ;;`,
|
|
131
|
+
' ensure-agent)',
|
|
132
|
+
' getent passwd "$AGENT" >/dev/null || useradd --create-home --shell /bin/bash "$AGENT"',
|
|
133
|
+
' chmod 700 "$(getent passwd "$AGENT" | cut -d: -f6)" ;;',
|
|
134
|
+
' as-agent-scope)',
|
|
135
|
+
' [ "$#" -ge 3 ] || die "usage: as-agent-scope <max> <high> <command...>"',
|
|
136
|
+
' printf %s "$1$2" | grep -Eq "^[0-9]+$" || die "bad memory limits"',
|
|
137
|
+
' max="$1"; high="$2"; shift 2',
|
|
138
|
+
' uid=$(agent_uid); gid=$(id -g "$AGENT")',
|
|
139
|
+
' exec systemd-run --scope --quiet --collect --unit="metro-claude-$(date +%s%N)" -p MemoryMax="$max" -p MemoryHigh="$high" -p OOMPolicy=continue -- setpriv --reuid="$uid" --regid="$gid" --init-groups -- "$@" ;;',
|
|
140
|
+
' dropin-write)',
|
|
141
|
+
' service_ok "$1"; agent_only "$1"; tmp=$(mktemp); trap \'rm -f "$tmp"\' EXIT; head -c 4096 > "$tmp"; dropin_ok "$2" "$tmp"',
|
|
142
|
+
' mkdir -p "$UNITS/$1.d"; install -m 644 "$tmp" "$UNITS/$1.d/$2" ;;',
|
|
143
|
+
' dropin-remove)',
|
|
144
|
+
` service_ok "$1"; [ "$2" = ${VAULT_DROP_IN} ] || die "bad drop-in name"`,
|
|
145
|
+
' rm -f "$UNITS/$1.d/$2" ;;',
|
|
146
|
+
' daemon-reload) systemctl daemon-reload ;;',
|
|
147
|
+
' start-job)',
|
|
148
|
+
' service_ok "$1"; [ "$(systemctl show "$1" -p User --value)" = "$AGENT" ] || die "that job does not run as $AGENT"',
|
|
149
|
+
' systemctl start --no-block "$1" ;;',
|
|
150
|
+
' root-crontab) crontab -l -u root 2>/dev/null || true ;;',
|
|
151
|
+
' root-crontab-drop)',
|
|
152
|
+
' printf %s "$1" | grep -Eq "^[0-9a-f]{16}$" || die "bad line id"',
|
|
153
|
+
` backups="${METRO_HOME}/.metro/agents"`,
|
|
154
|
+
' cur=$(mktemp); crontab -l -u root > "$cur" 2>/dev/null || true',
|
|
155
|
+
' kept=$(mktemp); found=0',
|
|
156
|
+
' while IFS= read -r line; do',
|
|
157
|
+
' id=$(printf %s "$line" | sed "s/^[[:space:]]*//;s/[[:space:]]*$//" | tr -d "\\n" | sha256sum | cut -c1-16)',
|
|
158
|
+
' if [ "$id" = "$1" ] && [ "$found" = 0 ]; then found=1; elif [ -n "$line" ]; then printf "%s\\n" "$line" >> "$kept"; fi',
|
|
159
|
+
' done < "$cur"',
|
|
160
|
+
' [ "$found" = 1 ] || die "that cron line is gone"',
|
|
161
|
+
' install -m 600 "$cur" "$backups/crontab-root.$(date +%Y-%m-%dT%H-%M-%S).bak"',
|
|
162
|
+
' crontab -u root "$kept"; rm -f "$cur" "$kept" ;;',
|
|
163
|
+
' imds-block) imds_block ;;',
|
|
164
|
+
' upgrade)',
|
|
165
|
+
' [ "$#" -eq 1 ] || die "usage: upgrade <version>"',
|
|
166
|
+
' case "$1" in *[!0-9A-Za-z.-]*|"") die "bad version";; esac',
|
|
167
|
+
' printf %s "$1" | grep -Eqx "[0-9]{1,9}\\.[0-9]{1,9}\\.[0-9]{1,9}(-[0-9A-Za-z]{1,20}(\\.[0-9A-Za-z]{1,20}){0,4})?" || die "bad version"',
|
|
168
|
+
` systemctl start --no-block "${UPGRADE_UNIT.replace('@.', '@$1.')}" ;;`,
|
|
169
|
+
' firewall-on) firewall_on ;;',
|
|
170
|
+
' firewall-off) firewall_off ;;',
|
|
171
|
+
' trust-ca)',
|
|
172
|
+
` src="${METRO_HOME}/.metro/agents/vault/ca/ca.crt"`,
|
|
173
|
+
' head -n1 "$src" | grep -q "BEGIN CERTIFICATE" || die "not a certificate"',
|
|
174
|
+
' if grep -q "PRIVATE KEY" "$src"; then die "a key is not a certificate"; fi',
|
|
175
|
+
' install -m 644 "$src" /usr/local/share/ca-certificates/metro-vault.crt && update-ca-certificates >/dev/null ;;',
|
|
176
|
+
' untrust-ca) rm -f /usr/local/share/ca-certificates/metro-vault.crt; update-ca-certificates --fresh >/dev/null ;;',
|
|
177
|
+
' install-nss-tools) DEBIAN_FRONTEND=noninteractive apt-get install -y -q libnss3-tools >/dev/null ;;',
|
|
178
|
+
' *) die "unknown action: $action" ;;',
|
|
179
|
+
'esac',
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
export const helperScript = (): string =>
|
|
183
|
+
['#!/bin/sh', 'set -eu', 'export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', CHECKS, FIREWALL, IMDS, ACTIONS, ''].join('\n');
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { log } from '@metro-labs/core/log';
|
|
2
|
+
import { METRO_VERSION } from '@metro-labs/core/version';
|
|
3
|
+
import { rootHelper, rootStepHint, type HelperResult } from './privilege.js';
|
|
4
|
+
|
|
5
|
+
export function blockImds(run: (args: string[]) => HelperResult = rootHelper): boolean {
|
|
6
|
+
const result = run(['imds-block']);
|
|
7
|
+
if (result.status === 0) {
|
|
8
|
+
log.info('imds: only root and metro reach the instance metadata service');
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
log.warn(
|
|
12
|
+
{ err: result.stderr.trim(), fix: rootStepHint(METRO_VERSION) },
|
|
13
|
+
'imds: the agent can still read the instance metadata (setup data, instance role), since the root helper on this box predates the guard',
|
|
14
|
+
);
|
|
15
|
+
return false;
|
|
16
|
+
}
|