@sammorrowdrums/mcpi-ext 0.1.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 (213) hide show
  1. package/.dockerignore +6 -0
  2. package/.github/dependabot.yml +25 -0
  3. package/.github/workflows/ci.yml +50 -0
  4. package/.hadolint.yaml +6 -0
  5. package/.prettierignore +4 -0
  6. package/.prettierrc +7 -0
  7. package/AGENTS.md +118 -0
  8. package/DECISIONS.md +99 -0
  9. package/Dockerfile +39 -0
  10. package/README.md +278 -0
  11. package/aube-lock.yaml +4146 -0
  12. package/dist/code-mode/code-mode-integration.test.d.ts +2 -0
  13. package/dist/code-mode/code-mode-integration.test.d.ts.map +1 -0
  14. package/dist/code-mode/code-mode-integration.test.js +116 -0
  15. package/dist/code-mode/code-mode-integration.test.js.map +1 -0
  16. package/dist/code-mode/eligibility.d.ts +10 -0
  17. package/dist/code-mode/eligibility.d.ts.map +1 -0
  18. package/dist/code-mode/eligibility.js +14 -0
  19. package/dist/code-mode/eligibility.js.map +1 -0
  20. package/dist/code-mode/eligibility.test.d.ts +2 -0
  21. package/dist/code-mode/eligibility.test.d.ts.map +1 -0
  22. package/dist/code-mode/eligibility.test.js +53 -0
  23. package/dist/code-mode/eligibility.test.js.map +1 -0
  24. package/dist/code-mode/executor.d.ts +35 -0
  25. package/dist/code-mode/executor.d.ts.map +1 -0
  26. package/dist/code-mode/executor.js +120 -0
  27. package/dist/code-mode/executor.js.map +1 -0
  28. package/dist/code-mode/executor.test.d.ts +2 -0
  29. package/dist/code-mode/executor.test.d.ts.map +1 -0
  30. package/dist/code-mode/executor.test.js +130 -0
  31. package/dist/code-mode/executor.test.js.map +1 -0
  32. package/dist/code-mode/index.d.ts +65 -0
  33. package/dist/code-mode/index.d.ts.map +1 -0
  34. package/dist/code-mode/index.js +175 -0
  35. package/dist/code-mode/index.js.map +1 -0
  36. package/dist/code-mode/tools.d.ts +45 -0
  37. package/dist/code-mode/tools.d.ts.map +1 -0
  38. package/dist/code-mode/tools.js +70 -0
  39. package/dist/code-mode/tools.js.map +1 -0
  40. package/dist/code-mode/type-hints.d.ts +20 -0
  41. package/dist/code-mode/type-hints.d.ts.map +1 -0
  42. package/dist/code-mode/type-hints.js +189 -0
  43. package/dist/code-mode/type-hints.js.map +1 -0
  44. package/dist/code-mode/type-hints.test.d.ts +2 -0
  45. package/dist/code-mode/type-hints.test.d.ts.map +1 -0
  46. package/dist/code-mode/type-hints.test.js +157 -0
  47. package/dist/code-mode/type-hints.test.js.map +1 -0
  48. package/dist/docker-e2e.d.ts +55 -0
  49. package/dist/docker-e2e.d.ts.map +1 -0
  50. package/dist/docker-e2e.js +235 -0
  51. package/dist/docker-e2e.js.map +1 -0
  52. package/dist/docker-e2e.test.d.ts +2 -0
  53. package/dist/docker-e2e.test.d.ts.map +1 -0
  54. package/dist/docker-e2e.test.js +176 -0
  55. package/dist/docker-e2e.test.js.map +1 -0
  56. package/dist/index.d.ts +3 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +128 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/index.test.d.ts +2 -0
  61. package/dist/index.test.d.ts.map +1 -0
  62. package/dist/index.test.js +8 -0
  63. package/dist/index.test.js.map +1 -0
  64. package/dist/mcp/client-manager.d.ts +46 -0
  65. package/dist/mcp/client-manager.d.ts.map +1 -0
  66. package/dist/mcp/client-manager.js +148 -0
  67. package/dist/mcp/client-manager.js.map +1 -0
  68. package/dist/mcp/client-manager.test.d.ts +2 -0
  69. package/dist/mcp/client-manager.test.d.ts.map +1 -0
  70. package/dist/mcp/client-manager.test.js +204 -0
  71. package/dist/mcp/client-manager.test.js.map +1 -0
  72. package/dist/mcp/config-loader.d.ts +8 -0
  73. package/dist/mcp/config-loader.d.ts.map +1 -0
  74. package/dist/mcp/config-loader.js +43 -0
  75. package/dist/mcp/config-loader.js.map +1 -0
  76. package/dist/mcp/config-loader.test.d.ts +2 -0
  77. package/dist/mcp/config-loader.test.d.ts.map +1 -0
  78. package/dist/mcp/config-loader.test.js +93 -0
  79. package/dist/mcp/config-loader.test.js.map +1 -0
  80. package/dist/mcp/config.d.ts +46 -0
  81. package/dist/mcp/config.d.ts.map +1 -0
  82. package/dist/mcp/config.js +28 -0
  83. package/dist/mcp/config.js.map +1 -0
  84. package/dist/mcp/index.d.ts +5 -0
  85. package/dist/mcp/index.d.ts.map +1 -0
  86. package/dist/mcp/index.js +4 -0
  87. package/dist/mcp/index.js.map +1 -0
  88. package/dist/skills/discover.d.ts +10 -0
  89. package/dist/skills/discover.d.ts.map +1 -0
  90. package/dist/skills/discover.js +60 -0
  91. package/dist/skills/discover.js.map +1 -0
  92. package/dist/skills/format.d.ts +10 -0
  93. package/dist/skills/format.d.ts.map +1 -0
  94. package/dist/skills/format.js +38 -0
  95. package/dist/skills/format.js.map +1 -0
  96. package/dist/skills/format.test.d.ts +2 -0
  97. package/dist/skills/format.test.d.ts.map +1 -0
  98. package/dist/skills/format.test.js +63 -0
  99. package/dist/skills/format.test.js.map +1 -0
  100. package/dist/skills/index.d.ts +6 -0
  101. package/dist/skills/index.d.ts.map +1 -0
  102. package/dist/skills/index.js +6 -0
  103. package/dist/skills/index.js.map +1 -0
  104. package/dist/skills/load-skill-tool.d.ts +40 -0
  105. package/dist/skills/load-skill-tool.d.ts.map +1 -0
  106. package/dist/skills/load-skill-tool.js +104 -0
  107. package/dist/skills/load-skill-tool.js.map +1 -0
  108. package/dist/skills/mcp-tool-proxy.d.ts +11 -0
  109. package/dist/skills/mcp-tool-proxy.d.ts.map +1 -0
  110. package/dist/skills/mcp-tool-proxy.js +116 -0
  111. package/dist/skills/mcp-tool-proxy.js.map +1 -0
  112. package/dist/skills/skill-integration.test.d.ts +2 -0
  113. package/dist/skills/skill-integration.test.d.ts.map +1 -0
  114. package/dist/skills/skill-integration.test.js +119 -0
  115. package/dist/skills/skill-integration.test.js.map +1 -0
  116. package/dist/skills/skill-registry.d.ts +39 -0
  117. package/dist/skills/skill-registry.d.ts.map +1 -0
  118. package/dist/skills/skill-registry.js +48 -0
  119. package/dist/skills/skill-registry.js.map +1 -0
  120. package/dist/skills/skill-registry.test.d.ts +2 -0
  121. package/dist/skills/skill-registry.test.d.ts.map +1 -0
  122. package/dist/skills/skill-registry.test.js +67 -0
  123. package/dist/skills/skill-registry.test.js.map +1 -0
  124. package/dist/test-servers/weather-server.d.ts +12 -0
  125. package/dist/test-servers/weather-server.d.ts.map +1 -0
  126. package/dist/test-servers/weather-server.js +139 -0
  127. package/dist/test-servers/weather-server.js.map +1 -0
  128. package/dist/test-servers/weather-stdio.d.ts +2 -0
  129. package/dist/test-servers/weather-stdio.d.ts.map +1 -0
  130. package/dist/test-servers/weather-stdio.js +11 -0
  131. package/dist/test-servers/weather-stdio.js.map +1 -0
  132. package/dist/tool-cli/cli.d.ts +3 -0
  133. package/dist/tool-cli/cli.d.ts.map +1 -0
  134. package/dist/tool-cli/cli.js +179 -0
  135. package/dist/tool-cli/cli.js.map +1 -0
  136. package/dist/tool-cli/constants.d.ts +7 -0
  137. package/dist/tool-cli/constants.d.ts.map +1 -0
  138. package/dist/tool-cli/constants.js +15 -0
  139. package/dist/tool-cli/constants.js.map +1 -0
  140. package/dist/tool-cli/format.d.ts +8 -0
  141. package/dist/tool-cli/format.d.ts.map +1 -0
  142. package/dist/tool-cli/format.js +57 -0
  143. package/dist/tool-cli/format.js.map +1 -0
  144. package/dist/tool-cli/format.test.d.ts +2 -0
  145. package/dist/tool-cli/format.test.d.ts.map +1 -0
  146. package/dist/tool-cli/format.test.js +30 -0
  147. package/dist/tool-cli/format.test.js.map +1 -0
  148. package/dist/tool-cli/index.d.ts +4 -0
  149. package/dist/tool-cli/index.d.ts.map +1 -0
  150. package/dist/tool-cli/index.js +4 -0
  151. package/dist/tool-cli/index.js.map +1 -0
  152. package/dist/tool-cli/rpc-client.d.ts +6 -0
  153. package/dist/tool-cli/rpc-client.d.ts.map +1 -0
  154. package/dist/tool-cli/rpc-client.js +25 -0
  155. package/dist/tool-cli/rpc-client.js.map +1 -0
  156. package/dist/tool-cli/rpc-server.d.ts +48 -0
  157. package/dist/tool-cli/rpc-server.d.ts.map +1 -0
  158. package/dist/tool-cli/rpc-server.js +220 -0
  159. package/dist/tool-cli/rpc-server.js.map +1 -0
  160. package/dist/tool-cli/rpc-server.test.d.ts +2 -0
  161. package/dist/tool-cli/rpc-server.test.d.ts.map +1 -0
  162. package/dist/tool-cli/rpc-server.test.js +154 -0
  163. package/dist/tool-cli/rpc-server.test.js.map +1 -0
  164. package/eslint.config.js +27 -0
  165. package/images/banner.webp +0 -0
  166. package/images/code-c-maude.webp +0 -0
  167. package/images/nuclear-mcp-football.webp +0 -0
  168. package/images/the-skill-dealer.webp +0 -0
  169. package/mise.toml +65 -0
  170. package/package.json +46 -0
  171. package/scripts/docker-entrypoint.sh +29 -0
  172. package/scripts/test-echo-server.mjs +28 -0
  173. package/scripts/test-mcp-integration.mjs +59 -0
  174. package/scripts/test-tool-cli-smoke.mjs +62 -0
  175. package/src/code-mode/code-mode-integration.test.ts +135 -0
  176. package/src/code-mode/eligibility.test.ts +60 -0
  177. package/src/code-mode/eligibility.ts +16 -0
  178. package/src/code-mode/executor.test.ts +168 -0
  179. package/src/code-mode/executor.ts +163 -0
  180. package/src/code-mode/index.ts +208 -0
  181. package/src/code-mode/tools.ts +110 -0
  182. package/src/code-mode/type-hints.test.ts +187 -0
  183. package/src/code-mode/type-hints.ts +249 -0
  184. package/src/docker-e2e.test.ts +195 -0
  185. package/src/docker-e2e.ts +277 -0
  186. package/src/index.test.ts +8 -0
  187. package/src/index.ts +158 -0
  188. package/src/mcp/client-manager.test.ts +250 -0
  189. package/src/mcp/client-manager.ts +199 -0
  190. package/src/mcp/config-loader.test.ts +115 -0
  191. package/src/mcp/config-loader.ts +46 -0
  192. package/src/mcp/config.ts +40 -0
  193. package/src/mcp/index.ts +4 -0
  194. package/src/skills/discover.ts +81 -0
  195. package/src/skills/format.test.ts +70 -0
  196. package/src/skills/format.ts +42 -0
  197. package/src/skills/index.ts +9 -0
  198. package/src/skills/load-skill-tool.ts +136 -0
  199. package/src/skills/mcp-tool-proxy.ts +143 -0
  200. package/src/skills/skill-integration.test.ts +139 -0
  201. package/src/skills/skill-registry.test.ts +83 -0
  202. package/src/skills/skill-registry.ts +69 -0
  203. package/src/test-servers/weather-server.ts +171 -0
  204. package/src/test-servers/weather-stdio.ts +11 -0
  205. package/src/tool-cli/cli.ts +232 -0
  206. package/src/tool-cli/constants.ts +15 -0
  207. package/src/tool-cli/format.test.ts +33 -0
  208. package/src/tool-cli/format.ts +56 -0
  209. package/src/tool-cli/index.ts +3 -0
  210. package/src/tool-cli/rpc-client.ts +39 -0
  211. package/src/tool-cli/rpc-server.test.ts +193 -0
  212. package/src/tool-cli/rpc-server.ts +287 -0
  213. package/tsconfig.json +21 -0
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Test MCP weather server — exposes a weather skill with gated tools.
3
+ *
4
+ * Registers:
5
+ * - skill://weather/SKILL.md — a skill resource with frontmatter
6
+ * - check_weather_for_city — current weather (gated by skill)
7
+ * - check_weekly_forecast_for_city — 7-day forecast (gated by skill)
8
+ * - echo — ungated baseline tool
9
+ */
10
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ import { z } from "zod";
12
+ const SKILL_CONTENT = `---
13
+ name: weather
14
+ description: Check current weather and weekly forecasts for any city
15
+ allowed-tools:
16
+ - check_weather_for_city
17
+ - check_weekly_forecast_for_city
18
+ ---
19
+
20
+ # Weather Forecasting Skill
21
+
22
+ Use the weather tools to look up conditions for any city.
23
+
24
+ - **check_weather_for_city** — returns current temperature, conditions, and humidity
25
+ - **check_weekly_forecast_for_city** — returns a 7-day forecast summary
26
+
27
+ Always confirm the city name with the user before calling.
28
+ `;
29
+ const WEATHER_DATA = {
30
+ london: { temp: 14, conditions: "Cloudy", humidity: 78 },
31
+ tokyo: { temp: 26, conditions: "Sunny", humidity: 55 },
32
+ "new york": { temp: 22, conditions: "Partly cloudy", humidity: 62 },
33
+ sydney: { temp: 19, conditions: "Clear", humidity: 45 },
34
+ };
35
+ const FORECAST_DATA = {
36
+ london: "Mon 13°C Rain | Tue 14°C Cloudy | Wed 15°C Cloudy | Thu 12°C Rain | Fri 14°C Sunny | Sat 16°C Sunny | Sun 15°C Cloudy",
37
+ tokyo: "Mon 27°C Sunny | Tue 28°C Sunny | Wed 25°C Rain | Thu 24°C Cloudy | Fri 26°C Sunny | Sat 27°C Sunny | Sun 26°C Partly cloudy",
38
+ "new york": "Mon 23°C Sunny | Tue 24°C Sunny | Wed 20°C Thunderstorms | Thu 18°C Cloudy | Fri 21°C Sunny | Sat 22°C Sunny | Sun 23°C Clear",
39
+ sydney: "Mon 18°C Clear | Tue 20°C Sunny | Wed 19°C Cloudy | Thu 17°C Rain | Fri 18°C Cloudy | Sat 21°C Sunny | Sun 20°C Clear",
40
+ };
41
+ export function createWeatherServer() {
42
+ const server = new McpServer({ name: "test-weather-server", version: "0.1.0" }, { capabilities: { resources: {} } });
43
+ // Skill resource
44
+ server.registerResource("weather-skill", "skill://weather/SKILL.md", {
45
+ description: "Weather forecasting skill instructions",
46
+ mimeType: "text/markdown",
47
+ }, async () => ({
48
+ contents: [
49
+ {
50
+ uri: "skill://weather/SKILL.md",
51
+ text: SKILL_CONTENT,
52
+ mimeType: "text/markdown",
53
+ },
54
+ ],
55
+ }));
56
+ // Tool: current weather (gated by skill)
57
+ server.registerTool("check_weather_for_city", {
58
+ description: "Get current weather conditions for a city",
59
+ inputSchema: { city: z.string().describe("City name, e.g. 'London'") },
60
+ outputSchema: {
61
+ temperature: z.number().describe("Temperature in Celsius"),
62
+ conditions: z.string().describe("Weather conditions description"),
63
+ humidity: z.number().describe("Humidity percentage"),
64
+ city: z.string().describe("City name"),
65
+ },
66
+ annotations: { readOnlyHint: true },
67
+ }, async ({ city }) => {
68
+ const data = WEATHER_DATA[city.toLowerCase()];
69
+ if (!data) {
70
+ return {
71
+ content: [
72
+ {
73
+ type: "text",
74
+ text: `No weather data available for "${city}". Try: London, Tokyo, New York, or Sydney.`,
75
+ },
76
+ ],
77
+ };
78
+ }
79
+ const structuredContent = {
80
+ temperature: data.temp,
81
+ conditions: data.conditions,
82
+ humidity: data.humidity,
83
+ city,
84
+ };
85
+ return {
86
+ content: [
87
+ {
88
+ type: "text",
89
+ text: `Weather in ${city}: ${data.conditions}, ${data.temp}°C, humidity ${data.humidity}%`,
90
+ },
91
+ ],
92
+ structuredContent,
93
+ };
94
+ });
95
+ // Tool: weekly forecast (gated by skill)
96
+ server.registerTool("check_weekly_forecast_for_city", {
97
+ description: "Get a 7-day weather forecast for a city",
98
+ inputSchema: { city: z.string().describe("City name, e.g. 'Tokyo'") },
99
+ outputSchema: {
100
+ city: z.string().describe("City name"),
101
+ forecast: z.string().describe("7-day forecast summary"),
102
+ },
103
+ annotations: { readOnlyHint: true },
104
+ }, async ({ city }) => {
105
+ const forecast = FORECAST_DATA[city.toLowerCase()];
106
+ if (!forecast) {
107
+ return {
108
+ content: [
109
+ {
110
+ type: "text",
111
+ text: `No forecast data available for "${city}". Try: London, Tokyo, New York, or Sydney.`,
112
+ },
113
+ ],
114
+ };
115
+ }
116
+ const structuredContent = { city, forecast };
117
+ return {
118
+ content: [{ type: "text", text: `Forecast for ${city}: ${forecast}` }],
119
+ structuredContent,
120
+ };
121
+ });
122
+ // Ungated tool (always available, not behind a skill)
123
+ server.registerTool("echo", {
124
+ description: "Echoes back the input message",
125
+ inputSchema: { message: z.string() },
126
+ outputSchema: {
127
+ echo: z.string().describe("The echoed message"),
128
+ },
129
+ annotations: { readOnlyHint: true },
130
+ }, async ({ message }) => {
131
+ const structuredContent = { echo: message };
132
+ return {
133
+ content: [{ type: "text", text: `Echo: ${message}` }],
134
+ structuredContent,
135
+ };
136
+ });
137
+ return server;
138
+ }
139
+ //# sourceMappingURL=weather-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weather-server.js","sourceRoot":"","sources":["../../src/test-servers/weather-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=weather-stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weather-stdio.d.ts","sourceRoot":"","sources":["../../src/test-servers/weather-stdio.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * stdio entrypoint for the test weather server.
3
+ * Run with: node dist/test-servers/weather-stdio.js
4
+ */
5
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
+ import { createWeatherServer } from "./weather-server.js";
7
+ const server = createWeatherServer();
8
+ const transport = new StdioServerTransport();
9
+ await server.connect(transport);
10
+ console.error("Test weather server running on stdio");
11
+ //# sourceMappingURL=weather-stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weather-stdio.js","sourceRoot":"","sources":["../../src/test-servers/weather-stdio.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;AACrC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/tool-cli/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env node
2
+ import { writeFileSync } from "node:fs";
3
+ import { rpcCall } from "./rpc-client.js";
4
+ async function main() {
5
+ const rawArgs = process.argv.slice(2);
6
+ // Extract --out <file> flag (can appear anywhere)
7
+ let outFile;
8
+ const args = [];
9
+ for (let i = 0; i < rawArgs.length; i++) {
10
+ if (rawArgs[i] === "--out" && i + 1 < rawArgs.length) {
11
+ outFile = rawArgs[++i];
12
+ }
13
+ else {
14
+ args.push(rawArgs[i]);
15
+ }
16
+ }
17
+ try {
18
+ // No args or --help → list servers
19
+ if (args.length === 0 || (args.length === 1 && isHelp(args[0]))) {
20
+ await listServers();
21
+ return;
22
+ }
23
+ const server = args[0];
24
+ // <server> --help or just <server> → list tools
25
+ if (args.length === 1 || (args.length === 2 && isHelp(args[1]))) {
26
+ await listTools(server);
27
+ return;
28
+ }
29
+ const tool = args[1];
30
+ // <server> <tool> --help or just <server> <tool> → describe tool
31
+ if (args.length === 2 || (args.length === 3 && isHelp(args[2]))) {
32
+ await describeTool(server, tool);
33
+ return;
34
+ }
35
+ // <server> <tool> <json-args> → call tool
36
+ await callTool(server, tool, args[2], outFile);
37
+ }
38
+ catch (err) {
39
+ const message = err instanceof Error ? err.message : String(err);
40
+ if (message.includes("ECONNREFUSED") || message.includes("fetch failed")) {
41
+ console.error("Error: tool-cli server not running. Is mcpi-ext loaded?");
42
+ }
43
+ else {
44
+ console.error(`Error: ${message}`);
45
+ }
46
+ process.exit(1);
47
+ }
48
+ }
49
+ async function listServers() {
50
+ const result = (await rpcCall("listServers"));
51
+ const { servers } = result;
52
+ if (servers.length === 0) {
53
+ console.log("No MCP servers connected.");
54
+ return;
55
+ }
56
+ console.log("Available servers:");
57
+ for (const s of servers) {
58
+ const examples = s.examples.length > 0 ? ` (e.g. ${s.examples.join(", ")})` : "";
59
+ console.log(` ${s.name.padEnd(20)} ${s.toolCount} tool(s)${examples}`);
60
+ }
61
+ console.log("");
62
+ console.log("Use: tool-cli <server> to list tools");
63
+ }
64
+ async function listTools(server) {
65
+ const result = (await rpcCall("listTools", { server }));
66
+ if (result.tools.length === 0) {
67
+ console.log(`${server} — no tools`);
68
+ return;
69
+ }
70
+ console.log(`${server} — ${result.tools.length} tool(s):`);
71
+ for (const t of result.tools) {
72
+ const badge = t.hasStructuredOutput ? " [json]" : "";
73
+ console.log(` ${t.name.padEnd(30)} ${t.description}${badge}`);
74
+ }
75
+ console.log("");
76
+ console.log("Use: tool-cli <server> <tool> for full schema");
77
+ }
78
+ async function describeTool(server, tool) {
79
+ const result = (await rpcCall("describeTool", { server, tool }));
80
+ console.log(`${result.name} — ${result.description}`);
81
+ console.log("");
82
+ console.log("Input schema:");
83
+ console.log(formatSchema(result.inputSchema));
84
+ if (result.outputSchema) {
85
+ console.log("");
86
+ console.log("Output schema (structured JSON output):");
87
+ console.log(formatSchema(result.outputSchema));
88
+ }
89
+ if (result.annotations && Object.keys(result.annotations).length > 0) {
90
+ console.log("");
91
+ console.log("Annotations:");
92
+ for (const [key, val] of Object.entries(result.annotations)) {
93
+ console.log(` ${key}: ${JSON.stringify(val)}`);
94
+ }
95
+ }
96
+ console.log("");
97
+ console.log(`Use: tool-cli ${server} ${tool} '{"key":"value"}' to call`);
98
+ }
99
+ async function callTool(server, tool, argsJson, outFile) {
100
+ let toolArgs;
101
+ try {
102
+ toolArgs = JSON.parse(argsJson);
103
+ }
104
+ catch {
105
+ console.error(`Error: invalid JSON arguments: ${argsJson}`);
106
+ process.exit(1);
107
+ }
108
+ const result = (await rpcCall("callTool", { server, tool, arguments: toolArgs }));
109
+ if (result.isError) {
110
+ // Error content goes to stderr so stdout stays clean for piping
111
+ if (result.structuredContent) {
112
+ console.error(JSON.stringify(result.structuredContent, null, 2));
113
+ }
114
+ else if (result.content) {
115
+ for (const item of result.content) {
116
+ const entry = item;
117
+ if (entry.type === "text") {
118
+ console.error(entry.text);
119
+ }
120
+ else {
121
+ console.error(JSON.stringify(entry, null, 2));
122
+ }
123
+ }
124
+ }
125
+ process.exit(1);
126
+ return;
127
+ }
128
+ const output = formatOutput(result.structuredContent, result.content);
129
+ if (!output)
130
+ return;
131
+ if (outFile) {
132
+ writeFileSync(outFile, output, "utf-8");
133
+ console.log(`Written to: ${outFile}`);
134
+ }
135
+ else {
136
+ console.log(output);
137
+ }
138
+ }
139
+ /** Build the output string from structured or raw content. */
140
+ function formatOutput(structuredContent, content) {
141
+ if (structuredContent) {
142
+ return JSON.stringify(structuredContent, null, 2);
143
+ }
144
+ if (content) {
145
+ const parts = [];
146
+ for (const item of content) {
147
+ const entry = item;
148
+ if (entry.type === "text") {
149
+ parts.push(entry.text);
150
+ }
151
+ else {
152
+ parts.push(JSON.stringify(entry, null, 2));
153
+ }
154
+ }
155
+ return parts.join("\n");
156
+ }
157
+ return "";
158
+ }
159
+ /** Format a JSON Schema as a compact, readable summary. */
160
+ function formatSchema(schema) {
161
+ const props = schema.properties;
162
+ const required = schema.required ?? [];
163
+ if (!props || Object.keys(props).length === 0) {
164
+ return " (no parameters)";
165
+ }
166
+ const lines = [];
167
+ for (const [name, prop] of Object.entries(props)) {
168
+ const type = prop.type ?? "unknown";
169
+ const req = required.includes(name) ? ", required" : "";
170
+ const desc = prop.description ? `: ${prop.description}` : "";
171
+ lines.push(` ${name} (${type}${req})${desc}`);
172
+ }
173
+ return lines.join("\n");
174
+ }
175
+ function isHelp(arg) {
176
+ return arg === "--help" || arg === "-h";
177
+ }
178
+ void main();
179
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/tool-cli/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Default port for the tool-cli JSON-RPC server. */
2
+ export declare const DEFAULT_PORT = 7179;
3
+ /** Environment variable to override the default port. */
4
+ export declare const PORT_ENV_VAR = "TOOL_CLI_PORT";
5
+ /** Resolve the port from environment or default. */
6
+ export declare function resolvePort(): number;
7
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/tool-cli/constants.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,yDAAyD;AACzD,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAE5C,oDAAoD;AACpD,wBAAgB,WAAW,IAAI,MAAM,CAOpC"}
@@ -0,0 +1,15 @@
1
+ /** Default port for the tool-cli JSON-RPC server. */
2
+ export const DEFAULT_PORT = 7179;
3
+ /** Environment variable to override the default port. */
4
+ export const PORT_ENV_VAR = "TOOL_CLI_PORT";
5
+ /** Resolve the port from environment or default. */
6
+ export function resolvePort() {
7
+ const envPort = process.env[PORT_ENV_VAR];
8
+ if (envPort) {
9
+ const parsed = parseInt(envPort, 10);
10
+ if (!isNaN(parsed) && parsed > 0 && parsed < 65536)
11
+ return parsed;
12
+ }
13
+ return DEFAULT_PORT;
14
+ }
15
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/tool-cli/constants.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC,yDAAyD;AACzD,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;AAE5C,oDAAoD;AACpD,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1C,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK;YAAE,OAAO,MAAM,CAAC;IACpE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Format system prompt section advising the agent when and how to use tool-cli.
3
+ *
4
+ * Only included when MCP servers are connected. Tells the agent about
5
+ * progressive discovery via tool-cli as an alternative to skill-based access.
6
+ */
7
+ export declare function formatToolCliForPrompt(serverCount: number): string;
8
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/tool-cli/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAiDlE"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Format system prompt section advising the agent when and how to use tool-cli.
3
+ *
4
+ * Only included when MCP servers are connected. Tells the agent about
5
+ * progressive discovery via tool-cli as an alternative to skill-based access.
6
+ */
7
+ export function formatToolCliForPrompt(serverCount) {
8
+ if (serverCount === 0)
9
+ return "";
10
+ return `
11
+
12
+ <tool_cli>
13
+ You have access to \`tool-cli\`, a CLI for discovering and calling MCP server tools progressively.
14
+
15
+ Use tool-cli when:
16
+ - No skill covers the task you need to do
17
+ - You want to explore what tools are available on a server
18
+ - You need ad-hoc access to an MCP tool without loading a full skill
19
+
20
+ If a skill exists for the task, prefer the skill — it provides workflow instructions and curated tool access.
21
+
22
+ Discovery (progressive — only fetch what you need):
23
+ tool-cli --help # List MCP servers with tool counts
24
+ tool-cli <server> # List all tools on a server
25
+ tool-cli <server> <tool> # Show full schema for a tool
26
+
27
+ Calling tools:
28
+ tool-cli <server> <tool> '{"key":"value"}' # Call a tool with JSON arguments
29
+ tool-cli <server> <tool> '{}' --out /tmp/result.json # Save large output to file
30
+
31
+ tool-cli outputs plain text or JSON. When a tool provides structured output (typed JSON),
32
+ tool-cli returns it directly as JSON — use \`jq\` to query fields.
33
+ Chain calls, filter, and transform results using pipes and bash idioms:
34
+
35
+ # Search across tool results
36
+ tool-cli myserver search_docs '{"query":"auth"}' | grep -i "token"
37
+
38
+ # Query structured JSON output with jq
39
+ tool-cli myserver list_issues '{"repo":"owner/repo"}' | jq '.[].title'
40
+
41
+ # Chain tool calls — feed one result into another
42
+ tool-cli myserver list_items '{}' | jq -r '.[0].id' | xargs -I{} tool-cli myserver get_item '{"id":"{}"}'
43
+
44
+ # Process multiple items
45
+ for city in London Tokyo Paris; do
46
+ echo "=== $city ==="; tool-cli weather check_weather '{"city":"'$city'"}';
47
+ done
48
+
49
+ # Combine with standard tools
50
+ tool-cli myserver export_csv '{"table":"users"}' | sort -t, -k2 | head -20
51
+
52
+ Prefer piping and chaining over multiple separate tool calls when processing collections or filtering results.
53
+ Errors go to stderr with exit code 1 — use \`&&\` or \`set -e\` for safe chaining.
54
+ ${serverCount} MCP server(s) currently connected.
55
+ </tool_cli>`;
56
+ }
57
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/tool-cli/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,IAAI,WAAW,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CP,WAAW;YACD,CAAC;AACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=format.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.test.d.ts","sourceRoot":"","sources":["../../src/tool-cli/format.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { formatToolCliForPrompt } from "./format.js";
3
+ describe("formatToolCliForPrompt", () => {
4
+ it("returns empty string when no servers connected", () => {
5
+ expect(formatToolCliForPrompt(0)).toBe("");
6
+ });
7
+ it("includes tool-cli usage instructions when servers are connected", () => {
8
+ const result = formatToolCliForPrompt(2);
9
+ expect(result).toContain("tool-cli");
10
+ expect(result).toContain("<tool_cli>");
11
+ expect(result).toContain("</tool_cli>");
12
+ expect(result).toContain("--help");
13
+ expect(result).toContain("<server>");
14
+ expect(result).toContain("<tool>");
15
+ expect(result).toContain("2 MCP server(s) currently connected");
16
+ });
17
+ it("advises preferring skills over tool-cli", () => {
18
+ const result = formatToolCliForPrompt(1);
19
+ expect(result).toContain("prefer the skill");
20
+ });
21
+ it("includes shell chaining and piping examples", () => {
22
+ const result = formatToolCliForPrompt(1);
23
+ expect(result).toContain("grep");
24
+ expect(result).toContain("|");
25
+ expect(result).toContain("jq");
26
+ expect(result).toContain("xargs");
27
+ expect(result).toContain("Prefer piping and chaining");
28
+ });
29
+ });
30
+ //# sourceMappingURL=format.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.test.js","sourceRoot":"","sources":["../../src/tool-cli/format.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ToolCliRpcServer } from "./rpc-server.js";
2
+ export { formatToolCliForPrompt } from "./format.js";
3
+ export { DEFAULT_PORT, PORT_ENV_VAR, resolvePort } from "./constants.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tool-cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ToolCliRpcServer } from "./rpc-server.js";
2
+ export { formatToolCliForPrompt } from "./format.js";
3
+ export { DEFAULT_PORT, PORT_ENV_VAR, resolvePort } from "./constants.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tool-cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Send a JSON-RPC 2.0 request to the tool-cli RPC server.
3
+ * Throws on network errors and JSON-RPC error responses.
4
+ */
5
+ export declare function rpcCall(method: string, params?: Record<string, unknown>): Promise<unknown>;
6
+ //# sourceMappingURL=rpc-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-client.d.ts","sourceRoot":"","sources":["../../src/tool-cli/rpc-client.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,OAAO,CAAC,CAsBlB"}
@@ -0,0 +1,25 @@
1
+ import { resolvePort } from "./constants.js";
2
+ /**
3
+ * Send a JSON-RPC 2.0 request to the tool-cli RPC server.
4
+ * Throws on network errors and JSON-RPC error responses.
5
+ */
6
+ export async function rpcCall(method, params = {}) {
7
+ const port = resolvePort();
8
+ const url = `http://127.0.0.1:${port}`;
9
+ const response = await fetch(url, {
10
+ method: "POST",
11
+ headers: { "Content-Type": "application/json" },
12
+ body: JSON.stringify({
13
+ jsonrpc: "2.0",
14
+ method,
15
+ params,
16
+ id: 1,
17
+ }),
18
+ });
19
+ const json = (await response.json());
20
+ if (json.error) {
21
+ throw new Error(json.error.message);
22
+ }
23
+ return json.result;
24
+ }
25
+ //# sourceMappingURL=rpc-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../src/tool-cli/rpc-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAS7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAc,EACd,SAAkC,EAAE;IAEpC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAEvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,MAAM;YACN,MAAM;YACN,EAAE,EAAE,CAAC;SACN,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoB,CAAC;IAExD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { McpClientManager } from "../mcp/index.js";
2
+ interface ServerInfo {
3
+ name: string;
4
+ toolCount: number;
5
+ examples: string[];
6
+ }
7
+ interface ToolSummary {
8
+ name: string;
9
+ description: string;
10
+ hasStructuredOutput: boolean;
11
+ }
12
+ interface ToolDetails {
13
+ name: string;
14
+ description: string;
15
+ inputSchema: Record<string, unknown>;
16
+ outputSchema?: Record<string, unknown>;
17
+ annotations?: Record<string, unknown>;
18
+ }
19
+ export type { ServerInfo, ToolSummary, ToolDetails };
20
+ /**
21
+ * JSON-RPC 2.0 server that exposes MCP tool discovery and execution.
22
+ *
23
+ * Methods:
24
+ * - listServers → server names + tool counts + random examples
25
+ * - listTools(server) → tool names + descriptions
26
+ * - describeTool(server, tool) → full schema
27
+ * - callTool(server, tool, arguments) → execute and return result
28
+ */
29
+ export declare class ToolCliRpcServer {
30
+ private mcpManager;
31
+ private server;
32
+ private port;
33
+ constructor(mcpManager: McpClientManager, port?: number);
34
+ /** Start the HTTP server. Resolves once listening. */
35
+ start(log?: (msg: string) => void): Promise<void>;
36
+ /** Stop the HTTP server. */
37
+ stop(): Promise<void>;
38
+ /** Returns the port the server is listening on (resolved after start for port 0). */
39
+ getPort(): number;
40
+ private handleBody;
41
+ private dispatch;
42
+ private listServers;
43
+ private listTools;
44
+ private describeTool;
45
+ private callTool;
46
+ private assertServerExists;
47
+ }
48
+ //# sourceMappingURL=rpc-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-server.d.ts","sourceRoot":"","sources":["../../src/tool-cli/rpc-server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAW,MAAM,iBAAiB,CAAC;AAiBjE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AAErD;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,UAAU;IAJpB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,IAAI,CAAS;gBAGX,UAAU,EAAE,gBAAgB,EACpC,IAAI,CAAC,EAAE,MAAM;IAKf,sDAAsD;IAChD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DvD,4BAA4B;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,qFAAqF;IACrF,OAAO,IAAI,MAAM;YAQH,UAAU;YAsBV,QAAQ;IAetB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,YAAY;YAmBN,QAAQ;IAwBtB,OAAO,CAAC,kBAAkB;CAQ3B"}