@stage-labs/metro 0.1.0-beta.24 → 0.1.0-beta.241
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/api.js +9 -129
- package/dist/background.js +123 -0
- package/dist/claude-settings.js +40 -0
- package/dist/claude.js +197 -0
- package/dist/cli.js +59 -111
- 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/route.js +58 -0
- package/dist/runtime-install.js +96 -0
- package/dist/runtime.js +29 -52
- package/dist/serve.js +157 -0
- package/dist/service.js +304 -0
- package/dist/tail.js +10 -11
- package/dist/update.js +13 -1
- package/dist/voice.js +56 -0
- package/package.json +2 -23
- 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 +75 -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 +51 -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 +5 -0
- 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/{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 +134 -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/provision.ts +80 -0
- package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedule-detail.ts +99 -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 +87 -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 +231 -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 +6 -34
- 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 +380 -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 +208 -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/session-files.ts +75 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/session.ts +299 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/settings.ts +109 -0
- package/runtime/node_modules/@metro-labs/daemon/src/claude/setup.ts +351 -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 +127 -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 -113
- 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} +61 -22
- 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/daemon/src/connectors/relay.ts +347 -0
- 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 +12 -13
- 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/codex-auth.ts +214 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-device.ts +91 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-stream.ts +173 -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 +155 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/effort.ts +93 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/eventstream.ts +123 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/forward.ts +237 -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 +307 -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 +235 -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 +203 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-config.ts +285 -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 +161 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-store.ts +72 -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 +118 -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 +102 -0
- package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage.ts +348 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/accounts.ts +28 -17
- 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 +81 -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 +37 -79
- 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 +46 -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 +97 -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 +126 -0
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/install.ts +37 -0
- package/runtime/node_modules/@metro-labs/daemon/src/metro-user/privilege.ts +48 -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 +35 -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 +65 -52
- package/runtime/node_modules/@metro-labs/daemon/src/routes/local-mode.ts +209 -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 +38 -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 +43 -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 +2 -4
- 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 +135 -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 +21 -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 +1 -3
- 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 +2 -2
- 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 +1 -1
- 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 +1 -1
- package/runtime/node_modules/@metro-labs/webhook/src/station.ts +5 -8
- package/runtime/node_modules/@metro-labs/whatsapp/package.json +2 -5
- 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 +3 -2
- 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 +35 -220
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +40 -53
- package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +95 -222
- 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 +95 -3
- package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +11 -7
- 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 +13 -20
- package/runtime/node_modules/@metro-labs/xmtp/src/labels.ts +57 -33
- 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/profile.ts +153 -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 +72 -0
- package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +8 -2
- package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +22 -58
- package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +55 -48
- 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/wire.ts +14 -4
- package/runtime/runtime.json +1 -1
- package/runtime/server.ts +1 -0
- package/runtime/stations.json +40 -0
- 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 -320
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair-api.ts +0 -111
- 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 -31
- 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 -41
- 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/connectors.ts +0 -329
- 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,329 +0,0 @@
|
|
|
1
|
-
import { assertRenameFreeOfClash } from './connector-collections.js';
|
|
2
|
-
import { projectIdOrThrow } from './projects.js';
|
|
3
|
-
import { and, asc, eq, inArray } from 'drizzle-orm';
|
|
4
|
-
import {
|
|
5
|
-
connectorUrlText,
|
|
6
|
-
ConnectorVerifyError,
|
|
7
|
-
parseConnectorUrl,
|
|
8
|
-
verifyRemoteMcp,
|
|
9
|
-
type ConnectorAuth,
|
|
10
|
-
type OAuthAuth,
|
|
11
|
-
type VerifiedRecord,
|
|
12
|
-
} from '../daemon/connector-verify.js';
|
|
13
|
-
import { oauthExpired, refreshOAuth } from '../daemon/connector-oauth.js';
|
|
14
|
-
import { advertisesOAuth } from '../daemon/oauth-discovery.js';
|
|
15
|
-
import {
|
|
16
|
-
ConnectorError,
|
|
17
|
-
connectorAuth,
|
|
18
|
-
connectorName,
|
|
19
|
-
readConfig,
|
|
20
|
-
signInState,
|
|
21
|
-
stamp,
|
|
22
|
-
type ConnectorConfig,
|
|
23
|
-
type ConnectorSignIn,
|
|
24
|
-
} from './connector-config.js';
|
|
25
|
-
import { errMsg, log } from '../daemon/log.js';
|
|
26
|
-
import { newId } from './ids.js';
|
|
27
|
-
import { getDb } from './client.js';
|
|
28
|
-
import { connectors, type ConnectorTransport } from './schema.js';
|
|
29
|
-
|
|
30
|
-
export interface Connector {
|
|
31
|
-
id: string;
|
|
32
|
-
name: string;
|
|
33
|
-
url: string;
|
|
34
|
-
transport: ConnectorTransport;
|
|
35
|
-
auth: ConnectorAuth['kind'];
|
|
36
|
-
header: string | null;
|
|
37
|
-
secret: string | null;
|
|
38
|
-
bearer: string | null;
|
|
39
|
-
expiresAt: number | null;
|
|
40
|
-
signIn: ConnectorSignIn;
|
|
41
|
-
verified: VerifiedRecord;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export interface ConnectorInput {
|
|
45
|
-
name: unknown;
|
|
46
|
-
url: unknown;
|
|
47
|
-
header: unknown;
|
|
48
|
-
value: unknown;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export type ConnectorCheck =
|
|
52
|
-
| { id: string; name: string; ok: true; verified: VerifiedRecord }
|
|
53
|
-
| { id: string; name: string; ok: false; reason: string };
|
|
54
|
-
|
|
55
|
-
export interface DeletedConnector {
|
|
56
|
-
id: string;
|
|
57
|
-
name: string;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
type ConnectorRow = typeof connectors.$inferSelect;
|
|
61
|
-
|
|
62
|
-
function toConnector(row: ConnectorRow): Connector {
|
|
63
|
-
const config = readConfig(row.config);
|
|
64
|
-
const auth = config.auth;
|
|
65
|
-
return {
|
|
66
|
-
id: row.id,
|
|
67
|
-
name: row.name,
|
|
68
|
-
url: row.url,
|
|
69
|
-
transport: row.transport,
|
|
70
|
-
auth: auth.kind,
|
|
71
|
-
header: auth.kind === 'header' ? auth.name : null,
|
|
72
|
-
secret: auth.kind === 'header' ? auth.value : null,
|
|
73
|
-
bearer: auth.kind === 'oauth' ? auth.accessToken : null,
|
|
74
|
-
expiresAt: auth.kind === 'oauth' ? (auth.expiresAt ?? null) : null,
|
|
75
|
-
signIn: signInState(config),
|
|
76
|
-
verified: config.verified,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const missing = (): ConnectorError =>
|
|
81
|
-
new ConnectorError('no such connector', 404);
|
|
82
|
-
|
|
83
|
-
async function ownedConnectorOrThrow(
|
|
84
|
-
email: string,
|
|
85
|
-
id: string,
|
|
86
|
-
): Promise<ConnectorRow> {
|
|
87
|
-
const rows = await getDb()
|
|
88
|
-
.select()
|
|
89
|
-
.from(connectors)
|
|
90
|
-
.where(eq(connectors.id, id));
|
|
91
|
-
const row = rows[0];
|
|
92
|
-
if (row === undefined) throw missing();
|
|
93
|
-
try {
|
|
94
|
-
await projectIdOrThrow(email, row.projectId);
|
|
95
|
-
} catch {
|
|
96
|
-
throw missing();
|
|
97
|
-
}
|
|
98
|
-
return row;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
async function saveConfig(
|
|
102
|
-
row: ConnectorRow,
|
|
103
|
-
config: ConnectorConfig,
|
|
104
|
-
): Promise<Connector> {
|
|
105
|
-
const rows = await getDb()
|
|
106
|
-
.update(connectors)
|
|
107
|
-
.set({ config })
|
|
108
|
-
.where(and(eq(connectors.id, row.id), eq(connectors.projectId, row.projectId)))
|
|
109
|
-
.returning();
|
|
110
|
-
const saved = rows[0];
|
|
111
|
-
if (saved === undefined) throw missing();
|
|
112
|
-
return toConnector(saved);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
async function connectorRowsFor(
|
|
116
|
-
email: string,
|
|
117
|
-
project: string,
|
|
118
|
-
): Promise<ConnectorRow[]> {
|
|
119
|
-
const projectId = await projectIdOrThrow(email, project);
|
|
120
|
-
return getDb()
|
|
121
|
-
.select()
|
|
122
|
-
.from(connectors)
|
|
123
|
-
.where(eq(connectors.projectId, projectId))
|
|
124
|
-
.orderBy(asc(connectors.id));
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export async function listConnectorsForEmail(
|
|
128
|
-
email: string,
|
|
129
|
-
project: string,
|
|
130
|
-
): Promise<Connector[]> {
|
|
131
|
-
return (await connectorRowsFor(email, project)).map(toConnector);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
async function withFreshToken(row: ConnectorRow): Promise<Connector> {
|
|
135
|
-
const config = readConfig(row.config);
|
|
136
|
-
if (config.auth.kind !== 'oauth' || !oauthExpired(config.auth))
|
|
137
|
-
return toConnector(row);
|
|
138
|
-
const url = parseConnectorUrl(row.url);
|
|
139
|
-
const auth = await refreshOAuth(config.auth, url.toString());
|
|
140
|
-
return saveConfig(row, { ...config, auth });
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
async function rowsByIds(ids: string[]): Promise<ConnectorRow[]> {
|
|
144
|
-
if (ids.length === 0) return [];
|
|
145
|
-
return getDb()
|
|
146
|
-
.select()
|
|
147
|
-
.from(connectors)
|
|
148
|
-
.where(inArray(connectors.id, ids))
|
|
149
|
-
.orderBy(asc(connectors.id));
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export async function listFreshConnectorsByIds(
|
|
153
|
-
ids: string[],
|
|
154
|
-
): Promise<Connector[]> {
|
|
155
|
-
const rows = await rowsByIds(ids);
|
|
156
|
-
return Promise.all(
|
|
157
|
-
rows.map(async (row) =>
|
|
158
|
-
withFreshToken(row).catch((err: unknown) => {
|
|
159
|
-
log.warn(
|
|
160
|
-
{ id: row.id, err: errMsg(err) },
|
|
161
|
-
'connectors: could not refresh the access token',
|
|
162
|
-
);
|
|
163
|
-
return toConnector(row);
|
|
164
|
-
}),
|
|
165
|
-
),
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export async function getConnectorForEmail(
|
|
170
|
-
email: string,
|
|
171
|
-
id: string,
|
|
172
|
-
): Promise<Connector> {
|
|
173
|
-
return toConnector(await ownedConnectorOrThrow(email, id));
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
async function insertConnector(
|
|
177
|
-
projectId: string,
|
|
178
|
-
name: string,
|
|
179
|
-
url: URL,
|
|
180
|
-
config: ConnectorConfig,
|
|
181
|
-
): Promise<Connector> {
|
|
182
|
-
const rows = await getDb()
|
|
183
|
-
.insert(connectors)
|
|
184
|
-
.values({
|
|
185
|
-
id: newId(),
|
|
186
|
-
projectId,
|
|
187
|
-
name,
|
|
188
|
-
url: connectorUrlText(url),
|
|
189
|
-
transport: 'http',
|
|
190
|
-
config,
|
|
191
|
-
})
|
|
192
|
-
.returning();
|
|
193
|
-
const row = rows[0];
|
|
194
|
-
if (row === undefined)
|
|
195
|
-
throw new ConnectorError('connector insert returned no row', 500);
|
|
196
|
-
return toConnector(row);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
const UNVERIFIED = {
|
|
200
|
-
at: '',
|
|
201
|
-
server: '',
|
|
202
|
-
version: '',
|
|
203
|
-
protocol: '',
|
|
204
|
-
icon: '',
|
|
205
|
-
tools: 0,
|
|
206
|
-
catalog: [],
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
export async function createPendingConnectorForEmail(
|
|
210
|
-
email: string,
|
|
211
|
-
project: string,
|
|
212
|
-
input: { name: unknown; url: unknown },
|
|
213
|
-
): Promise<Connector> {
|
|
214
|
-
const name = connectorName(input.name);
|
|
215
|
-
const url = parseConnectorUrl(input.url);
|
|
216
|
-
const projectId = await projectIdOrThrow(email, project);
|
|
217
|
-
return insertConnector(projectId, name, url, {
|
|
218
|
-
auth: { kind: 'none' },
|
|
219
|
-
createdAt: new Date().toISOString(),
|
|
220
|
-
verified: UNVERIFIED,
|
|
221
|
-
oauth: true,
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
export async function createConnectorForEmail(
|
|
226
|
-
email: string,
|
|
227
|
-
project: string,
|
|
228
|
-
input: ConnectorInput,
|
|
229
|
-
): Promise<Connector> {
|
|
230
|
-
const name = connectorName(input.name);
|
|
231
|
-
const url = parseConnectorUrl(input.url);
|
|
232
|
-
const auth = connectorAuth(input.header, input.value);
|
|
233
|
-
const projectId = await projectIdOrThrow(email, project);
|
|
234
|
-
const verified = stamp(await verifyRemoteMcp(url, auth));
|
|
235
|
-
return insertConnector(projectId, name, url, {
|
|
236
|
-
auth,
|
|
237
|
-
createdAt: new Date().toISOString(),
|
|
238
|
-
verified,
|
|
239
|
-
oauth: await oauthCapable(url, auth),
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
async function oauthCapable(url: URL, auth: ConnectorAuth): Promise<boolean> {
|
|
244
|
-
if (auth.kind === 'oauth') return true;
|
|
245
|
-
if (auth.kind === 'header') return false;
|
|
246
|
-
return advertisesOAuth(url);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
async function freshAuth(
|
|
250
|
-
auth: ConnectorAuth,
|
|
251
|
-
resource: string,
|
|
252
|
-
): Promise<ConnectorAuth> {
|
|
253
|
-
if (auth.kind !== 'oauth' || !oauthExpired(auth)) return auth;
|
|
254
|
-
return refreshOAuth(auth, resource);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
export async function reconnectConnectorForEmail(
|
|
258
|
-
email: string,
|
|
259
|
-
id: string,
|
|
260
|
-
auth: OAuthAuth,
|
|
261
|
-
): Promise<Connector> {
|
|
262
|
-
const row = await ownedConnectorOrThrow(email, id);
|
|
263
|
-
const config = readConfig(row.config);
|
|
264
|
-
const url = parseConnectorUrl(row.url);
|
|
265
|
-
const verified = stamp(await verifyRemoteMcp(url, auth));
|
|
266
|
-
return saveConfig(row, { ...config, auth, verified, oauth: true });
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
export async function disconnectConnectorForEmail(
|
|
270
|
-
email: string,
|
|
271
|
-
id: string,
|
|
272
|
-
): Promise<Connector> {
|
|
273
|
-
const row = await ownedConnectorOrThrow(email, id);
|
|
274
|
-
const config = readConfig(row.config);
|
|
275
|
-
if (config.auth.kind !== 'oauth')
|
|
276
|
-
throw new ConnectorError('that connector is not signed in', 400);
|
|
277
|
-
return saveConfig(row, { ...config, auth: { kind: 'none' }, oauth: true });
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
export async function verifyConnectorForEmail(
|
|
281
|
-
email: string,
|
|
282
|
-
id: string,
|
|
283
|
-
): Promise<ConnectorCheck> {
|
|
284
|
-
const row = await ownedConnectorOrThrow(email, id);
|
|
285
|
-
const config = readConfig(row.config);
|
|
286
|
-
try {
|
|
287
|
-
const url = parseConnectorUrl(row.url);
|
|
288
|
-
const auth = await freshAuth(config.auth, url.toString());
|
|
289
|
-
const verified = stamp(await verifyRemoteMcp(url, auth));
|
|
290
|
-
const oauth = config.oauth || (await oauthCapable(url, auth));
|
|
291
|
-
await saveConfig(row, { ...config, auth, verified, oauth });
|
|
292
|
-
return { id: row.id, name: row.name, ok: true, verified };
|
|
293
|
-
} catch (err) {
|
|
294
|
-
if (!(err instanceof ConnectorVerifyError)) throw err;
|
|
295
|
-
return { id: row.id, name: row.name, ok: false, reason: err.message };
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
export async function renameConnectorForEmail(
|
|
300
|
-
email: string,
|
|
301
|
-
id: string,
|
|
302
|
-
raw: string,
|
|
303
|
-
): Promise<Connector> {
|
|
304
|
-
const name = connectorName(raw);
|
|
305
|
-
const row = await ownedConnectorOrThrow(email, id);
|
|
306
|
-
await assertRenameFreeOfClash(row.id, name);
|
|
307
|
-
const rows = await getDb()
|
|
308
|
-
.update(connectors)
|
|
309
|
-
.set({ name })
|
|
310
|
-
.where(and(eq(connectors.id, row.id), eq(connectors.projectId, row.projectId)))
|
|
311
|
-
.returning();
|
|
312
|
-
const saved = rows[0];
|
|
313
|
-
if (saved === undefined) throw missing();
|
|
314
|
-
return toConnector(saved);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
export async function deleteConnectorForEmail(
|
|
318
|
-
email: string,
|
|
319
|
-
id: string,
|
|
320
|
-
): Promise<DeletedConnector> {
|
|
321
|
-
const row = await ownedConnectorOrThrow(email, id);
|
|
322
|
-
const gone = await getDb()
|
|
323
|
-
.delete(connectors)
|
|
324
|
-
.where(eq(connectors.id, row.id))
|
|
325
|
-
.returning({ id: connectors.id, name: connectors.name });
|
|
326
|
-
const deleted = gone[0];
|
|
327
|
-
if (deleted === undefined) throw missing();
|
|
328
|
-
return deleted;
|
|
329
|
-
}
|
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
import { ensureUser, normalizeEmail, userIdForEmail } from './users.js';
|
|
2
|
-
import { and, asc, eq } from 'drizzle-orm';
|
|
3
|
-
import { ApiError } from '../daemon/api-error.js';
|
|
4
|
-
import { getDb } from './client.js';
|
|
5
|
-
import { newId } from './ids.js';
|
|
6
|
-
import { projectMembers, projects, users, type ProjectRole } from './schema.js';
|
|
7
|
-
|
|
8
|
-
export class ProjectError extends ApiError {}
|
|
9
|
-
|
|
10
|
-
export interface Project {
|
|
11
|
-
id: string;
|
|
12
|
-
name: string;
|
|
13
|
-
isDefault: boolean;
|
|
14
|
-
owner: boolean;
|
|
15
|
-
role: ProjectRole;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface Member {
|
|
19
|
-
id: string;
|
|
20
|
-
email: string;
|
|
21
|
-
role: ProjectRole;
|
|
22
|
-
owner: boolean;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const NAME_MAX = 64;
|
|
26
|
-
const CONTROL = /[\u0000-\u001f\u007f]/;
|
|
27
|
-
|
|
28
|
-
const missing = (): ProjectError => new ProjectError('no such project', 404);
|
|
29
|
-
const forbidden = (why: string): ProjectError => new ProjectError(why, 403);
|
|
30
|
-
|
|
31
|
-
export function projectName(raw: unknown): string {
|
|
32
|
-
const name = typeof raw === 'string' ? raw.trim() : '';
|
|
33
|
-
if (name === '' || name.length > NAME_MAX)
|
|
34
|
-
throw new ProjectError(
|
|
35
|
-
`a project name is 1-${String(NAME_MAX)} characters`,
|
|
36
|
-
400,
|
|
37
|
-
);
|
|
38
|
-
if (CONTROL.test(name))
|
|
39
|
-
throw new ProjectError('a project name cannot carry control characters', 400);
|
|
40
|
-
return name;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export interface Access {
|
|
44
|
-
userId: string;
|
|
45
|
-
projectId: string;
|
|
46
|
-
ownerId: string;
|
|
47
|
-
isDefault: boolean;
|
|
48
|
-
name: string;
|
|
49
|
-
role: ProjectRole;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export async function memberAccessOrThrow(
|
|
53
|
-
email: string,
|
|
54
|
-
projectId: string,
|
|
55
|
-
): Promise<Access> {
|
|
56
|
-
const userId = await userIdForEmail(email);
|
|
57
|
-
if (userId === null) throw missing();
|
|
58
|
-
const rows = await getDb()
|
|
59
|
-
.select({
|
|
60
|
-
id: projects.id,
|
|
61
|
-
name: projects.name,
|
|
62
|
-
ownerId: projects.ownerId,
|
|
63
|
-
isDefault: projects.isDefault,
|
|
64
|
-
role: projectMembers.role,
|
|
65
|
-
})
|
|
66
|
-
.from(projects)
|
|
67
|
-
.innerJoin(projectMembers, eq(projectMembers.projectId, projects.id))
|
|
68
|
-
.where(and(eq(projects.id, projectId), eq(projectMembers.userId, userId)));
|
|
69
|
-
const row = rows[0];
|
|
70
|
-
if (row === undefined) throw missing();
|
|
71
|
-
return {
|
|
72
|
-
userId,
|
|
73
|
-
projectId: row.id,
|
|
74
|
-
ownerId: row.ownerId,
|
|
75
|
-
isDefault: row.isDefault,
|
|
76
|
-
name: row.name,
|
|
77
|
-
role: row.role,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export async function projectIdOrThrow(
|
|
82
|
-
email: string,
|
|
83
|
-
projectId: string,
|
|
84
|
-
): Promise<string> {
|
|
85
|
-
return (await memberAccessOrThrow(email, projectId)).projectId;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
async function addMemberRow(
|
|
89
|
-
projectId: string,
|
|
90
|
-
userId: string,
|
|
91
|
-
role: ProjectRole,
|
|
92
|
-
): Promise<void> {
|
|
93
|
-
await getDb()
|
|
94
|
-
.insert(projectMembers)
|
|
95
|
-
.values({ id: newId(), projectId, userId, role })
|
|
96
|
-
.onConflictDoNothing();
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export async function ensureDefaultProject(userId: string): Promise<string> {
|
|
100
|
-
const existing = await getDb()
|
|
101
|
-
.select({ id: projects.id })
|
|
102
|
-
.from(projects)
|
|
103
|
-
.where(and(eq(projects.ownerId, userId), eq(projects.isDefault, true)));
|
|
104
|
-
const found = existing[0];
|
|
105
|
-
if (found !== undefined) return found.id;
|
|
106
|
-
const id = newId();
|
|
107
|
-
await getDb()
|
|
108
|
-
.insert(projects)
|
|
109
|
-
.values({ id, name: 'Personal', ownerId: userId, isDefault: true });
|
|
110
|
-
await addMemberRow(id, userId, 'admin');
|
|
111
|
-
return id;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export async function ensureUserWithProject(rawEmail: string): Promise<string> {
|
|
115
|
-
const userId = await ensureUser(rawEmail);
|
|
116
|
-
await ensureDefaultProject(userId);
|
|
117
|
-
return userId;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
export async function listProjectsForEmail(email: string): Promise<Project[]> {
|
|
121
|
-
const userId = await userIdForEmail(email);
|
|
122
|
-
if (userId === null) return [];
|
|
123
|
-
const rows = await getDb()
|
|
124
|
-
.select({
|
|
125
|
-
id: projects.id,
|
|
126
|
-
name: projects.name,
|
|
127
|
-
isDefault: projects.isDefault,
|
|
128
|
-
ownerId: projects.ownerId,
|
|
129
|
-
role: projectMembers.role,
|
|
130
|
-
})
|
|
131
|
-
.from(projects)
|
|
132
|
-
.innerJoin(projectMembers, eq(projectMembers.projectId, projects.id))
|
|
133
|
-
.where(eq(projectMembers.userId, userId))
|
|
134
|
-
.orderBy(asc(projects.id));
|
|
135
|
-
return rows.map((r) => ({
|
|
136
|
-
id: r.id,
|
|
137
|
-
name: r.name,
|
|
138
|
-
isDefault: r.isDefault,
|
|
139
|
-
owner: r.ownerId === userId,
|
|
140
|
-
role: r.role,
|
|
141
|
-
}));
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export async function createProjectForEmail(
|
|
145
|
-
email: string,
|
|
146
|
-
raw: unknown,
|
|
147
|
-
): Promise<Project> {
|
|
148
|
-
const name = projectName(raw);
|
|
149
|
-
const userId = await ensureUser(email);
|
|
150
|
-
const id = newId();
|
|
151
|
-
await getDb().insert(projects).values({ id, name, ownerId: userId });
|
|
152
|
-
await addMemberRow(id, userId, 'admin');
|
|
153
|
-
return { id, name, isDefault: false, owner: true, role: 'admin' };
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export async function renameProjectForEmail(
|
|
157
|
-
email: string,
|
|
158
|
-
projectId: string,
|
|
159
|
-
raw: unknown,
|
|
160
|
-
): Promise<Project> {
|
|
161
|
-
const name = projectName(raw);
|
|
162
|
-
const access = await memberAccessOrThrow(email, projectId);
|
|
163
|
-
if (access.role !== 'admin')
|
|
164
|
-
throw forbidden('only an admin can rename a project');
|
|
165
|
-
await getDb()
|
|
166
|
-
.update(projects)
|
|
167
|
-
.set({ name })
|
|
168
|
-
.where(eq(projects.id, access.projectId));
|
|
169
|
-
return {
|
|
170
|
-
id: access.projectId,
|
|
171
|
-
name,
|
|
172
|
-
isDefault: access.isDefault,
|
|
173
|
-
owner: access.ownerId === access.userId,
|
|
174
|
-
role: access.role,
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
export async function deleteProjectForEmail(
|
|
179
|
-
email: string,
|
|
180
|
-
projectId: string,
|
|
181
|
-
): Promise<{ id: string; name: string }> {
|
|
182
|
-
const access = await memberAccessOrThrow(email, projectId);
|
|
183
|
-
if (access.ownerId !== access.userId)
|
|
184
|
-
throw forbidden('only the owner can delete a project');
|
|
185
|
-
if (access.isDefault)
|
|
186
|
-
throw forbidden('your default project cannot be deleted');
|
|
187
|
-
try {
|
|
188
|
-
await getDb().delete(projects).where(eq(projects.id, access.projectId));
|
|
189
|
-
} catch {
|
|
190
|
-
throw new ProjectError(
|
|
191
|
-
'this project still holds agents, connectors or collections',
|
|
192
|
-
409,
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
return { id: access.projectId, name: access.name };
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export async function listMembersForEmail(
|
|
199
|
-
email: string,
|
|
200
|
-
projectId: string,
|
|
201
|
-
): Promise<Member[]> {
|
|
202
|
-
const access = await memberAccessOrThrow(email, projectId);
|
|
203
|
-
const rows = await getDb()
|
|
204
|
-
.select({
|
|
205
|
-
id: projectMembers.id,
|
|
206
|
-
email: users.email,
|
|
207
|
-
role: projectMembers.role,
|
|
208
|
-
userId: projectMembers.userId,
|
|
209
|
-
})
|
|
210
|
-
.from(projectMembers)
|
|
211
|
-
.innerJoin(users, eq(users.id, projectMembers.userId))
|
|
212
|
-
.where(eq(projectMembers.projectId, access.projectId))
|
|
213
|
-
.orderBy(asc(projectMembers.id));
|
|
214
|
-
return rows.map((r) => ({
|
|
215
|
-
id: r.id,
|
|
216
|
-
email: r.email,
|
|
217
|
-
role: r.role,
|
|
218
|
-
owner: r.userId === access.ownerId,
|
|
219
|
-
}));
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
function readRole(raw: unknown): ProjectRole {
|
|
223
|
-
if (raw === 'admin' || raw === 'member') return raw;
|
|
224
|
-
throw new ProjectError("a role is 'admin' or 'member'", 400);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
async function adminAccessOrThrow(
|
|
228
|
-
email: string,
|
|
229
|
-
projectId: string,
|
|
230
|
-
): Promise<Access> {
|
|
231
|
-
const access = await memberAccessOrThrow(email, projectId);
|
|
232
|
-
if (access.role !== 'admin')
|
|
233
|
-
throw forbidden('only an admin can manage members');
|
|
234
|
-
return access;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
export async function addMemberForEmail(
|
|
238
|
-
email: string,
|
|
239
|
-
projectId: string,
|
|
240
|
-
raw: unknown,
|
|
241
|
-
rawRole: unknown,
|
|
242
|
-
): Promise<Member[]> {
|
|
243
|
-
const access = await adminAccessOrThrow(email, projectId);
|
|
244
|
-
const role = readRole(rawRole);
|
|
245
|
-
const invited = normalizeEmail(typeof raw === 'string' ? raw : '');
|
|
246
|
-
if (invited === '') throw new ProjectError('an email is required', 400);
|
|
247
|
-
const invitedId = await ensureUser(invited);
|
|
248
|
-
await ensureDefaultProject(invitedId);
|
|
249
|
-
await addMemberRow(access.projectId, invitedId, role);
|
|
250
|
-
return listMembersForEmail(email, projectId);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
async function memberRowOrThrow(
|
|
254
|
-
projectId: string,
|
|
255
|
-
memberId: string,
|
|
256
|
-
): Promise<{ userId: string }> {
|
|
257
|
-
const rows = await getDb()
|
|
258
|
-
.select({ userId: projectMembers.userId })
|
|
259
|
-
.from(projectMembers)
|
|
260
|
-
.where(
|
|
261
|
-
and(
|
|
262
|
-
eq(projectMembers.id, memberId),
|
|
263
|
-
eq(projectMembers.projectId, projectId),
|
|
264
|
-
),
|
|
265
|
-
);
|
|
266
|
-
const row = rows[0];
|
|
267
|
-
if (row === undefined) throw new ProjectError('no such member', 404);
|
|
268
|
-
return row;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
export async function setMemberRoleForEmail(
|
|
272
|
-
email: string,
|
|
273
|
-
projectId: string,
|
|
274
|
-
memberId: string,
|
|
275
|
-
rawRole: unknown,
|
|
276
|
-
): Promise<Member[]> {
|
|
277
|
-
const access = await adminAccessOrThrow(email, projectId);
|
|
278
|
-
const role = readRole(rawRole);
|
|
279
|
-
const member = await memberRowOrThrow(access.projectId, memberId);
|
|
280
|
-
if (member.userId === access.ownerId)
|
|
281
|
-
throw forbidden('the owner is always an admin');
|
|
282
|
-
await getDb()
|
|
283
|
-
.update(projectMembers)
|
|
284
|
-
.set({ role })
|
|
285
|
-
.where(eq(projectMembers.id, memberId));
|
|
286
|
-
return listMembersForEmail(email, projectId);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
export async function removeMemberForEmail(
|
|
290
|
-
email: string,
|
|
291
|
-
projectId: string,
|
|
292
|
-
memberId: string,
|
|
293
|
-
): Promise<Member[]> {
|
|
294
|
-
const access = await adminAccessOrThrow(email, projectId);
|
|
295
|
-
const member = await memberRowOrThrow(access.projectId, memberId);
|
|
296
|
-
if (member.userId === access.ownerId)
|
|
297
|
-
throw forbidden('the owner cannot be removed from their own project');
|
|
298
|
-
await getDb().delete(projectMembers).where(eq(projectMembers.id, memberId));
|
|
299
|
-
return listMembersForEmail(email, projectId);
|
|
300
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { ownedAgentOrThrow } from './agent-admin.js';
|
|
2
|
-
import { ApiError } from '../daemon/api-error.js';
|
|
3
|
-
import { mintRunCode } from '../daemon/run-pair.js';
|
|
4
|
-
import { loadAllStationsFor, unmovableStations } from './materialize.js';
|
|
5
|
-
import { releaseRuntime } from './runtimes.js';
|
|
6
|
-
|
|
7
|
-
export async function mintRuntimeCodeForEmail(
|
|
8
|
-
email: string,
|
|
9
|
-
agentId: string,
|
|
10
|
-
): Promise<{ code: string; expiresAt: number }> {
|
|
11
|
-
const { agent } = await ownedAgentOrThrow(email, agentId);
|
|
12
|
-
const blocked = unmovableStations(await loadAllStationsFor(agent.id));
|
|
13
|
-
if (blocked.length > 0)
|
|
14
|
-
throw new ApiError(
|
|
15
|
-
`'${agent.name}' holds ${blocked.join(', ')}, which only runs on metro ` +
|
|
16
|
-
'because a webhook url has to be publicly reachable. Its deliveries ' +
|
|
17
|
-
'would arrive at metro while this agent listens on your machine, so ' +
|
|
18
|
-
'they would be dropped. Detach it, or attach it to a second agent that ' +
|
|
19
|
-
'stays on metro, then authorize this one.',
|
|
20
|
-
409,
|
|
21
|
-
);
|
|
22
|
-
return mintRunCode({ email, agentId: agent.id });
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export async function releaseRuntimeForEmail(
|
|
26
|
-
email: string,
|
|
27
|
-
agentId: string,
|
|
28
|
-
): Promise<void> {
|
|
29
|
-
const { agent } = await ownedAgentOrThrow(email, agentId);
|
|
30
|
-
await releaseRuntime(agent.id);
|
|
31
|
-
}
|