@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.
Files changed (251) hide show
  1. package/dist/agent/compression.d.ts +12 -2
  2. package/dist/agent/compression.d.ts.map +1 -1
  3. package/dist/agent/compression.js +51 -2
  4. package/dist/agent/compression.js.map +1 -1
  5. package/dist/agent/file-ingest.js +2 -2
  6. package/dist/agent/file-ingest.js.map +1 -1
  7. package/dist/agent/loop-state.d.ts +3 -2
  8. package/dist/agent/loop-state.d.ts.map +1 -1
  9. package/dist/agent/loop-state.js.map +1 -1
  10. package/dist/agent/loop.d.ts.map +1 -1
  11. package/dist/agent/loop.js +134 -5
  12. package/dist/agent/loop.js.map +1 -1
  13. package/dist/agent/memory-extractor.js +5 -5
  14. package/dist/agent/memory-extractor.js.map +1 -1
  15. package/dist/agent/plan-storage.js +1 -1
  16. package/dist/agent/plan-storage.js.map +1 -1
  17. package/dist/agent/sub-agents/index.d.ts +2 -1
  18. package/dist/agent/sub-agents/index.d.ts.map +1 -1
  19. package/dist/agent/sub-agents/index.js +1 -1
  20. package/dist/agent/sub-agents/index.js.map +1 -1
  21. package/dist/agent/sub-agents/loader.d.ts +13 -3
  22. package/dist/agent/sub-agents/loader.d.ts.map +1 -1
  23. package/dist/agent/sub-agents/loader.js +36 -9
  24. package/dist/agent/sub-agents/loader.js.map +1 -1
  25. package/dist/agent/sub-agents/registry.d.ts +18 -1
  26. package/dist/agent/sub-agents/registry.d.ts.map +1 -1
  27. package/dist/agent/sub-agents/registry.js +38 -5
  28. package/dist/agent/sub-agents/registry.js.map +1 -1
  29. package/dist/agent/sub-agents/runner.d.ts.map +1 -1
  30. package/dist/agent/sub-agents/runner.js +45 -1
  31. package/dist/agent/sub-agents/runner.js.map +1 -1
  32. package/dist/agent/sub-agents/types.d.ts +4 -1
  33. package/dist/agent/sub-agents/types.d.ts.map +1 -1
  34. package/dist/agent/system-prompt.d.ts +21 -0
  35. package/dist/agent/system-prompt.d.ts.map +1 -1
  36. package/dist/agent/system-prompt.js +68 -2
  37. package/dist/agent/system-prompt.js.map +1 -1
  38. package/dist/agent/tool-execution.d.ts.map +1 -1
  39. package/dist/agent/tool-execution.js +220 -1
  40. package/dist/agent/tool-execution.js.map +1 -1
  41. package/dist/commands/index.d.ts +6 -0
  42. package/dist/commands/index.d.ts.map +1 -0
  43. package/dist/commands/index.js +3 -0
  44. package/dist/commands/index.js.map +1 -0
  45. package/dist/commands/loader.d.ts +13 -0
  46. package/dist/commands/loader.d.ts.map +1 -0
  47. package/dist/commands/loader.js +93 -0
  48. package/dist/commands/loader.js.map +1 -0
  49. package/dist/commands/registry.d.ts +44 -0
  50. package/dist/commands/registry.d.ts.map +1 -0
  51. package/dist/commands/registry.js +102 -0
  52. package/dist/commands/registry.js.map +1 -0
  53. package/dist/commands/types.d.ts +23 -0
  54. package/dist/commands/types.d.ts.map +1 -0
  55. package/dist/commands/types.js +26 -0
  56. package/dist/commands/types.js.map +1 -0
  57. package/dist/config/index.d.ts +9 -0
  58. package/dist/config/index.d.ts.map +1 -1
  59. package/dist/config/index.js +12 -10
  60. package/dist/config/index.js.map +1 -1
  61. package/dist/hooks/bus.d.ts +54 -0
  62. package/dist/hooks/bus.d.ts.map +1 -0
  63. package/dist/hooks/bus.js +165 -0
  64. package/dist/hooks/bus.js.map +1 -0
  65. package/dist/hooks/config-schema.d.ts +854 -0
  66. package/dist/hooks/config-schema.d.ts.map +1 -0
  67. package/dist/hooks/config-schema.js +79 -0
  68. package/dist/hooks/config-schema.js.map +1 -0
  69. package/dist/hooks/executor.d.ts +16 -0
  70. package/dist/hooks/executor.d.ts.map +1 -0
  71. package/dist/hooks/executor.js +183 -0
  72. package/dist/hooks/executor.js.map +1 -0
  73. package/dist/hooks/index.d.ts +10 -0
  74. package/dist/hooks/index.d.ts.map +1 -0
  75. package/dist/hooks/index.js +6 -0
  76. package/dist/hooks/index.js.map +1 -0
  77. package/dist/hooks/registry.d.ts +23 -0
  78. package/dist/hooks/registry.d.ts.map +1 -0
  79. package/dist/hooks/registry.js +49 -0
  80. package/dist/hooks/registry.js.map +1 -0
  81. package/dist/hooks/types.d.ts +165 -0
  82. package/dist/hooks/types.d.ts.map +1 -0
  83. package/dist/hooks/types.js +25 -0
  84. package/dist/hooks/types.js.map +1 -0
  85. package/dist/hooks/variables.d.ts +22 -0
  86. package/dist/hooks/variables.d.ts.map +1 -0
  87. package/dist/hooks/variables.js +80 -0
  88. package/dist/hooks/variables.js.map +1 -0
  89. package/dist/index.d.ts +56 -1
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +37 -1
  92. package/dist/index.js.map +1 -1
  93. package/dist/knowledge/auto-memory.d.ts +1 -1
  94. package/dist/knowledge/auto-memory.d.ts.map +1 -1
  95. package/dist/knowledge/auto-memory.js +10 -10
  96. package/dist/knowledge/auto-memory.js.map +1 -1
  97. package/dist/knowledge/loader.js +12 -12
  98. package/dist/knowledge/loader.js.map +1 -1
  99. package/dist/mcp/arg-parser.d.ts +49 -0
  100. package/dist/mcp/arg-parser.d.ts.map +1 -0
  101. package/dist/mcp/arg-parser.js +357 -0
  102. package/dist/mcp/arg-parser.js.map +1 -0
  103. package/dist/mcp/client.d.ts +73 -0
  104. package/dist/mcp/client.d.ts.map +1 -0
  105. package/dist/mcp/client.js +376 -0
  106. package/dist/mcp/client.js.map +1 -0
  107. package/dist/mcp/config-schema.d.ts +64 -0
  108. package/dist/mcp/config-schema.d.ts.map +1 -0
  109. package/dist/mcp/config-schema.js +86 -0
  110. package/dist/mcp/config-schema.js.map +1 -0
  111. package/dist/mcp/config-writer.d.ts +41 -0
  112. package/dist/mcp/config-writer.d.ts.map +1 -0
  113. package/dist/mcp/config-writer.js +138 -0
  114. package/dist/mcp/config-writer.js.map +1 -0
  115. package/dist/mcp/env-safety.d.ts +12 -0
  116. package/dist/mcp/env-safety.d.ts.map +1 -0
  117. package/dist/mcp/env-safety.js +80 -0
  118. package/dist/mcp/env-safety.js.map +1 -0
  119. package/dist/mcp/expand-env.d.ts +14 -0
  120. package/dist/mcp/expand-env.d.ts.map +1 -0
  121. package/dist/mcp/expand-env.js +52 -0
  122. package/dist/mcp/expand-env.js.map +1 -0
  123. package/dist/mcp/loader.d.ts +81 -0
  124. package/dist/mcp/loader.d.ts.map +1 -0
  125. package/dist/mcp/loader.js +223 -0
  126. package/dist/mcp/loader.js.map +1 -0
  127. package/dist/mcp/name-mangling.d.ts +11 -0
  128. package/dist/mcp/name-mangling.d.ts.map +1 -0
  129. package/dist/mcp/name-mangling.js +82 -0
  130. package/dist/mcp/name-mangling.js.map +1 -0
  131. package/dist/mcp/oauth/callback-server.d.ts +25 -0
  132. package/dist/mcp/oauth/callback-server.d.ts.map +1 -0
  133. package/dist/mcp/oauth/callback-server.js +118 -0
  134. package/dist/mcp/oauth/callback-server.js.map +1 -0
  135. package/dist/mcp/oauth/provider.d.ts +80 -0
  136. package/dist/mcp/oauth/provider.d.ts.map +1 -0
  137. package/dist/mcp/oauth/provider.js +292 -0
  138. package/dist/mcp/oauth/provider.js.map +1 -0
  139. package/dist/mcp/oauth/token-storage.d.ts +42 -0
  140. package/dist/mcp/oauth/token-storage.d.ts.map +1 -0
  141. package/dist/mcp/oauth/token-storage.js +121 -0
  142. package/dist/mcp/oauth/token-storage.js.map +1 -0
  143. package/dist/mcp/permissions.d.ts +28 -0
  144. package/dist/mcp/permissions.d.ts.map +1 -0
  145. package/dist/mcp/permissions.js +105 -0
  146. package/dist/mcp/permissions.js.map +1 -0
  147. package/dist/mcp/registry.d.ts +150 -0
  148. package/dist/mcp/registry.d.ts.map +1 -0
  149. package/dist/mcp/registry.js +334 -0
  150. package/dist/mcp/registry.js.map +1 -0
  151. package/dist/mcp/resources.d.ts +7 -0
  152. package/dist/mcp/resources.d.ts.map +1 -0
  153. package/dist/mcp/resources.js +40 -0
  154. package/dist/mcp/resources.js.map +1 -0
  155. package/dist/mcp/tool-bridge.d.ts +16 -0
  156. package/dist/mcp/tool-bridge.d.ts.map +1 -0
  157. package/dist/mcp/tool-bridge.js +56 -0
  158. package/dist/mcp/tool-bridge.js.map +1 -0
  159. package/dist/mcp/trust.d.ts +31 -0
  160. package/dist/mcp/trust.d.ts.map +1 -0
  161. package/dist/mcp/trust.js +103 -0
  162. package/dist/mcp/trust.js.map +1 -0
  163. package/dist/mcp/types.d.ts +73 -0
  164. package/dist/mcp/types.d.ts.map +1 -0
  165. package/dist/mcp/types.js +13 -0
  166. package/dist/mcp/types.js.map +1 -0
  167. package/dist/permissions/session-store.d.ts +4 -1
  168. package/dist/permissions/session-store.d.ts.map +1 -1
  169. package/dist/permissions/session-store.js +6 -1
  170. package/dist/permissions/session-store.js.map +1 -1
  171. package/dist/plugins/consent.d.ts +87 -0
  172. package/dist/plugins/consent.d.ts.map +1 -0
  173. package/dist/plugins/consent.js +181 -0
  174. package/dist/plugins/consent.js.map +1 -0
  175. package/dist/plugins/enable-state.d.ts +34 -0
  176. package/dist/plugins/enable-state.d.ts.map +1 -0
  177. package/dist/plugins/enable-state.js +159 -0
  178. package/dist/plugins/enable-state.js.map +1 -0
  179. package/dist/plugins/installer.d.ts +64 -0
  180. package/dist/plugins/installer.d.ts.map +1 -0
  181. package/dist/plugins/installer.js +416 -0
  182. package/dist/plugins/installer.js.map +1 -0
  183. package/dist/plugins/integration.d.ts +91 -0
  184. package/dist/plugins/integration.d.ts.map +1 -0
  185. package/dist/plugins/integration.js +233 -0
  186. package/dist/plugins/integration.js.map +1 -0
  187. package/dist/plugins/loader.d.ts +69 -0
  188. package/dist/plugins/loader.d.ts.map +1 -0
  189. package/dist/plugins/loader.js +243 -0
  190. package/dist/plugins/loader.js.map +1 -0
  191. package/dist/plugins/manifest.d.ts +23 -0
  192. package/dist/plugins/manifest.d.ts.map +1 -0
  193. package/dist/plugins/manifest.js +143 -0
  194. package/dist/plugins/manifest.js.map +1 -0
  195. package/dist/plugins/marketplace.d.ts +100 -0
  196. package/dist/plugins/marketplace.d.ts.map +1 -0
  197. package/dist/plugins/marketplace.js +529 -0
  198. package/dist/plugins/marketplace.js.map +1 -0
  199. package/dist/plugins/paths.d.ts +44 -0
  200. package/dist/plugins/paths.d.ts.map +1 -0
  201. package/dist/plugins/paths.js +89 -0
  202. package/dist/plugins/paths.js.map +1 -0
  203. package/dist/plugins/refresh.d.ts +61 -0
  204. package/dist/plugins/refresh.d.ts.map +1 -0
  205. package/dist/plugins/refresh.js +98 -0
  206. package/dist/plugins/refresh.js.map +1 -0
  207. package/dist/plugins/registry.d.ts +40 -0
  208. package/dist/plugins/registry.d.ts.map +1 -0
  209. package/dist/plugins/registry.js +80 -0
  210. package/dist/plugins/registry.js.map +1 -0
  211. package/dist/plugins/types.d.ts +225 -0
  212. package/dist/plugins/types.d.ts.map +1 -0
  213. package/dist/plugins/types.js +16 -0
  214. package/dist/plugins/types.js.map +1 -0
  215. package/dist/plugins/user-config.d.ts +22 -0
  216. package/dist/plugins/user-config.d.ts.map +1 -0
  217. package/dist/plugins/user-config.js +96 -0
  218. package/dist/plugins/user-config.js.map +1 -0
  219. package/dist/skills/loader.d.ts +19 -0
  220. package/dist/skills/loader.d.ts.map +1 -0
  221. package/dist/skills/loader.js +197 -0
  222. package/dist/skills/loader.js.map +1 -0
  223. package/dist/skills/registry.d.ts +74 -0
  224. package/dist/skills/registry.d.ts.map +1 -0
  225. package/dist/skills/registry.js +136 -0
  226. package/dist/skills/registry.js.map +1 -0
  227. package/dist/skills/settings.d.ts +13 -0
  228. package/dist/skills/settings.d.ts.map +1 -0
  229. package/dist/skills/settings.js +100 -0
  230. package/dist/skills/settings.js.map +1 -0
  231. package/dist/tools/activate-skill.d.ts +5 -0
  232. package/dist/tools/activate-skill.d.ts.map +1 -0
  233. package/dist/tools/activate-skill.js +33 -0
  234. package/dist/tools/activate-skill.js.map +1 -0
  235. package/dist/tools/index.d.ts +1 -1
  236. package/dist/tools/todo-write.d.ts +1 -1
  237. package/dist/tools/web-fetch.d.ts.map +1 -1
  238. package/dist/tools/web-fetch.js +2 -1
  239. package/dist/tools/web-fetch.js.map +1 -1
  240. package/dist/types/index.d.ts +46 -1
  241. package/dist/types/index.d.ts.map +1 -1
  242. package/dist/types/index.js.map +1 -1
  243. package/dist/utils.d.ts +23 -2
  244. package/dist/utils.d.ts.map +1 -1
  245. package/dist/utils.js +76 -20
  246. package/dist/utils.js.map +1 -1
  247. package/dist/version.d.ts +2 -0
  248. package/dist/version.d.ts.map +1 -0
  249. package/dist/version.js +47 -0
  250. package/dist/version.js.map +1 -0
  251. 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 === '&' ? '&amp;' : c === '<' ? '&lt;' : c === '>' ? '&gt;' : c === '"' ? '&quot;' : '&#39;');
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":"AAAA,mDAAmD;AACnD,EAAE;AACF,yEAAyE;AACzE,kEAAkE;AAClE,oEAAoE;AACpE,2BAA2B;AAC3B,EAAE;AACF,+BAA+B;AAC/B,0DAA0D;AAC1D,uEAAuE;AACvE,wEAAwE;AACxE,sCAAsC;AACtC,EAAE;AACF,YAAY;AACZ,uEAAuE;AACvE,wCAAwC;AACxC,wEAAwE;AACxE,kEAAkE;AAClE,sEAAsE;AACtE,kDAAkD;AAClD,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAyBzC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AACxC,MAAM,YAAY,GAAG,WAAW,CAAA;AAEhC;;4CAE4C;AAC5C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAwB,EAAE;IAClE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAA;IACzD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAA;IAEjD,IAAI,WAAW,GAAyC,IAAI,CAAA;IAC5D,IAAI,UAAU,GAAgC,IAAI,CAAA;IAElD,MAAM,MAAM,GAAG,IAAI,OAAO,CAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACtD,WAAW,GAAG,GAAG,CAAA;QACjB,UAAU,GAAG,GAAG,CAAA;IAClB,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;QACjD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;YAC1C,OAAM;QACR,CAAC;QACD,qEAAqE;QACrE,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;QAC9C,IAAI,CAAC,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAChC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACxC,OAAM;QACR,CAAC;QAED,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACvC,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAA;YAC1D,QAAQ;iBACL,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;iBAC/C,GAAG,CAAC,+CAA+C,UAAU,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YAC/G,UAAU,EAAE,CAAC,IAAI,KAAK,CAAC,yBAAyB,GAAG,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YACtE,WAAW,GAAG,IAAI,CAAA;YAClB,UAAU,GAAG,IAAI,CAAA;YACjB,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;YAC3C,UAAU,EAAE,CAAC,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAA;YAClE,WAAW,GAAG,IAAI,CAAA;YAClB,UAAU,GAAG,IAAI,CAAA;YACjB,OAAM;QACR,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS,CAAA;QACtD,QAAQ;aACL,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;aAC/C,GAAG,CACF,sFAAsF;YACpF,iCAAiC;YACjC,6DAA6D;YAC7D,gBAAgB,CACnB,CAAA;QACH,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9B,WAAW,GAAG,IAAI,CAAA;QAClB,UAAU,GAAG,IAAI,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,kEAAkE;IAClE,kDAAkD;IAClD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAClD,UAAU,EAAE,CAAC,GAAG,CAAC,CAAA;QACjB,WAAW,GAAG,IAAI,CAAA;QAClB,UAAU,GAAG,IAAI,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,qEAAqE;IACrE,oDAAoD;IACpD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACtC,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAiB,CAAA;IAC5C,MAAM,GAAG,GAAG,oBAAoB,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE,CAAA;IAE1D,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;QACpC,UAAU,EAAE,CAAC,IAAI,KAAK,CAAC,kCAAkC,SAAS,IAAI,CAAC,CAAC,CAAA;QACxE,WAAW,GAAG,IAAI,CAAA;QAClB,UAAU,GAAG,IAAI,CAAA;IACnB,CAAC,EAAE,SAAS,CAAC,CAAA;IACb,6CAA6C;IAC7C,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAA;IAEtD,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,MAAM;YAAE,OAAM;QAClB,MAAM,GAAG,IAAI,CAAA;QACb,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC,CAAA;IACD,uDAAuD;IACvD,KAAK,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAE1B,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAA;AACtD,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAC/F,CAAA;AACH,CAAC"}
@@ -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"}