@qduc/term2 0.24.1 → 0.25.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 (215) hide show
  1. package/dist/agent.d.ts +3 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +2 -1
  4. package/dist/agent.js.map +1 -1
  5. package/dist/app.d.ts +10 -0
  6. package/dist/app.d.ts.map +1 -1
  7. package/dist/app.js +33 -6
  8. package/dist/app.js.map +1 -1
  9. package/dist/cli.js +43 -1
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/mcp-login-command.d.ts +24 -0
  12. package/dist/commands/mcp-login-command.d.ts.map +1 -0
  13. package/dist/commands/mcp-login-command.js +65 -0
  14. package/dist/commands/mcp-login-command.js.map +1 -0
  15. package/dist/commands/mcp-status-command.d.ts +19 -0
  16. package/dist/commands/mcp-status-command.d.ts.map +1 -0
  17. package/dist/commands/mcp-status-command.js +19 -0
  18. package/dist/commands/mcp-status-command.js.map +1 -0
  19. package/dist/components/input/ApplicationInputSurface.d.ts +4 -0
  20. package/dist/components/input/ApplicationInputSurface.d.ts.map +1 -1
  21. package/dist/components/input/ApplicationInputSurface.js +2 -0
  22. package/dist/components/input/ApplicationInputSurface.js.map +1 -1
  23. package/dist/components/input/McpMenuSession.d.ts +9 -0
  24. package/dist/components/input/McpMenuSession.d.ts.map +1 -0
  25. package/dist/components/input/McpMenuSession.js +370 -0
  26. package/dist/components/input/McpMenuSession.js.map +1 -0
  27. package/dist/components/input/mcp-intent-host.d.ts +10 -0
  28. package/dist/components/input/mcp-intent-host.d.ts.map +1 -0
  29. package/dist/components/input/mcp-intent-host.js +31 -0
  30. package/dist/components/input/mcp-intent-host.js.map +1 -0
  31. package/dist/components/input/menu-controller.d.ts.map +1 -1
  32. package/dist/components/input/menu-controller.js +8 -5
  33. package/dist/components/input/menu-controller.js.map +1 -1
  34. package/dist/components/input/menu-registry.d.ts.map +1 -1
  35. package/dist/components/input/menu-registry.js +2 -0
  36. package/dist/components/input/menu-registry.js.map +1 -1
  37. package/dist/components/input/menu-types.d.ts +22 -1
  38. package/dist/components/input/menu-types.d.ts.map +1 -1
  39. package/dist/components/layout/BottomArea.d.ts +6 -1
  40. package/dist/components/layout/BottomArea.d.ts.map +1 -1
  41. package/dist/components/layout/BottomArea.js +9 -6
  42. package/dist/components/layout/BottomArea.js.map +1 -1
  43. package/dist/components/menu/McpSelectionMenu.d.ts +15 -0
  44. package/dist/components/menu/McpSelectionMenu.d.ts.map +1 -0
  45. package/dist/components/menu/McpSelectionMenu.js +19 -0
  46. package/dist/components/menu/McpSelectionMenu.js.map +1 -0
  47. package/dist/components/message/command-message-helpers.d.ts +2 -2
  48. package/dist/components/message/command-message-helpers.d.ts.map +1 -1
  49. package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
  50. package/dist/components/prompt/ApprovalPrompt.js +3 -0
  51. package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
  52. package/dist/contracts/conversation.d.ts +2 -0
  53. package/dist/contracts/conversation.d.ts.map +1 -1
  54. package/dist/contracts/conversation.js.map +1 -1
  55. package/dist/hooks/conversation-ui-reducer.d.ts +1 -1
  56. package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
  57. package/dist/hooks/settings-completion-config.d.ts.map +1 -1
  58. package/dist/hooks/settings-completion-config.js +1 -0
  59. package/dist/hooks/settings-completion-config.js.map +1 -1
  60. package/dist/hooks/use-app-commands.d.ts +9 -1
  61. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  62. package/dist/hooks/use-app-commands.js +14 -1
  63. package/dist/hooks/use-app-commands.js.map +1 -1
  64. package/dist/hooks/use-conversation.d.ts +1 -1
  65. package/dist/hooks/use-mcp-notices.d.ts +10 -0
  66. package/dist/hooks/use-mcp-notices.d.ts.map +1 -0
  67. package/dist/hooks/use-mcp-notices.js +47 -0
  68. package/dist/hooks/use-mcp-notices.js.map +1 -0
  69. package/dist/hooks/use-settings-value-completion.d.ts +3 -2
  70. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  71. package/dist/hooks/use-settings-value-completion.js +21 -3
  72. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  73. package/dist/hooks/use-shell-mode.d.ts +1 -0
  74. package/dist/hooks/use-shell-mode.d.ts.map +1 -1
  75. package/dist/hooks/use-shell-mode.js +1 -0
  76. package/dist/hooks/use-shell-mode.js.map +1 -1
  77. package/dist/lib/agent-client.d.ts +1 -0
  78. package/dist/lib/agent-client.d.ts.map +1 -1
  79. package/dist/lib/agent-client.js +2 -0
  80. package/dist/lib/agent-client.js.map +1 -1
  81. package/dist/lib/agent-configuration.d.ts +4 -0
  82. package/dist/lib/agent-configuration.d.ts.map +1 -1
  83. package/dist/lib/agent-configuration.js +8 -0
  84. package/dist/lib/agent-configuration.js.map +1 -1
  85. package/dist/lib/agent-factory.d.ts +2 -0
  86. package/dist/lib/agent-factory.d.ts.map +1 -1
  87. package/dist/lib/agent-factory.js +1 -0
  88. package/dist/lib/agent-factory.js.map +1 -1
  89. package/dist/lib/oauth-loopback.d.ts +79 -0
  90. package/dist/lib/oauth-loopback.d.ts.map +1 -0
  91. package/dist/lib/oauth-loopback.js +221 -0
  92. package/dist/lib/oauth-loopback.js.map +1 -0
  93. package/dist/non-interactive.d.ts +2 -0
  94. package/dist/non-interactive.d.ts.map +1 -1
  95. package/dist/non-interactive.js +19 -0
  96. package/dist/non-interactive.js.map +1 -1
  97. package/dist/providers/oauth-pkce.d.ts +5 -1
  98. package/dist/providers/oauth-pkce.d.ts.map +1 -1
  99. package/dist/providers/oauth-pkce.js +28 -208
  100. package/dist/providers/oauth-pkce.js.map +1 -1
  101. package/dist/providers/openrouter-decisions.d.ts +15 -0
  102. package/dist/providers/openrouter-decisions.d.ts.map +1 -0
  103. package/dist/providers/openrouter-decisions.js +25 -0
  104. package/dist/providers/openrouter-decisions.js.map +1 -0
  105. package/dist/services/approval/decision-shadow.d.ts +15 -0
  106. package/dist/services/approval/decision-shadow.d.ts.map +1 -0
  107. package/dist/services/approval/decision-shadow.js +77 -0
  108. package/dist/services/approval/decision-shadow.js.map +1 -0
  109. package/dist/services/approval/non-interactive-approval-policy.d.ts +5 -0
  110. package/dist/services/approval/non-interactive-approval-policy.d.ts.map +1 -1
  111. package/dist/services/approval/non-interactive-approval-policy.js +14 -0
  112. package/dist/services/approval/non-interactive-approval-policy.js.map +1 -1
  113. package/dist/services/approval/shell-auto-approval-evaluator.d.ts +5 -1
  114. package/dist/services/approval/shell-auto-approval-evaluator.d.ts.map +1 -1
  115. package/dist/services/approval/shell-auto-approval-evaluator.js +80 -4
  116. package/dist/services/approval/shell-auto-approval-evaluator.js.map +1 -1
  117. package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
  118. package/dist/services/conversation/conversation-orchestrator.js +16 -2
  119. package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
  120. package/dist/services/conversation/conversation-orchestrator.types.d.ts +1 -1
  121. package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
  122. package/dist/services/mcp/mcp-config-controller.d.ts +32 -0
  123. package/dist/services/mcp/mcp-config-controller.d.ts.map +1 -0
  124. package/dist/services/mcp/mcp-config-controller.js +89 -0
  125. package/dist/services/mcp/mcp-config-controller.js.map +1 -0
  126. package/dist/services/mcp/mcp-config.d.ts +61 -0
  127. package/dist/services/mcp/mcp-config.d.ts.map +1 -0
  128. package/dist/services/mcp/mcp-config.js +232 -0
  129. package/dist/services/mcp/mcp-config.js.map +1 -0
  130. package/dist/services/mcp/mcp-connection-manager.d.ts +126 -0
  131. package/dist/services/mcp/mcp-connection-manager.d.ts.map +1 -0
  132. package/dist/services/mcp/mcp-connection-manager.js +488 -0
  133. package/dist/services/mcp/mcp-connection-manager.js.map +1 -0
  134. package/dist/services/mcp/mcp-oauth-login.d.ts +79 -0
  135. package/dist/services/mcp/mcp-oauth-login.d.ts.map +1 -0
  136. package/dist/services/mcp/mcp-oauth-login.js +126 -0
  137. package/dist/services/mcp/mcp-oauth-login.js.map +1 -0
  138. package/dist/services/mcp/mcp-oauth-provider.d.ts +77 -0
  139. package/dist/services/mcp/mcp-oauth-provider.d.ts.map +1 -0
  140. package/dist/services/mcp/mcp-oauth-provider.js +121 -0
  141. package/dist/services/mcp/mcp-oauth-provider.js.map +1 -0
  142. package/dist/services/mcp/mcp-oauth-store.d.ts +106 -0
  143. package/dist/services/mcp/mcp-oauth-store.d.ts.map +1 -0
  144. package/dist/services/mcp/mcp-oauth-store.js +278 -0
  145. package/dist/services/mcp/mcp-oauth-store.js.map +1 -0
  146. package/dist/services/mcp/mcp-status.d.ts +41 -0
  147. package/dist/services/mcp/mcp-status.d.ts.map +1 -0
  148. package/dist/services/mcp/mcp-status.js +69 -0
  149. package/dist/services/mcp/mcp-status.js.map +1 -0
  150. package/dist/services/mcp/mcp-stdio-launcher.d.ts +26 -0
  151. package/dist/services/mcp/mcp-stdio-launcher.d.ts.map +1 -0
  152. package/dist/services/mcp/mcp-stdio-launcher.js +8 -0
  153. package/dist/services/mcp/mcp-stdio-launcher.js.map +1 -0
  154. package/dist/services/mcp/mcp-tool-source.d.ts +77 -0
  155. package/dist/services/mcp/mcp-tool-source.d.ts.map +1 -0
  156. package/dist/services/mcp/mcp-tool-source.js +10 -0
  157. package/dist/services/mcp/mcp-tool-source.js.map +1 -0
  158. package/dist/services/mcp/test-fixtures/fake-authorization-server.d.ts +25 -0
  159. package/dist/services/mcp/test-fixtures/fake-authorization-server.d.ts.map +1 -0
  160. package/dist/services/mcp/test-fixtures/fake-authorization-server.js +147 -0
  161. package/dist/services/mcp/test-fixtures/fake-authorization-server.js.map +1 -0
  162. package/dist/services/mcp/test-fixtures/protected-mcp-server.d.ts +29 -0
  163. package/dist/services/mcp/test-fixtures/protected-mcp-server.d.ts.map +1 -0
  164. package/dist/services/mcp/test-fixtures/protected-mcp-server.js +87 -0
  165. package/dist/services/mcp/test-fixtures/protected-mcp-server.js.map +1 -0
  166. package/dist/services/mcp/turn-stable-mcp-tool-source.d.ts +19 -0
  167. package/dist/services/mcp/turn-stable-mcp-tool-source.d.ts.map +1 -0
  168. package/dist/services/mcp/turn-stable-mcp-tool-source.js +37 -0
  169. package/dist/services/mcp/turn-stable-mcp-tool-source.js.map +1 -0
  170. package/dist/services/models/decision-model-listing.d.ts +26 -0
  171. package/dist/services/models/decision-model-listing.d.ts.map +1 -0
  172. package/dist/services/models/decision-model-listing.js +61 -0
  173. package/dist/services/models/decision-model-listing.js.map +1 -0
  174. package/dist/services/profiles/registry.d.ts +1 -1
  175. package/dist/services/profiles/registry.d.ts.map +1 -1
  176. package/dist/services/profiles/registry.js +2 -1
  177. package/dist/services/profiles/registry.js.map +1 -1
  178. package/dist/services/settings/settings-schema.d.ts +4 -0
  179. package/dist/services/settings/settings-schema.d.ts.map +1 -1
  180. package/dist/services/settings/settings-schema.js +8 -0
  181. package/dist/services/settings/settings-schema.js.map +1 -1
  182. package/dist/services/settings/settings-sources.d.ts +2 -0
  183. package/dist/services/settings/settings-sources.d.ts.map +1 -1
  184. package/dist/services/settings/settings-sources.js +2 -0
  185. package/dist/services/settings/settings-sources.js.map +1 -1
  186. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +1 -1
  187. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
  188. package/dist/services/settings/test-helpers/settings-consumer-inventory.js +1 -0
  189. package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
  190. package/dist/services/shell/shell-interaction-session.d.ts +2 -0
  191. package/dist/services/shell/shell-interaction-session.d.ts.map +1 -1
  192. package/dist/services/shell/shell-interaction-session.js +11 -2
  193. package/dist/services/shell/shell-interaction-session.js.map +1 -1
  194. package/dist/services/subagents/subagent-notification-store.js.map +1 -1
  195. package/dist/tools/system/run-code/mcp-script-surface.d.ts +28 -0
  196. package/dist/tools/system/run-code/mcp-script-surface.d.ts.map +1 -0
  197. package/dist/tools/system/run-code/mcp-script-surface.js +165 -0
  198. package/dist/tools/system/run-code/mcp-script-surface.js.map +1 -0
  199. package/dist/tools/system/run-code/run-code-runtime.d.ts.map +1 -1
  200. package/dist/tools/system/run-code/run-code-runtime.js +13 -1
  201. package/dist/tools/system/run-code/run-code-runtime.js.map +1 -1
  202. package/dist/tools/system/run-code/run-code.d.ts +3 -0
  203. package/dist/tools/system/run-code/run-code.d.ts.map +1 -1
  204. package/dist/tools/system/run-code/run-code.js +32 -4
  205. package/dist/tools/system/run-code/run-code.js.map +1 -1
  206. package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
  207. package/dist/utils/conversation/conversation-utils.d.ts +1 -5
  208. package/dist/utils/conversation/conversation-utils.d.ts.map +1 -1
  209. package/dist/utils/conversation/conversation-utils.js +4 -1
  210. package/dist/utils/conversation/conversation-utils.js.map +1 -1
  211. package/dist/utils/value-suggestions.d.ts +14 -0
  212. package/dist/utils/value-suggestions.d.ts.map +1 -1
  213. package/dist/utils/value-suggestions.js +31 -0
  214. package/dist/utils/value-suggestions.js.map +1 -1
  215. package/package.json +3 -1
