@stage-labs/metro 0.1.0-beta.29 → 0.1.0-beta.291
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/automation.js +56 -0
- package/dist/background.js +141 -0
- package/dist/claude-settings.js +40 -0
- package/dist/claude.js +199 -10
- package/dist/cli.js +73 -126
- 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/native-recovery-scan.js +246 -0
- package/dist/native-recovery-state.js +154 -0
- package/dist/native-recovery.js +164 -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 +114 -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 +109 -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 +102 -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 +59 -0
- package/runtime/node_modules/@metro-labs/core/src/automation-files.ts +216 -0
- package/runtime/node_modules/@metro-labs/core/src/automation-store.ts +171 -0
- package/runtime/node_modules/@metro-labs/core/src/automation-types.ts +141 -0
- package/runtime/node_modules/@metro-labs/core/src/call.ts +81 -0
- package/runtime/node_modules/@metro-labs/core/src/connector-sync.ts +17 -0
- package/runtime/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/events.ts +54 -6
- package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/ids.ts +10 -1
- package/runtime/node_modules/@metro-labs/core/src/is-record.ts +2 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/stations → core/src}/lines.ts +22 -26
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/protocol.ts +7 -4
- package/runtime/node_modules/@metro-labs/core/src/runner-activity.ts +226 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/secure-fs.ts +17 -0
- package/runtime/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
- package/runtime/node_modules/@metro-labs/core/src/station-names.ts +14 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
- package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/attachments.ts +9 -3
- package/runtime/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
- package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/station-runtime.ts +6 -11
- package/runtime/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
- package/runtime/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
- package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/types.ts +20 -1
- package/runtime/node_modules/@metro-labs/core/src/tickets.ts +44 -0
- package/runtime/node_modules/@metro-labs/core/src/version.ts +2 -0
- package/runtime/node_modules/@metro-labs/daemon/package.json +51 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/agent-fs.ts +246 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/crontab.ts +44 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files-api.ts +12 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files.ts +89 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/home-fs.ts +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 +362 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/admin.ts +30 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/allowlist.ts +59 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/api.ts +133 -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 +317 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/files.ts +142 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/db/key-map.ts → daemon/src/agents/keys.ts} +1 -11
- package/runtime/node_modules/@metro-labs/daemon/src/agents/map.ts +135 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/policy-route.ts +27 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-scope.ts → daemon/src/agents/scope.ts} +2 -2
- package/runtime/node_modules/@metro-labs/daemon/src/agents/sender-cards.ts +94 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agents/senders.ts +38 -0
- package/runtime/node_modules/@metro-labs/daemon/src/approvals/api.ts +55 -0
- package/runtime/node_modules/@metro-labs/daemon/src/approvals/owner-line.ts +45 -0
- package/runtime/node_modules/@metro-labs/daemon/src/approvals/pending.ts +189 -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 +250 -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 +95 -72
- 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 +13 -1
- package/runtime/node_modules/@metro-labs/daemon/src/channels/react-note.ts +13 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +2 -2
- package/runtime/node_modules/@metro-labs/daemon/src/claude/api.ts +316 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/files.ts +359 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/github-api.ts +12 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/github-fetch.ts +160 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/github-skills.ts +259 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/github-validate.ts +53 -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 +52 -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 +57 -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 +375 -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 +346 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/skills.ts +123 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/usage-probe.ts +128 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/version.ts +113 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/agent-key.ts +148 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-api.ts → daemon/src/connectors/api.ts} +91 -114
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/config.ts +103 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/enroll-api.ts +101 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/gates.ts +110 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/health.ts +18 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/metro-api.ts +93 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-api.ts +60 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-control.ts +287 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-guard.ts +90 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-operations.ts +196 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-preview.ts +219 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-source.ts +26 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-state.ts +125 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-url.ts +9 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/oauth-routes.ts +178 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth.ts → daemon/src/connectors/oauth.ts} +69 -26
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-relay.ts +61 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-runtime-discovery.ts +114 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-runtime.ts +300 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-sync-api.ts +25 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-sync-control.ts +172 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-sync-setting.ts +60 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-sync-watch.ts +53 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-sync.ts +187 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/plugin-sync.ts +143 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/publication.ts +48 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-id.ts +2 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-policy.ts +90 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-session.ts +11 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-target.ts +4 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/relay.ts +120 -39
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/store.ts +396 -0
- package/runtime/node_modules/@metro-labs/daemon/src/connectors/tools.ts +85 -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 +49 -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 +259 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-config.ts +362 -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/daemon/src/mcp/call-bridge.ts +45 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-permission.ts +25 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/call-tools.ts +88 -38
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/channel-tool.ts +80 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +24 -18
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/frame-schema.ts +44 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/group-tools.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/index.ts +51 -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 +104 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-relay.ts +109 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-gate.ts +88 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-snapshot.ts +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 +84 -55
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-schema.ts +11 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-send.ts +15 -0
- package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-catalog.ts +96 -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 +60 -40
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +87 -114
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +6 -11
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/helper-script.ts +183 -0
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/imds.ts +16 -0
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/install.ts +78 -0
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/privilege.ts +50 -0
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/root-follow.ts +16 -0
- package/runtime/node_modules/@metro-labs/daemon/src/monitor/api.ts +132 -0
- package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-event.ts +139 -0
- package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-events.ts +101 -0
- package/runtime/node_modules/@metro-labs/daemon/src/net/tunnel.ts +323 -0
- package/runtime/node_modules/@metro-labs/daemon/src/policy/policy.ts +119 -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/daemon/src/routes/gmail-attach.ts +67 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/gmail-detach.ts +37 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +64 -53
- package/runtime/node_modules/@metro-labs/daemon/src/routes/local-mode.ts +229 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/session-apis.ts +82 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/session.ts +29 -0
- package/runtime/node_modules/@metro-labs/daemon/src/routes/threema-callback.ts +103 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server/cloudwatch.ts +178 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server/control.ts +39 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server/machine.ts +58 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server/owner.ts +26 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server/update.ts +90 -0
- package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
- package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-browser.ts +107 -0
- package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-driver.ts +42 -0
- package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-gmail.ts +78 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-inline.ts +29 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-interactive.ts +5 -31
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-resolve.ts +84 -13
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/attach-session.ts +61 -25
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-xmtp.ts +8 -9
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach.ts +69 -3
- package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/stations}/materialize.ts +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 +135 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor-io.ts +3 -3
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor.ts +6 -9
- package/runtime/node_modules/@metro-labs/daemon/src/stations/threema-callbacks.ts +32 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/train-call.ts +1 -1
- package/runtime/node_modules/@metro-labs/daemon/src/stations/webhook-endpoints.ts +51 -0
- package/runtime/node_modules/@metro-labs/daemon/src/terminal/api.ts +84 -0
- package/runtime/node_modules/@metro-labs/daemon/src/terminal/socket.ts +124 -0
- package/runtime/node_modules/@metro-labs/daemon/src/terminal/tickets.ts +15 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/api.ts +45 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/config.ts +51 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/firewall.ts +9 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/index.ts +96 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/install.ts +56 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/paths.ts +26 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/proxy.ts +147 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/store.ts +129 -0
- package/runtime/node_modules/@metro-labs/daemon/src/vault/trust.ts +44 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/api.ts +14 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/approvals.ts +38 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/audio.ts +193 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/brain.ts +146 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/call.ts +274 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/calls.ts +156 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/peer.ts +85 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/scribe.ts +115 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/shared-talk.ts +85 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/shared.ts +200 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/speakable.ts +54 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/speech-queue.ts +200 -0
- package/runtime/node_modules/@metro-labs/daemon/src/voice/speech.ts +129 -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 +264 -0
- package/runtime/node_modules/@metro-labs/discord-bot/package.json +3 -5
- package/runtime/node_modules/@metro-labs/discord-bot/src/accounts.ts +3 -23
- package/runtime/node_modules/@metro-labs/discord-bot/src/actions.ts +21 -187
- package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +2 -2
- package/runtime/node_modules/@metro-labs/discord-bot/src/channel-source.ts +79 -0
- package/runtime/node_modules/@metro-labs/discord-bot/src/channels.ts +186 -0
- package/runtime/node_modules/@metro-labs/discord-bot/src/format.ts +26 -67
- package/runtime/node_modules/@metro-labs/discord-bot/src/group-actions.ts +1 -1
- package/runtime/node_modules/@metro-labs/discord-bot/src/group.ts +2 -2
- package/runtime/node_modules/@metro-labs/discord-bot/src/index.ts +8 -14
- package/runtime/node_modules/@metro-labs/discord-bot/src/members.ts +2 -2
- package/runtime/node_modules/@metro-labs/discord-bot/src/profile.ts +68 -0
- package/runtime/node_modules/@metro-labs/discord-bot/src/send-files.ts +12 -13
- package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +6 -1
- package/runtime/node_modules/@metro-labs/gmail/package.json +27 -0
- package/runtime/node_modules/@metro-labs/gmail/src/accounts.ts +133 -0
- package/runtime/node_modules/@metro-labs/gmail/src/actions.ts +20 -0
- package/runtime/node_modules/@metro-labs/gmail/src/api.ts +34 -0
- package/runtime/node_modules/@metro-labs/gmail/src/attachments.ts +38 -0
- package/runtime/node_modules/@metro-labs/gmail/src/auth.ts +115 -0
- package/runtime/node_modules/@metro-labs/gmail/src/channels.ts +66 -0
- package/runtime/node_modules/@metro-labs/gmail/src/config.ts +15 -0
- package/runtime/node_modules/@metro-labs/gmail/src/inbound.ts +97 -0
- package/runtime/node_modules/@metro-labs/gmail/src/index.ts +12 -0
- package/runtime/node_modules/@metro-labs/gmail/src/login.ts +39 -0
- package/runtime/node_modules/@metro-labs/gmail/src/managed-binding.ts +33 -0
- package/runtime/node_modules/@metro-labs/gmail/src/managed.ts +45 -0
- package/runtime/node_modules/@metro-labs/gmail/src/message.ts +125 -0
- package/runtime/node_modules/@metro-labs/gmail/src/mime.ts +70 -0
- package/runtime/node_modules/@metro-labs/gmail/src/outbound.ts +125 -0
- package/runtime/node_modules/@metro-labs/gmail/src/query.ts +101 -0
- package/runtime/node_modules/@metro-labs/gmail/src/state.ts +30 -0
- package/runtime/node_modules/@metro-labs/gmail/src/station.ts +16 -0
- package/runtime/node_modules/@metro-labs/gmail/src/trust.ts +42 -0
- package/runtime/node_modules/@metro-labs/http/package.json +41 -0
- package/runtime/node_modules/@metro-labs/http/src/agent-signature.ts +110 -0
- package/runtime/node_modules/@metro-labs/http/src/api-http.ts +147 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-delivery-validation.ts +115 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-delivery.ts +19 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-discovery.ts → http/src/connector-discovery.ts} +57 -27
- package/runtime/node_modules/@metro-labs/http/src/connector-input.ts +73 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-mcp.ts +106 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-migration.ts +171 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-client.ts → http/src/connector-oauth.ts} +48 -28
- package/runtime/node_modules/@metro-labs/http/src/connector-policy.ts +56 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-public-url.ts +64 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-reach.ts +27 -0
- package/runtime/node_modules/@metro-labs/http/src/connector-resource.ts +108 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/connector-url.ts +8 -28
- package/runtime/node_modules/@metro-labs/http/src/ed25519.ts +56 -0
- package/runtime/node_modules/@metro-labs/{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/transfer-crypto.ts +44 -0
- package/runtime/node_modules/@metro-labs/http/src/workos-token.ts +149 -0
- package/runtime/node_modules/@metro-labs/outlook/package.json +25 -0
- package/runtime/node_modules/@metro-labs/outlook/src/accounts.ts +78 -0
- package/runtime/node_modules/@metro-labs/outlook/src/actions.ts +15 -0
- package/runtime/node_modules/@metro-labs/outlook/src/attachments.ts +81 -0
- package/runtime/node_modules/@metro-labs/outlook/src/auth.ts +120 -0
- package/runtime/node_modules/@metro-labs/outlook/src/browser.ts +42 -0
- package/runtime/node_modules/@metro-labs/outlook/src/channels.ts +60 -0
- package/runtime/node_modules/@metro-labs/outlook/src/config.ts +23 -0
- package/runtime/node_modules/@metro-labs/outlook/src/format.ts +59 -0
- package/runtime/node_modules/@metro-labs/outlook/src/graph.ts +55 -0
- package/runtime/node_modules/@metro-labs/outlook/src/inbound.ts +96 -0
- package/runtime/node_modules/@metro-labs/outlook/src/index.ts +12 -0
- package/runtime/node_modules/@metro-labs/outlook/src/login.ts +129 -0
- package/runtime/node_modules/@metro-labs/outlook/src/me.ts +31 -0
- package/runtime/node_modules/@metro-labs/outlook/src/outbound.ts +103 -0
- package/runtime/node_modules/@metro-labs/outlook/src/query.ts +84 -0
- package/runtime/node_modules/@metro-labs/outlook/src/state.ts +28 -0
- package/runtime/node_modules/@metro-labs/outlook/src/station.ts +16 -0
- package/runtime/node_modules/@metro-labs/outlook/src/trust.ts +41 -0
- package/runtime/node_modules/@metro-labs/telegram/package.json +2 -4
- package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +5 -24
- package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +27 -6
- package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/channels.ts +58 -0
- package/runtime/node_modules/@metro-labs/telegram/src/client.ts +4 -4
- package/runtime/node_modules/@metro-labs/telegram/src/format.ts +19 -34
- package/runtime/node_modules/@metro-labs/telegram/src/group.ts +3 -3
- package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +13 -34
- package/runtime/node_modules/@metro-labs/telegram/src/index.ts +4 -43
- package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +2 -3
- package/runtime/node_modules/@metro-labs/telegram/src/members.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/profile.ts +70 -0
- package/runtime/node_modules/@metro-labs/telegram/src/reactions.ts +2 -2
- package/runtime/node_modules/@metro-labs/telegram/src/station.ts +5 -1
- package/runtime/node_modules/@metro-labs/telegram/src/types.ts +0 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/package.json +2 -2
- package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +7 -41
- package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +24 -77
- package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +2 -2
- package/runtime/node_modules/@metro-labs/telegram-bot/src/channel-files.ts +3 -0
- package/runtime/node_modules/@metro-labs/telegram-bot/src/channels.ts +43 -0
- package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +46 -48
- package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +15 -44
- package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +6 -82
- package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/src/observed-chats.ts +172 -0
- package/runtime/node_modules/@metro-labs/telegram-bot/src/profile.ts +85 -0
- package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +9 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/src/types.ts +50 -15
- package/runtime/node_modules/@metro-labs/telegram-bot/src/updates.ts +26 -0
- package/runtime/node_modules/@metro-labs/threema/package.json +26 -0
- package/runtime/node_modules/@metro-labs/threema/src/accounts.ts +108 -0
- package/runtime/node_modules/@metro-labs/threema/src/actions.ts +130 -0
- package/runtime/node_modules/@metro-labs/threema/src/api.ts +152 -0
- package/runtime/node_modules/@metro-labs/threema/src/channels.ts +37 -0
- package/runtime/node_modules/@metro-labs/threema/src/chats.ts +88 -0
- package/runtime/node_modules/@metro-labs/threema/src/crypto.ts +100 -0
- package/runtime/node_modules/@metro-labs/threema/src/files.ts +47 -0
- package/runtime/node_modules/@metro-labs/threema/src/format.ts +164 -0
- package/runtime/node_modules/@metro-labs/threema/src/groups.ts +96 -0
- package/runtime/node_modules/@metro-labs/threema/src/ids.ts +21 -0
- package/runtime/node_modules/@metro-labs/threema/src/inbound.ts +92 -0
- package/runtime/node_modules/@metro-labs/threema/src/index.ts +24 -0
- package/runtime/node_modules/@metro-labs/threema/src/messages.ts +264 -0
- package/runtime/node_modules/@metro-labs/threema/src/outbound.ts +161 -0
- package/runtime/node_modules/@metro-labs/threema/src/station.ts +21 -0
- package/runtime/node_modules/@metro-labs/threema/src/verify.ts +117 -0
- package/runtime/node_modules/@metro-labs/webhook/package.json +2 -2
- package/runtime/node_modules/@metro-labs/webhook/src/station.ts +5 -8
- package/runtime/node_modules/@metro-labs/whatsapp/package.json +3 -6
- package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +6 -28
- package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +97 -12
- package/runtime/node_modules/@metro-labs/whatsapp/src/app-state.ts +49 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +2 -2
- package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/channel-chats.ts +137 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/channels.ts +48 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/client-history.ts +31 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/client-types.ts +48 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +145 -63
- package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +7 -58
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-events.ts +127 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-files.ts +39 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-identity.ts +58 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-message.ts +161 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-state.ts +344 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history-types.ts +91 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/history.ts +195 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +11 -28
- package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +4 -37
- package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/members.ts +94 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/messages.ts +70 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/names.ts +75 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/parse.ts +44 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/resolve.ts +52 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/send-expiry.ts +65 -0
- package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +24 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +5 -9
- package/runtime/node_modules/@metro-labs/whatsapp/src/types.ts +0 -1
- package/runtime/node_modules/@metro-labs/xmtp/package.json +4 -3
- package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +10 -20
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +2 -2
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +55 -224
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +47 -53
- package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +114 -223
- package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +58 -15
- package/runtime/node_modules/@metro-labs/xmtp/src/call-leftovers.ts +48 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/channels.ts +56 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/codecs.ts +114 -3
- package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +35 -20
- package/runtime/node_modules/@metro-labs/xmtp/src/delete-requests.ts +34 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +38 -25
- package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +8 -18
- package/runtime/node_modules/@metro-labs/xmtp/src/frames.ts +190 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +2 -2
- package/runtime/node_modules/@metro-labs/xmtp/src/identity.ts +30 -16
- package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +18 -70
- package/runtime/node_modules/@metro-labs/xmtp/src/labels.ts +102 -50
- package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/names.ts +61 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/network.ts +114 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/profile.ts +160 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/read-attachments.ts +37 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/resolve.ts +44 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/sender.ts +112 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/smart.ts +79 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +10 -2
- package/runtime/node_modules/@metro-labs/xmtp/src/stream.ts +66 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +22 -58
- package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +72 -49
- package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +4 -6
- package/runtime/node_modules/@metro-labs/xmtp/src/verify.ts +19 -5
- package/runtime/node_modules/@metro-labs/xmtp/src/wallet.ts +28 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +14 -4
- package/runtime/patches/5bca2c07d5852d3f58453cff0448dd85da13d3665b61e3d758905b298d432d7c.patch +31 -0
- package/runtime/runtime.json +1 -1
- package/runtime/sdk-runner/node_modules/@metro-labs/core/package.json +59 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-files.ts +216 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-store.ts +171 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-types.ts +141 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/call.ts +81 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/connector-sync.ts +17 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/events.ts +165 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/ids.ts +28 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/is-record.ts +2 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/lines.ts +78 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/log.ts +42 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/protocol.ts +227 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/runner-activity.ts +226 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/secure-fs.ts +74 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/station-names.ts +14 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/attachments.ts +202 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/station-runtime.ts +59 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/types.ts +126 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/str.ts +5 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/tickets.ts +44 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/train-error.ts +53 -0
- package/runtime/sdk-runner/node_modules/@metro-labs/core/src/version.ts +2 -0
- package/runtime/sdk-runner/runner.json +10 -0
- package/runtime/sdk-runner/src/activity-tasks.ts +194 -0
- package/runtime/sdk-runner/src/activity.ts +397 -0
- package/runtime/sdk-runner/src/app.ts +87 -0
- package/runtime/sdk-runner/src/approvals.ts +37 -0
- package/runtime/sdk-runner/src/automation-cli.ts +10 -0
- package/runtime/sdk-runner/src/automation-command.ts +151 -0
- package/runtime/sdk-runner/src/automation.ts +145 -0
- package/runtime/sdk-runner/src/calls.ts +133 -0
- package/runtime/sdk-runner/src/channel-text.ts +26 -0
- package/runtime/sdk-runner/src/config.ts +50 -0
- package/runtime/sdk-runner/src/inbox.ts +168 -0
- package/runtime/sdk-runner/src/input-queue.ts +77 -0
- package/runtime/sdk-runner/src/input-timing.ts +68 -0
- package/runtime/sdk-runner/src/link.ts +154 -0
- package/runtime/sdk-runner/src/main.ts +53 -0
- package/runtime/sdk-runner/src/recovery.ts +46 -0
- package/runtime/sdk-runner/src/rules.ts +28 -0
- package/runtime/sdk-runner/src/runner.ts +343 -0
- package/runtime/sdk-runner/src/session-store.ts +129 -0
- package/runtime/sdk-runner/src/session-watch.ts +158 -0
- package/runtime/sdk-runner/src/singleton.ts +15 -0
- package/runtime/sdk-runner/src/skill-work.ts +76 -0
- package/runtime/sdk-runner/src/skills-files.ts +169 -0
- package/runtime/sdk-runner/src/skills.ts +150 -0
- package/runtime/sdk-runner/src/task-ledger.ts +229 -0
- package/runtime/sdk-runner/src/task-recovery.ts +203 -0
- package/runtime/sdk-runner/src/task-state.ts +71 -0
- package/runtime/sdk-runner/src/tool-proxy.ts +40 -0
- package/runtime/server.ts +1 -0
- package/runtime/stations.json +43 -0
- package/dist/bedrock-eventstream.js +0 -120
- package/dist/bedrock-proxy.js +0 -296
- package/dist/bedrock.js +0 -99
- 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 -337
- 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 -123
- 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-oauth-routes.ts +0 -157
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-tools.ts +0 -100
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-verify.ts +0 -333
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-auth.ts +0 -164
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-oauth.ts +0 -208
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity.ts +0 -79
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/oauth-pending.ts +0 -65
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/pair-codes.ts +0 -58
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/project-api.ts +0 -214
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-api.ts +0 -130
- 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-config.ts +0 -147
- package/runtime/node_modules/@metro-labs/mcp/src/db/connector-relay.ts +0 -126
- package/runtime/node_modules/@metro-labs/mcp/src/db/connectors.ts +0 -308
- package/runtime/node_modules/@metro-labs/mcp/src/db/projects.ts +0 -300
- package/runtime/node_modules/@metro-labs/mcp/src/db/runtime-admin.ts +0 -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
package/dist/claude.js
CHANGED
|
@@ -1,15 +1,204 @@
|
|
|
1
|
-
import { spawnSync } from 'node:child_process';
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
import { markOnboardingDone, seedChannels } from './onboarding.js';
|
|
3
|
+
import { writeMcpConfig } from './mcp-config.js';
|
|
4
|
+
import { currentRoute, harnessRunner, permissionMode, routeModelEnv, systemPrompt } from './route.js';
|
|
5
|
+
import { settingsConflicts, settingsFiles } from './claude-settings.js';
|
|
6
|
+
import { localAgent } from './local.js';
|
|
7
|
+
import { PROVIDER_FLAGS } from './provider-flags.js';
|
|
8
|
+
import { localPort, localUrl } from './runtime.js';
|
|
9
|
+
import { keepInSession, resumeSessionId, takeBackConversation } from './background.js';
|
|
10
|
+
import { nativeRecoveryArgs } from './native-recovery.js';
|
|
2
11
|
const CHANNEL_FLAGS = ['--dangerously-load-development-channels', 'server:metro'];
|
|
3
|
-
|
|
12
|
+
const FRESH_PROMPT_FLAGS = ['--system-prompt-snapshot', 'off'];
|
|
13
|
+
export const PERMISSION_MODE_FLAG = { auto: 'auto', bypass: 'bypassPermissions' };
|
|
14
|
+
const KEY_HEADER = 'x-metro-key';
|
|
15
|
+
const PROBE_MS = 3_000;
|
|
16
|
+
const AUTH_STATUS_MS = 20_000;
|
|
17
|
+
const KILL_GRACE_MS = 30_000;
|
|
18
|
+
export const claudeArgs = (extra, mcpConfig, mode = 'auto', prompt = null) => [
|
|
4
19
|
...CHANNEL_FLAGS,
|
|
20
|
+
'--permission-mode',
|
|
21
|
+
PERMISSION_MODE_FLAG[mode],
|
|
22
|
+
...FRESH_PROMPT_FLAGS,
|
|
23
|
+
...(mcpConfig === undefined ? [] : ['--mcp-config', mcpConfig]),
|
|
24
|
+
...(prompt === null ? [] : ['--append-system-prompt', prompt]),
|
|
5
25
|
...extra,
|
|
6
26
|
];
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
27
|
+
const set = (env, name) => (env[name] ?? '').trim() !== '';
|
|
28
|
+
export function pinnedBy(env) {
|
|
29
|
+
if (set(env, 'ANTHROPIC_BASE_URL'))
|
|
30
|
+
return 'ANTHROPIC_BASE_URL';
|
|
31
|
+
return PROVIDER_FLAGS.find((flag) => set(env, flag)) ?? null;
|
|
32
|
+
}
|
|
33
|
+
export function gatewayEnv(base, agentKey, port) {
|
|
34
|
+
if (agentKey === null || pinnedBy(base) !== null)
|
|
35
|
+
return base;
|
|
36
|
+
const own = (base.ANTHROPIC_CUSTOM_HEADERS ?? '').trim();
|
|
37
|
+
const mine = `${KEY_HEADER}: ${agentKey}`;
|
|
38
|
+
return {
|
|
39
|
+
...base,
|
|
40
|
+
ANTHROPIC_BASE_URL: `http://127.0.0.1:${String(port)}/gateway`,
|
|
41
|
+
ANTHROPIC_CUSTOM_HEADERS: own === '' ? mine : `${own}\n${mine}`,
|
|
42
|
+
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY: '1',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export const channelEnv = (env) => set(env, 'MCP_PROTOCOL_NEGOTIATION') ? env : { ...env, MCP_PROTOCOL_NEGOTIATION: 'legacy' };
|
|
46
|
+
export const toolSearchEnv = (env) => set(env, 'ENABLE_TOOL_SEARCH') ? env : { ...env, ENABLE_TOOL_SEARCH: 'true' };
|
|
47
|
+
const RM_PROMPT_OFF = 'CLAUDE_CODE_DISABLE_INLINE_SHELL_RM_PROMPT';
|
|
48
|
+
export const rmPromptEnv = (env) => set(env, RM_PROMPT_OFF) ? env : { ...env, [RM_PROMPT_OFF]: '1' };
|
|
49
|
+
const OWN_CREDENTIALS = ['ANTHROPIC_API_KEY', 'ANTHROPIC_AUTH_TOKEN'];
|
|
50
|
+
export function credentialEnv(env, agentKey, signedIn) {
|
|
51
|
+
if (signedIn || OWN_CREDENTIALS.some((name) => set(env, name)))
|
|
52
|
+
return env;
|
|
53
|
+
return { ...env, ANTHROPIC_AUTH_TOKEN: agentKey };
|
|
54
|
+
}
|
|
55
|
+
function claudeSignedIn() {
|
|
56
|
+
const run = spawnSync('claude', ['auth', 'status', '--json'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: AUTH_STATUS_MS });
|
|
57
|
+
if (run.error !== undefined || typeof run.stdout !== 'string')
|
|
58
|
+
return false;
|
|
59
|
+
try {
|
|
60
|
+
const parsed = JSON.parse(run.stdout);
|
|
61
|
+
return parsed.authenticated === true || parsed.loggedIn === true || typeof parsed.email === 'string' || typeof parsed.organization === 'string';
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export function servingDaemon(body) {
|
|
68
|
+
if (typeof body !== 'object' || body === null)
|
|
69
|
+
return false;
|
|
70
|
+
const mode = body;
|
|
71
|
+
return mode.mode === 'local' && mode.stopped !== true;
|
|
72
|
+
}
|
|
73
|
+
async function daemonServing(base = localUrl()) {
|
|
74
|
+
try {
|
|
75
|
+
const res = await fetch(`${base}/api/mode`, { signal: AbortSignal.timeout(PROBE_MS) });
|
|
76
|
+
return res.ok && servingDaemon(await res.json());
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function agentKey(agent) {
|
|
83
|
+
return agent === null ? { skip: 'no agent lives on this machine yet, so Claude Code talks to Anthropic directly' } : { key: agent.key };
|
|
84
|
+
}
|
|
85
|
+
async function verdict() {
|
|
86
|
+
const pinned = pinnedBy(process.env);
|
|
87
|
+
if (pinned !== null)
|
|
88
|
+
return { skip: `${pinned} is set, so Claude Code keeps talking to it` };
|
|
89
|
+
const conflicts = settingsConflicts(settingsFiles());
|
|
90
|
+
if (conflicts.length > 0)
|
|
91
|
+
return { skip: `a settings file pins the provider (${conflicts.join(', ')}), so Claude Code keeps it` };
|
|
92
|
+
const picked = agentKey(localAgent());
|
|
93
|
+
if ('skip' in picked)
|
|
94
|
+
return picked;
|
|
95
|
+
if (await daemonServing())
|
|
96
|
+
return picked;
|
|
97
|
+
return { skip: 'the daemon is not serving here (stopped, or not running), so Claude Code talks to Anthropic directly' };
|
|
98
|
+
}
|
|
99
|
+
function deadline(child, timeoutMs) {
|
|
100
|
+
if (timeoutMs === undefined)
|
|
101
|
+
return () => undefined;
|
|
102
|
+
let kill;
|
|
103
|
+
const term = setTimeout(() => {
|
|
104
|
+
child.kill('SIGTERM');
|
|
105
|
+
kill = setTimeout(() => {
|
|
106
|
+
child.kill('SIGKILL');
|
|
107
|
+
}, KILL_GRACE_MS);
|
|
108
|
+
}, timeoutMs);
|
|
109
|
+
return () => {
|
|
110
|
+
clearTimeout(term);
|
|
111
|
+
clearTimeout(kill);
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function runClaude(args, env, headless, command = 'claude') {
|
|
115
|
+
return new Promise((resolve, reject) => {
|
|
116
|
+
const leaveToChild = () => undefined;
|
|
117
|
+
process.on('SIGINT', leaveToChild);
|
|
118
|
+
process.on('SIGTERM', leaveToChild);
|
|
119
|
+
const child = spawn(command, args, { stdio: [headless === undefined ? 'inherit' : 'ignore', 'inherit', 'inherit'], env });
|
|
120
|
+
const stop = deadline(child, headless?.timeoutMs);
|
|
121
|
+
child.on('error', (err) => {
|
|
122
|
+
reject(new Error(err.code === 'ENOENT'
|
|
123
|
+
? `the \`${command}\` command is not on PATH${command === 'claude' ? ' — install Claude Code first' : ''}`
|
|
124
|
+
: err.message));
|
|
125
|
+
});
|
|
126
|
+
child.on('exit', (code) => {
|
|
127
|
+
stop();
|
|
128
|
+
resolve(code ?? 1);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async function servedKey(decision) {
|
|
133
|
+
if ('key' in decision)
|
|
134
|
+
return decision.key;
|
|
135
|
+
const picked = agentKey(localAgent());
|
|
136
|
+
if ('skip' in picked)
|
|
137
|
+
return null;
|
|
138
|
+
return (await daemonServing()) ? picked.key : null;
|
|
139
|
+
}
|
|
140
|
+
function mcpConfigFor(key, port) {
|
|
141
|
+
if (key === null)
|
|
142
|
+
return null;
|
|
143
|
+
const file = writeMcpConfig(key, port);
|
|
144
|
+
process.stderr.write(`metro claude: the metro MCP server is loaded for this session from the daemon at http://127.0.0.1:${String(port)}/mcp, nothing to add by hand\n`);
|
|
145
|
+
return file;
|
|
146
|
+
}
|
|
147
|
+
function gatewayLaunchEnv(key, port) {
|
|
148
|
+
process.stderr.write(`metro claude: inference goes through the daemon at http://127.0.0.1:${String(port)}/gateway (the Model page decides where)\n`);
|
|
149
|
+
const pointed = routeModelEnv(gatewayEnv(process.env, key, port), currentRoute());
|
|
150
|
+
const routed = toolSearchEnv(pointed);
|
|
151
|
+
if (routed !== pointed)
|
|
152
|
+
process.stderr.write('metro claude: MCP tool search is on, so connector tools load when Claude needs them instead of all at start\n');
|
|
153
|
+
const env = credentialEnv(routed, key, claudeSignedIn());
|
|
154
|
+
if (env !== routed)
|
|
155
|
+
process.stderr.write("metro claude: Claude Code has no login of its own here, so metro's key stands in as its credential; the Model page must route to Bedrock, OpenRouter or Codex\n");
|
|
156
|
+
if (seedChannels() === 'marked')
|
|
157
|
+
process.stderr.write('metro claude: marked Channels as available in Claude Code cached flags, since a box that sends no telemetry never fetches them\n');
|
|
158
|
+
if (markOnboardingDone() === 'marked')
|
|
159
|
+
process.stderr.write("metro claude: skipped Claude Code's first-run setup, since it already has a credential here\n");
|
|
160
|
+
return env;
|
|
161
|
+
}
|
|
162
|
+
function inferenceEnv(decision, port) {
|
|
163
|
+
if ('key' in decision)
|
|
164
|
+
return gatewayLaunchEnv(decision.key, port);
|
|
165
|
+
process.stderr.write(`metro claude: ${decision.skip}\n`);
|
|
166
|
+
return process.env;
|
|
167
|
+
}
|
|
168
|
+
export async function headlessEnv() {
|
|
169
|
+
return keepInSession(rmPromptEnv(inferenceEnv(await verdict(), localPort())));
|
|
170
|
+
}
|
|
171
|
+
const continues = (args) => args.includes('-c') || args.includes('--continue');
|
|
172
|
+
async function reclaimConversation(extra) {
|
|
173
|
+
const sessionId = resumeSessionId(extra);
|
|
174
|
+
if (sessionId === undefined && !continues(extra))
|
|
175
|
+
return;
|
|
176
|
+
try {
|
|
177
|
+
const note = await takeBackConversation({ sessionId });
|
|
178
|
+
if (note !== null)
|
|
179
|
+
process.stderr.write(`metro claude: ${note}\n`);
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
183
|
+
process.stderr.write(`metro claude: could not check for a Claude Code background session holding the conversation (${message})\n`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const SDK_HOLDS_CHAT = 'the Harness runs this agent as an Agent SDK session (metro agent), which holds the metro chat; a metro claude session would take it away. Switch the Harness runner back to the Claude Code session first, or open the conversation with plain claude --resume <session id>';
|
|
187
|
+
export async function launchClaude(extra) {
|
|
188
|
+
if (harnessRunner() === 'sdk')
|
|
189
|
+
throw new Error(SDK_HOLDS_CHAT);
|
|
190
|
+
await reclaimConversation(extra);
|
|
191
|
+
const decision = await verdict();
|
|
192
|
+
const port = localPort();
|
|
193
|
+
const mcp = mcpConfigFor(await servedKey(decision), port);
|
|
194
|
+
const mode = permissionMode();
|
|
195
|
+
const prompt = systemPrompt();
|
|
196
|
+
if (prompt !== null)
|
|
197
|
+
process.stderr.write('metro claude: the system prompt from the Harness page is appended to this session\n');
|
|
198
|
+
try {
|
|
199
|
+
return await runClaude(claudeArgs(nativeRecoveryArgs(extra), mcp?.path, mode, prompt), keepInSession(rmPromptEnv(channelEnv(inferenceEnv(decision, port)))));
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
mcp?.cleanup();
|
|
203
|
+
}
|
|
15
204
|
}
|
package/dist/cli.js
CHANGED
|
@@ -1,155 +1,102 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { askSecret } from './prompt.js';
|
|
5
|
-
import { clearToken, credentialsPath, metroUrl, metroWebUrl, writeToken, } from './store.js';
|
|
6
|
-
import { detach, lockedBy, probe, runningPid, stopAll, tail } from './control.js';
|
|
2
|
+
import { whoisAuthorized } from './api.js';
|
|
3
|
+
import { stopAll } from './control.js';
|
|
7
4
|
import { tailEvents } from './tail.js';
|
|
8
|
-
import {
|
|
5
|
+
import { agentSession } from './agent.js';
|
|
6
|
+
import { automationCommand } from './automation.js';
|
|
9
7
|
import { launchClaude } from './claude.js';
|
|
10
|
-
import {
|
|
11
|
-
import { installPlugin, syncPluginServers } from './plugin.js';
|
|
8
|
+
import { memoryPaths, memoryRoutine } from './memory.js';
|
|
12
9
|
import { update } from './update.js';
|
|
10
|
+
import { serve } from './serve.js';
|
|
11
|
+
import { service, serviceStopHint } from './service.js';
|
|
13
12
|
import { currentVersion } from './version.js';
|
|
14
|
-
|
|
13
|
+
import { voiceSession } from './voice.js';
|
|
14
|
+
const USAGE = `metro: run your agent on this machine
|
|
15
15
|
|
|
16
|
-
metro
|
|
17
|
-
run
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
metro
|
|
16
|
+
metro serve [--port <n>] [--owner <organization id>]
|
|
17
|
+
run the daemon: the agent, its channels and its connectors live in
|
|
18
|
+
~/.metro/agents here, and it is published through Tailscale Funnel at a
|
|
19
|
+
permanent https://<machine>.<tailnet>.ts.net (Tailscale installed and
|
|
20
|
+
signed in on this machine); the page at metro.box manages it through the
|
|
21
|
+
link it prints; --owner names the organization whose members may sign
|
|
22
|
+
in, needed on the first start only; Stop on the page parks the daemon and keeps the
|
|
23
|
+
address, so Start works from the page too
|
|
24
|
+
metro service install [--port <n>] [--owner <organization id>] [--user metro]
|
|
25
|
+
run metro serve as a service (systemd on Linux, launchd on macOS): it
|
|
26
|
+
starts at boot and after a crash, so the page can stop, start and
|
|
27
|
+
restart it with no shell; on Linux, root passes --user metro so Metro
|
|
28
|
+
runs as its own user and Claude Code as the user agent;
|
|
29
|
+
metro service uninstall and status as well
|
|
30
|
+
metro stop stop metro on this machine, metro serve included
|
|
31
|
+
metro tail [agent-id]
|
|
25
32
|
follow this machine's inbound events, one JSON line each
|
|
26
|
-
metro
|
|
27
|
-
metro logout forget this machine's sign-in
|
|
28
|
-
metro whoami print the account and collection this machine may read
|
|
29
|
-
metro mcp print the mcpServers block for the authorized collection
|
|
30
|
-
metro plugin set up the Claude Code plugin (connector servers + /metro:login)
|
|
33
|
+
metro whoami print the agent this machine runs
|
|
31
34
|
metro claude [args...]
|
|
32
|
-
open Claude Code with the metro channel
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
open Claude Code with the metro channel and the metro MCP server, its
|
|
36
|
+
inference routed through the daemon's model gateway (the Model page);
|
|
37
|
+
every argument is passed through the same
|
|
38
|
+
metro agent run chat, calls and background workers in one Agent SDK conversation,
|
|
39
|
+
when the Harness runner is Agent SDK, using the Model page's model;
|
|
40
|
+
resume it after a restart; call audio runs independently
|
|
41
|
+
metro agent --prepare [cli|sdk]
|
|
42
|
+
check the runner before selecting it; install the SDK runtime if needed,
|
|
43
|
+
without starting a session or connecting to chat
|
|
44
|
+
metro task submit <routine> <prompt-file> [--slot <UTC ISO timestamp>] [--dry-run]
|
|
45
|
+
metro task status [routine]
|
|
46
|
+
metro task finish <uuid> <token> completed|blocked
|
|
47
|
+
queue work without starting a session, or read safe local task metadata;
|
|
48
|
+
default slot is the current UTC hour; use --slot for other cadences;
|
|
49
|
+
accepted is saved, not executed; finish awaits runner verification;
|
|
50
|
+
--dry-run writes nothing; local authorization is not fresh owner approval
|
|
51
|
+
metro memory [skill file]
|
|
52
|
+
run the memory routine once: when Claude Code transcripts changed since
|
|
53
|
+
the last run, Claude Code reads the memory skill (or the file given) and
|
|
54
|
+
files them into its memory, with no metro tools and writes only inside
|
|
55
|
+
the memory folder
|
|
56
|
+
metro voice --model <model>
|
|
57
|
+
the agent's side of a voice call, which the daemon starts when a call
|
|
58
|
+
comes in: Claude Code reads the call's words as stream-json on stdin and
|
|
59
|
+
streams its replies on stdout, with the agent's memory, skills, plugin,
|
|
60
|
+
connectors and metro tools (on /mcp/voice, so the chat session keeps its
|
|
61
|
+
slot) but no metro channel; tool approvals come back on stdout
|
|
62
|
+
metro update update to the newest published version (--check only reports)
|
|
37
63
|
metro version print this CLI's version
|
|
38
64
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
METRO_URL the metro to talk to (default https://mcp.metro.box)
|
|
44
|
-
METRO_UI_URL where the web UI lives (default https://metro.box)
|
|
45
|
-
METRO_TOKEN use this connector sign-in instead of the stored one
|
|
46
|
-
METRO_RUN_TOKEN use this runtime authorization instead of the stored one
|
|
47
|
-
METRO_BEDROCK_MODEL
|
|
48
|
-
send every request to this Bedrock model id (default: derive from the
|
|
49
|
-
model Claude Code asks for, e.g. eu.anthropic.claude-sonnet-4-6)
|
|
65
|
+
METRO_WEBHOOK_PORT the daemon's port (default 8420)
|
|
66
|
+
METRO_AGENTS_DIR where the agents live (default ~/.metro/agents)
|
|
67
|
+
METRO_AGENT_KEY the key metro tail presents, instead of the agent file's
|
|
50
68
|
METRO_RUNTIME_DIR run the daemon from this directory instead of the bundled one
|
|
51
69
|
`;
|
|
52
|
-
function
|
|
53
|
-
const
|
|
54
|
-
return name === '' ? 'unnamed machine' : name;
|
|
55
|
-
}
|
|
56
|
-
async function authorizeRuntime(agentId) {
|
|
57
|
-
process.stderr.write(`Authorize this machine at ${metroWebUrl()}/#/authorize/${agentId}\n`);
|
|
58
|
-
const code = (await askSecret('Paste the code (input is hidden): ')).trim();
|
|
59
|
-
if (code === '')
|
|
60
|
-
throw new Error('no code given');
|
|
61
|
-
const claimed = await claimRuntime(code, hostLabel());
|
|
62
|
-
writeRunToken(claimed.agent, claimed.token);
|
|
63
|
-
process.stderr.write(`Authorized as '${claimed.label}'.\n`);
|
|
64
|
-
return claimed.token;
|
|
65
|
-
}
|
|
66
|
-
async function start(argv) {
|
|
67
|
-
const agentId = assertAgentId(argv[0]);
|
|
68
|
-
if (runningPid(agentId) !== null || lockedBy() !== null)
|
|
69
|
-
throw new Error('a metro daemon is already running on this machine. ' +
|
|
70
|
-
'Stop it first: metro stop');
|
|
71
|
-
const dir = runtimeDir();
|
|
72
|
-
const token = readRunToken(agentId) ?? (await authorizeRuntime(agentId));
|
|
73
|
-
const detached = argv.includes('--detach');
|
|
74
|
-
const plan = daemonPlan({ agentId, token, dir });
|
|
75
|
-
if (!detached)
|
|
76
|
-
return runDaemon(agentId, plan);
|
|
77
|
-
const pid = detach({ agentId, ...plan });
|
|
78
|
-
process.stderr.write(`metro is running for ${agentId} (pid ${String(pid)})\n` +
|
|
79
|
-
` logs: metro logs ${agentId} -f\n` +
|
|
80
|
-
` stop: metro stop ${agentId}\n`);
|
|
81
|
-
return 0;
|
|
82
|
-
}
|
|
83
|
-
async function stopDaemon(argv) {
|
|
84
|
-
const agentId = argv[0] === undefined ? undefined : assertAgentId(argv[0]);
|
|
85
|
-
const stopped = await stopAll(agentId);
|
|
70
|
+
async function stopDaemon() {
|
|
71
|
+
const stopped = await stopAll();
|
|
86
72
|
if (stopped.length === 0) {
|
|
87
73
|
process.stderr.write('no metro daemon is running on this machine\n');
|
|
88
74
|
return 1;
|
|
89
75
|
}
|
|
90
76
|
for (const d of stopped)
|
|
91
77
|
process.stderr.write(`Stopped metro (pid ${String(d.pid)}, via ${d.via})\n`);
|
|
78
|
+
const hint = serviceStopHint();
|
|
79
|
+
if (hint !== null)
|
|
80
|
+
process.stderr.write(`${hint}\n`);
|
|
92
81
|
return 0;
|
|
93
82
|
}
|
|
94
|
-
async function status(argv) {
|
|
95
|
-
const agentId = assertAgentId(argv[0]);
|
|
96
|
-
const pid = runningPid(agentId);
|
|
97
|
-
if (pid === null) {
|
|
98
|
-
process.stdout.write(`${agentId}: not running\n`);
|
|
99
|
-
return 1;
|
|
100
|
-
}
|
|
101
|
-
const health = await probe(localUrl());
|
|
102
|
-
process.stdout.write(`${agentId}: running (pid ${String(pid)}) · ` +
|
|
103
|
-
(health === null
|
|
104
|
-
? `not answering on ${localUrl()}\n`
|
|
105
|
-
: `healthy, up ${String(health.uptime)}s\n`));
|
|
106
|
-
return health === null ? 1 : 0;
|
|
107
|
-
}
|
|
108
|
-
function logs(argv) {
|
|
109
|
-
const agentId = assertAgentId(argv[0]);
|
|
110
|
-
return tail(agentId, argv.includes('-f') || argv.includes('--follow'));
|
|
111
|
-
}
|
|
112
|
-
async function login() {
|
|
113
|
-
process.stderr.write(`Choose a connector collection at ${metroWebUrl()}/#/authorize\n`);
|
|
114
|
-
const { token, email, collection } = await claimCode(await askSecret('Paste the code here (input is hidden): '));
|
|
115
|
-
writeToken(token);
|
|
116
|
-
process.stderr.write(`Authorized '${collection}' for ${email}. Stored in ${credentialsPath()}\n`);
|
|
117
|
-
if (syncPluginServers())
|
|
118
|
-
process.stderr.write('Claude Code plugin refreshed — new sessions have the connectors; ' +
|
|
119
|
-
'run /reload-plugins in any session already open.\n');
|
|
120
|
-
}
|
|
121
|
-
async function whoami() {
|
|
122
|
-
const { email, collection } = await whoisAuthorized();
|
|
123
|
-
process.stdout.write(`${email} · collection '${collection}' on ${metroUrl()}\n`);
|
|
124
|
-
}
|
|
125
83
|
const HELP = new Set([undefined, 'help', '--help', '-h']);
|
|
126
84
|
const COMMANDS = {
|
|
127
|
-
login: async () => {
|
|
128
|
-
await login();
|
|
129
|
-
return 0;
|
|
130
|
-
},
|
|
131
|
-
logout: async () => {
|
|
132
|
-
clearToken();
|
|
133
|
-
process.stderr.write('Signed out.\n');
|
|
134
|
-
return Promise.resolve(0);
|
|
135
|
-
},
|
|
136
85
|
whoami: async () => {
|
|
137
|
-
await
|
|
86
|
+
const { agent, where } = await whoisAuthorized();
|
|
87
|
+
process.stdout.write(`agent ${agent} on ${where}\n`);
|
|
138
88
|
return 0;
|
|
139
89
|
},
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
logs: () => logs(process.argv.slice(3)),
|
|
90
|
+
serve: () => serve(process.argv.slice(3)),
|
|
91
|
+
service: () => service(process.argv.slice(3)),
|
|
92
|
+
stop: stopDaemon,
|
|
144
93
|
tail: () => tailEvents(process.argv.slice(3)),
|
|
145
|
-
mcp: async () => {
|
|
146
|
-
process.stdout.write(`${await mcpServers()}\n`);
|
|
147
|
-
return 0;
|
|
148
|
-
},
|
|
149
|
-
plugin: installPlugin,
|
|
150
94
|
claude: () => launchClaude(process.argv.slice(3)),
|
|
151
|
-
|
|
152
|
-
|
|
95
|
+
agent: () => agentSession(process.argv.slice(3)),
|
|
96
|
+
task: () => automationCommand(process.argv.slice(3)),
|
|
97
|
+
memory: () => memoryRoutine(memoryPaths(process.env, process.argv[3])),
|
|
98
|
+
voice: () => voiceSession(process.argv.slice(3)),
|
|
99
|
+
update: () => update(process.argv.slice(3)),
|
|
153
100
|
version: async () => {
|
|
154
101
|
process.stdout.write(`${currentVersion()}\n`);
|
|
155
102
|
return Promise.resolve(0);
|
|
@@ -165,6 +112,6 @@ async function run(command) {
|
|
|
165
112
|
const code = await run(process.argv[2]).catch((err) => {
|
|
166
113
|
const message = err instanceof Error ? err.message : String(err);
|
|
167
114
|
process.stderr.write(`metro: ${message}\n`);
|
|
168
|
-
return
|
|
115
|
+
return 1;
|
|
169
116
|
});
|
|
170
117
|
process.exit(code);
|
package/dist/control.js
CHANGED
|
@@ -1,23 +1,13 @@
|
|
|
1
|
-
import { execFileSync
|
|
2
|
-
import {
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { readFileSync, rmSync } from 'node:fs';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
mkdirSync(STATE(), { recursive: true, mode: 0o700 });
|
|
10
|
-
mkdirSync(join(STATE(), 'logs'), { recursive: true, mode: 0o700 });
|
|
11
|
-
}
|
|
12
|
-
function readPid(agentId) {
|
|
13
|
-
try {
|
|
14
|
-
const pid = Number(readFileSync(pidPath(agentId), 'utf8').trim());
|
|
15
|
-
return Number.isInteger(pid) && pid > 0 ? pid : null;
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
5
|
+
export function serveStateDir() {
|
|
6
|
+
const xdg = process.env.XDG_CACHE_HOME?.trim();
|
|
7
|
+
const base = xdg === undefined || xdg === '' ? join(homedir(), '.cache') : xdg;
|
|
8
|
+
return join(base, 'metro', 'serve');
|
|
20
9
|
}
|
|
10
|
+
const serveLockPath = () => join(serveStateDir(), '.tail-lock');
|
|
21
11
|
function isAlive(pid) {
|
|
22
12
|
try {
|
|
23
13
|
process.kill(pid, 0);
|
|
@@ -27,37 +17,6 @@ function isAlive(pid) {
|
|
|
27
17
|
return false;
|
|
28
18
|
}
|
|
29
19
|
}
|
|
30
|
-
export function runningPid(agentId) {
|
|
31
|
-
const pid = readPid(agentId);
|
|
32
|
-
if (pid === null)
|
|
33
|
-
return null;
|
|
34
|
-
if (isAlive(pid))
|
|
35
|
-
return pid;
|
|
36
|
-
rmSync(pidPath(agentId), { force: true });
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
function writePid(agentId, pid) {
|
|
40
|
-
writeFileSync(pidPath(agentId), String(pid));
|
|
41
|
-
}
|
|
42
|
-
function clearPid(agentId) {
|
|
43
|
-
rmSync(pidPath(agentId), { force: true });
|
|
44
|
-
}
|
|
45
|
-
export function detach(opts) {
|
|
46
|
-
ensureStateDirs();
|
|
47
|
-
const out = openSync(logPath(opts.agentId), 'a');
|
|
48
|
-
const child = spawn(opts.command, opts.args, {
|
|
49
|
-
cwd: opts.cwd,
|
|
50
|
-
env: opts.env,
|
|
51
|
-
detached: true,
|
|
52
|
-
stdio: ['ignore', out, out],
|
|
53
|
-
});
|
|
54
|
-
child.unref();
|
|
55
|
-
const pid = child.pid ?? 0;
|
|
56
|
-
if (pid === 0)
|
|
57
|
-
throw new Error('could not start the metro daemon');
|
|
58
|
-
writePid(opts.agentId, pid);
|
|
59
|
-
return pid;
|
|
60
|
-
}
|
|
61
20
|
async function stopPid(pid, waitMs) {
|
|
62
21
|
process.kill(pid, 'SIGTERM');
|
|
63
22
|
const until = Date.now() + waitMs;
|
|
@@ -83,10 +42,10 @@ function commandOf(pid) {
|
|
|
83
42
|
}
|
|
84
43
|
}
|
|
85
44
|
const looksLikeMetro = (command) => command.includes('server.ts') || command.includes('metro');
|
|
86
|
-
|
|
45
|
+
function holderOf(lockFile) {
|
|
87
46
|
let pid;
|
|
88
47
|
try {
|
|
89
|
-
pid = Number(readFileSync(
|
|
48
|
+
pid = Number(readFileSync(lockFile, 'utf8').trim());
|
|
90
49
|
}
|
|
91
50
|
catch {
|
|
92
51
|
return null;
|
|
@@ -95,64 +54,21 @@ export function lockedBy() {
|
|
|
95
54
|
return null;
|
|
96
55
|
return looksLikeMetro(commandOf(pid)) ? pid : null;
|
|
97
56
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
tracked.add(agentId);
|
|
102
|
-
try {
|
|
103
|
-
for (const name of readdirSync(STATE())) {
|
|
104
|
-
const found = /^run-(.+)\.pid$/.exec(name);
|
|
105
|
-
if (found?.[1] !== undefined)
|
|
106
|
-
tracked.add(found[1]);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
return tracked;
|
|
111
|
-
}
|
|
112
|
-
return tracked;
|
|
113
|
-
}
|
|
114
|
-
export async function stopAll(agentId, waitMs = 10_000) {
|
|
57
|
+
export const lockedBy = () => holderOf(lockPath());
|
|
58
|
+
export const serveLockedBy = () => holderOf(serveLockPath());
|
|
59
|
+
export async function stopAll(waitMs = 10_000) {
|
|
115
60
|
const stopped = [];
|
|
116
|
-
const seen = new Set();
|
|
117
|
-
for (const id of trackedAgents(agentId)) {
|
|
118
|
-
const pid = runningPid(id);
|
|
119
|
-
if (pid === null || seen.has(pid))
|
|
120
|
-
continue;
|
|
121
|
-
seen.add(pid);
|
|
122
|
-
await stopPid(pid, waitMs);
|
|
123
|
-
clearPid(id);
|
|
124
|
-
stopped.push({ pid, via: id });
|
|
125
|
-
}
|
|
126
61
|
const holder = lockedBy();
|
|
127
|
-
if (holder !== null
|
|
62
|
+
if (holder !== null) {
|
|
128
63
|
await stopPid(holder, waitMs);
|
|
129
64
|
rmSync(lockPath(), { force: true });
|
|
130
65
|
stopped.push({ pid: holder, via: 'the machine lock' });
|
|
131
66
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
throw new Error(`no log for ${agentId} yet — it is only written when started with --detach`);
|
|
138
|
-
const args = follow ? ['-n', '200', '-f', path] : ['-n', '200', path];
|
|
139
|
-
const child = spawn('tail', args, { stdio: ['ignore', 'inherit', 'inherit'] });
|
|
140
|
-
return new Promise((resolve) => {
|
|
141
|
-
child.on('exit', (code) => {
|
|
142
|
-
resolve(code ?? 0);
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
export async function probe(url) {
|
|
147
|
-
try {
|
|
148
|
-
const res = await fetch(`${url}/health`, {
|
|
149
|
-
signal: AbortSignal.timeout(3_000),
|
|
150
|
-
});
|
|
151
|
-
if (!res.ok)
|
|
152
|
-
return null;
|
|
153
|
-
return (await res.json());
|
|
154
|
-
}
|
|
155
|
-
catch {
|
|
156
|
-
return null;
|
|
67
|
+
const served = serveLockedBy();
|
|
68
|
+
if (served !== null && served !== holder) {
|
|
69
|
+
await stopPid(served, waitMs);
|
|
70
|
+
rmSync(serveLockPath(), { force: true });
|
|
71
|
+
stopped.push({ pid: served, via: 'metro serve' });
|
|
157
72
|
}
|
|
73
|
+
return stopped;
|
|
158
74
|
}
|