@bastani/atomic 0.9.25-alpha.3 → 0.9.25-alpha.5

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 (184) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/CHANGELOG.md +30 -0
  4. package/dist/builtin/mcp/OAUTH.md +59 -269
  5. package/dist/builtin/mcp/README.md +58 -345
  6. package/dist/builtin/mcp/index.bundle.mjs +4 -28073
  7. package/dist/builtin/mcp/native-client-licenses/LICENSES/modelcontextprotocol-typescript-sdk.txt +21 -0
  8. package/dist/builtin/mcp/native-client-licenses/NOTICE +30 -0
  9. package/dist/builtin/mcp/package.json +4 -25
  10. package/dist/builtin/subagents/package.json +1 -1
  11. package/dist/builtin/web-access/package.json +1 -1
  12. package/dist/builtin/workflows/CHANGELOG.md +6 -0
  13. package/dist/builtin/workflows/package.json +1 -1
  14. package/dist/builtin/workflows/src/extension/index.bundle.mjs +18 -3
  15. package/dist/cli/args.d.ts.map +1 -1
  16. package/dist/cli/args.js +2 -1
  17. package/dist/cli/args.js.map +1 -1
  18. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  19. package/dist/core/agent-session-extension-bindings.js +87 -5
  20. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  21. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  22. package/dist/core/agent-session-tool-registry.js +6 -3
  23. package/dist/core/agent-session-tool-registry.js.map +1 -1
  24. package/dist/core/extensions/context-types.d.ts +3 -1
  25. package/dist/core/extensions/context-types.d.ts.map +1 -1
  26. package/dist/core/extensions/context-types.js.map +1 -1
  27. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  28. package/dist/core/extensions/loader-api.js +4 -0
  29. package/dist/core/extensions/loader-api.js.map +1 -1
  30. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  31. package/dist/core/extensions/loader-virtual-modules.js +3 -0
  32. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  33. package/dist/core/mcp-child-policy.d.ts +11 -0
  34. package/dist/core/mcp-child-policy.d.ts.map +1 -0
  35. package/dist/core/mcp-child-policy.js +31 -0
  36. package/dist/core/mcp-child-policy.js.map +1 -0
  37. package/dist/core/mcp-servers.d.ts +32 -26
  38. package/dist/core/mcp-servers.d.ts.map +1 -1
  39. package/dist/core/mcp-servers.js +148 -1
  40. package/dist/core/mcp-servers.js.map +1 -1
  41. package/dist/core/package-manager-manifest.js.map +1 -1
  42. package/dist/core/package-manager-mcp-servers.js +1 -1
  43. package/dist/core/package-manager-mcp-servers.js.map +1 -1
  44. package/dist/core/sdk.js +10 -1
  45. package/dist/core/sdk.js.map +1 -1
  46. package/dist/core/tools/truncate.d.ts +8 -0
  47. package/dist/core/tools/truncate.d.ts.map +1 -1
  48. package/dist/core/tools/truncate.js +24 -0
  49. package/dist/core/tools/truncate.js.map +1 -1
  50. package/dist/extensions/mcp/cli.d.ts +21 -0
  51. package/dist/extensions/mcp/cli.d.ts.map +1 -0
  52. package/dist/extensions/mcp/cli.js +500 -0
  53. package/dist/extensions/mcp/cli.js.map +1 -0
  54. package/dist/extensions/mcp/cli.lazy.d.ts +3 -0
  55. package/dist/extensions/mcp/cli.lazy.d.ts.map +1 -0
  56. package/dist/extensions/mcp/cli.lazy.js +3 -0
  57. package/dist/extensions/mcp/cli.lazy.js.map +1 -0
  58. package/dist/extensions/mcp/client/auth-provider.d.ts +15 -0
  59. package/dist/extensions/mcp/client/auth-provider.d.ts.map +1 -0
  60. package/dist/extensions/mcp/client/auth-provider.js +2 -0
  61. package/dist/extensions/mcp/client/auth-provider.js.map +1 -0
  62. package/dist/extensions/mcp/client/client.d.ts +89 -0
  63. package/dist/extensions/mcp/client/client.d.ts.map +1 -0
  64. package/dist/extensions/mcp/client/client.js +457 -0
  65. package/dist/extensions/mcp/client/client.js.map +1 -0
  66. package/dist/extensions/mcp/client/index.d.ts +9 -0
  67. package/dist/extensions/mcp/client/index.d.ts.map +1 -0
  68. package/dist/extensions/mcp/client/index.js +7 -0
  69. package/dist/extensions/mcp/client/index.js.map +1 -0
  70. package/dist/extensions/mcp/client/oauth/callback.d.ts +42 -0
  71. package/dist/extensions/mcp/client/oauth/callback.d.ts.map +1 -0
  72. package/dist/extensions/mcp/client/oauth/callback.js +106 -0
  73. package/dist/extensions/mcp/client/oauth/callback.js.map +1 -0
  74. package/dist/extensions/mcp/client/oauth/discovery.d.ts +27 -0
  75. package/dist/extensions/mcp/client/oauth/discovery.d.ts.map +1 -0
  76. package/dist/extensions/mcp/client/oauth/discovery.js +153 -0
  77. package/dist/extensions/mcp/client/oauth/discovery.js.map +1 -0
  78. package/dist/extensions/mcp/client/oauth/errors.d.ts +24 -0
  79. package/dist/extensions/mcp/client/oauth/errors.d.ts.map +1 -0
  80. package/dist/extensions/mcp/client/oauth/errors.js +46 -0
  81. package/dist/extensions/mcp/client/oauth/errors.js.map +1 -0
  82. package/dist/extensions/mcp/client/oauth/flow.d.ts +82 -0
  83. package/dist/extensions/mcp/client/oauth/flow.d.ts.map +1 -0
  84. package/dist/extensions/mcp/client/oauth/flow.js +292 -0
  85. package/dist/extensions/mcp/client/oauth/flow.js.map +1 -0
  86. package/dist/extensions/mcp/client/oauth/index.d.ts +7 -0
  87. package/dist/extensions/mcp/client/oauth/index.d.ts.map +1 -0
  88. package/dist/extensions/mcp/client/oauth/index.js +6 -0
  89. package/dist/extensions/mcp/client/oauth/index.js.map +1 -0
  90. package/dist/extensions/mcp/client/oauth/provider.d.ts +59 -0
  91. package/dist/extensions/mcp/client/oauth/provider.d.ts.map +1 -0
  92. package/dist/extensions/mcp/client/oauth/provider.js +116 -0
  93. package/dist/extensions/mcp/client/oauth/provider.js.map +1 -0
  94. package/dist/extensions/mcp/client/oauth/types.d.ts +77 -0
  95. package/dist/extensions/mcp/client/oauth/types.d.ts.map +1 -0
  96. package/dist/extensions/mcp/client/oauth/types.js +109 -0
  97. package/dist/extensions/mcp/client/oauth/types.js.map +1 -0
  98. package/dist/extensions/mcp/client/protocol/content.d.ts +82 -0
  99. package/dist/extensions/mcp/client/protocol/content.d.ts.map +1 -0
  100. package/dist/extensions/mcp/client/protocol/content.js +41 -0
  101. package/dist/extensions/mcp/client/protocol/content.js.map +1 -0
  102. package/dist/extensions/mcp/client/protocol/jsonrpc.d.ts +59 -0
  103. package/dist/extensions/mcp/client/protocol/jsonrpc.d.ts.map +1 -0
  104. package/dist/extensions/mcp/client/protocol/jsonrpc.js +67 -0
  105. package/dist/extensions/mcp/client/protocol/jsonrpc.js.map +1 -0
  106. package/dist/extensions/mcp/client/protocol/types.d.ts +123 -0
  107. package/dist/extensions/mcp/client/protocol/types.d.ts.map +1 -0
  108. package/dist/extensions/mcp/client/protocol/types.js +7 -0
  109. package/dist/extensions/mcp/client/protocol/types.js.map +1 -0
  110. package/dist/extensions/mcp/client/testing/index.d.ts +2 -0
  111. package/dist/extensions/mcp/client/testing/index.d.ts.map +1 -0
  112. package/dist/extensions/mcp/client/testing/index.js +2 -0
  113. package/dist/extensions/mcp/client/testing/index.js.map +1 -0
  114. package/dist/extensions/mcp/client/transports/in-memory.d.ts +19 -0
  115. package/dist/extensions/mcp/client/transports/in-memory.d.ts.map +1 -0
  116. package/dist/extensions/mcp/client/transports/in-memory.js +50 -0
  117. package/dist/extensions/mcp/client/transports/in-memory.js.map +1 -0
  118. package/dist/extensions/mcp/client/transports/stdio.d.ts +32 -0
  119. package/dist/extensions/mcp/client/transports/stdio.d.ts.map +1 -0
  120. package/dist/extensions/mcp/client/transports/stdio.js +201 -0
  121. package/dist/extensions/mcp/client/transports/stdio.js.map +1 -0
  122. package/dist/extensions/mcp/client/transports/streamable-http.d.ts +96 -0
  123. package/dist/extensions/mcp/client/transports/streamable-http.d.ts.map +1 -0
  124. package/dist/extensions/mcp/client/transports/streamable-http.js +456 -0
  125. package/dist/extensions/mcp/client/transports/streamable-http.js.map +1 -0
  126. package/dist/extensions/mcp/client/transports/transport.d.ts +28 -0
  127. package/dist/extensions/mcp/client/transports/transport.d.ts.map +1 -0
  128. package/dist/extensions/mcp/client/transports/transport.js +38 -0
  129. package/dist/extensions/mcp/client/transports/transport.js.map +1 -0
  130. package/dist/extensions/mcp/config.d.ts +72 -0
  131. package/dist/extensions/mcp/config.d.ts.map +1 -0
  132. package/dist/extensions/mcp/config.js +158 -0
  133. package/dist/extensions/mcp/config.js.map +1 -0
  134. package/dist/extensions/mcp/index.d.ts +76 -0
  135. package/dist/extensions/mcp/index.d.ts.map +1 -0
  136. package/dist/extensions/mcp/index.js +1119 -0
  137. package/dist/extensions/mcp/index.js.map +1 -0
  138. package/dist/extensions/mcp/log.d.ts +16 -0
  139. package/dist/extensions/mcp/log.d.ts.map +1 -0
  140. package/dist/extensions/mcp/log.js +66 -0
  141. package/dist/extensions/mcp/log.js.map +1 -0
  142. package/dist/extensions/mcp/oauth.d.ts +103 -0
  143. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  144. package/dist/extensions/mcp/oauth.js +382 -0
  145. package/dist/extensions/mcp/oauth.js.map +1 -0
  146. package/dist/extensions/mcp/resources.d.ts +43 -0
  147. package/dist/extensions/mcp/resources.d.ts.map +1 -0
  148. package/dist/extensions/mcp/resources.js +262 -0
  149. package/dist/extensions/mcp/resources.js.map +1 -0
  150. package/dist/extensions/mcp/runtime.d.ts +104 -0
  151. package/dist/extensions/mcp/runtime.d.ts.map +1 -0
  152. package/dist/extensions/mcp/runtime.js +546 -0
  153. package/dist/extensions/mcp/runtime.js.map +1 -0
  154. package/dist/extensions/mcp/runtime.lazy.d.ts +3 -0
  155. package/dist/extensions/mcp/runtime.lazy.d.ts.map +1 -0
  156. package/dist/extensions/mcp/runtime.lazy.js +3 -0
  157. package/dist/extensions/mcp/runtime.lazy.js.map +1 -0
  158. package/dist/extensions/mcp/tools.d.ts +84 -0
  159. package/dist/extensions/mcp/tools.d.ts.map +1 -0
  160. package/dist/extensions/mcp/tools.js +251 -0
  161. package/dist/extensions/mcp/tools.js.map +1 -0
  162. package/dist/extensions/mcp/ui.d.ts +60 -0
  163. package/dist/extensions/mcp/ui.d.ts.map +1 -0
  164. package/dist/extensions/mcp/ui.js +175 -0
  165. package/dist/extensions/mcp/ui.js.map +1 -0
  166. package/dist/index.d.ts +5 -1
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +5 -0
  169. package/dist/index.js.map +1 -1
  170. package/dist/main.d.ts.map +1 -1
  171. package/dist/main.js +7 -0
  172. package/dist/main.js.map +1 -1
  173. package/dist/modes/interactive/interactive-slash-commands.js +23 -8
  174. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  175. package/docs/extensions/api-reference.md +3 -3
  176. package/docs/extensions.md +8 -8
  177. package/docs/mcp-servers.md +153 -79
  178. package/docs/packages/authoring.md +2 -2
  179. package/docs/sdk.md +1 -1
  180. package/docs/sessions.md +1 -1
  181. package/npm-shrinkwrap.json +32 -32
  182. package/package.json +3 -3
  183. package/dist/builtin/mcp/app-bridge.bundle.js +0 -67
  184. package/dist/builtin/mcp/xdg-open +0 -1267
