@pentoshi/clai 4.8.4 → 4.9.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 (267) hide show
  1. package/README.md +69 -3
  2. package/dist/agent/finalize-gate.js +0 -9
  3. package/dist/agent/finalize-gate.js.map +1 -1
  4. package/dist/agent/plan-mode-reminders.js +5 -5
  5. package/dist/agent/plan-mode-reminders.js.map +1 -1
  6. package/dist/agent/plan-tool.d.ts +1 -0
  7. package/dist/agent/plan-tool.js +50 -21
  8. package/dist/agent/plan-tool.js.map +1 -1
  9. package/dist/agent/reliability-policy.d.ts +9 -0
  10. package/dist/agent/reliability-policy.js +36 -1
  11. package/dist/agent/reliability-policy.js.map +1 -1
  12. package/dist/agent/runner.d.ts +4 -0
  13. package/dist/agent/runner.js +193 -116
  14. package/dist/agent/runner.js.map +1 -1
  15. package/dist/agent/task-analyzer.d.ts +8 -18
  16. package/dist/agent/task-analyzer.js +75 -182
  17. package/dist/agent/task-analyzer.js.map +1 -1
  18. package/dist/agent/task-evidence.js +10 -0
  19. package/dist/agent/task-evidence.js.map +1 -1
  20. package/dist/agent/tool-call-parser.js +14 -13
  21. package/dist/agent/tool-call-parser.js.map +1 -1
  22. package/dist/app/adapters/current-agent-adapter.d.ts +5 -1
  23. package/dist/app/adapters/current-agent-adapter.js +2 -1
  24. package/dist/app/adapters/current-agent-adapter.js.map +1 -1
  25. package/dist/app/commands/catalog.js +5 -0
  26. package/dist/app/commands/catalog.js.map +1 -1
  27. package/dist/app/controllers/session-compact-helper.js +3 -6
  28. package/dist/app/controllers/session-compact-helper.js.map +1 -1
  29. package/dist/app/ports/transcript-item.d.ts +4 -0
  30. package/dist/classic/app/ClassicApp.js +1 -1
  31. package/dist/classic/app/ClassicApp.js.map +1 -1
  32. package/dist/classic/app/action-handlers.js +4 -0
  33. package/dist/classic/app/action-handlers.js.map +1 -1
  34. package/dist/classic/app/app-wiring.js +1 -0
  35. package/dist/classic/app/app-wiring.js.map +1 -1
  36. package/dist/classic/app/wiring-lifecycle.js +1 -0
  37. package/dist/classic/app/wiring-lifecycle.js.map +1 -1
  38. package/dist/classic/blocks/compacted-lines.js +3 -0
  39. package/dist/classic/blocks/compacted-lines.js.map +1 -1
  40. package/dist/classic/blocks/thinking-lines.js +11 -2
  41. package/dist/classic/blocks/thinking-lines.js.map +1 -1
  42. package/dist/classic/bootstrap/start-classic.js +3 -0
  43. package/dist/classic/bootstrap/start-classic.js.map +1 -1
  44. package/dist/classic/chrome/Composer.d.ts +6 -0
  45. package/dist/classic/chrome/Composer.js +2 -3
  46. package/dist/classic/chrome/Composer.js.map +1 -1
  47. package/dist/classic/chrome/composer-controller.d.ts +6 -1
  48. package/dist/classic/chrome/composer-controller.js +18 -8
  49. package/dist/classic/chrome/composer-controller.js.map +1 -1
  50. package/dist/classic/chrome/editor-view.d.ts +2 -1
  51. package/dist/classic/chrome/editor-view.js +1 -1
  52. package/dist/classic/chrome/editor-view.js.map +1 -1
  53. package/dist/classic/chrome/status-rows.js +3 -2
  54. package/dist/classic/chrome/status-rows.js.map +1 -1
  55. package/dist/classic/panels/TextEditorPanel.d.ts +3 -0
  56. package/dist/classic/panels/TextEditorPanel.js +7 -0
  57. package/dist/classic/panels/TextEditorPanel.js.map +1 -0
  58. package/dist/classic/panels/panel-controller.js +28 -1
  59. package/dist/classic/panels/panel-controller.js.map +1 -1
  60. package/dist/classic/panels/panel-effect.d.ts +3 -0
  61. package/dist/classic/panels/panel-effect.js.map +1 -1
  62. package/dist/classic/panels/panel-effects.js +3 -0
  63. package/dist/classic/panels/panel-effects.js.map +1 -1
  64. package/dist/classic/panels/panel-host.js +3 -0
  65. package/dist/classic/panels/panel-host.js.map +1 -1
  66. package/dist/classic/panels/panel-types.d.ts +2 -0
  67. package/dist/classic/panels/secret-panel.d.ts +1 -1
  68. package/dist/classic/panels/secret-panel.js +4 -2
  69. package/dist/classic/panels/secret-panel.js.map +1 -1
  70. package/dist/classic/panels/text-editor-panel.d.ts +33 -0
  71. package/dist/classic/panels/text-editor-panel.js +101 -0
  72. package/dist/classic/panels/text-editor-panel.js.map +1 -0
  73. package/dist/llm/adapters/anthropic-tools.d.ts +2 -1
  74. package/dist/llm/adapters/anthropic-tools.js +55 -4
  75. package/dist/llm/adapters/anthropic-tools.js.map +1 -1
  76. package/dist/llm/anthropic.js +1 -1
  77. package/dist/llm/anthropic.js.map +1 -1
  78. package/dist/llm/aws-mantle.js +2 -0
  79. package/dist/llm/aws-mantle.js.map +1 -1
  80. package/dist/llm/meta.js +62 -68
  81. package/dist/llm/meta.js.map +1 -1
  82. package/dist/llm/provider.js +7 -7
  83. package/dist/llm/request-plan.js +7 -2
  84. package/dist/llm/request-plan.js.map +1 -1
  85. package/dist/llm/tool-protocol.d.ts +1 -0
  86. package/dist/llm/tool-protocol.js +7 -0
  87. package/dist/llm/tool-protocol.js.map +1 -1
  88. package/dist/mcp/client.d.ts +27 -0
  89. package/dist/mcp/client.js +119 -0
  90. package/dist/mcp/client.js.map +1 -0
  91. package/dist/mcp/config-file.d.ts +35 -0
  92. package/dist/mcp/config-file.js +217 -0
  93. package/dist/mcp/config-file.js.map +1 -0
  94. package/dist/mcp/discovery.d.ts +4 -0
  95. package/dist/mcp/discovery.js +409 -0
  96. package/dist/mcp/discovery.js.map +1 -0
  97. package/dist/mcp/format.d.ts +17 -0
  98. package/dist/mcp/format.js +122 -0
  99. package/dist/mcp/format.js.map +1 -0
  100. package/dist/mcp/index.d.ts +15 -0
  101. package/dist/mcp/index.js +16 -0
  102. package/dist/mcp/index.js.map +1 -0
  103. package/dist/mcp/jsonrpc.d.ts +40 -0
  104. package/dist/mcp/jsonrpc.js +175 -0
  105. package/dist/mcp/jsonrpc.js.map +1 -0
  106. package/dist/mcp/manager.d.ts +36 -0
  107. package/dist/mcp/manager.js +300 -0
  108. package/dist/mcp/manager.js.map +1 -0
  109. package/dist/mcp/mentions.d.ts +9 -0
  110. package/dist/mcp/mentions.js +44 -0
  111. package/dist/mcp/mentions.js.map +1 -0
  112. package/dist/mcp/names.d.ts +15 -0
  113. package/dist/mcp/names.js +59 -0
  114. package/dist/mcp/names.js.map +1 -0
  115. package/dist/mcp/results.d.ts +6 -0
  116. package/dist/mcp/results.js +182 -0
  117. package/dist/mcp/results.js.map +1 -0
  118. package/dist/mcp/runtime.d.ts +107 -0
  119. package/dist/mcp/runtime.js +505 -0
  120. package/dist/mcp/runtime.js.map +1 -0
  121. package/dist/mcp/substitution.d.ts +13 -0
  122. package/dist/mcp/substitution.js +74 -0
  123. package/dist/mcp/substitution.js.map +1 -0
  124. package/dist/mcp/transport-http.d.ts +53 -0
  125. package/dist/mcp/transport-http.js +433 -0
  126. package/dist/mcp/transport-http.js.map +1 -0
  127. package/dist/mcp/transport-stdio.d.ts +39 -0
  128. package/dist/mcp/transport-stdio.js +268 -0
  129. package/dist/mcp/transport-stdio.js.map +1 -0
  130. package/dist/mcp/transport.d.ts +20 -0
  131. package/dist/mcp/transport.js +44 -0
  132. package/dist/mcp/transport.js.map +1 -0
  133. package/dist/mcp/types.d.ts +179 -0
  134. package/dist/mcp/types.js +30 -0
  135. package/dist/mcp/types.js.map +1 -0
  136. package/dist/mcp/validation.d.ts +16 -0
  137. package/dist/mcp/validation.js +222 -0
  138. package/dist/mcp/validation.js.map +1 -0
  139. package/dist/modes/agent.d.ts +2 -0
  140. package/dist/modes/agent.js.map +1 -1
  141. package/dist/noninteractive/start-noninteractive.js +4 -0
  142. package/dist/noninteractive/start-noninteractive.js.map +1 -1
  143. package/dist/prompts/embedded.js +2 -2
  144. package/dist/prompts/embedded.js.map +1 -1
  145. package/dist/prompts/index.d.ts +3 -0
  146. package/dist/prompts/index.js +70 -55
  147. package/dist/prompts/index.js.map +1 -1
  148. package/dist/prompts/system.agent.md +34 -10
  149. package/dist/prompts/system.ask.md +8 -0
  150. package/dist/safety/classifier.js +4 -0
  151. package/dist/safety/classifier.js.map +1 -1
  152. package/dist/store/logs.js +17 -6
  153. package/dist/store/logs.js.map +1 -1
  154. package/dist/store/plan.d.ts +2 -0
  155. package/dist/store/plan.js.map +1 -1
  156. package/dist/store/session-workspace.js +2 -1
  157. package/dist/store/session-workspace.js.map +1 -1
  158. package/dist/tools/definitions.js +18 -0
  159. package/dist/tools/definitions.js.map +1 -1
  160. package/dist/tools/external-tools.d.ts +30 -0
  161. package/dist/tools/external-tools.js +52 -0
  162. package/dist/tools/external-tools.js.map +1 -0
  163. package/dist/tools/registry.js +36 -5
  164. package/dist/tools/registry.js.map +1 -1
  165. package/dist/tui-v2/bootstrap/start-tui-v2.js +3 -0
  166. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  167. package/dist/tui-v2/components/completion/completion-menu.d.ts +4 -6
  168. package/dist/tui-v2/components/completion/completion-menu.js +34 -16
  169. package/dist/tui-v2/components/completion/completion-menu.js.map +1 -1
  170. package/dist/tui-v2/components/composer/composer-input-box.js +3 -1
  171. package/dist/tui-v2/components/composer/composer-input-box.js.map +1 -1
  172. package/dist/tui-v2/components/modal/secret-modal.js +6 -4
  173. package/dist/tui-v2/components/modal/secret-modal.js.map +1 -1
  174. package/dist/tui-v2/components/modal/text-editor-modal.d.ts +19 -0
  175. package/dist/tui-v2/components/modal/text-editor-modal.js +85 -0
  176. package/dist/tui-v2/components/modal/text-editor-modal.js.map +1 -0
  177. package/dist/tui-v2/components/overlay/overlay-host.js +2 -1
  178. package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -1
  179. package/dist/tui-v2/components/transcript/compacted-row.js +12 -3
  180. package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
  181. package/dist/tui-v2/components/transcript/thinking-block.d.ts +9 -1
  182. package/dist/tui-v2/components/transcript/thinking-block.js +253 -49
  183. package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
  184. package/dist/tui-v2/components/transcript/thinking-presentation.d.ts +46 -0
  185. package/dist/tui-v2/components/transcript/thinking-presentation.js +84 -0
  186. package/dist/tui-v2/components/transcript/thinking-presentation.js.map +1 -0
  187. package/dist/tui-v2/components/transcript/transcript-row.d.ts +2 -0
  188. package/dist/tui-v2/components/transcript/transcript-row.js +7 -2
  189. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
  190. package/dist/tui-v2/components/transcript/transcript-view.js +195 -83
  191. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
  192. package/dist/tui-v2/composer/composer-editor.js +54 -39
  193. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  194. package/dist/tui-v2/composer/composer-highlight.d.ts +20 -0
  195. package/dist/tui-v2/composer/composer-highlight.js +97 -0
  196. package/dist/tui-v2/composer/composer-highlight.js.map +1 -0
  197. package/dist/tui-v2/composer/textarea-keybindings.d.ts +5 -0
  198. package/dist/tui-v2/composer/textarea-keybindings.js +12 -0
  199. package/dist/tui-v2/composer/textarea-keybindings.js.map +1 -1
  200. package/dist/ui/mentions.js +4 -1
  201. package/dist/ui/mentions.js.map +1 -1
  202. package/dist/ui-core/actions/action-id.d.ts +1 -1
  203. package/dist/ui-core/actions/action-id.js +1 -0
  204. package/dist/ui-core/actions/action-id.js.map +1 -1
  205. package/dist/ui-core/actions/format-shortcuts.js +5 -0
  206. package/dist/ui-core/actions/format-shortcuts.js.map +1 -1
  207. package/dist/ui-core/actions/keymap.js +3 -0
  208. package/dist/ui-core/actions/keymap.js.map +1 -1
  209. package/dist/ui-core/bootstrap/composition-root.d.ts +3 -0
  210. package/dist/ui-core/bootstrap/composition-root.js +5 -1
  211. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  212. package/dist/ui-core/commands/command-handlers.js +2 -0
  213. package/dist/ui-core/commands/command-handlers.js.map +1 -1
  214. package/dist/ui-core/commands/mcp-commands.d.ts +3 -0
  215. package/dist/ui-core/commands/mcp-commands.js +310 -0
  216. package/dist/ui-core/commands/mcp-commands.js.map +1 -0
  217. package/dist/ui-core/commands/picker-commands.d.ts +1 -1
  218. package/dist/ui-core/commands/picker-commands.js +2 -2
  219. package/dist/ui-core/commands/picker-commands.js.map +1 -1
  220. package/dist/ui-core/commands/session-commands.js +1 -0
  221. package/dist/ui-core/commands/session-commands.js.map +1 -1
  222. package/dist/ui-core/composer/completion-viewport.d.ts +40 -0
  223. package/dist/ui-core/composer/completion-viewport.js +105 -0
  224. package/dist/ui-core/composer/completion-viewport.js.map +1 -0
  225. package/dist/ui-core/controllers/overlay-controller.d.ts +24 -3
  226. package/dist/ui-core/controllers/overlay-controller.js +35 -4
  227. package/dist/ui-core/controllers/overlay-controller.js.map +1 -1
  228. package/dist/ui-core/rendering/artifact-pager-source.d.ts +1 -0
  229. package/dist/ui-core/rendering/artifact-pager-source.js +67 -1
  230. package/dist/ui-core/rendering/artifact-pager-source.js.map +1 -1
  231. package/dist/ui-core/rendering/duration.d.ts +3 -1
  232. package/dist/ui-core/rendering/duration.js +14 -0
  233. package/dist/ui-core/rendering/duration.js.map +1 -1
  234. package/dist/ui-core/rendering/exit-summary.js +4 -4
  235. package/dist/ui-core/rendering/format-help.js +4 -0
  236. package/dist/ui-core/rendering/format-help.js.map +1 -1
  237. package/dist/ui-core/rendering/intro-header.js +4 -4
  238. package/dist/ui-core/rendering/open-tool-output.js +90 -32
  239. package/dist/ui-core/rendering/open-tool-output.js.map +1 -1
  240. package/dist/ui-core/rendering/theme.d.ts +5 -3
  241. package/dist/ui-core/rendering/theme.js +8 -4
  242. package/dist/ui-core/rendering/theme.js.map +1 -1
  243. package/dist/ui-core/rendering/wordmark.d.ts +2 -2
  244. package/dist/ui-core/rendering/wordmark.js +62 -62
  245. package/dist/ui-core/rendering/wordmark.js.map +1 -1
  246. package/dist/ui-core/state/thinking-copy.d.ts +13 -0
  247. package/dist/ui-core/state/thinking-copy.js +33 -0
  248. package/dist/ui-core/state/thinking-copy.js.map +1 -0
  249. package/dist/ui-core/state/transcript-hydrate.js +20 -0
  250. package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
  251. package/dist/ui-core/state/transcript-reducer.js +140 -62
  252. package/dist/ui-core/state/transcript-reducer.js.map +1 -1
  253. package/dist/ui-core/state/transcript-store.d.ts +10 -0
  254. package/dist/ui-core/state/transcript-store.js +235 -31
  255. package/dist/ui-core/state/transcript-store.js.map +1 -1
  256. package/dist/ui-core/state/transcript-types.d.ts +10 -0
  257. package/dist/ui-core/state/transcript-types.js +1 -0
  258. package/dist/ui-core/state/transcript-types.js.map +1 -1
  259. package/dist/ui-core/state/transcript-window.d.ts +32 -0
  260. package/dist/ui-core/state/transcript-window.js +63 -0
  261. package/dist/ui-core/state/transcript-window.js.map +1 -0
  262. package/dist/version.generated.d.ts +2 -2
  263. package/dist/version.generated.js +2 -2
  264. package/package.json +1 -1
  265. package/dist/tui-v2/composer/skill-highlight.d.ts +0 -3
  266. package/dist/tui-v2/composer/skill-highlight.js +0 -63
  267. package/dist/tui-v2/composer/skill-highlight.js.map +0 -1
