@pythonluvr/openwar 0.4.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 (298) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +297 -0
  3. package/bin/openwar +45 -0
  4. package/dist/adapters/anthropic.d.ts +15 -0
  5. package/dist/adapters/anthropic.d.ts.map +1 -0
  6. package/dist/adapters/anthropic.js +179 -0
  7. package/dist/adapters/anthropic.js.map +1 -0
  8. package/dist/adapters/gemini.d.ts +15 -0
  9. package/dist/adapters/gemini.d.ts.map +1 -0
  10. package/dist/adapters/gemini.js +141 -0
  11. package/dist/adapters/gemini.js.map +1 -0
  12. package/dist/adapters/grok.d.ts +6 -0
  13. package/dist/adapters/grok.d.ts.map +1 -0
  14. package/dist/adapters/grok.js +15 -0
  15. package/dist/adapters/grok.js.map +1 -0
  16. package/dist/adapters/index.d.ts +16 -0
  17. package/dist/adapters/index.d.ts.map +1 -0
  18. package/dist/adapters/index.js +35 -0
  19. package/dist/adapters/index.js.map +1 -0
  20. package/dist/adapters/mock.d.ts +17 -0
  21. package/dist/adapters/mock.d.ts.map +1 -0
  22. package/dist/adapters/mock.js +33 -0
  23. package/dist/adapters/mock.js.map +1 -0
  24. package/dist/adapters/openai-compat.d.ts +6 -0
  25. package/dist/adapters/openai-compat.d.ts.map +1 -0
  26. package/dist/adapters/openai-compat.js +19 -0
  27. package/dist/adapters/openai-compat.js.map +1 -0
  28. package/dist/adapters/openai.d.ts +23 -0
  29. package/dist/adapters/openai.d.ts.map +1 -0
  30. package/dist/adapters/openai.js +176 -0
  31. package/dist/adapters/openai.js.map +1 -0
  32. package/dist/adapters/sse.d.ts +6 -0
  33. package/dist/adapters/sse.d.ts.map +1 -0
  34. package/dist/adapters/sse.js +45 -0
  35. package/dist/adapters/sse.js.map +1 -0
  36. package/dist/adapters/types.d.ts +7 -0
  37. package/dist/adapters/types.d.ts.map +1 -0
  38. package/dist/adapters/types.js +2 -0
  39. package/dist/adapters/types.js.map +1 -0
  40. package/dist/auth/categories.d.ts +13 -0
  41. package/dist/auth/categories.d.ts.map +1 -0
  42. package/dist/auth/categories.js +47 -0
  43. package/dist/auth/categories.js.map +1 -0
  44. package/dist/auth/check.d.ts +31 -0
  45. package/dist/auth/check.d.ts.map +1 -0
  46. package/dist/auth/check.js +59 -0
  47. package/dist/auth/check.js.map +1 -0
  48. package/dist/auth/role-scope.d.ts +18 -0
  49. package/dist/auth/role-scope.d.ts.map +1 -0
  50. package/dist/auth/role-scope.js +62 -0
  51. package/dist/auth/role-scope.js.map +1 -0
  52. package/dist/auth/wildcards.d.ts +5 -0
  53. package/dist/auth/wildcards.d.ts.map +1 -0
  54. package/dist/auth/wildcards.js +36 -0
  55. package/dist/auth/wildcards.js.map +1 -0
  56. package/dist/brief.d.ts +9 -0
  57. package/dist/brief.d.ts.map +1 -0
  58. package/dist/brief.js +514 -0
  59. package/dist/brief.js.map +1 -0
  60. package/dist/cli.d.ts +2 -0
  61. package/dist/cli.d.ts.map +1 -0
  62. package/dist/cli.js +585 -0
  63. package/dist/cli.js.map +1 -0
  64. package/dist/coordinator/cost-tracker.d.ts +14 -0
  65. package/dist/coordinator/cost-tracker.d.ts.map +1 -0
  66. package/dist/coordinator/cost-tracker.js +63 -0
  67. package/dist/coordinator/cost-tracker.js.map +1 -0
  68. package/dist/coordinator/driver.d.ts +37 -0
  69. package/dist/coordinator/driver.d.ts.map +1 -0
  70. package/dist/coordinator/driver.js +644 -0
  71. package/dist/coordinator/driver.js.map +1 -0
  72. package/dist/coordinator/index.d.ts +14 -0
  73. package/dist/coordinator/index.d.ts.map +1 -0
  74. package/dist/coordinator/index.js +8 -0
  75. package/dist/coordinator/index.js.map +1 -0
  76. package/dist/coordinator/plan-parser.d.ts +17 -0
  77. package/dist/coordinator/plan-parser.d.ts.map +1 -0
  78. package/dist/coordinator/plan-parser.js +44 -0
  79. package/dist/coordinator/plan-parser.js.map +1 -0
  80. package/dist/coordinator/result-aggregator.d.ts +21 -0
  81. package/dist/coordinator/result-aggregator.d.ts.map +1 -0
  82. package/dist/coordinator/result-aggregator.js +58 -0
  83. package/dist/coordinator/result-aggregator.js.map +1 -0
  84. package/dist/coordinator/retry-policy.d.ts +7 -0
  85. package/dist/coordinator/retry-policy.d.ts.map +1 -0
  86. package/dist/coordinator/retry-policy.js +17 -0
  87. package/dist/coordinator/retry-policy.js.map +1 -0
  88. package/dist/coordinator/state-machine.d.ts +63 -0
  89. package/dist/coordinator/state-machine.d.ts.map +1 -0
  90. package/dist/coordinator/state-machine.js +242 -0
  91. package/dist/coordinator/state-machine.js.map +1 -0
  92. package/dist/coordinator/types.d.ts +3 -0
  93. package/dist/coordinator/types.d.ts.map +1 -0
  94. package/dist/coordinator/types.js +5 -0
  95. package/dist/coordinator/types.js.map +1 -0
  96. package/dist/detectors/banned-phrases.d.ts +3 -0
  97. package/dist/detectors/banned-phrases.d.ts.map +1 -0
  98. package/dist/detectors/banned-phrases.js +33 -0
  99. package/dist/detectors/banned-phrases.js.map +1 -0
  100. package/dist/detectors/blocker.d.ts +3 -0
  101. package/dist/detectors/blocker.d.ts.map +1 -0
  102. package/dist/detectors/blocker.js +62 -0
  103. package/dist/detectors/blocker.js.map +1 -0
  104. package/dist/detectors/completion.d.ts +3 -0
  105. package/dist/detectors/completion.d.ts.map +1 -0
  106. package/dist/detectors/completion.js +17 -0
  107. package/dist/detectors/completion.js.map +1 -0
  108. package/dist/detectors/confirmation-summary.d.ts +3 -0
  109. package/dist/detectors/confirmation-summary.d.ts.map +1 -0
  110. package/dist/detectors/confirmation-summary.js +76 -0
  111. package/dist/detectors/confirmation-summary.js.map +1 -0
  112. package/dist/detectors/destructive.d.ts +3 -0
  113. package/dist/detectors/destructive.d.ts.map +1 -0
  114. package/dist/detectors/destructive.js +96 -0
  115. package/dist/detectors/destructive.js.map +1 -0
  116. package/dist/detectors/index.d.ts +12 -0
  117. package/dist/detectors/index.d.ts.map +1 -0
  118. package/dist/detectors/index.js +19 -0
  119. package/dist/detectors/index.js.map +1 -0
  120. package/dist/detectors/phase-marker.d.ts +3 -0
  121. package/dist/detectors/phase-marker.d.ts.map +1 -0
  122. package/dist/detectors/phase-marker.js +25 -0
  123. package/dist/detectors/phase-marker.js.map +1 -0
  124. package/dist/framework.d.ts +2 -0
  125. package/dist/framework.d.ts.map +1 -0
  126. package/dist/framework.js +34 -0
  127. package/dist/framework.js.map +1 -0
  128. package/dist/index.d.ts +10 -0
  129. package/dist/index.d.ts.map +1 -0
  130. package/dist/index.js +10 -0
  131. package/dist/index.js.map +1 -0
  132. package/dist/io.d.ts +25 -0
  133. package/dist/io.d.ts.map +1 -0
  134. package/dist/io.js +83 -0
  135. package/dist/io.js.map +1 -0
  136. package/dist/mcp/client.d.ts +22 -0
  137. package/dist/mcp/client.d.ts.map +1 -0
  138. package/dist/mcp/client.js +44 -0
  139. package/dist/mcp/client.js.map +1 -0
  140. package/dist/mcp/index.d.ts +5 -0
  141. package/dist/mcp/index.d.ts.map +1 -0
  142. package/dist/mcp/index.js +6 -0
  143. package/dist/mcp/index.js.map +1 -0
  144. package/dist/mcp/registry.d.ts +16 -0
  145. package/dist/mcp/registry.d.ts.map +1 -0
  146. package/dist/mcp/registry.js +53 -0
  147. package/dist/mcp/registry.js.map +1 -0
  148. package/dist/mcp/transport-stdio.d.ts +26 -0
  149. package/dist/mcp/transport-stdio.d.ts.map +1 -0
  150. package/dist/mcp/transport-stdio.js +138 -0
  151. package/dist/mcp/transport-stdio.js.map +1 -0
  152. package/dist/mcp/types.d.ts +90 -0
  153. package/dist/mcp/types.d.ts.map +1 -0
  154. package/dist/mcp/types.js +23 -0
  155. package/dist/mcp/types.js.map +1 -0
  156. package/dist/orchestration/handoff.d.ts +27 -0
  157. package/dist/orchestration/handoff.d.ts.map +1 -0
  158. package/dist/orchestration/handoff.js +322 -0
  159. package/dist/orchestration/handoff.js.map +1 -0
  160. package/dist/phases/blocker.d.ts +8 -0
  161. package/dist/phases/blocker.d.ts.map +1 -0
  162. package/dist/phases/blocker.js +11 -0
  163. package/dist/phases/blocker.js.map +1 -0
  164. package/dist/phases/completion.d.ts +10 -0
  165. package/dist/phases/completion.d.ts.map +1 -0
  166. package/dist/phases/completion.js +47 -0
  167. package/dist/phases/completion.js.map +1 -0
  168. package/dist/phases/destructive.d.ts +10 -0
  169. package/dist/phases/destructive.d.ts.map +1 -0
  170. package/dist/phases/destructive.js +31 -0
  171. package/dist/phases/destructive.js.map +1 -0
  172. package/dist/phases/execute.d.ts +30 -0
  173. package/dist/phases/execute.d.ts.map +1 -0
  174. package/dist/phases/execute.js +222 -0
  175. package/dist/phases/execute.js.map +1 -0
  176. package/dist/phases/intake.d.ts +16 -0
  177. package/dist/phases/intake.d.ts.map +1 -0
  178. package/dist/phases/intake.js +105 -0
  179. package/dist/phases/intake.js.map +1 -0
  180. package/dist/roles/critic.d.ts +3 -0
  181. package/dist/roles/critic.d.ts.map +1 -0
  182. package/dist/roles/critic.js +35 -0
  183. package/dist/roles/critic.js.map +1 -0
  184. package/dist/roles/executor.d.ts +3 -0
  185. package/dist/roles/executor.d.ts.map +1 -0
  186. package/dist/roles/executor.js +46 -0
  187. package/dist/roles/executor.js.map +1 -0
  188. package/dist/roles/index.d.ts +8 -0
  189. package/dist/roles/index.d.ts.map +1 -0
  190. package/dist/roles/index.js +8 -0
  191. package/dist/roles/index.js.map +1 -0
  192. package/dist/roles/planner.d.ts +3 -0
  193. package/dist/roles/planner.d.ts.map +1 -0
  194. package/dist/roles/planner.js +50 -0
  195. package/dist/roles/planner.js.map +1 -0
  196. package/dist/roles/prompt-overlay.d.ts +9 -0
  197. package/dist/roles/prompt-overlay.d.ts.map +1 -0
  198. package/dist/roles/prompt-overlay.js +25 -0
  199. package/dist/roles/prompt-overlay.js.map +1 -0
  200. package/dist/roles/registry.d.ts +8 -0
  201. package/dist/roles/registry.d.ts.map +1 -0
  202. package/dist/roles/registry.js +45 -0
  203. package/dist/roles/registry.js.map +1 -0
  204. package/dist/roles/reviewer.d.ts +3 -0
  205. package/dist/roles/reviewer.d.ts.map +1 -0
  206. package/dist/roles/reviewer.js +46 -0
  207. package/dist/roles/reviewer.js.map +1 -0
  208. package/dist/roles/types.d.ts +2 -0
  209. package/dist/roles/types.d.ts.map +1 -0
  210. package/dist/roles/types.js +4 -0
  211. package/dist/roles/types.js.map +1 -0
  212. package/dist/runner.d.ts +3 -0
  213. package/dist/runner.d.ts.map +1 -0
  214. package/dist/runner.js +473 -0
  215. package/dist/runner.js.map +1 -0
  216. package/dist/sandbox/host-allowlist.d.ts +13 -0
  217. package/dist/sandbox/host-allowlist.d.ts.map +1 -0
  218. package/dist/sandbox/host-allowlist.js +85 -0
  219. package/dist/sandbox/host-allowlist.js.map +1 -0
  220. package/dist/sandbox/output-cap.d.ts +9 -0
  221. package/dist/sandbox/output-cap.d.ts.map +1 -0
  222. package/dist/sandbox/output-cap.js +66 -0
  223. package/dist/sandbox/output-cap.js.map +1 -0
  224. package/dist/sandbox/timeout.d.ts +7 -0
  225. package/dist/sandbox/timeout.d.ts.map +1 -0
  226. package/dist/sandbox/timeout.js +52 -0
  227. package/dist/sandbox/timeout.js.map +1 -0
  228. package/dist/sandbox/types.d.ts +18 -0
  229. package/dist/sandbox/types.d.ts.map +1 -0
  230. package/dist/sandbox/types.js +27 -0
  231. package/dist/sandbox/types.js.map +1 -0
  232. package/dist/sandbox/workdir.d.ts +9 -0
  233. package/dist/sandbox/workdir.d.ts.map +1 -0
  234. package/dist/sandbox/workdir.js +83 -0
  235. package/dist/sandbox/workdir.js.map +1 -0
  236. package/dist/state/index.d.ts +4 -0
  237. package/dist/state/index.d.ts.map +1 -0
  238. package/dist/state/index.js +4 -0
  239. package/dist/state/index.js.map +1 -0
  240. package/dist/state/paths.d.ts +5 -0
  241. package/dist/state/paths.d.ts.map +1 -0
  242. package/dist/state/paths.js +18 -0
  243. package/dist/state/paths.js.map +1 -0
  244. package/dist/state/persist.d.ts +14 -0
  245. package/dist/state/persist.d.ts.map +1 -0
  246. package/dist/state/persist.js +146 -0
  247. package/dist/state/persist.js.map +1 -0
  248. package/dist/state/transcript.d.ts +9 -0
  249. package/dist/state/transcript.d.ts.map +1 -0
  250. package/dist/state/transcript.js +34 -0
  251. package/dist/state/transcript.js.map +1 -0
  252. package/dist/tools/native/apply_patch.d.ts +18 -0
  253. package/dist/tools/native/apply_patch.d.ts.map +1 -0
  254. package/dist/tools/native/apply_patch.js +245 -0
  255. package/dist/tools/native/apply_patch.js.map +1 -0
  256. package/dist/tools/native/http_fetch.d.ts +6 -0
  257. package/dist/tools/native/http_fetch.d.ts.map +1 -0
  258. package/dist/tools/native/http_fetch.js +168 -0
  259. package/dist/tools/native/http_fetch.js.map +1 -0
  260. package/dist/tools/native/index.d.ts +9 -0
  261. package/dist/tools/native/index.d.ts.map +1 -0
  262. package/dist/tools/native/index.js +22 -0
  263. package/dist/tools/native/index.js.map +1 -0
  264. package/dist/tools/native/list_dir.d.ts +4 -0
  265. package/dist/tools/native/list_dir.d.ts.map +1 -0
  266. package/dist/tools/native/list_dir.js +175 -0
  267. package/dist/tools/native/list_dir.js.map +1 -0
  268. package/dist/tools/native/read_file.d.ts +4 -0
  269. package/dist/tools/native/read_file.d.ts.map +1 -0
  270. package/dist/tools/native/read_file.js +91 -0
  271. package/dist/tools/native/read_file.js.map +1 -0
  272. package/dist/tools/native/shell_exec.d.ts +4 -0
  273. package/dist/tools/native/shell_exec.d.ts.map +1 -0
  274. package/dist/tools/native/shell_exec.js +180 -0
  275. package/dist/tools/native/shell_exec.js.map +1 -0
  276. package/dist/tools/native/write_file.d.ts +4 -0
  277. package/dist/tools/native/write_file.d.ts.map +1 -0
  278. package/dist/tools/native/write_file.js +101 -0
  279. package/dist/tools/native/write_file.js.map +1 -0
  280. package/dist/tools/types.d.ts +48 -0
  281. package/dist/tools/types.d.ts.map +1 -0
  282. package/dist/tools/types.js +10 -0
  283. package/dist/tools/types.js.map +1 -0
  284. package/dist/types.d.ts +385 -0
  285. package/dist/types.d.ts.map +1 -0
  286. package/dist/types.js +9 -0
  287. package/dist/types.js.map +1 -0
  288. package/examples/README.md +73 -0
  289. package/examples/creative-brief.md +34 -0
  290. package/examples/critic-disagreement-brief.md +42 -0
  291. package/examples/engineering-brief.md +35 -0
  292. package/examples/file-editing-brief.md +33 -0
  293. package/examples/mcp-brief.md +34 -0
  294. package/examples/multi-agent-brief.md +43 -0
  295. package/examples/research-brief.md +35 -0
  296. package/openwar.md +248 -0
  297. package/package.json +76 -0
  298. package/templates/brief.md +62 -0