@@ -0,0 +1,77 @@
1
+ export interface OAuthProtectedResourceMetadata {
2
+ resource: string;
3
+ authorization_servers?: string[];
4
+ scopes_supported?: string[];
5
+ [key: string]: unknown;
6
+ }
7
+ export interface AuthorizationServerMetadata {
8
+ issuer: string;
9
+ authorization_endpoint: string;
10
+ token_endpoint: string;
11
+ registration_endpoint?: string;
12
+ scopes_supported?: string[];
13
+ response_types_supported: string[];
14
+ grant_types_supported?: string[];
15
+ token_endpoint_auth_methods_supported?: string[];
16
+ code_challenge_methods_supported?: string[];
17
+ client_id_metadata_document_supported?: boolean;
18
+ /** Whether authorization responses carry an `iss` parameter (RFC 9207). */
19
+ authorization_response_iss_parameter_supported?: boolean;
20
+ [key: string]: unknown;
21
+ }
22
+ export interface OAuthTokens {
23
+ access_token: string;
24
+ token_type: string;
25
+ expires_in?: number;
26
+ scope?: string;
27
+ refresh_token?: string;
28
+ id_token?: string;
29
+ }
30
+ export interface OAuthClientMetadata {
31
+ redirect_uris: string[];
32
+ token_endpoint_auth_method?: string;
33
+ grant_types?: string[];
34
+ response_types?: string[];
35
+ client_name?: string;
36
+ client_uri?: string;
37
+ logo_uri?: string;
38
+ scope?: string;
39
+ contacts?: string[];
40
+ tos_uri?: string;
41
+ policy_uri?: string;
42
+ jwks_uri?: string;
43
+ jwks?: unknown;
44
+ software_id?: string;
45
+ software_version?: string;
46
+ software_statement?: string;
47
+ }
48
+ export interface OAuthClientInformation {
49
+ client_id: string;
50
+ client_secret?: string;
51
+ client_id_issued_at?: number;
52
+ client_secret_expires_at?: number;
53
+ }
54
+ export type OAuthClientInformationFull = OAuthClientInformation & OAuthClientMetadata;
55
+ export type OAuthClientInformationMixed = OAuthClientInformation | OAuthClientInformationFull;
56
+ export interface OAuthDiscoveryState {
57
+ authorizationServerUrl: string;
58
+ authorizationServerMetadata?: AuthorizationServerMetadata;
59
+ resourceMetadata?: OAuthProtectedResourceMetadata;
60
+ resourceMetadataUrl?: string;
61
+ }
62
+ export interface OAuthServerInfo {
63
+ authorizationServerUrl: string;
64
+ authorizationServerMetadata?: AuthorizationServerMetadata;
65
+ resourceMetadata?: OAuthProtectedResourceMetadata;
66
+ }
67
+ export interface OAuthChallenge {
68
+ resourceMetadataUrl?: URL;
69
+ scope?: string;
70
+ error?: string;
71
+ errorDescription?: string;
72
+ }
73
+ export declare function parseProtectedResourceMetadata(value: unknown): OAuthProtectedResourceMetadata;
74
+ export declare function parseAuthorizationServerMetadata(value: unknown): AuthorizationServerMetadata;
75
+ export declare function parseOAuthTokens(value: unknown): OAuthTokens;
76
+ export declare function parseClientInformation(value: unknown): OAuthClientInformationFull;
77
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/oauth/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /*
2
+ * Adapted from modelcontextprotocol/typescript-sdk v1.29.0.
3
+ * Copyright (c) 2024 Anthropic, PBC. Licensed under MIT; see LICENSES/.
4
+ * Modified to use dependency-free structural validation.
5
+ */
6
+ import { isObject } from "../protocol/jsonrpc.js";
7
+ function object(value, name) {
8
+ if (!isObject(value))
9
+ throw new Error(`Invalid ${name}`);
10
+ return value;
11
+ }
12
+ /** Drops `undefined` values so optional fields are absent rather than present-but-undefined. */
13
+ function compact(value) {
14
+ return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined));
15
+ }
16
+ function requiredString(value, name) {
17
+ if (typeof value !== "string" || value.length === 0)
18
+ throw new Error(`Invalid ${name}`);
19
+ return value;
20
+ }
21
+ /** Treats `null` and `""` as absent: servers send them for fields they have no value for, like `scope: ""`. */
22
+ function absent(value) {
23
+ return value === undefined || value === null || value === "";
24
+ }
25
+ function optionalString(value, name) {
26
+ if (absent(value))
27
+ return undefined;
28
+ return requiredString(value, name);
29
+ }
30
+ function optionalStrings(value, name) {
31
+ if (value === undefined || value === null)
32
+ return undefined;
33
+ if (!Array.isArray(value) || value.some((item) => typeof item !== "string"))
34
+ throw new Error(`Invalid ${name}`);
35
+ return [...value];
36
+ }
37
+ function safeUrl(value, name) {
38
+ const text = requiredString(value, name);
39
+ // URL parsing throws a `TypeError`, which discovery reserves for network failures.
40
+ if (!URL.canParse(text))
41
+ throw new Error(`Invalid ${name}`);
42
+ const url = new URL(text);
43
+ if (["javascript:", "data:", "vbscript:"].includes(url.protocol))
44
+ throw new Error(`Invalid ${name}`);
45
+ return text;
46
+ }
47
+ function optionalUrl(value, name) {
48
+ return absent(value) ? undefined : safeUrl(value, name);
49
+ }
50
+ export function parseProtectedResourceMetadata(value) {
51
+ const input = object(value, "OAuth protected resource metadata");
52
+ return compact({
53
+ ...input,
54
+ resource: safeUrl(input.resource, "OAuth protected resource metadata resource"),
55
+ authorization_servers: optionalStrings(input.authorization_servers, "authorization_servers")?.map((url) => safeUrl(url, "authorization server URL")),
56
+ scopes_supported: optionalStrings(input.scopes_supported, "scopes_supported"),
57
+ });
58
+ }
59
+ export function parseAuthorizationServerMetadata(value) {
60
+ const input = object(value, "authorization server metadata");
61
+ const responseTypes = optionalStrings(input.response_types_supported, "response_types_supported");
62
+ if (!responseTypes)
63
+ throw new Error("Invalid response_types_supported");
64
+ return compact({
65
+ ...input,
66
+ issuer: safeUrl(input.issuer, "authorization server issuer"),
67
+ authorization_endpoint: safeUrl(input.authorization_endpoint, "authorization endpoint"),
68
+ token_endpoint: safeUrl(input.token_endpoint, "token endpoint"),
69
+ registration_endpoint: optionalUrl(input.registration_endpoint, "registration endpoint"),
70
+ scopes_supported: optionalStrings(input.scopes_supported, "scopes_supported"),
71
+ response_types_supported: responseTypes,
72
+ grant_types_supported: optionalStrings(input.grant_types_supported, "grant_types_supported"),
73
+ token_endpoint_auth_methods_supported: optionalStrings(input.token_endpoint_auth_methods_supported, "token_endpoint_auth_methods_supported"),
74
+ code_challenge_methods_supported: optionalStrings(input.code_challenge_methods_supported, "code_challenge_methods_supported"),
75
+ client_id_metadata_document_supported: typeof input.client_id_metadata_document_supported === "boolean"
76
+ ? input.client_id_metadata_document_supported
77
+ : undefined,
78
+ authorization_response_iss_parameter_supported: typeof input.authorization_response_iss_parameter_supported === "boolean"
79
+ ? input.authorization_response_iss_parameter_supported
80
+ : undefined,
81
+ });
82
+ }
83
+ export function parseOAuthTokens(value) {
84
+ const input = object(value, "OAuth token response");
85
+ // `Number(null)` is 0, which would mark the token as expired at once.
86
+ const expires = absent(input.expires_in) ? undefined : Number(input.expires_in);
87
+ if (expires !== undefined && !Number.isFinite(expires))
88
+ throw new Error("Invalid expires_in");
89
+ return compact({
90
+ access_token: requiredString(input.access_token, "access_token"),
91
+ token_type: requiredString(input.token_type, "token_type"),
92
+ expires_in: expires,
93
+ scope: optionalString(input.scope, "scope"),
94
+ refresh_token: optionalString(input.refresh_token, "refresh_token"),
95
+ id_token: optionalString(input.id_token, "id_token"),
96
+ });
97
+ }
98
+ export function parseClientInformation(value) {
99
+ const input = object(value, "OAuth client registration response");
100
+ return compact({
101
+ ...input,
102
+ client_id: requiredString(input.client_id, "client_id"),
103
+ client_secret: optionalString(input.client_secret, "client_secret"),
104
+ client_id_issued_at: typeof input.client_id_issued_at === "number" ? input.client_id_issued_at : undefined,
105
+ client_secret_expires_at: typeof input.client_secret_expires_at === "number" ? input.client_secret_expires_at : undefined,
106
+ redirect_uris: optionalStrings(input.redirect_uris, "redirect_uris") ?? [],
107
+ });
108
+ }
109
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/oauth/types.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Adapted from modelcontextprotocol/typescript-sdk v1.29.0.\n * Copyright (c) 2024 Anthropic, PBC. Licensed under MIT; see LICENSES/.\n * Modified to use dependency-free structural validation.\n */\n\nimport { isObject } from \"../protocol/jsonrpc.js\";\n\nexport interface OAuthProtectedResourceMetadata {\n\tresource: string;\n\tauthorization_servers?: string[];\n\tscopes_supported?: string[];\n\t[key: string]: unknown;\n}\n\nexport interface AuthorizationServerMetadata {\n\tissuer: string;\n\tauthorization_endpoint: string;\n\ttoken_endpoint: string;\n\tregistration_endpoint?: string;\n\tscopes_supported?: string[];\n\tresponse_types_supported: string[];\n\tgrant_types_supported?: string[];\n\ttoken_endpoint_auth_methods_supported?: string[];\n\tcode_challenge_methods_supported?: string[];\n\tclient_id_metadata_document_supported?: boolean;\n\t/** Whether authorization responses carry an `iss` parameter (RFC 9207). */\n\tauthorization_response_iss_parameter_supported?: boolean;\n\t[key: string]: unknown;\n}\n\nexport interface OAuthTokens {\n\taccess_token: string;\n\ttoken_type: string;\n\texpires_in?: number;\n\tscope?: string;\n\trefresh_token?: string;\n\tid_token?: string;\n}\n\nexport interface OAuthClientMetadata {\n\tredirect_uris: string[];\n\ttoken_endpoint_auth_method?: string;\n\tgrant_types?: string[];\n\tresponse_types?: string[];\n\tclient_name?: string;\n\tclient_uri?: string;\n\tlogo_uri?: string;\n\tscope?: string;\n\tcontacts?: string[];\n\ttos_uri?: string;\n\tpolicy_uri?: string;\n\tjwks_uri?: string;\n\tjwks?: unknown;\n\tsoftware_id?: string;\n\tsoftware_version?: string;\n\tsoftware_statement?: string;\n}\n\nexport interface OAuthClientInformation {\n\tclient_id: string;\n\tclient_secret?: string;\n\tclient_id_issued_at?: number;\n\tclient_secret_expires_at?: number;\n}\n\nexport type OAuthClientInformationFull = OAuthClientInformation & OAuthClientMetadata;\nexport type OAuthClientInformationMixed = OAuthClientInformation | OAuthClientInformationFull;\n\nexport interface OAuthDiscoveryState {\n\tauthorizationServerUrl: string;\n\tauthorizationServerMetadata?: AuthorizationServerMetadata;\n\tresourceMetadata?: OAuthProtectedResourceMetadata;\n\tresourceMetadataUrl?: string;\n}\n\nexport interface OAuthServerInfo {\n\tauthorizationServerUrl: string;\n\tauthorizationServerMetadata?: AuthorizationServerMetadata;\n\tresourceMetadata?: OAuthProtectedResourceMetadata;\n}\n\nexport interface OAuthChallenge {\n\tresourceMetadataUrl?: URL;\n\tscope?: string;\n\terror?: string;\n\terrorDescription?: string;\n}\n\nfunction object(value: unknown, name: string): Record<string, unknown> {\n\tif (!isObject(value)) throw new Error(`Invalid ${name}`);\n\treturn value;\n}\n\n/** Drops `undefined` values so optional fields are absent rather than present-but-undefined. */\nfunction compact<T extends object>(value: T): T {\n\treturn Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined)) as T;\n}\n\nfunction requiredString(value: unknown, name: string): string {\n\tif (typeof value !== \"string\" || value.length === 0) throw new Error(`Invalid ${name}`);\n\treturn value;\n}\n\n/** Treats `null` and `\"\"` as absent: servers send them for fields they have no value for, like `scope: \"\"`. */\nfunction absent(value: unknown): value is undefined | null | \"\" {\n\treturn value === undefined || value === null || value === \"\";\n}\n\nfunction optionalString(value: unknown, name: string): string | undefined {\n\tif (absent(value)) return undefined;\n\treturn requiredString(value, name);\n}\n\nfunction optionalStrings(value: unknown, name: string): string[] | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) throw new Error(`Invalid ${name}`);\n\treturn [...value];\n}\n\nfunction safeUrl(value: unknown, name: string): string {\n\tconst text = requiredString(value, name);\n\t// URL parsing throws a `TypeError`, which discovery reserves for network failures.\n\tif (!URL.canParse(text)) throw new Error(`Invalid ${name}`);\n\tconst url = new URL(text);\n\tif ([\"javascript:\", \"data:\", \"vbscript:\"].includes(url.protocol)) throw new Error(`Invalid ${name}`);\n\treturn text;\n}\n\nfunction optionalUrl(value: unknown, name: string): string | undefined {\n\treturn absent(value) ? undefined : safeUrl(value, name);\n}\n\nexport function parseProtectedResourceMetadata(value: unknown): OAuthProtectedResourceMetadata {\n\tconst input = object(value, \"OAuth protected resource metadata\");\n\treturn compact({\n\t\t...input,\n\t\tresource: safeUrl(input.resource, \"OAuth protected resource metadata resource\"),\n\t\tauthorization_servers: optionalStrings(input.authorization_servers, \"authorization_servers\")?.map((url) =>\n\t\t\tsafeUrl(url, \"authorization server URL\"),\n\t\t),\n\t\tscopes_supported: optionalStrings(input.scopes_supported, \"scopes_supported\"),\n\t});\n}\n\nexport function parseAuthorizationServerMetadata(value: unknown): AuthorizationServerMetadata {\n\tconst input = object(value, \"authorization server metadata\");\n\tconst responseTypes = optionalStrings(input.response_types_supported, \"response_types_supported\");\n\tif (!responseTypes) throw new Error(\"Invalid response_types_supported\");\n\treturn compact({\n\t\t...input,\n\t\tissuer: safeUrl(input.issuer, \"authorization server issuer\"),\n\t\tauthorization_endpoint: safeUrl(input.authorization_endpoint, \"authorization endpoint\"),\n\t\ttoken_endpoint: safeUrl(input.token_endpoint, \"token endpoint\"),\n\t\tregistration_endpoint: optionalUrl(input.registration_endpoint, \"registration endpoint\"),\n\t\tscopes_supported: optionalStrings(input.scopes_supported, \"scopes_supported\"),\n\t\tresponse_types_supported: responseTypes,\n\t\tgrant_types_supported: optionalStrings(input.grant_types_supported, \"grant_types_supported\"),\n\t\ttoken_endpoint_auth_methods_supported: optionalStrings(\n\t\t\tinput.token_endpoint_auth_methods_supported,\n\t\t\t\"token_endpoint_auth_methods_supported\",\n\t\t),\n\t\tcode_challenge_methods_supported: optionalStrings(\n\t\t\tinput.code_challenge_methods_supported,\n\t\t\t\"code_challenge_methods_supported\",\n\t\t),\n\t\tclient_id_metadata_document_supported:\n\t\t\ttypeof input.client_id_metadata_document_supported === \"boolean\"\n\t\t\t\t? input.client_id_metadata_document_supported\n\t\t\t\t: undefined,\n\t\tauthorization_response_iss_parameter_supported:\n\t\t\ttypeof input.authorization_response_iss_parameter_supported === \"boolean\"\n\t\t\t\t? input.authorization_response_iss_parameter_supported\n\t\t\t\t: undefined,\n\t});\n}\n\nexport function parseOAuthTokens(value: unknown): OAuthTokens {\n\tconst input = object(value, \"OAuth token response\");\n\t// `Number(null)` is 0, which would mark the token as expired at once.\n\tconst expires = absent(input.expires_in) ? undefined : Number(input.expires_in);\n\tif (expires !== undefined && !Number.isFinite(expires)) throw new Error(\"Invalid expires_in\");\n\treturn compact({\n\t\taccess_token: requiredString(input.access_token, \"access_token\"),\n\t\ttoken_type: requiredString(input.token_type, \"token_type\"),\n\t\texpires_in: expires,\n\t\tscope: optionalString(input.scope, \"scope\"),\n\t\trefresh_token: optionalString(input.refresh_token, \"refresh_token\"),\n\t\tid_token: optionalString(input.id_token, \"id_token\"),\n\t});\n}\n\nexport function parseClientInformation(value: unknown): OAuthClientInformationFull {\n\tconst input = object(value, \"OAuth client registration response\");\n\treturn compact({\n\t\t...(input as unknown as OAuthClientMetadata),\n\t\tclient_id: requiredString(input.client_id, \"client_id\"),\n\t\tclient_secret: optionalString(input.client_secret, \"client_secret\"),\n\t\tclient_id_issued_at: typeof input.client_id_issued_at === \"number\" ? input.client_id_issued_at : undefined,\n\t\tclient_secret_expires_at:\n\t\t\ttypeof input.client_secret_expires_at === \"number\" ? input.client_secret_expires_at : undefined,\n\t\tredirect_uris: optionalStrings(input.redirect_uris, \"redirect_uris\") ?? [],\n\t});\n}\n"]}
@@ -0,0 +1,82 @@
1
+ export interface ContentAnnotations {
2
+ audience?: ("user" | "assistant")[];
3
+ priority?: number;
4
+ lastModified?: string;
5
+ }
6
+ export interface TextContent {
7
+ type: "text";
8
+ text: string;
9
+ annotations?: ContentAnnotations;
10
+ _meta?: Record<string, unknown>;
11
+ }
12
+ export interface ImageContent {
13
+ type: "image";
14
+ data: string;
15
+ mimeType: string;
16
+ annotations?: ContentAnnotations;
17
+ _meta?: Record<string, unknown>;
18
+ }
19
+ export interface AudioContent {
20
+ type: "audio";
21
+ data: string;
22
+ mimeType: string;
23
+ annotations?: ContentAnnotations;
24
+ _meta?: Record<string, unknown>;
25
+ }
26
+ export interface ResourceLinkContent {
27
+ type: "resource_link";
28
+ uri: string;
29
+ name: string;
30
+ title?: string;
31
+ description?: string;
32
+ mimeType?: string;
33
+ size?: number;
34
+ annotations?: ContentAnnotations;
35
+ _meta?: Record<string, unknown>;
36
+ }
37
+ export interface TextResourceContents {
38
+ uri: string;
39
+ mimeType?: string;
40
+ text: string;
41
+ _meta?: Record<string, unknown>;
42
+ }
43
+ export interface BlobResourceContents {
44
+ uri: string;
45
+ mimeType?: string;
46
+ blob: string;
47
+ _meta?: Record<string, unknown>;
48
+ }
49
+ export interface EmbeddedResourceContent {
50
+ type: "resource";
51
+ resource: TextResourceContents | BlobResourceContents;
52
+ annotations?: ContentAnnotations;
53
+ _meta?: Record<string, unknown>;
54
+ }
55
+ export type ContentBlock = TextContent | ImageContent | AudioContent | ResourceLinkContent | EmbeddedResourceContent;
56
+ export interface CallToolResult {
57
+ content: ContentBlock[];
58
+ structuredContent?: Record<string, unknown>;
59
+ isError?: boolean;
60
+ _meta?: Record<string, unknown>;
61
+ }
62
+ /**
63
+ * Tool result content in the shape LLM APIs accept: text and base64 images. Matches the
64
+ * `TextContent` and `ImageContent` types of `@earendil-works/pi-ai`.
65
+ */
66
+ export type LlmContent = {
67
+ type: "text";
68
+ text: string;
69
+ } | {
70
+ type: "image";
71
+ data: string;
72
+ mimeType: string;
73
+ };
74
+ /**
75
+ * Convert a tool result to text and image content for a model. Text and images pass through,
76
+ * embedded text resources become text, embedded image resources become images, and other blocks
77
+ * (audio, resource links, binary resources) become a short text placeholder. A result without
78
+ * content blocks but with `structuredContent` becomes its JSON, since servers should, but do not
79
+ * always, mirror structured results as text.
80
+ */
81
+ export declare function toLlmContent(result: Pick<CallToolResult, "content" | "structuredContent">): LlmContent[];
82
+ //# sourceMappingURL=content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/protocol/content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ function blockToLlmContent(block) {
2
+ switch (block.type) {
3
+ case "text":
4
+ return { type: "text", text: block.text };
5
+ case "image":
6
+ return { type: "image", data: block.data, mimeType: block.mimeType };
7
+ case "audio":
8
+ return { type: "text", text: `[audio ${block.mimeType} omitted]` };
9
+ case "resource_link":
10
+ return { type: "text", text: `${block.name}: ${block.uri}` };
11
+ case "resource": {
12
+ const resource = block.resource;
13
+ if ("text" in resource)
14
+ return { type: "text", text: resource.text };
15
+ if (resource.mimeType?.startsWith("image/")) {
16
+ return { type: "image", data: resource.blob, mimeType: resource.mimeType };
17
+ }
18
+ return {
19
+ type: "text",
20
+ text: `[binary resource ${resource.uri} (${resource.mimeType ?? "unknown type"}) omitted]`,
21
+ };
22
+ }
23
+ default:
24
+ return { type: "text", text: `[unsupported MCP content ${block.type}]` };
25
+ }
26
+ }
27
+ /**
28
+ * Convert a tool result to text and image content for a model. Text and images pass through,
29
+ * embedded text resources become text, embedded image resources become images, and other blocks
30
+ * (audio, resource links, binary resources) become a short text placeholder. A result without
31
+ * content blocks but with `structuredContent` becomes its JSON, since servers should, but do not
32
+ * always, mirror structured results as text.
33
+ */
34
+ export function toLlmContent(result) {
35
+ const content = (result.content ?? []).map(blockToLlmContent);
36
+ if (content.length === 0 && result.structuredContent !== undefined) {
37
+ content.push({ type: "text", text: JSON.stringify(result.structuredContent, null, 2) });
38
+ }
39
+ return content;
40
+ }
41
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/protocol/content.ts"],"names":[],"mappings":"AA6EA,SAAS,iBAAiB,CAAC,KAAmB;IAC7C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM;YACV,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3C,KAAK,OAAO;YACX,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtE,KAAK,OAAO;YACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,CAAC,QAAQ,WAAW,EAAE,CAAC;QACpE,KAAK,eAAe;YACnB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;QAC9D,KAAK,UAAU,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAChC,IAAI,MAAM,IAAI,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrE,IAAI,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC5E,CAAC;YACD,OAAO;gBACN,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,oBAAoB,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,QAAQ,IAAI,cAAc,YAAY;aAC1F,CAAC;QACH,CAAC;QACD;YACC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA6B,KAA0B,CAAC,IAAI,GAAG,EAAE,CAAC;IACjG,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,MAA6D;IACzF,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC","sourcesContent":["export interface ContentAnnotations {\n\taudience?: (\"user\" | \"assistant\")[];\n\tpriority?: number;\n\tlastModified?: string;\n}\n\nexport interface TextContent {\n\ttype: \"text\";\n\ttext: string;\n\tannotations?: ContentAnnotations;\n\t_meta?: Record<string, unknown>;\n}\n\nexport interface ImageContent {\n\ttype: \"image\";\n\tdata: string;\n\tmimeType: string;\n\tannotations?: ContentAnnotations;\n\t_meta?: Record<string, unknown>;\n}\n\nexport interface AudioContent {\n\ttype: \"audio\";\n\tdata: string;\n\tmimeType: string;\n\tannotations?: ContentAnnotations;\n\t_meta?: Record<string, unknown>;\n}\n\nexport interface ResourceLinkContent {\n\ttype: \"resource_link\";\n\turi: string;\n\tname: string;\n\ttitle?: string;\n\tdescription?: string;\n\tmimeType?: string;\n\tsize?: number;\n\tannotations?: ContentAnnotations;\n\t_meta?: Record<string, unknown>;\n}\n\nexport interface TextResourceContents {\n\turi: string;\n\tmimeType?: string;\n\ttext: string;\n\t_meta?: Record<string, unknown>;\n}\n\nexport interface BlobResourceContents {\n\turi: string;\n\tmimeType?: string;\n\tblob: string;\n\t_meta?: Record<string, unknown>;\n}\n\nexport interface EmbeddedResourceContent {\n\ttype: \"resource\";\n\tresource: TextResourceContents | BlobResourceContents;\n\tannotations?: ContentAnnotations;\n\t_meta?: Record<string, unknown>;\n}\n\nexport type ContentBlock = TextContent | ImageContent | AudioContent | ResourceLinkContent | EmbeddedResourceContent;\n\nexport interface CallToolResult {\n\tcontent: ContentBlock[];\n\tstructuredContent?: Record<string, unknown>;\n\tisError?: boolean;\n\t_meta?: Record<string, unknown>;\n}\n\n/**\n * Tool result content in the shape LLM APIs accept: text and base64 images. Matches the\n * `TextContent` and `ImageContent` types of `@earendil-works/pi-ai`.\n */\nexport type LlmContent = { type: \"text\"; text: string } | { type: \"image\"; data: string; mimeType: string };\n\nfunction blockToLlmContent(block: ContentBlock): LlmContent {\n\tswitch (block.type) {\n\t\tcase \"text\":\n\t\t\treturn { type: \"text\", text: block.text };\n\t\tcase \"image\":\n\t\t\treturn { type: \"image\", data: block.data, mimeType: block.mimeType };\n\t\tcase \"audio\":\n\t\t\treturn { type: \"text\", text: `[audio ${block.mimeType} omitted]` };\n\t\tcase \"resource_link\":\n\t\t\treturn { type: \"text\", text: `${block.name}: ${block.uri}` };\n\t\tcase \"resource\": {\n\t\t\tconst resource = block.resource;\n\t\t\tif (\"text\" in resource) return { type: \"text\", text: resource.text };\n\t\t\tif (resource.mimeType?.startsWith(\"image/\")) {\n\t\t\t\treturn { type: \"image\", data: resource.blob, mimeType: resource.mimeType };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `[binary resource ${resource.uri} (${resource.mimeType ?? \"unknown type\"}) omitted]`,\n\t\t\t};\n\t\t}\n\t\tdefault:\n\t\t\treturn { type: \"text\", text: `[unsupported MCP content ${(block as { type: string }).type}]` };\n\t}\n}\n\n/**\n * Convert a tool result to text and image content for a model. Text and images pass through,\n * embedded text resources become text, embedded image resources become images, and other blocks\n * (audio, resource links, binary resources) become a short text placeholder. A result without\n * content blocks but with `structuredContent` becomes its JSON, since servers should, but do not\n * always, mirror structured results as text.\n */\nexport function toLlmContent(result: Pick<CallToolResult, \"content\" | \"structuredContent\">): LlmContent[] {\n\tconst content = (result.content ?? []).map(blockToLlmContent);\n\tif (content.length === 0 && result.structuredContent !== undefined) {\n\t\tcontent.push({ type: \"text\", text: JSON.stringify(result.structuredContent, null, 2) });\n\t}\n\treturn content;\n}\n"]}
@@ -0,0 +1,59 @@
1
+ export type JsonRpcId = string | number;
2
+ export interface JsonRpcRequest {
3
+ jsonrpc: "2.0";
4
+ id: JsonRpcId;
5
+ method: string;
6
+ params?: unknown;
7
+ }
8
+ export interface JsonRpcNotification {
9
+ jsonrpc: "2.0";
10
+ method: string;
11
+ params?: unknown;
12
+ }
13
+ export interface JsonRpcErrorObject {
14
+ code: number;
15
+ message: string;
16
+ data?: unknown;
17
+ }
18
+ export interface JsonRpcSuccessResponse {
19
+ jsonrpc: "2.0";
20
+ id: JsonRpcId;
21
+ result: unknown;
22
+ }
23
+ export interface JsonRpcErrorResponse {
24
+ jsonrpc: "2.0";
25
+ id: JsonRpcId;
26
+ error: JsonRpcErrorObject;
27
+ }
28
+ export type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;
29
+ export type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;
30
+ export declare const JSON_RPC_ERROR_CODES: {
31
+ readonly parseError: -32700;
32
+ readonly invalidRequest: -32600;
33
+ readonly methodNotFound: -32601;
34
+ readonly invalidParams: -32602;
35
+ readonly internalError: -32603;
36
+ };
37
+ export declare class McpError extends Error {
38
+ readonly code: number;
39
+ readonly data: unknown;
40
+ constructor(code: number, message: string, data?: unknown);
41
+ }
42
+ export declare class McpConnectionClosedError extends Error {
43
+ constructor(message?: string);
44
+ }
45
+ export declare class McpTimeoutError extends Error {
46
+ readonly timeoutMs: number;
47
+ constructor(timeoutMs: number);
48
+ }
49
+ export declare class McpAbortError extends Error {
50
+ constructor(message?: string);
51
+ }
52
+ export declare function isObject(value: unknown): value is Record<string, unknown>;
53
+ export declare function toError(value: unknown): Error;
54
+ export declare function isJsonRpcId(value: unknown): value is JsonRpcId;
55
+ export declare function isJsonRpcRequest(message: unknown): message is JsonRpcRequest;
56
+ export declare function isJsonRpcNotification(message: unknown): message is JsonRpcNotification;
57
+ export declare function isJsonRpcResponse(message: unknown): message is JsonRpcResponse;
58
+ export declare function parseJsonRpcMessage(value: unknown): JsonRpcMessage;
59
+ //# sourceMappingURL=jsonrpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/protocol/jsonrpc.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAExC,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,kBAAkB,CAAC;CAC1B;AAED,MAAM,MAAM,eAAe,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AAC5E,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,mBAAmB,GAAG,eAAe,CAAC;AAEpF,eAAO,MAAM,oBAAoB;aAChC,UAAU,EAAE,CAAC,KAAK;aAClB,cAAc,EAAE,CAAC,KAAK;aACtB,cAAc,EAAE,CAAC,KAAK;aACtB,aAAa,EAAE,CAAC,KAAK;aACrB,aAAa,EAAE,CAAC,KAAK;CACZ,CAAC;AAEX,qBAAa,QAAS,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAEvB,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAKxD;CACD;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IAClD,YAAY,OAAO,SAA0B,EAG5C;CACD;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,YAAY,SAAS,EAAE,MAAM,EAI5B;CACD;AAED,qBAAa,aAAc,SAAQ,KAAK;IACvC,YAAY,OAAO,SAAwB,EAG1C;CACD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAE7C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAE9D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,cAAc,CAI5E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,mBAAmB,CAEtF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,eAAe,CAK9E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAGlE"}
@@ -0,0 +1,67 @@
1
+ export const JSON_RPC_ERROR_CODES = {
2
+ parseError: -32700,
3
+ invalidRequest: -32600,
4
+ methodNotFound: -32601,
5
+ invalidParams: -32602,
6
+ internalError: -32603,
7
+ };
8
+ export class McpError extends Error {
9
+ code;
10
+ data;
11
+ constructor(code, message, data) {
12
+ super(message);
13
+ this.name = "McpError";
14
+ this.code = code;
15
+ this.data = data;
16
+ }
17
+ }
18
+ export class McpConnectionClosedError extends Error {
19
+ constructor(message = "MCP connection closed") {
20
+ super(message);
21
+ this.name = "McpConnectionClosedError";
22
+ }
23
+ }
24
+ export class McpTimeoutError extends Error {
25
+ timeoutMs;
26
+ constructor(timeoutMs) {
27
+ super(`MCP request timed out after ${timeoutMs}ms`);
28
+ this.name = "McpTimeoutError";
29
+ this.timeoutMs = timeoutMs;
30
+ }
31
+ }
32
+ export class McpAbortError extends Error {
33
+ constructor(message = "MCP request aborted") {
34
+ super(message);
35
+ this.name = "AbortError";
36
+ }
37
+ }
38
+ export function isObject(value) {
39
+ return typeof value === "object" && value !== null && !Array.isArray(value);
40
+ }
41
+ export function toError(value) {
42
+ return value instanceof Error ? value : new Error(String(value));
43
+ }
44
+ export function isJsonRpcId(value) {
45
+ return typeof value === "string" || (typeof value === "number" && Number.isFinite(value));
46
+ }
47
+ export function isJsonRpcRequest(message) {
48
+ return (isObject(message) && message.jsonrpc === "2.0" && isJsonRpcId(message.id) && typeof message.method === "string");
49
+ }
50
+ export function isJsonRpcNotification(message) {
51
+ return isObject(message) && message.jsonrpc === "2.0" && !("id" in message) && typeof message.method === "string";
52
+ }
53
+ export function isJsonRpcResponse(message) {
54
+ if (!isObject(message) || message.jsonrpc !== "2.0" || !isJsonRpcId(message.id))
55
+ return false;
56
+ if ("result" in message)
57
+ return !("error" in message);
58
+ if (!("error" in message) || !isObject(message.error))
59
+ return false;
60
+ return typeof message.error.code === "number" && typeof message.error.message === "string";
61
+ }
62
+ export function parseJsonRpcMessage(value) {
63
+ if (isJsonRpcRequest(value) || isJsonRpcNotification(value) || isJsonRpcResponse(value))
64
+ return value;
65
+ throw new McpError(JSON_RPC_ERROR_CODES.invalidRequest, "Invalid JSON-RPC message");
66
+ }
67
+ //# sourceMappingURL=jsonrpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/protocol/jsonrpc.ts"],"names":[],"mappings":"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","sourcesContent":["export type JsonRpcId = string | number;\n\nexport interface JsonRpcRequest {\n\tjsonrpc: \"2.0\";\n\tid: JsonRpcId;\n\tmethod: string;\n\tparams?: unknown;\n}\n\nexport interface JsonRpcNotification {\n\tjsonrpc: \"2.0\";\n\tmethod: string;\n\tparams?: unknown;\n}\n\nexport interface JsonRpcErrorObject {\n\tcode: number;\n\tmessage: string;\n\tdata?: unknown;\n}\n\nexport interface JsonRpcSuccessResponse {\n\tjsonrpc: \"2.0\";\n\tid: JsonRpcId;\n\tresult: unknown;\n}\n\nexport interface JsonRpcErrorResponse {\n\tjsonrpc: \"2.0\";\n\tid: JsonRpcId;\n\terror: JsonRpcErrorObject;\n}\n\nexport type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;\n\nexport const JSON_RPC_ERROR_CODES = {\n\tparseError: -32700,\n\tinvalidRequest: -32600,\n\tmethodNotFound: -32601,\n\tinvalidParams: -32602,\n\tinternalError: -32603,\n} as const;\n\nexport class McpError extends Error {\n\treadonly code: number;\n\treadonly data: unknown;\n\n\tconstructor(code: number, message: string, data?: unknown) {\n\t\tsuper(message);\n\t\tthis.name = \"McpError\";\n\t\tthis.code = code;\n\t\tthis.data = data;\n\t}\n}\n\nexport class McpConnectionClosedError extends Error {\n\tconstructor(message = \"MCP connection closed\") {\n\t\tsuper(message);\n\t\tthis.name = \"McpConnectionClosedError\";\n\t}\n}\n\nexport class McpTimeoutError extends Error {\n\treadonly timeoutMs: number;\n\n\tconstructor(timeoutMs: number) {\n\t\tsuper(`MCP request timed out after ${timeoutMs}ms`);\n\t\tthis.name = \"McpTimeoutError\";\n\t\tthis.timeoutMs = timeoutMs;\n\t}\n}\n\nexport class McpAbortError extends Error {\n\tconstructor(message = \"MCP request aborted\") {\n\t\tsuper(message);\n\t\tthis.name = \"AbortError\";\n\t}\n}\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function toError(value: unknown): Error {\n\treturn value instanceof Error ? value : new Error(String(value));\n}\n\nexport function isJsonRpcId(value: unknown): value is JsonRpcId {\n\treturn typeof value === \"string\" || (typeof value === \"number\" && Number.isFinite(value));\n}\n\nexport function isJsonRpcRequest(message: unknown): message is JsonRpcRequest {\n\treturn (\n\t\tisObject(message) && message.jsonrpc === \"2.0\" && isJsonRpcId(message.id) && typeof message.method === \"string\"\n\t);\n}\n\nexport function isJsonRpcNotification(message: unknown): message is JsonRpcNotification {\n\treturn isObject(message) && message.jsonrpc === \"2.0\" && !(\"id\" in message) && typeof message.method === \"string\";\n}\n\nexport function isJsonRpcResponse(message: unknown): message is JsonRpcResponse {\n\tif (!isObject(message) || message.jsonrpc !== \"2.0\" || !isJsonRpcId(message.id)) return false;\n\tif (\"result\" in message) return !(\"error\" in message);\n\tif (!(\"error\" in message) || !isObject(message.error)) return false;\n\treturn typeof message.error.code === \"number\" && typeof message.error.message === \"string\";\n}\n\nexport function parseJsonRpcMessage(value: unknown): JsonRpcMessage {\n\tif (isJsonRpcRequest(value) || isJsonRpcNotification(value) || isJsonRpcResponse(value)) return value;\n\tthrow new McpError(JSON_RPC_ERROR_CODES.invalidRequest, \"Invalid JSON-RPC message\");\n}\n"]}
@@ -0,0 +1,123 @@
1
+ import type { BlobResourceContents, ContentAnnotations, TextResourceContents } from "./content.js";
2
+ import type { JsonRpcId } from "./jsonrpc.js";
3
+ export declare const LATEST_PROTOCOL_VERSION = "2025-11-25";
4
+ /**
5
+ * Versions the client accepts from a server. Servers that do not support the requested version answer
6
+ * with their own latest one, so older versions stay accepted for servers built on older SDKs.
7
+ */
8
+ export declare const SUPPORTED_PROTOCOL_VERSIONS: readonly ["2025-11-25", "2025-06-18", "2025-03-26", "2024-11-05"];
9
+ export type SupportedProtocolVersion = (typeof SUPPORTED_PROTOCOL_VERSIONS)[number];
10
+ export interface Implementation {
11
+ name: string;
12
+ version: string;
13
+ title?: string;
14
+ }
15
+ export interface Root {
16
+ uri: string;
17
+ name?: string;
18
+ }
19
+ export interface ClientCapabilities {
20
+ experimental?: Record<string, unknown>;
21
+ roots?: {
22
+ listChanged?: boolean;
23
+ };
24
+ sampling?: Record<string, unknown>;
25
+ elicitation?: Record<string, unknown>;
26
+ }
27
+ export interface ServerCapabilities {
28
+ experimental?: Record<string, unknown>;
29
+ logging?: Record<string, unknown>;
30
+ prompts?: {
31
+ listChanged?: boolean;
32
+ };
33
+ resources?: {
34
+ subscribe?: boolean;
35
+ listChanged?: boolean;
36
+ };
37
+ tools?: {
38
+ listChanged?: boolean;
39
+ };
40
+ completions?: Record<string, unknown>;
41
+ }
42
+ export interface InitializeParams {
43
+ protocolVersion: string;
44
+ capabilities: ClientCapabilities;
45
+ clientInfo: Implementation;
46
+ }
47
+ export interface InitializeResult {
48
+ protocolVersion: string;
49
+ capabilities: ServerCapabilities;
50
+ serverInfo: Implementation;
51
+ instructions?: string;
52
+ }
53
+ export interface ProgressNotification {
54
+ progressToken: string | number;
55
+ progress: number;
56
+ total?: number;
57
+ message?: string;
58
+ }
59
+ export interface CancelledNotification {
60
+ requestId: JsonRpcId;
61
+ reason?: string;
62
+ }
63
+ export interface ToolAnnotations {
64
+ title?: string;
65
+ readOnlyHint?: boolean;
66
+ destructiveHint?: boolean;
67
+ idempotentHint?: boolean;
68
+ openWorldHint?: boolean;
69
+ }
70
+ export interface ToolExecution {
71
+ taskSupport?: "forbidden" | "optional" | "required";
72
+ }
73
+ export interface Tool {
74
+ name: string;
75
+ title?: string;
76
+ description?: string;
77
+ inputSchema: Record<string, unknown>;
78
+ outputSchema?: Record<string, unknown>;
79
+ annotations?: ToolAnnotations;
80
+ execution?: ToolExecution;
81
+ _meta?: Record<string, unknown>;
82
+ }
83
+ export interface ListToolsResult {
84
+ tools: Tool[];
85
+ nextCursor?: string;
86
+ _meta?: Record<string, unknown>;
87
+ }
88
+ /** A resource a server lists in `resources/list`. */
89
+ export interface Resource {
90
+ uri: string;
91
+ name: string;
92
+ title?: string;
93
+ description?: string;
94
+ mimeType?: string;
95
+ size?: number;
96
+ annotations?: ContentAnnotations;
97
+ _meta?: Record<string, unknown>;
98
+ }
99
+ /** A family of resources, addressed by an RFC 6570 URI template, from `resources/templates/list`. */
100
+ export interface ResourceTemplate {
101
+ uriTemplate: string;
102
+ name: string;
103
+ title?: string;
104
+ description?: string;
105
+ mimeType?: string;
106
+ annotations?: ContentAnnotations;
107
+ _meta?: Record<string, unknown>;
108
+ }
109
+ export interface ListResourcesResult {
110
+ resources: Resource[];
111
+ nextCursor?: string;
112
+ _meta?: Record<string, unknown>;
113
+ }
114
+ export interface ListResourceTemplatesResult {
115
+ resourceTemplates: ResourceTemplate[];
116
+ nextCursor?: string;
117
+ _meta?: Record<string, unknown>;
118
+ }
119
+ export interface ReadResourceResult {
120
+ contents: (TextResourceContents | BlobResourceContents)[];
121
+ _meta?: Record<string, unknown>;
122
+ }
123
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/protocol/types.ts"],"names":[],"mappings":"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"}