@x-code-cli/core 0.2.10 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/compression.d.ts +12 -2
- package/dist/agent/compression.d.ts.map +1 -1
- package/dist/agent/compression.js +51 -2
- package/dist/agent/compression.js.map +1 -1
- package/dist/agent/file-ingest.js +2 -2
- package/dist/agent/file-ingest.js.map +1 -1
- package/dist/agent/loop-state.d.ts +3 -2
- package/dist/agent/loop-state.d.ts.map +1 -1
- package/dist/agent/loop-state.js.map +1 -1
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +134 -5
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/memory-extractor.js +5 -5
- package/dist/agent/memory-extractor.js.map +1 -1
- package/dist/agent/plan-storage.js +1 -1
- package/dist/agent/plan-storage.js.map +1 -1
- package/dist/agent/sub-agents/index.d.ts +2 -1
- package/dist/agent/sub-agents/index.d.ts.map +1 -1
- package/dist/agent/sub-agents/index.js +1 -1
- package/dist/agent/sub-agents/index.js.map +1 -1
- package/dist/agent/sub-agents/loader.d.ts +13 -3
- package/dist/agent/sub-agents/loader.d.ts.map +1 -1
- package/dist/agent/sub-agents/loader.js +36 -9
- package/dist/agent/sub-agents/loader.js.map +1 -1
- package/dist/agent/sub-agents/registry.d.ts +18 -1
- package/dist/agent/sub-agents/registry.d.ts.map +1 -1
- package/dist/agent/sub-agents/registry.js +38 -5
- package/dist/agent/sub-agents/registry.js.map +1 -1
- package/dist/agent/sub-agents/runner.d.ts.map +1 -1
- package/dist/agent/sub-agents/runner.js +45 -1
- package/dist/agent/sub-agents/runner.js.map +1 -1
- package/dist/agent/sub-agents/types.d.ts +4 -1
- package/dist/agent/sub-agents/types.d.ts.map +1 -1
- package/dist/agent/system-prompt.d.ts +21 -0
- package/dist/agent/system-prompt.d.ts.map +1 -1
- package/dist/agent/system-prompt.js +68 -2
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/tool-execution.d.ts.map +1 -1
- package/dist/agent/tool-execution.js +220 -1
- package/dist/agent/tool-execution.js.map +1 -1
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +3 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/loader.d.ts +13 -0
- package/dist/commands/loader.d.ts.map +1 -0
- package/dist/commands/loader.js +93 -0
- package/dist/commands/loader.js.map +1 -0
- package/dist/commands/registry.d.ts +44 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +102 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/types.d.ts +23 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +26 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +12 -10
- package/dist/config/index.js.map +1 -1
- package/dist/hooks/bus.d.ts +54 -0
- package/dist/hooks/bus.d.ts.map +1 -0
- package/dist/hooks/bus.js +165 -0
- package/dist/hooks/bus.js.map +1 -0
- package/dist/hooks/config-schema.d.ts +854 -0
- package/dist/hooks/config-schema.d.ts.map +1 -0
- package/dist/hooks/config-schema.js +79 -0
- package/dist/hooks/config-schema.js.map +1 -0
- package/dist/hooks/executor.d.ts +16 -0
- package/dist/hooks/executor.d.ts.map +1 -0
- package/dist/hooks/executor.js +183 -0
- package/dist/hooks/executor.js.map +1 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/registry.d.ts +23 -0
- package/dist/hooks/registry.d.ts.map +1 -0
- package/dist/hooks/registry.js +49 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/types.d.ts +165 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +25 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/hooks/variables.d.ts +22 -0
- package/dist/hooks/variables.d.ts.map +1 -0
- package/dist/hooks/variables.js +80 -0
- package/dist/hooks/variables.js.map +1 -0
- package/dist/index.d.ts +56 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -1
- package/dist/index.js.map +1 -1
- package/dist/knowledge/auto-memory.d.ts +1 -1
- package/dist/knowledge/auto-memory.d.ts.map +1 -1
- package/dist/knowledge/auto-memory.js +10 -10
- package/dist/knowledge/auto-memory.js.map +1 -1
- package/dist/knowledge/loader.js +12 -12
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/mcp/arg-parser.d.ts +49 -0
- package/dist/mcp/arg-parser.d.ts.map +1 -0
- package/dist/mcp/arg-parser.js +357 -0
- package/dist/mcp/arg-parser.js.map +1 -0
- package/dist/mcp/client.d.ts +73 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +376 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config-schema.d.ts +64 -0
- package/dist/mcp/config-schema.d.ts.map +1 -0
- package/dist/mcp/config-schema.js +86 -0
- package/dist/mcp/config-schema.js.map +1 -0
- package/dist/mcp/config-writer.d.ts +41 -0
- package/dist/mcp/config-writer.d.ts.map +1 -0
- package/dist/mcp/config-writer.js +138 -0
- package/dist/mcp/config-writer.js.map +1 -0
- package/dist/mcp/env-safety.d.ts +12 -0
- package/dist/mcp/env-safety.d.ts.map +1 -0
- package/dist/mcp/env-safety.js +80 -0
- package/dist/mcp/env-safety.js.map +1 -0
- package/dist/mcp/expand-env.d.ts +14 -0
- package/dist/mcp/expand-env.d.ts.map +1 -0
- package/dist/mcp/expand-env.js +52 -0
- package/dist/mcp/expand-env.js.map +1 -0
- package/dist/mcp/loader.d.ts +81 -0
- package/dist/mcp/loader.d.ts.map +1 -0
- package/dist/mcp/loader.js +223 -0
- package/dist/mcp/loader.js.map +1 -0
- package/dist/mcp/name-mangling.d.ts +11 -0
- package/dist/mcp/name-mangling.d.ts.map +1 -0
- package/dist/mcp/name-mangling.js +82 -0
- package/dist/mcp/name-mangling.js.map +1 -0
- package/dist/mcp/oauth/callback-server.d.ts +25 -0
- package/dist/mcp/oauth/callback-server.d.ts.map +1 -0
- package/dist/mcp/oauth/callback-server.js +118 -0
- package/dist/mcp/oauth/callback-server.js.map +1 -0
- package/dist/mcp/oauth/provider.d.ts +80 -0
- package/dist/mcp/oauth/provider.d.ts.map +1 -0
- package/dist/mcp/oauth/provider.js +292 -0
- package/dist/mcp/oauth/provider.js.map +1 -0
- package/dist/mcp/oauth/token-storage.d.ts +42 -0
- package/dist/mcp/oauth/token-storage.d.ts.map +1 -0
- package/dist/mcp/oauth/token-storage.js +121 -0
- package/dist/mcp/oauth/token-storage.js.map +1 -0
- package/dist/mcp/permissions.d.ts +28 -0
- package/dist/mcp/permissions.d.ts.map +1 -0
- package/dist/mcp/permissions.js +105 -0
- package/dist/mcp/permissions.js.map +1 -0
- package/dist/mcp/registry.d.ts +150 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +334 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/resources.d.ts +7 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +40 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/tool-bridge.d.ts +16 -0
- package/dist/mcp/tool-bridge.d.ts.map +1 -0
- package/dist/mcp/tool-bridge.js +56 -0
- package/dist/mcp/tool-bridge.js.map +1 -0
- package/dist/mcp/trust.d.ts +31 -0
- package/dist/mcp/trust.d.ts.map +1 -0
- package/dist/mcp/trust.js +103 -0
- package/dist/mcp/trust.js.map +1 -0
- package/dist/mcp/types.d.ts +73 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +13 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/permissions/session-store.d.ts +4 -1
- package/dist/permissions/session-store.d.ts.map +1 -1
- package/dist/permissions/session-store.js +6 -1
- package/dist/permissions/session-store.js.map +1 -1
- package/dist/plugins/consent.d.ts +87 -0
- package/dist/plugins/consent.d.ts.map +1 -0
- package/dist/plugins/consent.js +181 -0
- package/dist/plugins/consent.js.map +1 -0
- package/dist/plugins/enable-state.d.ts +34 -0
- package/dist/plugins/enable-state.d.ts.map +1 -0
- package/dist/plugins/enable-state.js +159 -0
- package/dist/plugins/enable-state.js.map +1 -0
- package/dist/plugins/installer.d.ts +64 -0
- package/dist/plugins/installer.d.ts.map +1 -0
- package/dist/plugins/installer.js +416 -0
- package/dist/plugins/installer.js.map +1 -0
- package/dist/plugins/integration.d.ts +91 -0
- package/dist/plugins/integration.d.ts.map +1 -0
- package/dist/plugins/integration.js +233 -0
- package/dist/plugins/integration.js.map +1 -0
- package/dist/plugins/loader.d.ts +69 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +243 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/manifest.d.ts +23 -0
- package/dist/plugins/manifest.d.ts.map +1 -0
- package/dist/plugins/manifest.js +143 -0
- package/dist/plugins/manifest.js.map +1 -0
- package/dist/plugins/marketplace.d.ts +100 -0
- package/dist/plugins/marketplace.d.ts.map +1 -0
- package/dist/plugins/marketplace.js +529 -0
- package/dist/plugins/marketplace.js.map +1 -0
- package/dist/plugins/paths.d.ts +44 -0
- package/dist/plugins/paths.d.ts.map +1 -0
- package/dist/plugins/paths.js +89 -0
- package/dist/plugins/paths.js.map +1 -0
- package/dist/plugins/refresh.d.ts +61 -0
- package/dist/plugins/refresh.d.ts.map +1 -0
- package/dist/plugins/refresh.js +98 -0
- package/dist/plugins/refresh.js.map +1 -0
- package/dist/plugins/registry.d.ts +40 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +80 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/types.d.ts +225 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +16 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/plugins/user-config.d.ts +22 -0
- package/dist/plugins/user-config.d.ts.map +1 -0
- package/dist/plugins/user-config.js +96 -0
- package/dist/plugins/user-config.js.map +1 -0
- package/dist/skills/loader.d.ts +19 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +197 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts +74 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +136 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/settings.d.ts +13 -0
- package/dist/skills/settings.d.ts.map +1 -0
- package/dist/skills/settings.js +100 -0
- package/dist/skills/settings.js.map +1 -0
- package/dist/tools/activate-skill.d.ts +5 -0
- package/dist/tools/activate-skill.d.ts.map +1 -0
- package/dist/tools/activate-skill.js +33 -0
- package/dist/tools/activate-skill.js.map +1 -0
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/todo-write.d.ts +1 -1
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +2 -1
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/types/index.d.ts +46 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils.d.ts +23 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +76 -20
- package/dist/utils.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +47 -0
- package/dist/version.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/mcp/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const MCP_MAX_NAME_LEN = 64;
|
|
2
|
+
/** Build the model-facing tool name for one MCP tool.
|
|
3
|
+
*
|
|
4
|
+
* `existing` is the set of names already taken in the current registry —
|
|
5
|
+
* if the new name collides, we append a 4-char hash of the server name
|
|
6
|
+
* to disambiguate. (Hashing the server, not the tool, is intentional:
|
|
7
|
+
* the tool name carries the semantic meaning the model relies on; the
|
|
8
|
+
* server name is the part the user picked, so the disambiguator is
|
|
9
|
+
* more meaningful keyed to it.) */
|
|
10
|
+
export declare function buildCallableName(serverName: string, rawToolName: string, existing: ReadonlySet<string>): string;
|
|
11
|
+
//# sourceMappingURL=name-mangling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"name-mangling.d.ts","sourceRoot":"","sources":["../../src/mcp/name-mangling.ts"],"names":[],"mappings":"AA8BA,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAkBlC;;;;;;;oCAOoC;AACpC,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAiChH"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// @x-code-cli/core — MCP tool name mangling
|
|
2
|
+
//
|
|
3
|
+
// We expose MCP tools to the model under namespaced names so they can't
|
|
4
|
+
// collide with built-in tools (readFile, shell, ...) and so the model
|
|
5
|
+
// can tell at a glance "this came from server X":
|
|
6
|
+
//
|
|
7
|
+
// <server>__<tool>
|
|
8
|
+
//
|
|
9
|
+
// Both server and tool names are sanitised: any char outside
|
|
10
|
+
// [A-Za-z0-9_] becomes `_`. We pick `__` (double underscore) as the
|
|
11
|
+
// separator so a tool whose raw name contains a single underscore
|
|
12
|
+
// (very common — `read_file`, `list_issues`) is unambiguous.
|
|
13
|
+
//
|
|
14
|
+
// No `mcp__` umbrella prefix — Claude Code adds one (`mcp__<server>__<tool>`)
|
|
15
|
+
// but it burns tokens per-tool without telling the model anything the
|
|
16
|
+
// description doesn't already carry. Codex and Gemini CLI both omit the
|
|
17
|
+
// prefix; we follow them. "Is this tool MCP or built-in?" routing is a
|
|
18
|
+
// registry lookup in tool-execution.ts, not a name-prefix check.
|
|
19
|
+
//
|
|
20
|
+
// The model-facing tool name has a hard cap at 64 chars (OpenAI's
|
|
21
|
+
// historical limit; Anthropic/Google are higher but 64 keeps us
|
|
22
|
+
// portable). Over-length names are truncated and tagged with a 6-char
|
|
23
|
+
// content hash so two long, similar names still differ.
|
|
24
|
+
//
|
|
25
|
+
// Cross-server name collisions are rare in practice but possible
|
|
26
|
+
// (two servers both expose `read_file`). We resolve them by hashing
|
|
27
|
+
// the server name into a 4-char suffix on whichever entry was added
|
|
28
|
+
// second.
|
|
29
|
+
import { createHash } from 'node:crypto';
|
|
30
|
+
export const MCP_MAX_NAME_LEN = 64;
|
|
31
|
+
function sanitize(part) {
|
|
32
|
+
// Replace any run of disallowed chars with a single `_`. Trim leading
|
|
33
|
+
// / trailing underscores so we don't end up with `_server__tool_`.
|
|
34
|
+
const cleaned = part.replace(/[^A-Za-z0-9_]+/g, '_').replace(/^_+|_+$/g, '');
|
|
35
|
+
// Empty after sanitisation (e.g. all-CJK server name) → fall back to a
|
|
36
|
+
// hash so we still produce a stable, valid identifier.
|
|
37
|
+
if (cleaned === '') {
|
|
38
|
+
return shortHash(part, 6);
|
|
39
|
+
}
|
|
40
|
+
return cleaned;
|
|
41
|
+
}
|
|
42
|
+
function shortHash(input, len) {
|
|
43
|
+
return createHash('sha256').update(input).digest('hex').slice(0, len);
|
|
44
|
+
}
|
|
45
|
+
/** Build the model-facing tool name for one MCP tool.
|
|
46
|
+
*
|
|
47
|
+
* `existing` is the set of names already taken in the current registry —
|
|
48
|
+
* if the new name collides, we append a 4-char hash of the server name
|
|
49
|
+
* to disambiguate. (Hashing the server, not the tool, is intentional:
|
|
50
|
+
* the tool name carries the semantic meaning the model relies on; the
|
|
51
|
+
* server name is the part the user picked, so the disambiguator is
|
|
52
|
+
* more meaningful keyed to it.) */
|
|
53
|
+
export function buildCallableName(serverName, rawToolName, existing) {
|
|
54
|
+
const s = sanitize(serverName);
|
|
55
|
+
const t = sanitize(rawToolName);
|
|
56
|
+
let name = `${s}__${t}`;
|
|
57
|
+
// Over-length: truncate while preserving a content hash so
|
|
58
|
+
// truncated-different names don't collapse to the same string.
|
|
59
|
+
if (name.length > MCP_MAX_NAME_LEN) {
|
|
60
|
+
const hash = shortHash(`${serverName}::${rawToolName}`, 6);
|
|
61
|
+
const room = MCP_MAX_NAME_LEN - 1 /* underscore */ - hash.length;
|
|
62
|
+
name = `${(s + '__' + t).slice(0, room)}_${hash}`;
|
|
63
|
+
}
|
|
64
|
+
// Collision: append a 4-char server-name hash. If THAT still collides
|
|
65
|
+
// (theoretically possible across many servers), bump the hash length
|
|
66
|
+
// until unique — bounded by MCP_MAX_NAME_LEN.
|
|
67
|
+
if (existing.has(name)) {
|
|
68
|
+
for (let extra = 4; extra <= 12; extra++) {
|
|
69
|
+
const suffix = '_' + shortHash(serverName, extra);
|
|
70
|
+
const candidate = name.length + suffix.length <= MCP_MAX_NAME_LEN
|
|
71
|
+
? name + suffix
|
|
72
|
+
: name.slice(0, MCP_MAX_NAME_LEN - suffix.length) + suffix;
|
|
73
|
+
if (!existing.has(candidate)) {
|
|
74
|
+
return candidate;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Pathological: just append a random-ish suffix and hope.
|
|
78
|
+
return name.slice(0, MCP_MAX_NAME_LEN - 9) + '_' + shortHash(name + Date.now(), 8);
|
|
79
|
+
}
|
|
80
|
+
return name;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=name-mangling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"name-mangling.js","sourceRoot":"","sources":["../../src/mcp/name-mangling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface CallbackResult {
|
|
2
|
+
code: string;
|
|
3
|
+
state?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface RunningCallbackServer {
|
|
6
|
+
/** The full redirect URL to advertise to the auth server. */
|
|
7
|
+
url: string;
|
|
8
|
+
/** Resolves with the code/state on the first valid callback request,
|
|
9
|
+
* or rejects on timeout / OAuth error response. */
|
|
10
|
+
waitForCallback: () => Promise<CallbackResult>;
|
|
11
|
+
/** Stop accepting new connections and free the port. Idempotent. */
|
|
12
|
+
close: () => void;
|
|
13
|
+
}
|
|
14
|
+
export interface StartOptions {
|
|
15
|
+
/** Max time to wait (ms). Default 5 minutes. */
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
/** Path on which the auth server should redirect.
|
|
18
|
+
* Default '/callback'. */
|
|
19
|
+
path?: string;
|
|
20
|
+
}
|
|
21
|
+
/** Start the listener and return control to the caller so it can hand
|
|
22
|
+
* the URL to the auth provider. The actual waiting happens via the
|
|
23
|
+
* returned `waitForCallback()` promise. */
|
|
24
|
+
export declare function startCallbackServer(options?: StartOptions): Promise<RunningCallbackServer>;
|
|
25
|
+
//# sourceMappingURL=callback-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback-server.d.ts","sourceRoot":"","sources":["../../../src/mcp/oauth/callback-server.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAA;IACX;wDACoD;IACpD,eAAe,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAA;IAC9C,oEAAoE;IACpE,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;+BAC2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAKD;;4CAE4C;AAC5C,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAmGpG"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// @x-code-cli/core — Local OAuth callback receiver
|
|
2
|
+
//
|
|
3
|
+
// Spins up an ephemeral HTTP server on 127.0.0.1:<random-port>/callback,
|
|
4
|
+
// waits for the user's authorization-server redirect, returns the
|
|
5
|
+
// captured `code` + `state` (or error). Auto-closes after the first
|
|
6
|
+
// request (or on timeout).
|
|
7
|
+
//
|
|
8
|
+
// Why ephemeral & random-port:
|
|
9
|
+
// - A fixed port collides if two CLIs run concurrently.
|
|
10
|
+
// - Random ports require the OAuth provider to be told the URL after
|
|
11
|
+
// the listener is up — we expose `start()` returning the actual URL
|
|
12
|
+
// before resolving any callbacks.
|
|
13
|
+
//
|
|
14
|
+
// Security:
|
|
15
|
+
// - Bound to 127.0.0.1 only, never 0.0.0.0 — the listener should not
|
|
16
|
+
// be reachable from other machines.
|
|
17
|
+
// - We only accept the first matching request; subsequent hits return
|
|
18
|
+
// a friendly "auth complete, you can close this window" page.
|
|
19
|
+
// - We do NOT validate `state` here — that's the SDK's job. We just
|
|
20
|
+
// forward whatever the auth server sent back.
|
|
21
|
+
import http from 'node:http';
|
|
22
|
+
import { debugLog } from '../../utils.js';
|
|
23
|
+
const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000;
|
|
24
|
+
const DEFAULT_PATH = '/callback';
|
|
25
|
+
/** Start the listener and return control to the caller so it can hand
|
|
26
|
+
* the URL to the auth provider. The actual waiting happens via the
|
|
27
|
+
* returned `waitForCallback()` promise. */
|
|
28
|
+
export async function startCallbackServer(options = {}) {
|
|
29
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
30
|
+
const expectedPath = options.path ?? DEFAULT_PATH;
|
|
31
|
+
let resolveOnce = null;
|
|
32
|
+
let rejectOnce = null;
|
|
33
|
+
const waiter = new Promise((res, rej) => {
|
|
34
|
+
resolveOnce = res;
|
|
35
|
+
rejectOnce = rej;
|
|
36
|
+
});
|
|
37
|
+
const server = http.createServer((req, response) => {
|
|
38
|
+
if (!req.url) {
|
|
39
|
+
response.writeHead(400).end('missing URL');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Parse against a dummy base — we only care about pathname + search.
|
|
43
|
+
const u = new URL(req.url, 'http://localhost');
|
|
44
|
+
if (u.pathname !== expectedPath) {
|
|
45
|
+
response.writeHead(404).end('not found');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const err = u.searchParams.get('error');
|
|
49
|
+
if (err) {
|
|
50
|
+
const desc = u.searchParams.get('error_description') ?? '';
|
|
51
|
+
response
|
|
52
|
+
.writeHead(400, { 'Content-Type': 'text/html' })
|
|
53
|
+
.end(`<html><body><h1>Authorization failed</h1><p>${escapeHtml(err)}: ${escapeHtml(desc)}</p></body></html>`);
|
|
54
|
+
rejectOnce?.(new Error(`OAuth callback error: ${err} ${desc}`.trim()));
|
|
55
|
+
resolveOnce = null;
|
|
56
|
+
rejectOnce = null;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const code = u.searchParams.get('code');
|
|
60
|
+
if (!code) {
|
|
61
|
+
response.writeHead(400).end('missing code');
|
|
62
|
+
rejectOnce?.(new Error('OAuth callback missing `code` parameter'));
|
|
63
|
+
resolveOnce = null;
|
|
64
|
+
rejectOnce = null;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const state = u.searchParams.get('state') ?? undefined;
|
|
68
|
+
response
|
|
69
|
+
.writeHead(200, { 'Content-Type': 'text/html' })
|
|
70
|
+
.end(`<html><body style="font-family:system-ui;padding:2rem;max-width:40rem;margin:auto;">` +
|
|
71
|
+
`<h1>Authorization complete</h1>` +
|
|
72
|
+
`<p>You can close this tab and return to the X-Code CLI.</p>` +
|
|
73
|
+
`</body></html>`);
|
|
74
|
+
resolveOnce?.({ code, state });
|
|
75
|
+
resolveOnce = null;
|
|
76
|
+
rejectOnce = null;
|
|
77
|
+
});
|
|
78
|
+
// Watch for socket errors so a connection reset doesn't crash the
|
|
79
|
+
// CLI on Windows where ECONNRESET is more common.
|
|
80
|
+
server.on('error', (err) => {
|
|
81
|
+
debugLog('mcp.callback-server-error', String(err));
|
|
82
|
+
rejectOnce?.(err);
|
|
83
|
+
resolveOnce = null;
|
|
84
|
+
rejectOnce = null;
|
|
85
|
+
});
|
|
86
|
+
// Bind to ephemeral port. listen(0, '127.0.0.1') asks the OS for any
|
|
87
|
+
// free port; the actual one comes out of address().
|
|
88
|
+
await new Promise((resolve, reject) => {
|
|
89
|
+
server.once('error', reject);
|
|
90
|
+
server.listen(0, '127.0.0.1', () => {
|
|
91
|
+
server.removeListener('error', reject);
|
|
92
|
+
resolve();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
const addr = server.address();
|
|
96
|
+
const url = `http://127.0.0.1:${addr.port}${expectedPath}`;
|
|
97
|
+
const timeoutHandle = setTimeout(() => {
|
|
98
|
+
rejectOnce?.(new Error(`OAuth callback timed out after ${timeoutMs}ms`));
|
|
99
|
+
resolveOnce = null;
|
|
100
|
+
rejectOnce = null;
|
|
101
|
+
}, timeoutMs);
|
|
102
|
+
// Clear the timer on either resolution path.
|
|
103
|
+
void waiter.finally(() => clearTimeout(timeoutHandle));
|
|
104
|
+
let closed = false;
|
|
105
|
+
const close = () => {
|
|
106
|
+
if (closed)
|
|
107
|
+
return;
|
|
108
|
+
closed = true;
|
|
109
|
+
server.close();
|
|
110
|
+
};
|
|
111
|
+
// Auto-close once we've handled the (single) callback.
|
|
112
|
+
void waiter.finally(close);
|
|
113
|
+
return { url, waitForCallback: () => waiter, close };
|
|
114
|
+
}
|
|
115
|
+
function escapeHtml(s) {
|
|
116
|
+
return s.replace(/[&<>"']/g, (c) => c === '&' ? '&' : c === '<' ? '<' : c === '>' ? '>' : c === '"' ? '"' : ''');
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=callback-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback-server.js","sourceRoot":"","sources":["../../../src/mcp/oauth/callback-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
2
|
+
import type { OAuthClientInformationMixed, OAuthClientMetadata, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
|
|
3
|
+
import { McpTokenStorage } from './token-storage.js';
|
|
4
|
+
export interface CreateProviderOptions {
|
|
5
|
+
serverName: string;
|
|
6
|
+
serverUrl: string;
|
|
7
|
+
storage: McpTokenStorage;
|
|
8
|
+
/** Callback that should be invoked just before the browser opens,
|
|
9
|
+
* e.g. to print "Opening browser for sentry auth..." to the CLI UI. */
|
|
10
|
+
onOpenBrowser?: (url: string) => void;
|
|
11
|
+
}
|
|
12
|
+
/** Concrete provider, wired up to fetched persisted state + a callback
|
|
13
|
+
* server that gets started on demand. Reused across multiple connect /
|
|
14
|
+
* refresh attempts for the same server. */
|
|
15
|
+
export declare class McpOAuthProvider implements OAuthClientProvider {
|
|
16
|
+
private readonly opts;
|
|
17
|
+
/** Currently-running callback server. We keep a handle so a second
|
|
18
|
+
* call to redirectToAuthorization (after a failed first attempt)
|
|
19
|
+
* reuses the same port instead of opening another listener. */
|
|
20
|
+
private callbackServer;
|
|
21
|
+
/** PKCE verifier — kept in memory only, replaced on each new flow. */
|
|
22
|
+
private memoryCodeVerifier;
|
|
23
|
+
/** Pending callback that the SDK will consume via `finishAuth` on
|
|
24
|
+
* the transport. Caller of `waitForAuthCode()` retrieves it. */
|
|
25
|
+
private pendingCode;
|
|
26
|
+
/** Whether `redirectToAuthorization` should actually launch a browser.
|
|
27
|
+
* Default false — booting the CLI with an HTTP MCP server that has
|
|
28
|
+
* no stored token must NOT silently open a browser window. The flag
|
|
29
|
+
* is flipped on for the duration of `connectWithOAuth` (driven by
|
|
30
|
+
* `/mcp auth <name>`) and back off in `finally`. */
|
|
31
|
+
private interactive;
|
|
32
|
+
constructor(opts: CreateProviderOptions);
|
|
33
|
+
/** Caller (client.ts:connectWithOAuth) toggles this around an
|
|
34
|
+
* authenticated dance. Outside that window we stay passive. */
|
|
35
|
+
setInteractive(value: boolean): void;
|
|
36
|
+
/** Eagerly start the callback server, so the real loopback port is
|
|
37
|
+
* available to `redirectUrl` and `clientMetadata.redirect_uris`
|
|
38
|
+
* BEFORE the SDK constructs the dynamic-registration request.
|
|
39
|
+
*
|
|
40
|
+
* Why this matters: Sentry (and any auth server that doesn't follow
|
|
41
|
+
* RFC 8252 §7.3 strictly) validates the auth-URL `redirect_uri` against
|
|
42
|
+
* the value the client registered with. If we register with the
|
|
43
|
+
* port-less placeholder and then redirect to a concrete port, the
|
|
44
|
+
* server replies "Invalid redirect URI" and the whole flow dies.
|
|
45
|
+
* Pre-starting the server ensures registration and authorization use
|
|
46
|
+
* the SAME concrete `http://127.0.0.1:<port>/callback`. */
|
|
47
|
+
prepareForAuth(): Promise<void>;
|
|
48
|
+
get redirectUrl(): string;
|
|
49
|
+
get clientMetadata(): OAuthClientMetadata;
|
|
50
|
+
clientInformation(): Promise<OAuthClientInformationMixed | undefined>;
|
|
51
|
+
saveClientInformation(info: OAuthClientInformationMixed): Promise<void>;
|
|
52
|
+
tokens(): Promise<OAuthTokens | undefined>;
|
|
53
|
+
saveTokens(tokens: OAuthTokens): Promise<void>;
|
|
54
|
+
saveCodeVerifier(codeVerifier: string): void;
|
|
55
|
+
codeVerifier(): string;
|
|
56
|
+
redirectToAuthorization(authorizationUrl: URL): Promise<void>;
|
|
57
|
+
/** Block until the auth server has redirected back. Resolves with the
|
|
58
|
+
* captured code; the caller then calls `transport.finishAuth(code)`
|
|
59
|
+
* on the SDK's StreamableHTTPClientTransport.
|
|
60
|
+
*
|
|
61
|
+
* We close the callback server here because we already have the code
|
|
62
|
+
* — Sentry won't call us back again on this flow. But we leave
|
|
63
|
+
* `memoryCodeVerifier` alive: the SDK reads it during
|
|
64
|
+
* `transport.finishAuth(code)`, which the caller runs AFTER this
|
|
65
|
+
* promise resolves. Nulling the verifier in this finally block was
|
|
66
|
+
* the cause of "No PKCE verifier set — auth flow not in progress".
|
|
67
|
+
* Cleanup of the verifier happens either via `cancel()` (abort
|
|
68
|
+
* path) or naturally on the next `saveCodeVerifier(...)` call. */
|
|
69
|
+
waitForAuthCode(): Promise<{
|
|
70
|
+
code: string;
|
|
71
|
+
state?: string;
|
|
72
|
+
}>;
|
|
73
|
+
/** Drop any in-progress flow without saving. Safe to call any time. */
|
|
74
|
+
cancel(): void;
|
|
75
|
+
private ensureCallbackServer;
|
|
76
|
+
}
|
|
77
|
+
/** Factory used by loader.ts. Returns undefined for stdio servers — the
|
|
78
|
+
* loader skips OAuth construction for those. */
|
|
79
|
+
export declare function createOAuthProviderFactory(storage: McpTokenStorage, onOpenBrowser?: (serverName: string, url: string) => void): (serverName: string, serverUrl: string) => McpOAuthProvider;
|
|
80
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/mcp/oauth/provider.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AACnF,OAAO,KAAK,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,WAAW,EACZ,MAAM,0CAA0C,CAAA;AAMjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAUpD,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,eAAe,CAAA;IACxB;4EACwE;IACxE,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CACtC;AAED;;4CAE4C;AAC5C,qBAAa,gBAAiB,YAAW,mBAAmB;IAiB9C,OAAO,CAAC,QAAQ,CAAC,IAAI;IAhBjC;;oEAEgE;IAChE,OAAO,CAAC,cAAc,CAAqC;IAC3D,sEAAsE;IACtE,OAAO,CAAC,kBAAkB,CAAsB;IAChD;qEACiE;IACjE,OAAO,CAAC,WAAW,CAAyD;IAC5E;;;;yDAIqD;IACrD,OAAO,CAAC,WAAW,CAAQ;gBAEE,IAAI,EAAE,qBAAqB;IAExD;oEACgE;IAChE,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIpC;;;;;;;;;;gEAU4D;IACtD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrC,IAAI,WAAW,IAAI,MAAM,CAcxB;IAED,IAAI,cAAc,IAAI,mBAAmB,CASxC;IAEK,iBAAiB,IAAI,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC;IAKrE,qBAAqB,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,MAAM,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAK1C,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI5C,YAAY,IAAI,MAAM;IAOhB,uBAAuB,CAAC,gBAAgB,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCnE;;;;;;;;;;;uEAWmE;IAC7D,eAAe,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAalE,uEAAuE;IACvE,MAAM,IAAI,IAAI;YASA,oBAAoB;CAInC;AA+GD;iDACiD;AACjD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,eAAe,EACxB,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,IAEjD,YAAY,MAAM,EAAE,WAAW,MAAM,KAAG,gBAAgB,CAQjE"}
|