@@ -0,0 +1,268 @@
1
+ import { spawn } from "node:child_process";
2
+ import { supportsProcessGroups, terminateProcessTree, } from "../os/process-tree.js";
3
+ import { encodeLine, LineDecoder, parseMessage } from "./jsonrpc.js";
4
+ import { isAbortError, McpTransportError, withTimeout, } from "./transport.js";
5
+ import { isJsonRpcResponse } from "./jsonrpc.js";
6
+ const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
7
+ const DEFAULT_CLOSE_GRACE_MS = 2_000;
8
+ const MAX_STDERR_BYTES = 64 * 1024;
9
+ export class StdioTransport {
10
+ config;
11
+ options;
12
+ kind = "stdio";
13
+ child;
14
+ decoder = new LineDecoder();
15
+ pending = new Map();
16
+ nextId = 1;
17
+ closed = false;
18
+ exited = false;
19
+ stderrTail = "";
20
+ processGroupId;
21
+ protocolVersion;
22
+ startPromise;
23
+ constructor(config, options = {}) {
24
+ this.config = config;
25
+ this.options = options;
26
+ }
27
+ sessionId() {
28
+ return undefined;
29
+ }
30
+ setProtocolVersion(version) {
31
+ this.protocolVersion = version;
32
+ }
33
+ start() {
34
+ if (this.startPromise)
35
+ return this.startPromise;
36
+ this.startPromise = this.spawnChild();
37
+ return this.startPromise;
38
+ }
39
+ buildEnv() {
40
+ const base = this.options.baseEnv ?? process.env;
41
+ const merged = {};
42
+ for (const [key, value] of Object.entries(base)) {
43
+ if (typeof value === "string")
44
+ merged[key] = value;
45
+ }
46
+ for (const [key, value] of Object.entries(this.config.env)) {
47
+ merged[key] = value;
48
+ }
49
+ return merged;
50
+ }
51
+ spawnChild() {
52
+ return new Promise((resolve, reject) => {
53
+ let child;
54
+ try {
55
+ child = spawn(this.config.command, [...this.config.args], {
56
+ shell: false,
57
+ stdio: ["pipe", "pipe", "pipe"],
58
+ env: this.buildEnv(),
59
+ detached: supportsProcessGroups(),
60
+ windowsHide: true,
61
+ ...(this.config.cwd !== undefined ? { cwd: this.config.cwd } : {}),
62
+ });
63
+ }
64
+ catch (error) {
65
+ reject(new McpTransportError("spawn", `Failed to spawn MCP server "${this.config.command}": ${error.message}`));
66
+ return;
67
+ }
68
+ this.child = child;
69
+ this.processGroupId = supportsProcessGroups() ? child.pid : undefined;
70
+ let settled = false;
71
+ const onSpawn = () => {
72
+ if (settled)
73
+ return;
74
+ settled = true;
75
+ child.off("error", onError);
76
+ resolve();
77
+ };
78
+ const onError = (error) => {
79
+ if (settled) {
80
+ this.failAll(new McpTransportError("network", error.message));
81
+ return;
82
+ }
83
+ settled = true;
84
+ child.off("spawn", onSpawn);
85
+ reject(new McpTransportError("spawn", `MCP server "${this.config.command}" failed to start: ${error.message}`));
86
+ };
87
+ child.once("spawn", onSpawn);
88
+ child.once("error", onError);
89
+ child.stdout.setEncoding("utf8");
90
+ child.stdout.on("data", (chunk) => this.onStdout(chunk));
91
+ child.stderr.setEncoding("utf8");
92
+ child.stderr.on("data", (chunk) => this.onStderr(chunk));
93
+ child.stdin.on("error", () => undefined);
94
+ child.on("exit", () => {
95
+ this.exited = true;
96
+ this.failAll(new McpTransportError("closed", this.stderrTail.trim().length > 0
97
+ ? `MCP server exited: ${this.stderrTail.trim().slice(-400)}`
98
+ : "MCP server process exited."));
99
+ });
100
+ });
101
+ }
102
+ onStdout(chunk) {
103
+ let lines;
104
+ try {
105
+ lines = this.decoder.push(chunk);
106
+ }
107
+ catch (error) {
108
+ const failure = error instanceof McpTransportError
109
+ ? error
110
+ : new McpTransportError("protocol", `MCP stdio framing error: ${error.message}`);
111
+ this.failAll(failure);
112
+ void this.close();
113
+ return;
114
+ }
115
+ for (const line of lines) {
116
+ const message = parseMessage(line);
117
+ if (!message || !isJsonRpcResponse(message))
118
+ continue;
119
+ const numericId = typeof message.id === "number" ? message.id : Number(message.id);
120
+ if (!Number.isFinite(numericId))
121
+ continue;
122
+ const entry = this.pending.get(numericId);
123
+ if (!entry)
124
+ continue;
125
+ this.pending.delete(numericId);
126
+ entry.dispose();
127
+ entry.resolve(message);
128
+ }
129
+ }
130
+ onStderr(chunk) {
131
+ this.stderrTail = (this.stderrTail + chunk).slice(-MAX_STDERR_BYTES);
132
+ }
133
+ failAll(error) {
134
+ for (const [, entry] of this.pending) {
135
+ entry.dispose();
136
+ entry.reject(error);
137
+ }
138
+ this.pending.clear();
139
+ }
140
+ async request(message, options = {}) {
141
+ await this.start();
142
+ if (this.closed || this.exited || !this.child) {
143
+ throw new McpTransportError("closed", "MCP stdio transport is not connected.");
144
+ }
145
+ const id = this.nextId++;
146
+ const framed = { ...message, id };
147
+ const timeoutMs = options.timeoutMs ?? this.options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
148
+ const { signal, dispose } = withTimeout(options.signal, timeoutMs);
149
+ return await new Promise((resolve, reject) => {
150
+ const onAbort = () => {
151
+ const entry = this.pending.get(id);
152
+ if (entry) {
153
+ this.pending.delete(id);
154
+ entry.dispose();
155
+ }
156
+ const reason = signal.reason;
157
+ if (reason instanceof McpTransportError)
158
+ reject(reason);
159
+ else
160
+ reject(new McpTransportError("cancelled", "MCP request cancelled."));
161
+ };
162
+ const disposeEntry = () => {
163
+ dispose();
164
+ signal.removeEventListener("abort", onAbort);
165
+ };
166
+ if (signal.aborted) {
167
+ disposeEntry();
168
+ onAbort();
169
+ return;
170
+ }
171
+ signal.addEventListener("abort", onAbort, { once: true });
172
+ this.pending.set(id, { resolve, reject, dispose: disposeEntry });
173
+ try {
174
+ this.child.stdin.write(encodeLine(framed));
175
+ }
176
+ catch (error) {
177
+ this.pending.delete(id);
178
+ disposeEntry();
179
+ reject(new McpTransportError("network", `Failed to write MCP request: ${error.message}`));
180
+ }
181
+ });
182
+ }
183
+ async notify(message) {
184
+ await this.start();
185
+ if (this.closed || this.exited || !this.child) {
186
+ throw new McpTransportError("closed", "MCP stdio transport is not connected.");
187
+ }
188
+ this.child.stdin.write(encodeLine(message));
189
+ }
190
+ async close() {
191
+ if (this.closed)
192
+ return;
193
+ this.closed = true;
194
+ const child = this.child;
195
+ this.failAll(new McpTransportError("closed", "MCP stdio transport closed."));
196
+ if (!child || this.exited) {
197
+ this.disposeChild();
198
+ return;
199
+ }
200
+ try {
201
+ child.stdin.end();
202
+ }
203
+ catch {
204
+ void 0;
205
+ }
206
+ const graceMs = this.options.closeGraceMs ?? DEFAULT_CLOSE_GRACE_MS;
207
+ const exitedGracefully = await this.waitForExit(child, graceMs, "SIGTERM");
208
+ if (!exitedGracefully) {
209
+ this.forceKill(child);
210
+ await this.waitForExit(child, graceMs, undefined);
211
+ }
212
+ this.disposeChild();
213
+ }
214
+ waitForExit(child, graceMs, signal) {
215
+ if (this.exited || child.exitCode !== null || child.signalCode !== null) {
216
+ return Promise.resolve(true);
217
+ }
218
+ return new Promise((resolve) => {
219
+ const timer = setTimeout(() => {
220
+ child.off("exit", onExit);
221
+ resolve(false);
222
+ }, graceMs);
223
+ if (typeof timer.unref === "function")
224
+ timer.unref();
225
+ const onExit = () => {
226
+ clearTimeout(timer);
227
+ resolve(true);
228
+ };
229
+ child.once("exit", onExit);
230
+ if (signal && child.pid) {
231
+ terminateProcessTree(child.pid, {
232
+ signal,
233
+ ...(this.processGroupId !== undefined ? { processGroupId: this.processGroupId } : {}),
234
+ });
235
+ }
236
+ });
237
+ }
238
+ forceKill(child) {
239
+ if (!child.pid)
240
+ return;
241
+ terminateProcessTree(child.pid, {
242
+ signal: "SIGKILL",
243
+ ...(this.processGroupId !== undefined ? { processGroupId: this.processGroupId } : {}),
244
+ });
245
+ }
246
+ disposeChild() {
247
+ const child = this.child;
248
+ if (!child)
249
+ return;
250
+ try {
251
+ child.stdin.destroy();
252
+ child.stdout.destroy();
253
+ child.stderr.destroy();
254
+ }
255
+ catch {
256
+ void 0;
257
+ }
258
+ child.removeAllListeners();
259
+ this.child = undefined;
260
+ }
261
+ diagnostics() {
262
+ return this.stderrTail.trim();
263
+ }
264
+ }
265
+ export function isTransportAbort(error) {
266
+ return isAbortError(error);
267
+ }
268
+ //# sourceMappingURL=transport-stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-stdio.js","sourceRoot":"","sources":["../../src/mcp/transport-stdio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { JsonRpcNotification, JsonRpcRequest, JsonRpcResponse, McpRequestOptions } from "./types.js";
2
+ export type McpTransportFailureKind = "spawn" | "timeout" | "cancelled" | "closed" | "protocol" | "network" | "too-large";
3
+ export declare class McpTransportError extends Error {
4
+ readonly kind: McpTransportFailureKind;
5
+ constructor(kind: McpTransportFailureKind, message: string);
6
+ }
7
+ export interface McpTransport {
8
+ readonly kind: "stdio" | "http" | "sse";
9
+ start(options?: McpRequestOptions): Promise<void>;
10
+ request(message: JsonRpcRequest, options?: McpRequestOptions): Promise<JsonRpcResponse>;
11
+ notify(message: JsonRpcNotification, options?: McpRequestOptions): Promise<void>;
12
+ close(): Promise<void>;
13
+ sessionId(): string | undefined;
14
+ setProtocolVersion(version: string): void;
15
+ }
16
+ export declare function isAbortError(error: unknown): boolean;
17
+ export declare function withTimeout(parent: AbortSignal | undefined, timeoutMs: number | undefined): {
18
+ signal: AbortSignal;
19
+ dispose: () => void;
20
+ };
@@ -0,0 +1,44 @@
1
+ export class McpTransportError extends Error {
2
+ kind;
3
+ constructor(kind, message) {
4
+ super(message);
5
+ this.name = "McpTransportError";
6
+ this.kind = kind;
7
+ }
8
+ }
9
+ export function isAbortError(error) {
10
+ if (error instanceof McpTransportError)
11
+ return error.kind === "cancelled";
12
+ if (typeof error !== "object" || error === null)
13
+ return false;
14
+ const name = error.name;
15
+ return name === "AbortError";
16
+ }
17
+ export function withTimeout(parent, timeoutMs) {
18
+ const controller = new AbortController();
19
+ const dispose = () => {
20
+ if (timer)
21
+ clearTimeout(timer);
22
+ if (parent)
23
+ parent.removeEventListener("abort", onParentAbort);
24
+ };
25
+ const onParentAbort = () => {
26
+ controller.abort(parent?.reason);
27
+ };
28
+ let timer;
29
+ if (parent) {
30
+ if (parent.aborted)
31
+ controller.abort(parent.reason);
32
+ else
33
+ parent.addEventListener("abort", onParentAbort, { once: true });
34
+ }
35
+ if (timeoutMs !== undefined && timeoutMs > 0) {
36
+ timer = setTimeout(() => {
37
+ controller.abort(new McpTransportError("timeout", `Request timed out after ${timeoutMs}ms.`));
38
+ }, timeoutMs);
39
+ if (typeof timer.unref === "function")
40
+ timer.unref();
41
+ }
42
+ return { signal: controller.signal, dispose };
43
+ }
44
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/mcp/transport.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,CAA0B;IACvC,YAAY,IAA6B,EAAE,OAAe;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAeD,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,YAAY,iBAAiB;QAAE,OAAO,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC;IAC1E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;IAChD,OAAO,IAAI,KAAK,YAAY,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,MAA+B,EAC/B,SAA6B;IAE7B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,MAAM;YAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACjE,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,GAAS,EAAE;QAC/B,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC;IACF,IAAI,KAAgD,CAAC;IACrD,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,OAAO;YAAE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;;YAC/C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAC7C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,UAAU,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,2BAA2B,SAAS,KAAK,CAAC,CAAC,CAAC;QAChG,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;YAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC"}
@@ -0,0 +1,179 @@
1
+ import type { ChatImage, JsonSchemaObject, RiskLevel } from "../types.js";
2
+ export declare const MCP_PROTOCOL_VERSION: "2025-06-18";
3
+ export declare const MCP_SUPPORTED_PROTOCOL_VERSIONS: readonly ["2025-06-18", "2025-03-26", "2024-11-05"];
4
+ export declare const MCP_CLIENT_NAME: "clai";
5
+ export type McpTransportKind = "stdio" | "http" | "sse";
6
+ export interface McpStdioConfig {
7
+ readonly transport: "stdio";
8
+ readonly command: string;
9
+ readonly args: readonly string[];
10
+ readonly env: Readonly<Record<string, string>>;
11
+ readonly cwd?: string | undefined;
12
+ }
13
+ export interface McpHttpConfig {
14
+ readonly transport: "http" | "sse";
15
+ readonly url: string;
16
+ readonly headers: Readonly<Record<string, string>>;
17
+ }
18
+ export type McpServerConfig = McpStdioConfig | McpHttpConfig;
19
+ export type McpToolSelection = "all" | readonly string[];
20
+ export type McpConfigSourceKind = "clai-env" | "clai-project" | "mcp-project" | "github-project" | "vscode-project" | "clai-user" | "copilot-user" | "claude-user" | "vscode-user";
21
+ export declare const MCP_SOURCE_PRECEDENCE: readonly McpConfigSourceKind[];
22
+ export declare const MCP_SOURCE_LABELS: Readonly<Record<McpConfigSourceKind, string>>;
23
+ export interface McpConfigSource {
24
+ readonly kind: McpConfigSourceKind;
25
+ readonly path: string;
26
+ readonly rank: number;
27
+ readonly depth?: number | undefined;
28
+ }
29
+ export interface McpInputDefinition {
30
+ readonly id: string;
31
+ readonly type?: string | undefined;
32
+ readonly description?: string | undefined;
33
+ readonly default?: string | undefined;
34
+ readonly password?: boolean | undefined;
35
+ }
36
+ export interface McpServerDefinition {
37
+ readonly name: string;
38
+ readonly config: McpServerConfig;
39
+ readonly disabled: boolean;
40
+ readonly toolSelection: McpToolSelection;
41
+ readonly source: McpConfigSource;
42
+ readonly signature: string;
43
+ readonly secretValues: readonly string[];
44
+ }
45
+ export interface McpShadowedServer {
46
+ readonly name: string;
47
+ readonly source: McpConfigSource;
48
+ readonly shadowedBy: McpConfigSource;
49
+ }
50
+ export interface McpInvalidServer {
51
+ readonly name: string;
52
+ readonly source: McpConfigSource;
53
+ readonly errors: readonly string[];
54
+ }
55
+ export interface McpDiscoveryResult {
56
+ readonly servers: readonly McpServerDefinition[];
57
+ readonly shadowed: readonly McpShadowedServer[];
58
+ readonly invalid: readonly McpInvalidServer[];
59
+ readonly sources: readonly McpConfigSource[];
60
+ readonly warnings: readonly string[];
61
+ }
62
+ export interface McpDiscoveryOptions {
63
+ readonly workspaceFolder?: string | undefined;
64
+ readonly homeDir?: string | undefined;
65
+ readonly env?: Readonly<Record<string, string | undefined>> | undefined;
66
+ readonly platform?: NodeJS.Platform | undefined;
67
+ }
68
+ export type JsonRpcId = number | string;
69
+ export interface JsonRpcRequest {
70
+ readonly jsonrpc: "2.0";
71
+ readonly id: JsonRpcId;
72
+ readonly method: string;
73
+ readonly params?: unknown;
74
+ }
75
+ export interface JsonRpcNotification {
76
+ readonly jsonrpc: "2.0";
77
+ readonly method: string;
78
+ readonly params?: unknown;
79
+ }
80
+ export interface JsonRpcErrorPayload {
81
+ readonly code: number;
82
+ readonly message: string;
83
+ readonly data?: unknown;
84
+ }
85
+ export interface JsonRpcSuccess {
86
+ readonly jsonrpc: "2.0";
87
+ readonly id: JsonRpcId;
88
+ readonly result: unknown;
89
+ }
90
+ export interface JsonRpcFailure {
91
+ readonly jsonrpc: "2.0";
92
+ readonly id: JsonRpcId | null;
93
+ readonly error: JsonRpcErrorPayload;
94
+ }
95
+ export type JsonRpcResponse = JsonRpcSuccess | JsonRpcFailure;
96
+ export type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;
97
+ export interface McpServerInfo {
98
+ readonly name: string;
99
+ readonly version: string;
100
+ }
101
+ export interface McpInitializeResult {
102
+ readonly protocolVersion: string;
103
+ readonly capabilities: Readonly<Record<string, unknown>>;
104
+ readonly serverInfo?: McpServerInfo | undefined;
105
+ readonly instructions?: string | undefined;
106
+ }
107
+ export interface McpToolAnnotations {
108
+ readonly title?: string | undefined;
109
+ readonly readOnlyHint?: boolean | undefined;
110
+ readonly destructiveHint?: boolean | undefined;
111
+ readonly idempotentHint?: boolean | undefined;
112
+ readonly openWorldHint?: boolean | undefined;
113
+ }
114
+ export interface McpToolDescriptor {
115
+ readonly name: string;
116
+ readonly title?: string | undefined;
117
+ readonly description?: string | undefined;
118
+ readonly inputSchema?: Readonly<Record<string, unknown>> | undefined;
119
+ readonly annotations?: McpToolAnnotations | undefined;
120
+ }
121
+ export interface McpToolMetadata {
122
+ readonly canonicalName: string;
123
+ readonly wireName: string;
124
+ readonly serverName: string;
125
+ readonly toolName: string;
126
+ readonly title?: string | undefined;
127
+ readonly description: string;
128
+ readonly inputSchema: JsonSchemaObject;
129
+ readonly risk: RiskLevel;
130
+ readonly readOnly: boolean;
131
+ readonly destructive: boolean;
132
+ readonly idempotent: boolean;
133
+ readonly openWorld: boolean;
134
+ readonly annotations: McpToolAnnotations;
135
+ }
136
+ export interface McpNormalizedImage {
137
+ readonly mediaType: string;
138
+ readonly dataBase64: string;
139
+ }
140
+ export interface McpNormalizedResource {
141
+ readonly uri: string;
142
+ readonly mimeType?: string | undefined;
143
+ readonly text?: string | undefined;
144
+ readonly blobBase64?: string | undefined;
145
+ }
146
+ export interface McpNormalizedResult {
147
+ readonly ok: boolean;
148
+ readonly isError: boolean;
149
+ readonly text: string;
150
+ readonly images: readonly McpNormalizedImage[];
151
+ readonly resources: readonly McpNormalizedResource[];
152
+ readonly chatImages: readonly ChatImage[];
153
+ readonly raw: unknown;
154
+ }
155
+ export type McpServerStatusKind = "ready" | "degraded" | "disabled" | "error" | "connecting";
156
+ export interface McpServerStatus {
157
+ readonly name: string;
158
+ readonly status: McpServerStatusKind;
159
+ readonly transport: McpTransportKind;
160
+ readonly source: McpConfigSource;
161
+ readonly toolCount: number;
162
+ readonly signature: string;
163
+ readonly detail?: string | undefined;
164
+ readonly serverInfo?: McpServerInfo | undefined;
165
+ readonly protocolVersion?: string | undefined;
166
+ }
167
+ export interface McpSnapshot {
168
+ readonly createdAt: number;
169
+ readonly statuses: readonly McpServerStatus[];
170
+ readonly tools: readonly McpToolMetadata[];
171
+ readonly toolsByCanonicalName: ReadonlyMap<string, McpToolMetadata>;
172
+ readonly toolsByWireName: ReadonlyMap<string, McpToolMetadata>;
173
+ readonly shadowed: readonly McpShadowedServer[];
174
+ readonly invalid: readonly McpInvalidServer[];
175
+ }
176
+ export interface McpRequestOptions {
177
+ readonly signal?: AbortSignal | undefined;
178
+ readonly timeoutMs?: number | undefined;
179
+ }
@@ -0,0 +1,30 @@
1
+ export const MCP_PROTOCOL_VERSION = "2025-06-18";
2
+ export const MCP_SUPPORTED_PROTOCOL_VERSIONS = [
3
+ "2025-06-18",
4
+ "2025-03-26",
5
+ "2024-11-05",
6
+ ];
7
+ export const MCP_CLIENT_NAME = "clai";
8
+ export const MCP_SOURCE_PRECEDENCE = [
9
+ "clai-env",
10
+ "clai-project",
11
+ "mcp-project",
12
+ "github-project",
13
+ "vscode-project",
14
+ "clai-user",
15
+ "copilot-user",
16
+ "claude-user",
17
+ "vscode-user",
18
+ ];
19
+ export const MCP_SOURCE_LABELS = {
20
+ "clai-env": "CLAI_MCP_CONFIG",
21
+ "clai-project": ".clai/mcp.json (project)",
22
+ "mcp-project": ".mcp.json (project)",
23
+ "github-project": ".github/mcp.json (repo)",
24
+ "vscode-project": ".vscode/mcp.json (VS Code compatibility)",
25
+ "clai-user": "clai user MCP config",
26
+ "copilot-user": "~/.copilot/mcp-config.json (user)",
27
+ "claude-user": "Claude user config",
28
+ "vscode-user": "VS Code user config (compatibility)",
29
+ };
30
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAqB,CAAC;AAE1D,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,YAAY;IACZ,YAAY;IACZ,YAAY;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG,MAAe,CAAC;AAiC/C,MAAM,CAAC,MAAM,qBAAqB,GAAmC;IACnE,UAAU;IACV,cAAc;IACd,aAAa;IACb,gBAAgB;IAChB,gBAAgB;IAChB,WAAW;IACX,cAAc;IACd,aAAa;IACb,aAAa;CACL,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAkD;IAC9E,UAAU,EAAE,iBAAiB;IAC7B,cAAc,EAAE,0BAA0B;IAC1C,aAAa,EAAE,qBAAqB;IACpC,gBAAgB,EAAE,yBAAyB;IAC3C,gBAAgB,EAAE,0CAA0C;IAC5D,WAAW,EAAE,sBAAsB;IACnC,cAAc,EAAE,mCAAmC;IACnD,aAAa,EAAE,oBAAoB;IACnC,aAAa,EAAE,qCAAqC;CAC5C,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type McpSubstitutionContext } from "./substitution.js";
2
+ import type { McpServerConfig, McpToolSelection } from "./types.js";
3
+ export interface ValidatedServer {
4
+ readonly config: McpServerConfig;
5
+ readonly disabled: boolean;
6
+ readonly toolSelection: McpToolSelection;
7
+ readonly secretValues: readonly string[];
8
+ }
9
+ export type ServerValidation = {
10
+ readonly ok: true;
11
+ readonly server: ValidatedServer;
12
+ } | {
13
+ readonly ok: false;
14
+ readonly errors: readonly string[];
15
+ };
16
+ export declare function validateServerEntry(name: string, rawEntry: unknown, context: McpSubstitutionContext): ServerValidation;