@stage-labs/metro 0.1.0-beta.75 → 0.1.0-beta.77
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/cli.js +0 -3
- package/dist/runtime.js +1 -1
- package/dist/serve.js +0 -1
- package/package.json +1 -1
- package/runtime/node_modules/@metro-labs/core/package.json +43 -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 +1 -1
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/identity.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/protocol.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/account-store.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/station-runtime.ts +1 -1
- package/runtime/node_modules/@metro-labs/daemon/package.json +47 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/agents}/account-attach.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/account-api.ts → daemon/src/agents/accounts-api.ts} +6 -6
- package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-admin.ts → daemon/src/agents/admin.ts} +2 -2
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/agent-api.ts → daemon/src/agents/api.ts} +6 -6
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/bundle-api.ts → daemon/src/agents/bundle.ts} +7 -7
- package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/agents}/file-admin.ts +9 -9
- package/runtime/node_modules/@metro-labs/{mcp/src/db/file-source.ts → daemon/src/agents/files.ts} +4 -4
- package/runtime/node_modules/@metro-labs/{mcp/src/db/key-map.ts → daemon/src/agents/keys.ts} +1 -1
- 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/{mcp/src/daemon → daemon/src/boot}/boot.ts +23 -51
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/crash-guard.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/local-owner.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/paths.ts +1 -4
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/addressed.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/dedupe.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/inbound.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/pending.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-api.ts → daemon/src/claude/api.ts} +47 -14
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-files.ts → daemon/src/claude/files.ts} +2 -2
- package/runtime/node_modules/@metro-labs/daemon/src/claude/login.ts +167 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-settings.ts → daemon/src/claude/settings.ts} +4 -4
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-api.ts → daemon/src/connectors/api.ts} +6 -6
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/local-cli-api.ts → daemon/src/connectors/cli-api.ts} +5 -5
- package/runtime/node_modules/@metro-labs/{mcp/src/db/connector-config.ts → daemon/src/connectors/config.ts} +4 -4
- package/runtime/node_modules/@metro-labs/{mcp/src/db/connectors.ts → daemon/src/connectors/model.ts} +3 -3
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-client.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-discovery.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth-routes.ts → daemon/src/connectors/oauth-routes.ts} +6 -6
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth.ts → daemon/src/connectors/oauth.ts} +3 -3
- package/runtime/node_modules/@metro-labs/{mcp/src/db/connector-relay.ts → daemon/src/connectors/relay-target.ts} +1 -1
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/relay.ts +4 -4
- package/runtime/node_modules/@metro-labs/{mcp/src/db/local-connectors.ts → daemon/src/connectors/store.ts} +12 -12
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-tools.ts → daemon/src/connectors/tools.ts} +1 -1
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-url.ts → daemon/src/connectors/url.ts} +1 -1
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-verify.ts → daemon/src/connectors/verify.ts} +5 -5
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-grant.ts +3 -3
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-owner.ts +3 -3
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-serve.ts +5 -12
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-api.ts +5 -5
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-store.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/bedrock.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-auth.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-device.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-stream.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-translate.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/gateway.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/gateway}/model-api.ts +12 -12
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/model-config.ts +3 -3
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/openrouter.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/accounts.ts +3 -7
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/call-tools.ts +3 -3
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/channel-owner.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/frame-scope.ts +2 -2
- 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 +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/member-tools.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/request-identity.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session-registry.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-dispatch.ts +4 -4
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +5 -5
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/monitor/api.ts +5 -5
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/net}/tunnel.ts +6 -10
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +15 -15
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/identity-routes.ts → daemon/src/routes/identity.ts} +5 -5
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/local-mode.ts +16 -16
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/session-apis.ts +14 -20
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-api.ts → daemon/src/routes/session.ts} +1 -1
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/control-api.ts → daemon/src/server/control.ts} +3 -3
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/machine-api.ts → daemon/src/server/machine.ts} +8 -8
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/update-api.ts → daemon/src/server/update.ts} +5 -5
- package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-resolve.ts +3 -3
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/attach-session.ts +4 -4
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-xmtp.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach.ts +3 -3
- package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/stations}/materialize.ts +9 -14
- package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/registry.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/runtime-deps.ts +4 -4
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor-io.ts +2 -2
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor.ts +4 -4
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/train-call.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/terminal-api.ts → daemon/src/terminal/api.ts} +4 -4
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon/terminal-ws.ts → daemon/src/terminal/socket.ts} +3 -3
- package/runtime/node_modules/@metro-labs/discord-bot/package.json +1 -1
- package/runtime/node_modules/@metro-labs/discord-bot/src/accounts.ts +2 -2
- package/runtime/node_modules/@metro-labs/discord-bot/src/actions.ts +3 -3
- package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +2 -2
- package/runtime/node_modules/@metro-labs/discord-bot/src/group.ts +2 -2
- package/runtime/node_modules/@metro-labs/discord-bot/src/index.ts +2 -2
- package/runtime/node_modules/@metro-labs/discord-bot/src/members.ts +2 -2
- package/runtime/node_modules/@metro-labs/discord-bot/src/send-files.ts +1 -1
- package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +1 -1
- package/runtime/node_modules/@metro-labs/discord-bot/src/voice-speak.ts +1 -1
- package/runtime/node_modules/@metro-labs/discord-bot/src/voice-transcribe.ts +1 -1
- package/runtime/node_modules/@metro-labs/discord-bot/src/voice.ts +1 -1
- package/runtime/node_modules/@metro-labs/discord-bot/src/wire.ts +1 -1
- package/runtime/node_modules/@metro-labs/http/package.json +33 -0
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-http.ts +1 -1
- package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/signed-identity.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/package.json +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +3 -3
- 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 +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/group.ts +3 -3
- package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/index.ts +3 -3
- package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/members.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/normalize.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/reactions.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/station.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/package.json +1 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +2 -2
- package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +4 -4
- package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +2 -2
- package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +2 -2
- package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +1 -1
- package/runtime/node_modules/@metro-labs/telegram-bot/src/wire.ts +1 -1
- package/runtime/node_modules/@metro-labs/webhook/package.json +1 -1
- package/runtime/node_modules/@metro-labs/webhook/src/station.ts +4 -4
- package/runtime/node_modules/@metro-labs/whatsapp/package.json +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +4 -4
- 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 +2 -2
- package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +3 -3
- 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/normalize.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +1 -1
- package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +2 -2
- package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/package.json +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +2 -2
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +3 -3
- package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +3 -3
- package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +2 -2
- package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +1 -1
- 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/index.ts +2 -2
- package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +2 -2
- package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +3 -3
- package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +1 -1
- package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +1 -1
- package/runtime/runtime.json +1 -1
- package/dist/bedrock-eventstream.js +0 -120
- package/dist/bedrock-proxy.js +0 -260
- package/dist/bedrock-upstream.js +0 -72
- package/dist/bedrock.js +0 -37
- package/runtime/node_modules/@metro-labs/mcp/package.json +0 -64
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/server-types.ts +0 -21
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/servers-api.ts +0 -80
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/vault-api.ts +0 -78
- package/runtime/node_modules/@metro-labs/mcp/src/daemon/vault-types.ts +0 -12
- package/runtime/node_modules/@metro-labs/mcp/src/db/client.ts +0 -32
- package/runtime/node_modules/@metro-labs/mcp/src/db/schema.ts +0 -33
- package/runtime/node_modules/@metro-labs/mcp/src/db/servers.ts +0 -83
- package/runtime/node_modules/@metro-labs/mcp/src/db/vault.ts +0 -109
- package/runtime/node_modules/@metro-labs/mcp/src/server.ts +0 -2
- /package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/address.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/ids.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/is-record.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/stations → core/src}/lines.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/log.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/secure-fs.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/db/stations.ts → core/src/station-names.ts} +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/attachments.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/messaging-normalize.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/types.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/src/daemon → core/src}/version.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-map.ts → daemon/src/agents/map.ts} +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/connect-hint.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/media-note.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/webhook-note.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-json.ts → daemon/src/connectors/json.ts} +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-pending.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/eventstream.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/forward.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/served.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/permission-relay.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 → daemon}/src/mcp/session-route.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-inline.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-interactive.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon/terminal-tickets.ts → daemon/src/terminal/tickets.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/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/identity-key.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/identity-registry.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/mode-api.ts +0 -0
- /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/return-to.ts +0 -0
package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-api.ts → daemon/src/claude/api.ts}
RENAMED
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
import { errMsg, log } from '
|
|
3
|
-
import { apiFailure, apiSession, cors, readJsonBody, sendJson } from '
|
|
4
|
-
import { ApiError } from '
|
|
5
|
-
import { isRecord } from '
|
|
6
|
-
import { listClaudeSettings, SETTINGS_MAX, writeClaudeSettings } from './
|
|
2
|
+
import { errMsg, log } from '@metro-labs/core/log';
|
|
3
|
+
import { apiFailure, apiSession, cors, readJsonBody, sendJson } from '@metro-labs/http/api-http';
|
|
4
|
+
import { ApiError } from '@metro-labs/http/api-error';
|
|
5
|
+
import { isRecord } from '@metro-labs/core/is-record';
|
|
6
|
+
import { listClaudeSettings, SETTINGS_MAX, writeClaudeSettings } from './settings.js';
|
|
7
|
+
import {
|
|
8
|
+
answerClaudeLogin,
|
|
9
|
+
claudeAccount,
|
|
10
|
+
claudeInstalled,
|
|
11
|
+
claudeLoginView,
|
|
12
|
+
endClaudeLogin,
|
|
13
|
+
startClaudeLogin,
|
|
14
|
+
type LoginDeps,
|
|
15
|
+
} from './login.js';
|
|
7
16
|
import {
|
|
8
17
|
claudeDir,
|
|
9
18
|
deleteClaudeSession,
|
|
@@ -12,17 +21,18 @@ import {
|
|
|
12
21
|
listMemory,
|
|
13
22
|
readMemoryFile,
|
|
14
23
|
readTranscript,
|
|
15
|
-
} from './
|
|
24
|
+
} from './files.js';
|
|
16
25
|
|
|
17
26
|
const PREFIX = '/api/claude';
|
|
18
27
|
const BODY_MAX = SETTINGS_MAX + 4096;
|
|
19
|
-
const WRITABLE = new Set(['GET', 'DELETE', 'PUT']);
|
|
28
|
+
const WRITABLE = new Set(['GET', 'DELETE', 'PUT', 'POST']);
|
|
20
29
|
const PAGE = 100;
|
|
21
30
|
const PAGE_MAX = 500;
|
|
22
31
|
|
|
23
32
|
export interface ClaudeApiDeps {
|
|
24
33
|
authorize: (subject: string) => void;
|
|
25
34
|
dir?: () => string;
|
|
35
|
+
login?: LoginDeps;
|
|
26
36
|
}
|
|
27
37
|
|
|
28
38
|
function projectOf(query: URLSearchParams): string {
|
|
@@ -65,17 +75,38 @@ async function writeAnswer(req: IncomingMessage, path: string, dir: string): Pro
|
|
|
65
75
|
return writeClaudeSettings(item, body.text, seenAt, dir);
|
|
66
76
|
}
|
|
67
77
|
|
|
78
|
+
const LOGIN = 'login';
|
|
79
|
+
|
|
80
|
+
async function loginAnswer(req: IncomingMessage, id: string, deps: ClaudeApiDeps): Promise<unknown> {
|
|
81
|
+
const method = req.method ?? 'GET';
|
|
82
|
+
if (id === '') {
|
|
83
|
+
if (method === 'POST') return startClaudeLogin(deps.login);
|
|
84
|
+
if (method === 'GET') return { available: claudeInstalled(), ...claudeAccount() };
|
|
85
|
+
throw new ApiError('method not allowed', 405);
|
|
86
|
+
}
|
|
87
|
+
if (method === 'GET') return claudeLoginView(id);
|
|
88
|
+
if (method === 'DELETE') return endClaudeLogin(id);
|
|
89
|
+
if (method !== 'POST') throw new ApiError('method not allowed', 405);
|
|
90
|
+
const body = await readJsonBody(req);
|
|
91
|
+
if (!isRecord(body) || typeof body.text !== 'string') throw new ApiError('text is required', 400);
|
|
92
|
+
return answerClaudeLogin(id, body.text);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function removed(rest: string[], query: URLSearchParams, dir: string): unknown {
|
|
96
|
+
const [head = '', item = ''] = rest;
|
|
97
|
+
if (rest.length !== 2 || head !== 'sessions') throw new ApiError('method not allowed', 405);
|
|
98
|
+
deleteClaudeSession(projectOf(query), item, dir);
|
|
99
|
+
return { deleted: item };
|
|
100
|
+
}
|
|
101
|
+
|
|
68
102
|
function answer(method: string, path: string, query: URLSearchParams, dir: string): unknown {
|
|
69
103
|
const rest = parts(path);
|
|
70
|
-
const [head = '', item] = rest;
|
|
71
|
-
if (method === 'DELETE')
|
|
72
|
-
|
|
73
|
-
deleteClaudeSession(projectOf(query), item ?? '', dir);
|
|
74
|
-
return { deleted: item };
|
|
75
|
-
}
|
|
104
|
+
const [head = '', item = ''] = rest;
|
|
105
|
+
if (method === 'DELETE') return removed(rest, query, dir);
|
|
106
|
+
if (method !== 'GET') throw new ApiError('method not allowed', 405);
|
|
76
107
|
const handler = rest.length === 1 ? COLLECTIONS[head] : rest.length === 2 ? ITEMS[head] : undefined;
|
|
77
108
|
if (handler === undefined) throw new ApiError('no such route', 404);
|
|
78
|
-
return handler(query, dir, item
|
|
109
|
+
return handler(query, dir, item);
|
|
79
110
|
}
|
|
80
111
|
|
|
81
112
|
export function handleClaudeRequest(
|
|
@@ -98,6 +129,8 @@ export function handleClaudeRequest(
|
|
|
98
129
|
if (!session) throw new ApiError('unauthorized', 401);
|
|
99
130
|
deps.authorize(session.subject);
|
|
100
131
|
const dir = (deps.dir ?? claudeDir)();
|
|
132
|
+
const [head = '', item = ''] = parts(path);
|
|
133
|
+
if (head === LOGIN) return loginAnswer(req, item, deps);
|
|
101
134
|
if (req.method === 'PUT') return writeAnswer(req, path, dir);
|
|
102
135
|
return answer(req.method ?? 'GET', path, new URLSearchParams(search), dir);
|
|
103
136
|
})
|
|
@@ -11,8 +11,8 @@ import {
|
|
|
11
11
|
import { homedir } from 'node:os';
|
|
12
12
|
import { join } from 'node:path';
|
|
13
13
|
import { createInterface } from 'node:readline';
|
|
14
|
-
import { ApiError } from '
|
|
15
|
-
import { isRecord } from '
|
|
14
|
+
import { ApiError } from '@metro-labs/http/api-error';
|
|
15
|
+
import { isRecord } from '@metro-labs/core/is-record';
|
|
16
16
|
|
|
17
17
|
const PROJECT_RE = /^[A-Za-z0-9._-]{1,200}$/;
|
|
18
18
|
const SESSION_RE = /^[A-Za-z0-9][A-Za-z0-9-]{7,63}$/;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { ApiError } from '@metro-labs/http/api-error';
|
|
4
|
+
import { isRecord } from '@metro-labs/core/is-record';
|
|
5
|
+
import { errMsg, log } from '@metro-labs/core/log';
|
|
6
|
+
|
|
7
|
+
const LOGIN_COMMAND = ['claude', 'auth', 'login', '--claudeai'];
|
|
8
|
+
const STATUS_COMMAND = ['auth', 'status', '--json'];
|
|
9
|
+
const TTL_MS = 10 * 60_000;
|
|
10
|
+
const OUTPUT_MAX = 8_000;
|
|
11
|
+
const COLS = 100;
|
|
12
|
+
const ROWS = 40;
|
|
13
|
+
const ESC = String.fromCharCode(27);
|
|
14
|
+
const CSI = /^\[[0-9;?]*[a-zA-Z]/;
|
|
15
|
+
const URL_RE = /https:\/\/[^\s"'`]+/g;
|
|
16
|
+
|
|
17
|
+
export type LoginState = 'pending' | 'done' | 'failed';
|
|
18
|
+
|
|
19
|
+
export interface LoginView {
|
|
20
|
+
id: string;
|
|
21
|
+
state: LoginState;
|
|
22
|
+
url: string | null;
|
|
23
|
+
output: string;
|
|
24
|
+
error: string | null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface Live {
|
|
28
|
+
id: string;
|
|
29
|
+
startedAt: number;
|
|
30
|
+
state: LoginState;
|
|
31
|
+
output: string;
|
|
32
|
+
error: string | null;
|
|
33
|
+
write: (text: string) => void;
|
|
34
|
+
kill: () => void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface LoginDeps {
|
|
38
|
+
command?: string[];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let live: Live | null = null;
|
|
42
|
+
|
|
43
|
+
export function plainText(raw: string): string {
|
|
44
|
+
return raw
|
|
45
|
+
.split(ESC)
|
|
46
|
+
.map((part, index) => (index === 0 ? part : part.replace(CSI, '')))
|
|
47
|
+
.join('');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function loginUrlIn(output: string): string | null {
|
|
51
|
+
const found = output.match(URL_RE) ?? [];
|
|
52
|
+
const trimmed = found.map((url) => url.replace(/[.,)]+$/, ''));
|
|
53
|
+
return trimmed.find((url) => url.includes('claude.ai') || url.includes('anthropic.com')) ?? trimmed[0] ?? null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const view = (session: Live): LoginView => ({
|
|
57
|
+
id: session.id,
|
|
58
|
+
state: session.state,
|
|
59
|
+
url: loginUrlIn(session.output),
|
|
60
|
+
output: session.output,
|
|
61
|
+
error: session.error,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
function sweep(now: number): void {
|
|
65
|
+
if (live !== null && live.state !== 'pending') return;
|
|
66
|
+
if (live !== null && now - live.startedAt > TTL_MS) {
|
|
67
|
+
live.kill();
|
|
68
|
+
live = null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function claudeInstalled(): boolean {
|
|
73
|
+
const run = spawnSync('claude', ['--version'], { stdio: 'ignore' });
|
|
74
|
+
return run.error === undefined && run.status === 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function claudeAccount(): { signedIn: boolean; account: string | null } {
|
|
78
|
+
const run = spawnSync('claude', STATUS_COMMAND, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });
|
|
79
|
+
if (run.error !== undefined || typeof run.stdout !== 'string') return { signedIn: false, account: null };
|
|
80
|
+
try {
|
|
81
|
+
const parsed: unknown = JSON.parse(run.stdout);
|
|
82
|
+
if (!isRecord(parsed)) return { signedIn: false, account: null };
|
|
83
|
+
const account = typeof parsed.email === 'string' ? parsed.email : typeof parsed.organization === 'string' ? parsed.organization : null;
|
|
84
|
+
return { signedIn: parsed.authenticated === true || parsed.loggedIn === true || account !== null, account };
|
|
85
|
+
} catch {
|
|
86
|
+
return { signedIn: false, account: null };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function note(session: Live, chunk: string): void {
|
|
91
|
+
const next = session.output + plainText(chunk);
|
|
92
|
+
session.output = next.length > OUTPUT_MAX ? next.slice(next.length - OUTPUT_MAX) : next;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function startClaudeLogin(deps: LoginDeps = {}, now = Date.now()): LoginView {
|
|
96
|
+
sweep(now);
|
|
97
|
+
if (live !== null && live.state === 'pending') return view(live);
|
|
98
|
+
const command = deps.command ?? LOGIN_COMMAND;
|
|
99
|
+
const session: Live = {
|
|
100
|
+
id: randomBytes(9).toString('base64url'),
|
|
101
|
+
startedAt: now,
|
|
102
|
+
state: 'pending',
|
|
103
|
+
output: '',
|
|
104
|
+
error: null,
|
|
105
|
+
write: () => undefined,
|
|
106
|
+
kill: () => undefined,
|
|
107
|
+
};
|
|
108
|
+
const terminal = new Bun.Terminal({
|
|
109
|
+
cols: COLS,
|
|
110
|
+
rows: ROWS,
|
|
111
|
+
data: (_term, chunk: Uint8Array) => {
|
|
112
|
+
note(session, Buffer.from(chunk).toString('utf8'));
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
const proc = Bun.spawn(command, { terminal, env: { ...process.env, TERM: 'xterm-256color' } });
|
|
116
|
+
session.write = (text: string) => {
|
|
117
|
+
terminal.write(Buffer.from(`${text}\r`, 'utf8'));
|
|
118
|
+
};
|
|
119
|
+
session.kill = () => {
|
|
120
|
+
proc.kill();
|
|
121
|
+
terminal.close();
|
|
122
|
+
};
|
|
123
|
+
proc.exited
|
|
124
|
+
.then((code) => {
|
|
125
|
+
session.state = code === 0 ? 'done' : 'failed';
|
|
126
|
+
if (code !== 0) session.error = `the login ended with status ${String(code)}`;
|
|
127
|
+
terminal.close();
|
|
128
|
+
log.info({ state: session.state }, 'claude-login: the official login finished');
|
|
129
|
+
})
|
|
130
|
+
.catch((err: unknown) => {
|
|
131
|
+
session.state = 'failed';
|
|
132
|
+
session.error = errMsg(err);
|
|
133
|
+
});
|
|
134
|
+
live = session;
|
|
135
|
+
log.info({ command: command[0] }, 'claude-login: started');
|
|
136
|
+
return view(session);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function current(id: string): Live {
|
|
140
|
+
const session = live;
|
|
141
|
+
if (session?.id !== id) throw new ApiError('that sign-in is over; start another one', 404);
|
|
142
|
+
return session;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function claudeLoginView(id: string, now = Date.now()): LoginView {
|
|
146
|
+
sweep(now);
|
|
147
|
+
return view(current(id));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function answerClaudeLogin(id: string, text: string): LoginView {
|
|
151
|
+
const session = current(id);
|
|
152
|
+
if (session.state !== 'pending') throw new ApiError('that sign-in has already finished', 409);
|
|
153
|
+
session.write(text);
|
|
154
|
+
return view(session);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function endClaudeLogin(id: string): { ended: true } {
|
|
158
|
+
const session = current(id);
|
|
159
|
+
session.kill();
|
|
160
|
+
live = null;
|
|
161
|
+
return { ended: true };
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export const forgetClaudeLogin = (): void => {
|
|
165
|
+
live?.kill();
|
|
166
|
+
live = null;
|
|
167
|
+
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { dirname, join } from 'node:path';
|
|
3
|
-
import { ApiError } from '
|
|
4
|
-
import { claudeDir, listClaudeProjects } from './
|
|
5
|
-
import { isRecord } from '
|
|
6
|
-
import { errMsg } from '
|
|
3
|
+
import { ApiError } from '@metro-labs/http/api-error';
|
|
4
|
+
import { claudeDir, listClaudeProjects } from './files.js';
|
|
5
|
+
import { isRecord } from '@metro-labs/core/is-record';
|
|
6
|
+
import { errMsg } from '@metro-labs/core/log';
|
|
7
7
|
|
|
8
8
|
export const SETTINGS_MAX = 256 * 1024;
|
|
9
9
|
const USER_ID = 'user';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
import { errMsg, log } from '
|
|
2
|
+
import { errMsg, log } from '@metro-labs/core/log';
|
|
3
3
|
import {
|
|
4
4
|
apiFailure,
|
|
5
5
|
apiSession,
|
|
@@ -9,22 +9,22 @@ import {
|
|
|
9
9
|
readJsonBody,
|
|
10
10
|
sendJson,
|
|
11
11
|
type ApiSession,
|
|
12
|
-
} from '
|
|
13
|
-
import { parseId } from '
|
|
12
|
+
} from '@metro-labs/http/api-http';
|
|
13
|
+
import { parseId } from '@metro-labs/core/ids';
|
|
14
14
|
import {
|
|
15
15
|
handleCallback,
|
|
16
16
|
handleConnect,
|
|
17
17
|
hostOf,
|
|
18
18
|
startOAuth,
|
|
19
19
|
type OAuthRouteDeps,
|
|
20
|
-
} from './
|
|
21
|
-
import { ConnectorUnauthorized } from './
|
|
20
|
+
} from './oauth-routes.js';
|
|
21
|
+
import { ConnectorUnauthorized } from './verify.js';
|
|
22
22
|
import type {
|
|
23
23
|
Connector,
|
|
24
24
|
ConnectorCheck,
|
|
25
25
|
ConnectorInput,
|
|
26
26
|
DeletedConnector,
|
|
27
|
-
} from '
|
|
27
|
+
} from './model.js';
|
|
28
28
|
|
|
29
29
|
const PREFIX = '/api/connectors';
|
|
30
30
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
import { errMsg, log } from '
|
|
3
|
-
import { cors, sendJson, type AgentIdentity } from '
|
|
4
|
-
import { publicBaseOrDefault } from '
|
|
5
|
-
import { relayServersJson, type RelayServerEntry } from './
|
|
6
|
-
import { agentIdForKey } from '../
|
|
2
|
+
import { errMsg, log } from '@metro-labs/core/log';
|
|
3
|
+
import { cors, sendJson, type AgentIdentity } from '@metro-labs/http/api-http';
|
|
4
|
+
import { publicBaseOrDefault } from '../files/attach-serve.js';
|
|
5
|
+
import { relayServersJson, type RelayServerEntry } from './json.js';
|
|
6
|
+
import { agentIdForKey } from '../agents/keys.js';
|
|
7
7
|
|
|
8
8
|
const PATH = '/api/cli/mcp';
|
|
9
9
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { ApiError } from '
|
|
1
|
+
import { ApiError } from '@metro-labs/http/api-error';
|
|
2
2
|
import type {
|
|
3
3
|
ConnectorAuth,
|
|
4
4
|
VerifiedRecord,
|
|
5
5
|
VerifiedServer,
|
|
6
|
-
} from '
|
|
7
|
-
import { readStoredTools } from '
|
|
8
|
-
import { isRecord } from '
|
|
6
|
+
} from './verify.js';
|
|
7
|
+
import { readStoredTools } from './tools.js';
|
|
8
|
+
import { isRecord } from '@metro-labs/core/is-record';
|
|
9
9
|
|
|
10
10
|
const CONNECTOR_NAME_MAX = 64;
|
|
11
11
|
const HEADER_NAME_RE = /^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,64}$/;
|
package/runtime/node_modules/@metro-labs/{mcp/src/db/connectors.ts → daemon/src/connectors/model.ts}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { ConnectorAuth, VerifiedRecord } from '
|
|
2
|
-
import { readConfig, signInState, type ConnectorSignIn } from './
|
|
3
|
-
import type { ConnectorTransport } from '
|
|
1
|
+
import type { ConnectorAuth, VerifiedRecord } from './verify.js';
|
|
2
|
+
import { readConfig, signInState, type ConnectorSignIn } from './config.js';
|
|
3
|
+
import type { ConnectorTransport } from '@metro-labs/core/station-names';
|
|
4
4
|
|
|
5
5
|
export interface Connector {
|
|
6
6
|
id: string;
|
package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-client.ts
RENAMED
|
@@ -2,9 +2,9 @@ import { createHash, randomBytes } from 'node:crypto';
|
|
|
2
2
|
import {
|
|
3
3
|
ConnectorVerifyError,
|
|
4
4
|
type OAuthTokens,
|
|
5
|
-
} from './
|
|
5
|
+
} from './verify.js';
|
|
6
6
|
import type { OAuthServer } from './oauth-discovery.js';
|
|
7
|
-
import { isRecord } from '
|
|
7
|
+
import { isRecord } from '@metro-labs/core/is-record';
|
|
8
8
|
|
|
9
9
|
const TOKEN_TIMEOUT_MS = 15_000;
|
|
10
10
|
const CLIENT_NAME = 'Metro';
|
package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-discovery.ts
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ConnectorVerifyError, parseConnectorUrl } from './
|
|
2
|
-
import { isRecord } from '
|
|
1
|
+
import { ConnectorVerifyError, parseConnectorUrl } from './verify.js';
|
|
2
|
+
import { isRecord } from '@metro-labs/core/is-record';
|
|
3
3
|
|
|
4
4
|
const DISCOVERY_TIMEOUT_MS = 10_000;
|
|
5
5
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
import { errMsg, log } from '
|
|
3
|
-
import { bodyField, readJsonBody, sendJson, type ApiSession } from '
|
|
2
|
+
import { errMsg, log } from '@metro-labs/core/log';
|
|
3
|
+
import { bodyField, readJsonBody, sendJson, type ApiSession } from '@metro-labs/http/api-http';
|
|
4
4
|
import {
|
|
5
5
|
beginOAuth,
|
|
6
6
|
completeOAuth,
|
|
7
7
|
takePending,
|
|
8
8
|
type PendingAuth,
|
|
9
|
-
} from './
|
|
10
|
-
import { parseConnectorUrl } from './
|
|
11
|
-
import type { OAuthAuth } from './
|
|
12
|
-
import type { Connector } from '
|
|
9
|
+
} from './oauth.js';
|
|
10
|
+
import { parseConnectorUrl } from './verify.js';
|
|
11
|
+
import type { OAuthAuth } from './verify.js';
|
|
12
|
+
import type { Connector } from './model.js';
|
|
13
13
|
|
|
14
14
|
const asText = (value: unknown): string =>
|
|
15
15
|
typeof value === 'string' ? value : '';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { publicBaseOrDefault } from '
|
|
1
|
+
import { publicBaseOrDefault } from '../files/attach-serve.js';
|
|
2
2
|
import {
|
|
3
3
|
ConnectorVerifyError,
|
|
4
4
|
type OAuthAuth,
|
|
5
5
|
type OAuthTokens,
|
|
6
|
-
} from './
|
|
7
|
-
import { validateReturnTo } from '
|
|
6
|
+
} from './verify.js';
|
|
7
|
+
import { validateReturnTo } from '@metro-labs/http/return-to';
|
|
8
8
|
import {
|
|
9
9
|
authorizeUrl,
|
|
10
10
|
exchangeCode,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
import type { RelayTarget } from '
|
|
3
|
-
import type { AgentIdentity } from '
|
|
4
|
-
import { ApiError } from '
|
|
5
|
-
import { errMsg, log } from '
|
|
2
|
+
import type { RelayTarget } from './relay-target.js';
|
|
3
|
+
import type { AgentIdentity } from '@metro-labs/http/api-http';
|
|
4
|
+
import { ApiError } from '@metro-labs/http/api-error';
|
|
5
|
+
import { errMsg, log } from '@metro-labs/core/log';
|
|
6
6
|
|
|
7
7
|
export interface RelayApiDeps {
|
|
8
8
|
target: (connectorId: string, force: boolean) => Promise<RelayTarget>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
-
import { readJson, writeSecure } from '
|
|
3
|
-
import { errMsg, log } from '
|
|
2
|
+
import { readJson, writeSecure } from '@metro-labs/core/secure-fs';
|
|
3
|
+
import { errMsg, log } from '@metro-labs/core/log';
|
|
4
4
|
import {
|
|
5
5
|
connectorUrlText,
|
|
6
6
|
ConnectorVerifyError,
|
|
@@ -8,9 +8,9 @@ import {
|
|
|
8
8
|
verifyRemoteMcp,
|
|
9
9
|
type ConnectorAuth,
|
|
10
10
|
type OAuthAuth,
|
|
11
|
-
} from '
|
|
12
|
-
import { oauthExpired, refreshOAuth } from '
|
|
13
|
-
import { advertisesOAuth } from '
|
|
11
|
+
} from './verify.js';
|
|
12
|
+
import { oauthExpired, refreshOAuth } from './oauth.js';
|
|
13
|
+
import { advertisesOAuth } from './oauth-discovery.js';
|
|
14
14
|
import {
|
|
15
15
|
ConnectorError,
|
|
16
16
|
connectorAuth,
|
|
@@ -18,13 +18,13 @@ import {
|
|
|
18
18
|
readConfig,
|
|
19
19
|
stamp,
|
|
20
20
|
type ConnectorConfig,
|
|
21
|
-
} from './
|
|
21
|
+
} from './config.js';
|
|
22
22
|
import {
|
|
23
23
|
bearerHeaders,
|
|
24
24
|
fixedTarget,
|
|
25
25
|
unrefreshedTarget,
|
|
26
26
|
type RelayTarget,
|
|
27
|
-
} from './
|
|
27
|
+
} from './relay-target.js';
|
|
28
28
|
import {
|
|
29
29
|
connectorFromRow,
|
|
30
30
|
UNVERIFIED,
|
|
@@ -32,11 +32,11 @@ import {
|
|
|
32
32
|
type ConnectorCheck,
|
|
33
33
|
type ConnectorInput,
|
|
34
34
|
type DeletedConnector,
|
|
35
|
-
} from './
|
|
36
|
-
import { agentsDir } from '
|
|
37
|
-
import { assertLocalOwner, LOCAL_PROJECT_ID } from '
|
|
38
|
-
import { newId } from '
|
|
39
|
-
import type { LoadedConnector } from '
|
|
35
|
+
} from './model.js';
|
|
36
|
+
import { agentsDir } from '../agents/files.js';
|
|
37
|
+
import { assertLocalOwner, LOCAL_PROJECT_ID } from '../agents/file-admin.js';
|
|
38
|
+
import { newId } from '@metro-labs/core/ids';
|
|
39
|
+
import type { LoadedConnector } from '../stations/materialize.js';
|
|
40
40
|
|
|
41
41
|
export interface LocalConnectorRow {
|
|
42
42
|
id: string;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { errMsg, log } from '
|
|
1
|
+
import { errMsg, log } from '@metro-labs/core/log';
|
|
2
2
|
import {
|
|
3
3
|
ConnectorNotMcp,
|
|
4
4
|
ConnectorUnauthorized,
|
|
5
5
|
refused,
|
|
6
6
|
safeIconSrc,
|
|
7
|
-
} from './
|
|
8
|
-
import { toToolList, type ToolInfo } from './
|
|
7
|
+
} from './url.js';
|
|
8
|
+
import { toToolList, type ToolInfo } from './tools.js';
|
|
9
9
|
|
|
10
10
|
export {
|
|
11
11
|
ConnectorUnauthorized,
|
|
12
12
|
ConnectorVerifyError,
|
|
13
13
|
connectorUrlText,
|
|
14
14
|
parseConnectorUrl,
|
|
15
|
-
} from './
|
|
16
|
-
import { isRecord } from '
|
|
15
|
+
} from './url.js';
|
|
16
|
+
import { isRecord } from '@metro-labs/core/is-record';
|
|
17
17
|
|
|
18
18
|
export interface OAuthTokens {
|
|
19
19
|
accessToken: string;
|
package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-grant.ts
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { randomBytes, timingSafeEqual } from 'node:crypto';
|
|
2
|
-
import { ID_RE } from '
|
|
2
|
+
import { ID_RE } from '@metro-labs/core/ids';
|
|
3
3
|
import { readFileSync } from 'node:fs';
|
|
4
|
-
import { resolveCachedAttachment } from '
|
|
5
|
-
import { writeSecure } from '
|
|
4
|
+
import { resolveCachedAttachment } from '@metro-labs/core/stations/attachments';
|
|
5
|
+
import { writeSecure } from '@metro-labs/core/secure-fs';
|
|
6
6
|
|
|
7
7
|
const GRANT_SUFFIX = '.grant';
|
|
8
8
|
|
package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-owner.ts
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { ID_RE } from '
|
|
3
|
-
import { resolveCachedAttachment } from '
|
|
4
|
-
import { writeSecure } from '
|
|
2
|
+
import { ID_RE } from '@metro-labs/core/ids';
|
|
3
|
+
import { resolveCachedAttachment } from '@metro-labs/core/stations/attachments';
|
|
4
|
+
import { writeSecure } from '@metro-labs/core/secure-fs';
|
|
5
5
|
|
|
6
6
|
const OWNER_SUFFIX = '.owner';
|
|
7
7
|
|
package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-serve.ts
RENAMED
|
@@ -4,7 +4,7 @@ import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
|
4
4
|
import {
|
|
5
5
|
guessMime,
|
|
6
6
|
resolveCachedAttachment,
|
|
7
|
-
} from '
|
|
7
|
+
} from '@metro-labs/core/stations/attachments';
|
|
8
8
|
import {
|
|
9
9
|
allowedAgents,
|
|
10
10
|
authenticate,
|
|
@@ -12,9 +12,8 @@ import {
|
|
|
12
12
|
} from '../mcp/request-identity.js';
|
|
13
13
|
import { attachmentOwner, recordAttachmentOwner } from './attach-owner.js';
|
|
14
14
|
import { grantAllows, issueAttachmentGrant } from './attach-grant.js';
|
|
15
|
-
import { errMsg, log } from '
|
|
16
|
-
import { currentTunnelUrl, webhookPort } from '
|
|
17
|
-
import { isLocalMode } from './paths.js';
|
|
15
|
+
import { errMsg, log } from '@metro-labs/core/log';
|
|
16
|
+
import { currentTunnelUrl, webhookPort } from '../net/tunnel.js';
|
|
18
17
|
|
|
19
18
|
function authorized(req: IncomingMessage, name: string): boolean {
|
|
20
19
|
const owner = attachmentOwner(name);
|
|
@@ -25,21 +24,15 @@ function authorized(req: IncomingMessage, name: string): boolean {
|
|
|
25
24
|
);
|
|
26
25
|
}
|
|
27
26
|
|
|
28
|
-
const DEFAULT_PUBLIC_BASE = 'https://api.metro.box';
|
|
29
|
-
|
|
30
27
|
export function publicBaseUrl(): string | null {
|
|
31
28
|
const env = process.env.METRO_PUBLIC_URL?.trim();
|
|
32
29
|
if (env) return env.replace(/\/+$/, '');
|
|
33
30
|
return currentTunnelUrl();
|
|
34
31
|
}
|
|
35
32
|
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
const localBase = (): string | null =>
|
|
39
|
-
servesLocally() ? `http://127.0.0.1:${String(webhookPort())}` : null;
|
|
33
|
+
const localBase = (): string => `http://127.0.0.1:${String(webhookPort())}`;
|
|
40
34
|
|
|
41
|
-
export const publicBaseOrDefault = (): string =>
|
|
42
|
-
publicBaseUrl() ?? localBase() ?? DEFAULT_PUBLIC_BASE;
|
|
35
|
+
export const publicBaseOrDefault = (): string => publicBaseUrl() ?? localBase();
|
|
43
36
|
|
|
44
37
|
export function attachmentUrl(
|
|
45
38
|
pathOrName: string,
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { open, rename, rm, type FileHandle } from 'node:fs/promises';
|
|
2
2
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
3
|
-
import { guessMime } from '
|
|
3
|
+
import { guessMime } from '@metro-labs/core/stations/attachments';
|
|
4
4
|
import { safeFileName } from '../stations/attach-inline.js';
|
|
5
5
|
import {
|
|
6
6
|
allowedAgents,
|
|
7
7
|
authenticate,
|
|
8
8
|
extractToken,
|
|
9
9
|
} from '../mcp/request-identity.js';
|
|
10
|
-
import { ApiError } from '
|
|
11
|
-
import { apiFailure, cors, sendJson } from '
|
|
12
|
-
import { log } from '
|
|
13
|
-
import { writeSecure } from '
|
|
10
|
+
import { ApiError } from '@metro-labs/http/api-error';
|
|
11
|
+
import { apiFailure, cors, sendJson } from '@metro-labs/http/api-http';
|
|
12
|
+
import { log } from '@metro-labs/core/log';
|
|
13
|
+
import { writeSecure } from '@metro-labs/core/secure-fs';
|
|
14
14
|
import {
|
|
15
15
|
createUploadSlot,
|
|
16
16
|
liveUploadBytes,
|