@@ -0,0 +1,89 @@
1
+ import * as nodeFileSystem from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { loadMcpConfig } from './mcp-config.js';
5
+ export class McpConfigController {
6
+ userConfigPath;
7
+ workspaceRoot;
8
+ replaceServers;
9
+ onNote;
10
+ fileSystem;
11
+ temporaryPath;
12
+ loadConfig;
13
+ constructor(options) {
14
+ this.userConfigPath = options.userConfigPath;
15
+ this.workspaceRoot = options.workspaceRoot;
16
+ this.replaceServers = options.replaceServers;
17
+ this.onNote = options.onNote;
18
+ this.fileSystem = options.fileSystem ?? nodeFileSystem;
19
+ this.temporaryPath = options.temporaryPath ?? ((path) => `${path}.${randomUUID()}.tmp`);
20
+ this.loadConfig = options.loadConfig ?? loadMcpConfig;
21
+ }
22
+ async readRoot() {
23
+ let contents;
24
+ try {
25
+ contents = await this.fileSystem.readFile(this.userConfigPath, 'utf8');
26
+ }
27
+ catch (error) {
28
+ if (error.code === 'ENOENT')
29
+ return {};
30
+ throw error;
31
+ }
32
+ let parsed;
33
+ try {
34
+ parsed = JSON.parse(contents);
35
+ }
36
+ catch (error) {
37
+ throw new Error(`${this.userConfigPath} is not valid JSON: ${error.message}`);
38
+ }
39
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
40
+ throw new Error(`${this.userConfigPath} must contain a JSON object`);
41
+ }
42
+ const root = parsed;
43
+ if (root.mcpServers !== undefined &&
44
+ (!root.mcpServers || typeof root.mcpServers !== 'object' || Array.isArray(root.mcpServers))) {
45
+ throw new Error(`${this.userConfigPath}: "mcpServers" must be an object`);
46
+ }
47
+ return root;
48
+ }
49
+ async listUserServers() {
50
+ const root = await this.readRoot();
51
+ return Object.entries(root.mcpServers ?? {}).flatMap(([name, config]) => config && typeof config === 'object' && !Array.isArray(config)
52
+ ? [{ name, config: config }]
53
+ : []);
54
+ }
55
+ async saveUserServer(originalName, name, config) {
56
+ const trimmedName = name.trim();
57
+ if (!trimmedName)
58
+ throw new Error('Server name is required.');
59
+ const root = await this.readRoot();
60
+ const servers = { ...(root.mcpServers ?? {}) };
61
+ if (originalName !== null && originalName !== trimmedName)
62
+ delete servers[originalName];
63
+ if (originalName !== trimmedName && Object.hasOwn(servers, trimmedName)) {
64
+ throw new Error(`An MCP server named "${trimmedName}" already exists.`);
65
+ }
66
+ servers[trimmedName] = config;
67
+ await this.persistAndReload({ ...root, mcpServers: servers });
68
+ }
69
+ async deleteUserServer(name) {
70
+ const root = await this.readRoot();
71
+ const servers = { ...(root.mcpServers ?? {}) };
72
+ delete servers[name];
73
+ await this.persistAndReload({ ...root, mcpServers: servers });
74
+ }
75
+ async persistAndReload(root) {
76
+ const directory = dirname(this.userConfigPath);
77
+ await this.fileSystem.mkdir(directory, { recursive: true });
78
+ const temporary = this.temporaryPath(this.userConfigPath);
79
+ await this.fileSystem.writeFile(temporary, `${JSON.stringify(root, null, 2)}\n`, { mode: 0o600 });
80
+ await this.fileSystem.rename(temporary, this.userConfigPath);
81
+ const loaded = await this.loadConfig({
82
+ settingsDir: directory,
83
+ workspaceRoot: this.workspaceRoot,
84
+ ...(this.onNote ? { onNote: this.onNote } : {}),
85
+ });
86
+ await this.replaceServers(loaded.servers);
87
+ }
88
+ }
89
+ //# sourceMappingURL=mcp-config-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config-controller.js","sourceRoot":"","sources":["../../../source/services/mcp/mcp-config-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { McpServerProvenance, McpTransportKind } from './mcp-tool-source.js';
2
+ export interface McpServerOverrides {
3
+ readonly enabled?: boolean;
4
+ }
5
+ /** A server entry after merge + validation. `error` set means the entry is unusable. */
6
+ export interface ResolvedMcpServerConfig {
7
+ readonly name: string;
8
+ readonly provenance: McpServerProvenance;
9
+ readonly transport: McpTransportKind;
10
+ readonly command?: string;
11
+ readonly args?: readonly string[];
12
+ readonly env?: Readonly<Record<string, string>>;
13
+ readonly cwd?: string;
14
+ readonly url?: string;
15
+ readonly headers?: Readonly<Record<string, string>>;
16
+ /**
17
+ * CIMD: an HTTPS document the authorization server fetches client metadata
18
+ * from, which lets the login skip Dynamic Client Registration (plan D4 keeps
19
+ * DCR only as the fallback when this is absent).
20
+ */
21
+ readonly clientMetadataUrl?: string;
22
+ /**
23
+ * A pre-registered OAuth client id, for authorization servers that support
24
+ * neither CIMD nor Dynamic Client Registration and instead require an app
25
+ * registered out of band. GitHub is the observed case: its metadata
26
+ * advertises no `registration_endpoint` at all, so without this the login
27
+ * cannot begin. Takes precedence over both other paths.
28
+ */
29
+ readonly clientId?: string;
30
+ /**
31
+ * Loopback ports to fall back to when an authorization server only accepts
32
+ * pre-registered redirect URIs (plan D3). An ephemeral port is always tried
33
+ * first, so most servers need no entry here.
34
+ */
35
+ readonly redirectPorts?: readonly number[];
36
+ /** `projectServers."<workspace root>".<name>.enabled` from user config; only set on project entries. */
37
+ readonly projectEnabledOverride?: boolean;
38
+ /** Why this entry is unusable; always yields a `failed` snapshot. */
39
+ readonly error?: string;
40
+ }
41
+ export interface McpConfigLoadResult {
42
+ readonly servers: readonly ResolvedMcpServerConfig[];
43
+ /** Dropped/ignored material a user should know about (clashes, bad files). */
44
+ readonly notes: readonly string[];
45
+ /** Absolute path of the user config file, for actionable override hints. */
46
+ readonly userConfigPath: string;
47
+ readonly nonInteractiveAllow: readonly string[];
48
+ }
49
+ export interface LoadMcpConfigOptions {
50
+ /** `path -> contents` reader; defaults to the real filesystem. ENOENT is fine. */
51
+ files?: (path: string) => Promise<string>;
52
+ settingsDir?: string;
53
+ workspaceRoot?: string;
54
+ env?: NodeJS.ProcessEnv;
55
+ /** Receives notes (dropped clashes, unreadable files). */
56
+ onNote?: (message: string) => void;
57
+ }
58
+ /** Canonical form for opt-in matching; falls back to the input when the path does not exist. */
59
+ export declare const realpathOrSelf: (path: string) => string;
60
+ export declare function loadMcpConfig(options?: LoadMcpConfigOptions): Promise<McpConfigLoadResult>;
61
+ //# sourceMappingURL=mcp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../../source/services/mcp/mcp-config.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKlF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wFAAwF;AACxF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,wGAAwG;IACxG,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,qEAAqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACrD,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,kFAAkF;IAClF,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAyCD,gGAAgG;AAChG,eAAO,MAAM,cAAc,SAAU,MAAM,KAAG,MAM7C,CAAC;AA6IF,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgDpG"}
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Config loading for MCP servers (plan Decision 4 + the M1-connection brief).
3
+ *
4
+ * Sources: user `mcp.json` next to term2's settings directory and project
5
+ * `<workspace root>/.mcp.json`. A user entry wins over a clashing project
6
+ * entry; `${VAR}` expansion runs against the process environment for user
7
+ * config only, so a repository can never route a secret to a URL it chose.
8
+ * Invalid entries resolve to config errors — the connection manager turns
9
+ * those into `failed` snapshots — so one bad line never blocks startup.
10
+ */
11
+ import { realpathSync } from 'node:fs';
12
+ import { readFile } from 'node:fs/promises';
13
+ import { isAbsolute, join, resolve } from 'node:path';
14
+ import { getActiveWorkspaceRoot } from '../workspace/active-workspace-root.js';
15
+ import { resolveSettingsDirectory } from '../settings/settings-path.js';
16
+ const USER_CONFIG_FILE_NAME = 'mcp.json';
17
+ const PROJECT_CONFIG_FILE_NAME = '.mcp.json';
18
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
19
+ const ENV_PATTERN = /\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g;
20
+ const expandValue = (value, env) => value.replace(ENV_PATTERN, (_whole, name) => env[name] ?? '');
21
+ /** Relative cwd paths run against the config file's context, never term2's process cwd. */
22
+ const resolveCwd = (cwd, cwdBase) => (isAbsolute(cwd) ? cwd : resolve(cwdBase, cwd));
23
+ const asStringRecord = (value) => {
24
+ if (!isRecord(value))
25
+ return undefined;
26
+ const out = {};
27
+ for (const [k, v] of Object.entries(value)) {
28
+ if (typeof v !== 'string')
29
+ return undefined;
30
+ out[k] = v;
31
+ }
32
+ return out;
33
+ };
34
+ const EMPTY_SOURCE = { entries: new Map(), projectOverrides: new Map(), nonInteractiveAllow: [] };
35
+ /** Canonical form for opt-in matching; falls back to the input when the path does not exist. */
36
+ export const realpathOrSelf = (path) => {
37
+ try {
38
+ return realpathSync(path);
39
+ }
40
+ catch {
41
+ return path;
42
+ }
43
+ };
44
+ const parseSourceFile = (sourceName, contents, note) => {
45
+ let root;
46
+ try {
47
+ root = JSON.parse(contents);
48
+ }
49
+ catch (error) {
50
+ note(`${sourceName} is not valid JSON and was ignored: ${error.message}`);
51
+ return EMPTY_SOURCE;
52
+ }
53
+ if (!isRecord(root)) {
54
+ note(`${sourceName} is not a JSON object and was ignored.`);
55
+ return EMPTY_SOURCE;
56
+ }
57
+ const entries = new Map();
58
+ const rawServers = root.mcpServers;
59
+ if (rawServers !== undefined) {
60
+ if (!isRecord(rawServers)) {
61
+ note(`${sourceName}: "mcpServers" is not an object and was ignored.`);
62
+ }
63
+ else {
64
+ for (const [name, entry] of Object.entries(rawServers))
65
+ entries.set(name, entry);
66
+ }
67
+ }
68
+ const projectOverrides = new Map();
69
+ const nonInteractiveAllow = Array.isArray(root.nonInteractiveAllow)
70
+ ? root.nonInteractiveAllow.filter((value) => typeof value === 'string')
71
+ : [];
72
+ const rawOverrides = root.projectServers;
73
+ if (rawOverrides !== undefined) {
74
+ if (!isRecord(rawOverrides)) {
75
+ note(`${sourceName}: "projectServers" is not an object and was ignored.`);
76
+ }
77
+ else {
78
+ for (const [rootPath, servers] of Object.entries(rawOverrides)) {
79
+ // Keys are workspace roots: relative paths must never be resolved
80
+ // against term2's process cwd, so they are ignored with a note.
81
+ if (!isAbsolute(rootPath)) {
82
+ note(`${sourceName}: "projectServers.${rootPath}" is not an absolute path and was ignored.`);
83
+ continue;
84
+ }
85
+ if (!isRecord(servers)) {
86
+ note(`${sourceName}: "projectServers.${rootPath}" is not an object and was ignored.`);
87
+ continue;
88
+ }
89
+ const byName = new Map();
90
+ for (const [name, value] of Object.entries(servers)) {
91
+ if (isRecord(value) && typeof value.enabled === 'boolean') {
92
+ byName.set(name, { enabled: value.enabled });
93
+ }
94
+ }
95
+ projectOverrides.set(rootPath, byName);
96
+ }
97
+ }
98
+ }
99
+ return { entries, projectOverrides, nonInteractiveAllow };
100
+ };
101
+ const resolveEntry = (name, provenance, entry, env,
102
+ /** User config expands `${VAR}`; project config is literal. */
103
+ expandVariables, projectEnabledOverride,
104
+ /** Relative `cwd` resolves against this: the config file's workspace (project) or settings dir (user). */
105
+ cwdBase) => {
106
+ const fail = (error) => ({
107
+ name,
108
+ provenance,
109
+ // Nothing is inferable when the entry itself is malformed; the manager
110
+ // never launches an errored entry, so this placeholder is inert.
111
+ transport: 'stdio',
112
+ projectEnabledOverride,
113
+ error,
114
+ });
115
+ if (!isRecord(entry))
116
+ return fail('entry is not an object');
117
+ const rawType = entry.type;
118
+ if (rawType !== undefined && rawType !== 'stdio' && rawType !== 'http' && rawType !== 'sse') {
119
+ return fail(`unknown type ${JSON.stringify(rawType)} (expected stdio, http, or sse)`);
120
+ }
121
+ const rawCommand = entry.command;
122
+ const rawUrl = entry.url;
123
+ if (rawCommand !== undefined && typeof rawCommand !== 'string')
124
+ return fail('command must be a string');
125
+ if (rawUrl !== undefined && typeof rawUrl !== 'string')
126
+ return fail('url must be a string');
127
+ let type = rawType;
128
+ if (type === undefined)
129
+ type = rawCommand !== undefined ? 'stdio' : rawUrl !== undefined ? 'http' : undefined;
130
+ if (type === undefined)
131
+ return fail('needs a command (stdio) or a url (http/sse)');
132
+ if (type === 'stdio' && rawCommand === undefined)
133
+ return fail('type "stdio" requires a command');
134
+ if (type !== 'stdio' && rawUrl === undefined)
135
+ return fail(`type "${type}" requires a url`);
136
+ const rawArgs = entry.args;
137
+ if (rawArgs !== undefined && (!Array.isArray(rawArgs) || rawArgs.some((a) => typeof a !== 'string'))) {
138
+ return fail('args must be an array of strings');
139
+ }
140
+ const rawEnv = asStringRecord(entry.env);
141
+ if (entry.env !== undefined && rawEnv === undefined)
142
+ return fail('env must be an object of strings');
143
+ const rawHeaders = asStringRecord(entry.headers);
144
+ if (entry.headers !== undefined && rawHeaders === undefined)
145
+ return fail('headers must be an object of strings');
146
+ const rawCwd = entry.cwd;
147
+ if (rawCwd !== undefined && typeof rawCwd !== 'string')
148
+ return fail('cwd must be a string');
149
+ const rawClientId = entry.clientId;
150
+ if (rawClientId !== undefined && typeof rawClientId !== 'string')
151
+ return fail('clientId must be a string');
152
+ const rawClientMetadataUrl = entry.clientMetadataUrl;
153
+ if (rawClientMetadataUrl !== undefined && typeof rawClientMetadataUrl !== 'string') {
154
+ return fail('clientMetadataUrl must be a string');
155
+ }
156
+ const rawRedirectPorts = entry.redirectPorts;
157
+ if (rawRedirectPorts !== undefined &&
158
+ (!Array.isArray(rawRedirectPorts) ||
159
+ rawRedirectPorts.some((p) => typeof p !== 'number' || !Number.isInteger(p) || p < 1 || p > 65535))) {
160
+ return fail('redirectPorts must be an array of port numbers');
161
+ }
162
+ const expandArg = (value) => (expandVariables ? expandValue(value, env) : value);
163
+ const transport = type === 'http' ? 'streamable-http' : type;
164
+ return {
165
+ name,
166
+ provenance,
167
+ transport,
168
+ ...(rawCommand !== undefined ? { command: expandArg(rawCommand) } : {}),
169
+ ...(rawArgs !== undefined ? { args: rawArgs.map(expandArg) } : {}),
170
+ ...(rawEnv !== undefined
171
+ ? { env: Object.fromEntries(Object.entries(rawEnv).map(([k, v]) => [k, expandArg(v)])) }
172
+ : {}),
173
+ ...(rawCwd !== undefined ? { cwd: resolveCwd(expandArg(rawCwd), cwdBase) } : {}),
174
+ ...(rawUrl !== undefined ? { url: expandArg(rawUrl) } : {}),
175
+ ...(rawHeaders !== undefined
176
+ ? { headers: Object.fromEntries(Object.entries(rawHeaders).map(([k, v]) => [k, expandArg(v)])) }
177
+ : {}),
178
+ ...(rawClientMetadataUrl !== undefined ? { clientMetadataUrl: expandArg(rawClientMetadataUrl) } : {}),
179
+ ...(rawClientId !== undefined ? { clientId: expandArg(rawClientId) } : {}),
180
+ ...(rawRedirectPorts !== undefined ? { redirectPorts: rawRedirectPorts } : {}),
181
+ projectEnabledOverride,
182
+ };
183
+ };
184
+ export async function loadMcpConfig(options = {}) {
185
+ const notes = [];
186
+ const note = (message) => {
187
+ notes.push(message);
188
+ options.onNote?.(message);
189
+ };
190
+ const read = options.files ?? ((path) => readFile(path, 'utf8'));
191
+ const env = options.env ?? process.env;
192
+ const settingsDir = options.settingsDir ?? resolveSettingsDirectory();
193
+ const workspaceRoot = options.workspaceRoot ?? getActiveWorkspaceRoot();
194
+ const userConfigPath = join(settingsDir, USER_CONFIG_FILE_NAME);
195
+ const projectConfigPath = join(workspaceRoot, PROJECT_CONFIG_FILE_NAME);
196
+ const loadSource = async (path, sourceName) => {
197
+ let contents;
198
+ try {
199
+ contents = await read(path);
200
+ }
201
+ catch (error) {
202
+ if (error.code === 'ENOENT')
203
+ return EMPTY_SOURCE;
204
+ note(`${sourceName} could not be read and was ignored: ${error.message}`);
205
+ return EMPTY_SOURCE;
206
+ }
207
+ return parseSourceFile(sourceName, contents, note);
208
+ };
209
+ const user = await loadSource(userConfigPath, userConfigPath);
210
+ const project = await loadSource(projectConfigPath, projectConfigPath);
211
+ // Opt-in matching compares the real path of the workspace with the real path
212
+ // of each projectServers key, so a symlinked session root still matches.
213
+ const workspaceKey = realpathOrSelf(workspaceRoot);
214
+ const servers = [];
215
+ for (const [name, entry] of user.entries) {
216
+ servers.push(resolveEntry(name, 'user', entry, env, true, undefined, settingsDir));
217
+ }
218
+ for (const [name, entry] of project.entries) {
219
+ if (user.entries.has(name)) {
220
+ note(`project server "${name}" from ${projectConfigPath} was dropped: a user entry with the same name wins.`);
221
+ continue;
222
+ }
223
+ let projectEnabledOverride;
224
+ for (const [rootPath, byName] of user.projectOverrides) {
225
+ if (realpathOrSelf(rootPath) === workspaceKey)
226
+ projectEnabledOverride = byName.get(name)?.enabled;
227
+ }
228
+ servers.push(resolveEntry(name, 'project', entry, env, false, projectEnabledOverride, workspaceRoot));
229
+ }
230
+ return { servers, notes, userConfigPath, nonInteractiveAllow: user.nonInteractiveAllow };
231
+ }
232
+ //# sourceMappingURL=mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../source/services/mcp/mcp-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ import { McpCallError } from './mcp-tool-source.js';
2
+ import type { McpServerSnapshot, McpToolSource } from './mcp-tool-source.js';
3
+ export { McpCallError };
4
+ import { type ResolvedMcpServerConfig } from './mcp-config.js';
5
+ import { type StdioLauncher } from './mcp-stdio-launcher.js';
6
+ import type { McpOAuthStore } from './mcp-oauth-store.js';
7
+ export interface McpConnectionManagerOptions {
8
+ servers: readonly ResolvedMcpServerConfig[];
9
+ /** Path of the user config file, cited in the project-stdio opt-in error. */
10
+ userConfigPath?: string;
11
+ /** This session's workspace root, cited in the project-stdio opt-in error. */
12
+ workspaceRoot?: string;
13
+ /** Where stdio servers are actually spawned. Defaults to an unsandboxed spawn. */
14
+ stdioLauncher?: StdioLauncher;
15
+ /** Receives one notice per server that enters the failed state. */
16
+ onNotice?: (message: string) => void;
17
+ /**
18
+ * Credential storage for OAuth-protected HTTP servers. Without it no stored
19
+ * token is ever presented and such a server resolves to `needs-auth`.
20
+ */
21
+ oauthStore?: McpOAuthStore;
22
+ /**
23
+ * False in non-interactive runs, where no one can complete a browser login.
24
+ * A server needing one then resolves to `failed` with that reason, rather
25
+ * than to `needs-auth` naming a command that cannot be typed.
26
+ */
27
+ interactive?: boolean;
28
+ }
29
+ /** Everything `/mcp-login` needs to drive a flow for one configured server. */
30
+ export interface McpOAuthTarget {
31
+ readonly serverName: string;
32
+ readonly serverUrl: string;
33
+ readonly clientMetadataUrl?: string;
34
+ readonly clientId?: string;
35
+ readonly redirectPorts?: readonly number[];
36
+ }
37
+ export declare class McpConnectionManager implements McpToolSource {
38
+ private readonly connections;
39
+ private readonly listeners;
40
+ private readonly stdioLauncher;
41
+ private readonly userConfigPath?;
42
+ private readonly workspaceRoot?;
43
+ private readonly onNotice?;
44
+ private readonly oauthStore?;
45
+ private readonly interactive;
46
+ private readonly noticedFailures;
47
+ private snapshotCache;
48
+ private started;
49
+ private closed;
50
+ private settlePromise;
51
+ constructor(options: McpConnectionManagerOptions);
52
+ /** Begins connecting every server concurrently. Resolved configs never throw. */
53
+ start(): void;
54
+ /** Resolves once every connection started by `start()` left `connecting`. */
55
+ whenSettled(): Promise<void>;
56
+ snapshot(): readonly McpServerSnapshot[];
57
+ onCatalogChanged(listener: () => void): () => void;
58
+ callTool(server: string, tool: string, args: Record<string, unknown>, options: {
59
+ signal: AbortSignal;
60
+ timeoutMs?: number;
61
+ }): Promise<{
62
+ content: readonly unknown[];
63
+ structuredContent?: unknown;
64
+ isError: boolean;
65
+ }>;
66
+ close(): Promise<void>;
67
+ /** Reconciles edited config while preserving this stable tool-source object. */
68
+ replaceServers(configs: readonly ResolvedMcpServerConfig[]): Promise<void>;
69
+ /**
70
+ * Closes and clears this connection's client and transport, waiting for the
71
+ * closes to finish (bounded by the caller). Clearing first means a close()
72
+ * racing an in-flight connect can never double-close or re-await a torn-down
73
+ * client, and connectOne's post-await checks see the cleared state.
74
+ */
75
+ private teardown;
76
+ /** True once close() ran or this connection is being torn down. */
77
+ private isAbandoned;
78
+ private mapCallError;
79
+ private connectOne;
80
+ /**
81
+ * All three shapes mean the same thing: the server wants a credential this
82
+ * session does not have.
83
+ *
84
+ * The `SdkHttpError` case is not redundant — the transport only raises
85
+ * `UnauthorizedError` when an auth provider is attached, and one is attached
86
+ * only once a credential is stored. A server nobody has logged in to yet
87
+ * therefore reports its 401 as a plain HTTP error, which is precisely the
88
+ * case that must reach `needs-auth`.
89
+ */
90
+ private isAuthRequired;
91
+ /**
92
+ * Routes a server that asked for a login to the right resting state: an
93
+ * actionable `needs-auth` interactively, a `failed` that says why when no one
94
+ * can complete a browser flow (non-interactive) or when a project config is
95
+ * not allowed to start one (D2).
96
+ */
97
+ private markAuthRequired;
98
+ private connectStdio;
99
+ private connectHttp;
100
+ /**
101
+ * A provider that refreshes a stored credential but never starts a login, or
102
+ * `undefined` when there is nothing stored to refresh.
103
+ *
104
+ * D2: a project server that has not been opted in gets no provider at all, so
105
+ * a repository cannot cause even a discovery request to an issuer it chose.
106
+ */
107
+ private refreshOnlyAuthProvider;
108
+ /** Whether this server's config is allowed to hold or obtain OAuth credentials (D2). */
109
+ private oauthEligible;
110
+ /** The login details for a server, or undefined when it may not use OAuth. */
111
+ oauthTarget(name: string): McpOAuthTarget | undefined;
112
+ /**
113
+ * Re-runs one server's connection, used after `/mcp-login` stores a token.
114
+ *
115
+ * Clears the previous failure first so a re-entered failure is noticed (and
116
+ * announced) again rather than being swallowed as a duplicate.
117
+ */
118
+ reconnect(name: string): Promise<void>;
119
+ private connectClient;
120
+ private watchStdio;
121
+ private handleListChanged;
122
+ private refreshTools;
123
+ private markFailed;
124
+ private rebuildSnapshot;
125
+ }
126
+ //# sourceMappingURL=mcp-connection-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-connection-manager.d.ts","sourceRoot":"","sources":["../../../source/services/mcp/mcp-connection-manager.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAqB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEhG,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAkB,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC5C,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAyCD,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IACrD,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAoC;IAEzD,YAAY,OAAO,EAAE,2BAA2B,EAoB/C;IAED,iFAAiF;IACjF,KAAK,IAAI,IAAI,CAKZ;IAED,6EAA6E;IAC7E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAED,QAAQ,IAAI,SAAS,iBAAiB,EAAE,CAEvC;IAED,gBAAgB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAGjD;IAEK,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GACnD,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CA2BzF;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB3B;IAED,gFAAgF;IAC1E,cAAc,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B/E;IAED;;;;;OAKG;YACW,QAAQ;IAOtB,mEAAmE;IACnE,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;YAyBN,UAAU;IAkDxB;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;IAWtB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;YA2BV,YAAY;YAyBZ,WAAW;IAuBzB;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAe/B,wFAAwF;IACxF,OAAO,CAAC,aAAa;IAIrB,8EAA8E;IAC9E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAWpD;IAED;;;;;OAKG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3C;YAEa,aAAa;IAY3B,OAAO,CAAC,UAAU;YAgBJ,iBAAiB;YAcjB,YAAY;IAe1B,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,eAAe;CAaxB"}