package/dist/io.js ADDED
@@ -0,0 +1,83 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { stdin as input, stdout as output, stderr } from "node:process";
3
+ // ---------- Terminal IO ----------
4
+ // ANSI helpers. Disabled when NO_COLOR is set or stdout is not a TTY.
5
+ const enableColor = !process.env.NO_COLOR && output.isTTY;
6
+ const c = (code) => (s) => (enableColor ? `\x1b[${code}m${s}\x1b[0m` : s);
7
+ export const styles = {
8
+ dim: c("2"),
9
+ bold: c("1"),
10
+ cyan: c("36"),
11
+ yellow: c("33"),
12
+ red: c("31"),
13
+ green: c("32"),
14
+ magenta: c("35"),
15
+ };
16
+ export function createTerminalIO() {
17
+ let rl = null;
18
+ const getRl = () => {
19
+ rl ??= createInterface({ input, output, terminal: output.isTTY });
20
+ return rl;
21
+ };
22
+ return {
23
+ write(text) {
24
+ output.write(text);
25
+ },
26
+ banner(text) {
27
+ const bar = "─".repeat(Math.min(72, Math.max(8, text.length + 4)));
28
+ output.write(`\n${styles.cyan(bar)}\n${styles.bold(styles.cyan(text))}\n${styles.cyan(bar)}\n`);
29
+ },
30
+ warn(text) {
31
+ stderr.write(`${styles.yellow("! " + text)}\n`);
32
+ },
33
+ async prompt(question) {
34
+ const answer = await getRl().question(`${styles.magenta("> " + question + " ")}`);
35
+ return answer.trim();
36
+ },
37
+ async confirm(question) {
38
+ const answer = await getRl().question(`${styles.magenta("> " + question + " (y/N) ")}`);
39
+ return /^(y|yes)$/i.test(answer.trim());
40
+ },
41
+ };
42
+ }
43
+ export function closeTerminalIO(io) {
44
+ // The terminal IO owns its readline; trying to close another implementation
45
+ // is a no-op. We detect by duck-typing.
46
+ const maybeRl = io._rl;
47
+ if (maybeRl)
48
+ maybeRl.close();
49
+ }
50
+ export function createScriptedIO(opts = {}) {
51
+ const inputs = [...(opts.inputs ?? [])];
52
+ const confirmations = [...(opts.confirmations ?? [])];
53
+ let outBuf = "";
54
+ const warnings = [];
55
+ const banners = [];
56
+ const io = {
57
+ write(text) {
58
+ outBuf += text;
59
+ opts.onWrite?.(text);
60
+ },
61
+ banner(text) {
62
+ banners.push(text);
63
+ opts.onBanner?.(text);
64
+ },
65
+ warn(text) {
66
+ warnings.push(text);
67
+ opts.onWarn?.(text);
68
+ },
69
+ async prompt() {
70
+ return inputs.shift() ?? "";
71
+ },
72
+ async confirm() {
73
+ return confirmations.shift() ?? false;
74
+ },
75
+ get output() {
76
+ return outBuf;
77
+ },
78
+ warnings,
79
+ banners,
80
+ };
81
+ return io;
82
+ }
83
+ //# sourceMappingURL=io.js.map
package/dist/io.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type McpTransport, type InitializeResult, type CallToolResult, type CallToolParams, type McpTool } from "./types.js";
2
+ export interface McpClientInfo {
3
+ name: string;
4
+ version: string;
5
+ }
6
+ export interface McpClientOpts {
7
+ transport: McpTransport;
8
+ clientInfo?: McpClientInfo;
9
+ }
10
+ export declare class MCPClient {
11
+ private transport;
12
+ private clientInfo;
13
+ private serverInfo;
14
+ private initialized;
15
+ constructor(opts: McpClientOpts);
16
+ connect(): Promise<InitializeResult>;
17
+ listTools(): Promise<McpTool[]>;
18
+ callTool(params: CallToolParams): Promise<CallToolResult>;
19
+ disconnect(): Promise<void>;
20
+ getServerInfo(): InitializeResult["serverInfo"] | null;
21
+ }
22
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,OAAO,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,YAAY,CAAC;IACxB,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,WAAW,CAAS;gBAEhB,IAAI,EAAE,aAAa;IAKzB,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAapC,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAM/B,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAKzD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC,aAAa,IAAI,gBAAgB,CAAC,YAAY,CAAC,GAAG,IAAI;CAGvD"}
@@ -0,0 +1,44 @@
1
+ // MCPClient. High-level wrapper over a transport. Handles handshake,
2
+ // initialized notification, tools/list, tools/call.
3
+ import { MCP_PROTOCOL_VERSION, } from "./types.js";
4
+ export class MCPClient {
5
+ transport;
6
+ clientInfo;
7
+ serverInfo = null;
8
+ initialized = false;
9
+ constructor(opts) {
10
+ this.transport = opts.transport;
11
+ this.clientInfo = opts.clientInfo ?? { name: "openwar", version: "0.3.0" };
12
+ }
13
+ async connect() {
14
+ const result = await this.transport.request("initialize", {
15
+ protocolVersion: MCP_PROTOCOL_VERSION,
16
+ capabilities: { tools: {} },
17
+ clientInfo: this.clientInfo,
18
+ });
19
+ this.serverInfo = result.serverInfo;
20
+ // Per spec, send the "initialized" notification after the handshake.
21
+ await this.transport.notify("notifications/initialized");
22
+ this.initialized = true;
23
+ return result;
24
+ }
25
+ async listTools() {
26
+ if (!this.initialized)
27
+ throw new Error("MCPClient: connect() before listTools()");
28
+ const result = await this.transport.request("tools/list");
29
+ return result.tools;
30
+ }
31
+ async callTool(params) {
32
+ if (!this.initialized)
33
+ throw new Error("MCPClient: connect() before callTool()");
34
+ return await this.transport.request("tools/call", params);
35
+ }
36
+ async disconnect() {
37
+ await this.transport.close();
38
+ this.initialized = false;
39
+ }
40
+ getServerInfo() {
41
+ return this.serverInfo;
42
+ }
43
+ }
44
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,oDAAoD;AAEpD,OAAO,EACL,oBAAoB,GAOrB,MAAM,YAAY,CAAC;AAYpB,MAAM,OAAO,SAAS;IACZ,SAAS,CAAe;IACxB,UAAU,CAAgB;IAC1B,UAAU,GAA0C,IAAI,CAAC;IACzD,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAY,IAAmB;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAmB,YAAY,EAAE;YAC1E,eAAe,EAAE,oBAAoB;YACrC,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,qEAAqE;QACrE,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAkB,YAAY,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAsB;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACjF,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAiB,YAAY,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export { MCPClient, type McpClientInfo, type McpClientOpts } from "./client.js";
2
+ export { StdioTransport, type StdioTransportOpts } from "./transport-stdio.js";
3
+ export { loadGlobalMcpConfig, mergeServerConfigs, splitCommand, type McpServerConfig, type GlobalMcpConfig, } from "./registry.js";
4
+ export { MCP_PROTOCOL_VERSION, McpProtocolError, McpTransportError, type McpTransport, type McpTool, type CallToolResult, type CallToolParams, type InitializeResult, } from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ // MCP module exports.
2
+ export { MCPClient } from "./client.js";
3
+ export { StdioTransport } from "./transport-stdio.js";
4
+ export { loadGlobalMcpConfig, mergeServerConfigs, splitCommand, } from "./registry.js";
5
+ export { MCP_PROTOCOL_VERSION, McpProtocolError, McpTransportError, } from "./types.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,OAAO,EAAE,SAAS,EAA0C,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,cAAc,EAA2B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,GAGb,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAMlB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface McpServerConfig {
2
+ name: string;
3
+ command: string;
4
+ cwd?: string;
5
+ env?: Record<string, string>;
6
+ }
7
+ export interface GlobalMcpConfig {
8
+ servers?: McpServerConfig[];
9
+ }
10
+ export declare function loadGlobalMcpConfig(path?: string): Promise<McpServerConfig[]>;
11
+ export declare function mergeServerConfigs(global: McpServerConfig[], perSession: McpServerConfig[]): McpServerConfig[];
12
+ export declare function splitCommand(command: string): {
13
+ bin: string;
14
+ args: string[];
15
+ };
16
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IAGb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;CAC7B;AAID,wBAAsB,mBAAmB,CAAC,IAAI,GAAE,MAAqB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAsBjG;AAGD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EAAE,EACzB,UAAU,EAAE,eAAe,EAAE,GAC5B,eAAe,EAAE,CAKnB;AAGD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAM7E"}
@@ -0,0 +1,53 @@
1
+ // MCP server registry. Loads server configurations from:
2
+ // 1. ~/.openwar/mcp.json (global per-user)
3
+ // 2. Brief frontmatter `mcp_servers:` (per-session)
4
+ //
5
+ // Per-session entries take precedence on name collision.
6
+ import { readFile } from "node:fs/promises";
7
+ import { homedir } from "node:os";
8
+ import { join } from "node:path";
9
+ const DEFAULT_PATH = join(homedir(), ".openwar", "mcp.json");
10
+ export async function loadGlobalMcpConfig(path = DEFAULT_PATH) {
11
+ try {
12
+ const content = await readFile(path, "utf8");
13
+ const parsed = JSON.parse(content);
14
+ if (!parsed.servers)
15
+ return [];
16
+ if (!Array.isArray(parsed.servers)) {
17
+ throw new Error(`${path}: "servers" must be an array`);
18
+ }
19
+ for (const s of parsed.servers) {
20
+ if (typeof s.name !== "string" || s.name.length === 0) {
21
+ throw new Error(`${path}: every server needs a non-empty "name"`);
22
+ }
23
+ if (typeof s.command !== "string" || s.command.length === 0) {
24
+ throw new Error(`${path}: server "${s.name}" needs a "command"`);
25
+ }
26
+ }
27
+ return parsed.servers;
28
+ }
29
+ catch (err) {
30
+ const code = err.code;
31
+ if (code === "ENOENT")
32
+ return [];
33
+ throw err;
34
+ }
35
+ }
36
+ // Merge per-session (brief) configs over global configs by name.
37
+ export function mergeServerConfigs(global, perSession) {
38
+ const byName = new Map();
39
+ for (const s of global)
40
+ byName.set(s.name, s);
41
+ for (const s of perSession)
42
+ byName.set(s.name, s);
43
+ return [...byName.values()];
44
+ }
45
+ // Split a server.command string into [binary, ...args]. Whitespace-separated.
46
+ export function splitCommand(command) {
47
+ const parts = command.trim().split(/\s+/);
48
+ if (parts.length === 0 || parts[0] === "") {
49
+ throw new Error("empty command");
50
+ }
51
+ return { bin: parts[0], args: parts.slice(1) };
52
+ }
53
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,6CAA6C;AAC7C,sDAAsD;AACtD,EAAE;AACF,yDAAyD;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAejC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAe,YAAY;IACnE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,8BAA8B,CAAC,CAAC;QACzD,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,yCAAyC,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC,IAAI,qBAAqB,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACjC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAChC,MAAyB,EACzB,UAA6B;IAE7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { McpTransport } from "./types.js";
2
+ export interface StdioTransportOpts {
3
+ command: string;
4
+ args?: string[];
5
+ cwd?: string;
6
+ env?: NodeJS.ProcessEnv;
7
+ defaultTimeoutMs?: number;
8
+ }
9
+ export declare class StdioTransport implements McpTransport {
10
+ private child;
11
+ private nextId;
12
+ private pending;
13
+ private buffer;
14
+ private closeResolve;
15
+ readonly closed: Promise<void>;
16
+ private isClosed;
17
+ private readonly defaultTimeoutMs;
18
+ constructor(opts: StdioTransportOpts);
19
+ private onData;
20
+ private handleLine;
21
+ private fail;
22
+ request<T = unknown>(method: string, params?: unknown): Promise<T>;
23
+ notify(method: string, params?: unknown): Promise<void>;
24
+ close(): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=transport-stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-stdio.d.ts","sourceRoot":"","sources":["../../src/mcp/transport-stdio.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAA4G,MAAM,YAAY,CAAC;AAQpJ,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAwB;IAC5C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,IAAI,EAAE,kBAAkB;IAiBpC,OAAO,CAAC,MAAM;IAgBd,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,IAAI;IAWN,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAuBlE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAY7B"}
@@ -0,0 +1,138 @@
1
+ // Stdio JSON-RPC transport for MCP. Spawns a child process and exchanges
2
+ // newline-delimited JSON messages over stdin/stdout.
3
+ import { spawn } from "node:child_process";
4
+ import { McpProtocolError, McpTransportError } from "./types.js";
5
+ export class StdioTransport {
6
+ child;
7
+ nextId = 1;
8
+ pending = new Map();
9
+ buffer = "";
10
+ closeResolve = () => { };
11
+ closed;
12
+ isClosed = false;
13
+ defaultTimeoutMs;
14
+ constructor(opts) {
15
+ this.defaultTimeoutMs = opts.defaultTimeoutMs ?? 30_000;
16
+ this.child = spawn(opts.command, opts.args ?? [], {
17
+ cwd: opts.cwd,
18
+ env: opts.env ?? process.env,
19
+ stdio: ["pipe", "pipe", "pipe"],
20
+ });
21
+ this.closed = new Promise(resolve => { this.closeResolve = resolve; });
22
+ this.child.stdout.on("data", (chunk) => this.onData(chunk));
23
+ this.child.stderr.on("data", () => { });
24
+ this.child.on("error", err => this.fail(new McpTransportError(`child error: ${err.message}`)));
25
+ this.child.on("exit", (code, signal) => {
26
+ this.fail(new McpTransportError(`child exited (code=${code}, signal=${signal ?? "none"})`));
27
+ });
28
+ }
29
+ onData(chunk) {
30
+ this.buffer += chunk.toString("utf8");
31
+ // Cap buffer to prevent unbounded memory growth on malformed servers.
32
+ if (this.buffer.length > 5_000_000) {
33
+ this.fail(new McpTransportError("inbound buffer exceeded 5MB; aborting"));
34
+ return;
35
+ }
36
+ let newlineIdx;
37
+ while ((newlineIdx = this.buffer.indexOf("\n")) !== -1) {
38
+ const line = this.buffer.slice(0, newlineIdx).trim();
39
+ this.buffer = this.buffer.slice(newlineIdx + 1);
40
+ if (line.length === 0)
41
+ continue;
42
+ this.handleLine(line);
43
+ }
44
+ }
45
+ handleLine(line) {
46
+ let parsed;
47
+ try {
48
+ parsed = JSON.parse(line);
49
+ }
50
+ catch (err) {
51
+ // Malformed message: log via stderr would help, but we don't crash.
52
+ // No silent failures per spec; surface to next caller via console.error.
53
+ console.error(`MCP stdio: malformed JSON: ${err.message}`);
54
+ return;
55
+ }
56
+ if ("id" in parsed && parsed.id !== null && parsed.id !== undefined) {
57
+ const pending = this.pending.get(parsed.id);
58
+ if (!pending)
59
+ return; // late response, no pending request
60
+ this.pending.delete(parsed.id);
61
+ if (pending.timer)
62
+ clearTimeout(pending.timer);
63
+ if (parsed.error) {
64
+ pending.reject(new McpProtocolError(parsed.error.message, parsed.error.code));
65
+ }
66
+ else {
67
+ pending.resolve(parsed.result);
68
+ }
69
+ }
70
+ // Notifications are accepted but ignored at this layer (no subscribers yet).
71
+ }
72
+ fail(err) {
73
+ if (this.isClosed)
74
+ return;
75
+ this.isClosed = true;
76
+ for (const pending of this.pending.values()) {
77
+ if (pending.timer)
78
+ clearTimeout(pending.timer);
79
+ pending.reject(err);
80
+ }
81
+ this.pending.clear();
82
+ this.closeResolve();
83
+ }
84
+ async request(method, params) {
85
+ if (this.isClosed)
86
+ throw new McpTransportError("transport closed");
87
+ const id = this.nextId++;
88
+ const req = { jsonrpc: "2.0", id, method, ...(params !== undefined && { params }) };
89
+ return new Promise((resolve, reject) => {
90
+ const timer = setTimeout(() => {
91
+ if (this.pending.has(id)) {
92
+ this.pending.delete(id);
93
+ reject(new McpProtocolError(`request "${method}" timed out after ${this.defaultTimeoutMs}ms`));
94
+ }
95
+ }, this.defaultTimeoutMs);
96
+ this.pending.set(id, { resolve: resolve, reject, timer });
97
+ const line = JSON.stringify(req) + "\n";
98
+ this.child.stdin.write(line, err => {
99
+ if (err) {
100
+ this.pending.delete(id);
101
+ if (timer)
102
+ clearTimeout(timer);
103
+ reject(new McpTransportError(`write failed: ${err.message}`));
104
+ }
105
+ });
106
+ });
107
+ }
108
+ async notify(method, params) {
109
+ if (this.isClosed)
110
+ throw new McpTransportError("transport closed");
111
+ const msg = { jsonrpc: "2.0", method, ...(params !== undefined && { params }) };
112
+ return new Promise((resolve, reject) => {
113
+ this.child.stdin.write(JSON.stringify(msg) + "\n", err => {
114
+ if (err)
115
+ reject(new McpTransportError(`write failed: ${err.message}`));
116
+ else
117
+ resolve();
118
+ });
119
+ });
120
+ }
121
+ async close() {
122
+ if (this.isClosed)
123
+ return;
124
+ this.isClosed = true;
125
+ this.child.stdin.end();
126
+ // Give the child a moment to exit cleanly, then kill.
127
+ const timer = setTimeout(() => {
128
+ try {
129
+ this.child.kill("SIGTERM");
130
+ }
131
+ catch { /* swallow */ }
132
+ }, 1000);
133
+ await new Promise(resolve => this.child.once("exit", () => resolve()));
134
+ clearTimeout(timer);
135
+ this.fail(new McpTransportError("transport closed"));
136
+ }
137
+ }
138
+ //# 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,90 @@
1
+ export declare const MCP_PROTOCOL_VERSION = "2024-11-05";
2
+ export interface JsonRpcRequest {
3
+ jsonrpc: "2.0";
4
+ id: number | string;
5
+ method: string;
6
+ params?: unknown;
7
+ }
8
+ export interface JsonRpcResponse<T = unknown> {
9
+ jsonrpc: "2.0";
10
+ id: number | string | null;
11
+ result?: T;
12
+ error?: JsonRpcError;
13
+ }
14
+ export interface JsonRpcNotification {
15
+ jsonrpc: "2.0";
16
+ method: string;
17
+ params?: unknown;
18
+ }
19
+ export interface JsonRpcError {
20
+ code: number;
21
+ message: string;
22
+ data?: unknown;
23
+ }
24
+ export interface InitializeParams {
25
+ protocolVersion: string;
26
+ capabilities: {
27
+ tools?: Record<string, unknown>;
28
+ resources?: Record<string, unknown>;
29
+ prompts?: Record<string, unknown>;
30
+ };
31
+ clientInfo: {
32
+ name: string;
33
+ version: string;
34
+ };
35
+ }
36
+ export interface InitializeResult {
37
+ protocolVersion: string;
38
+ capabilities: {
39
+ tools?: {
40
+ listChanged?: boolean;
41
+ };
42
+ resources?: {
43
+ listChanged?: boolean;
44
+ subscribe?: boolean;
45
+ };
46
+ prompts?: {
47
+ listChanged?: boolean;
48
+ };
49
+ };
50
+ serverInfo: {
51
+ name: string;
52
+ version: string;
53
+ };
54
+ }
55
+ export interface McpTool {
56
+ name: string;
57
+ description?: string;
58
+ inputSchema: Record<string, unknown>;
59
+ }
60
+ export interface ListToolsResult {
61
+ tools: McpTool[];
62
+ }
63
+ export interface CallToolParams {
64
+ name: string;
65
+ arguments?: Record<string, unknown>;
66
+ }
67
+ export interface CallToolResult {
68
+ content: Array<{
69
+ type: string;
70
+ text?: string;
71
+ data?: string;
72
+ }>;
73
+ isError?: boolean;
74
+ }
75
+ export interface McpTransport {
76
+ request<T = unknown>(method: string, params?: unknown): Promise<T>;
77
+ notify(method: string, params?: unknown): Promise<void>;
78
+ close(): Promise<void>;
79
+ readonly closed: Promise<void>;
80
+ }
81
+ export declare class McpProtocolError extends Error {
82
+ readonly rpcCode?: number | undefined;
83
+ readonly code: "MCP_PROTOCOL";
84
+ constructor(message: string, rpcCode?: number | undefined);
85
+ }
86
+ export declare class McpTransportError extends Error {
87
+ readonly code: "MCP_TRANSPORT";
88
+ constructor(message: string);
89
+ }
90
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ // MCP protocol types. Hand-rolled from the spec to avoid the SDK dependency.
2
+ // https://spec.modelcontextprotocol.io/
3
+ //
4
+ // Targets the 2024-11-05 stable spec. When the spec versions, bump this
5
+ // constant and update the shapes below as needed.
6
+ export const MCP_PROTOCOL_VERSION = "2024-11-05";
7
+ export class McpProtocolError extends Error {
8
+ rpcCode;
9
+ code = "MCP_PROTOCOL";
10
+ constructor(message, rpcCode) {
11
+ super(message);
12
+ this.rpcCode = rpcCode;
13
+ this.name = "McpProtocolError";
14
+ }
15
+ }
16
+ export class McpTransportError extends Error {
17
+ code = "MCP_TRANSPORT";
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = "McpTransportError";
21
+ }
22
+ }
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,wCAAwC;AACxC,EAAE;AACF,wEAAwE;AACxE,kDAAkD;AAElD,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AA4FjD,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAEI;IADpC,IAAI,GAAG,cAAuB,CAAC;IACxC,YAAY,OAAe,EAAkB,OAAgB;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,YAAO,GAAP,OAAO,CAAS;QAE3D,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,GAAG,eAAwB,CAAC;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import type { PlanHandoff, ExecutionHandoff, ReviewHandoff, EscalationHandoff } from "../types.js";
2
+ export declare class HandoffParseError extends Error {
3
+ readonly cause_text: string;
4
+ readonly code: "HANDOFF_PARSE";
5
+ constructor(message: string, cause_text: string);
6
+ }
7
+ export declare class HandoffValidationError extends Error {
8
+ readonly path: string;
9
+ readonly code: "HANDOFF_VALIDATION";
10
+ constructor(message: string, path: string);
11
+ }
12
+ export declare function extractHandoffJson(text: string): string | null;
13
+ export declare function validatePlanHandoff(raw: unknown): PlanHandoff;
14
+ export declare function validateExecutionHandoff(raw: unknown): ExecutionHandoff;
15
+ export declare function validateReviewHandoff(raw: unknown): ReviewHandoff;
16
+ export declare function validateEscalationHandoff(raw: unknown): EscalationHandoff;
17
+ export type AnyHandoff = PlanHandoff | ExecutionHandoff | ReviewHandoff | EscalationHandoff;
18
+ export type ParseResult = {
19
+ ok: true;
20
+ handoff: AnyHandoff;
21
+ } | {
22
+ ok: false;
23
+ reason: "no_fence" | "bad_json" | "validation";
24
+ message: string;
25
+ };
26
+ export declare function parseHandoffFromText(text: string): ParseResult;
27
+ //# sourceMappingURL=handoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/orchestration/handoff.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EAGlB,MAAM,aAAa,CAAC;AAWrB,qBAAa,iBAAkB,SAAQ,KAAK;aAEG,UAAU,EAAE,MAAM;IAD/D,QAAQ,CAAC,IAAI,EAAG,eAAe,CAAU;gBAC7B,OAAO,EAAE,MAAM,EAAkB,UAAU,EAAE,MAAM;CAIhE;AAED,qBAAa,sBAAuB,SAAQ,KAAK;aAEF,IAAI,EAAE,MAAM;IADzD,QAAQ,CAAC,IAAI,EAAG,oBAAoB,CAAU;gBAClC,OAAO,EAAE,MAAM,EAAkB,IAAI,EAAE,MAAM;CAI1D;AAOD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ9D;AAqDD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CAiF7D;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAYvE;AAkCD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CA6BjE;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CA6BzE;AAID,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,gBAAgB,GAAG,aAAa,GAAG,iBAAiB,CAAC;AAK5F,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,GACjC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAmC9D"}