hyperclaw 5.2.7 → 5.2.9

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 (207) hide show
  1. package/dist/a2ui-protocol-DEsfqO7h.js +75 -0
  2. package/dist/agents-routing-Cee7wrfi.js +398 -0
  3. package/dist/agents-routing-ChorJKFL.js +6 -0
  4. package/dist/agents-routing-Cpg20-1e.js +398 -0
  5. package/dist/agents-routing-uNzqjgOr.js +6 -0
  6. package/dist/api-key-validation-DgOBmp8Y.js +64 -0
  7. package/dist/api-key-validation-DydlUth1.js +64 -0
  8. package/dist/api-keys-guide--73Bq0Ey.js +149 -0
  9. package/dist/api-keys-guide-DqRGa4x7.js +149 -0
  10. package/dist/audit-CX5poVMR.js +445 -0
  11. package/dist/audit-Dntx9fG9.js +445 -0
  12. package/dist/banner-B_rR7FPO.js +7 -0
  13. package/dist/banner-Bb7CderS.js +143 -0
  14. package/dist/bounty-tools-BoU1NN5N.js +211 -0
  15. package/dist/bounty-tools-Dn9Yq7V1.js +211 -0
  16. package/dist/browser-tools-CJ9M9o22.js +179 -0
  17. package/dist/browser-tools-CXxWxA1c.js +5 -0
  18. package/dist/chat-C07wF0mM.js +494 -0
  19. package/dist/chat-D1Zc73I5.js +513 -0
  20. package/dist/claw-tasks-BLqd1a0Q.js +80 -0
  21. package/dist/claw-tasks-ChqkHdFs.js +80 -0
  22. package/dist/config-BlLlJ6Er.js +7 -0
  23. package/dist/config-Bzues-G2.js +7 -0
  24. package/dist/config-DGAAJ49A.js +261 -0
  25. package/dist/config-SgDxKyfV.js +261 -0
  26. package/dist/connector-1efnZgQN.js +566 -0
  27. package/dist/connector-B5q1_srT.js +286 -0
  28. package/dist/connector-BMFLJ4fr.js +508 -0
  29. package/dist/connector-BZYv9siY.js +189 -0
  30. package/dist/connector-B_XkXm-j.js +218 -0
  31. package/dist/connector-BkY1I6gf.js +189 -0
  32. package/dist/connector-C2Z3RN1z.js +350 -0
  33. package/dist/connector-C7aYvVzU.js +225 -0
  34. package/dist/connector-CXXYOyHw.js +164 -0
  35. package/dist/connector-Ca1J23HX.js +167 -0
  36. package/dist/connector-Cjqc656I.js +181 -0
  37. package/dist/connector-CluRienN.js +425 -0
  38. package/dist/connector-CuNz2eP-.js +305 -0
  39. package/dist/connector-DHL_oeHy.js +552 -0
  40. package/dist/connector-DJ79rd1L.js +173 -0
  41. package/dist/connector-DcLE6xCZ.js +239 -0
  42. package/dist/connector-DcyQTJnJ.js +162 -0
  43. package/dist/connector-DgyX9qSc.js +192 -0
  44. package/dist/connector-DnDXXZ7L.js +182 -0
  45. package/dist/connector-DqUslg-X.js +213 -0
  46. package/dist/connector-Duc-HmRZ.js +85 -0
  47. package/dist/connector-IV0QFer8.js +498 -0
  48. package/dist/connector-OnsLxE8G.js +194 -0
  49. package/dist/connector-UYu_TS0X.js +204 -0
  50. package/dist/connector-cCA5ffmp.js +340 -0
  51. package/dist/connector-fbNfx4_L.js +568 -0
  52. package/dist/connector-fi2vlwbO.js +276 -0
  53. package/dist/connector-l3LD8IDN.js +419 -0
  54. package/dist/cost-tracker-CgEXyEtz.js +103 -0
  55. package/dist/cost-tracker-DCXDUzBI.js +103 -0
  56. package/dist/credentials-store-1LDtNReY.js +89 -0
  57. package/dist/credentials-store-BFxEJR00.js +7 -0
  58. package/dist/credentials-store-Bmm9e1SS.js +7 -0
  59. package/dist/credentials-store-D8ERbGR2.js +89 -0
  60. package/dist/cron-tasks-1E6wKpTv.js +85 -0
  61. package/dist/cron-tasks-OQbgmenS.js +85 -0
  62. package/dist/daemon-B13UIqvL.js +7 -0
  63. package/dist/daemon-CzOW-1PS.js +421 -0
  64. package/dist/daemon-aVX-WGz1.js +421 -0
  65. package/dist/daemon-iFmVBPXN.js +7 -0
  66. package/dist/delivery-B8YGmrq5.js +4 -0
  67. package/dist/delivery-DWsU6gx-.js +95 -0
  68. package/dist/delivery-Pko6sSkt.js +4 -0
  69. package/dist/delivery-hMHFRZwy.js +95 -0
  70. package/dist/destructive-gate-C2TrWsp2.js +101 -0
  71. package/dist/destructive-gate-bnkroJWG.js +101 -0
  72. package/dist/developer-keys-BWXHaWxY.js +127 -0
  73. package/dist/developer-keys-CzDxVczE.js +8 -0
  74. package/dist/device-auth-store-C1bCwXO2.js +7 -0
  75. package/dist/device-auth-store-DIZTOz4V.js +88 -0
  76. package/dist/doctor-C6nAGdH8.js +233 -0
  77. package/dist/doctor-mgWumA25.js +6 -0
  78. package/dist/engine-BGRTi0fo.js +327 -0
  79. package/dist/engine-BvCEhaUn.js +7 -0
  80. package/dist/engine-ByQ-0sWM.js +7 -0
  81. package/dist/engine-gnMjO743.js +327 -0
  82. package/dist/env-resolve-BdagnXhK.js +151 -0
  83. package/dist/env-resolve-CHxjGo8u.js +151 -0
  84. package/dist/env-resolve-NEtsGacw.js +10 -0
  85. package/dist/env-resolve-pIETNTpQ.js +10 -0
  86. package/dist/extraction-tools-BE6z_Yw5.js +91 -0
  87. package/dist/extraction-tools-CJsdyBST.js +5 -0
  88. package/dist/form_data-B2_0EoWj.js +8657 -0
  89. package/dist/gmail-watch-setup-1RGIHNdu.js +42 -0
  90. package/dist/gmail-watch-setup-Brkj94Sy.js +42 -0
  91. package/dist/health-BMUmUNoe.js +152 -0
  92. package/dist/health-C8n9RH5O.js +6 -0
  93. package/dist/heartbeat-engine-D6oSpgxx.js +89 -0
  94. package/dist/heartbeat-engine-aRbab8a5.js +89 -0
  95. package/dist/hub-BJM2KXLO.js +6 -0
  96. package/dist/hub-Bb_dYECE.js +512 -0
  97. package/dist/hyperclawbot-CgrV46DA.js +516 -0
  98. package/dist/hyperclawbot-DzP_v3iA.js +516 -0
  99. package/dist/inference-BHJFPEKL.js +8 -0
  100. package/dist/inference-CFBkvLpE.js +2854 -0
  101. package/dist/inference-G4MbdErG.js +8 -0
  102. package/dist/inference-vweXyh27.js +2854 -0
  103. package/dist/knowledge-graph-9UNrsiIY.js +134 -0
  104. package/dist/knowledge-graph-yeMPBPP8.js +134 -0
  105. package/dist/loader-BXYJl25e.js +6 -0
  106. package/dist/loader-DIPs649t.js +410 -0
  107. package/dist/loader-Dq_cDlOW.js +6 -0
  108. package/dist/loader-gTdKBwiI.js +410 -0
  109. package/dist/logger-C3ZCDSkc.js +86 -0
  110. package/dist/logger-CG38Idq4.js +86 -0
  111. package/dist/manager--wG9JdFW.js +120 -0
  112. package/dist/manager-BI3izlRG.js +120 -0
  113. package/dist/manager-BNc21xgG.js +6 -0
  114. package/dist/manager-CQ3MWNHY.js +250 -0
  115. package/dist/manager-DWJ7WZcY.js +250 -0
  116. package/dist/manager-DYfzqckn.js +35 -0
  117. package/dist/mcp-CklaYr_6.js +142 -0
  118. package/dist/mcp-SsMEvl28.js +142 -0
  119. package/dist/mcp-loader-9v8eUsNI.js +93 -0
  120. package/dist/mcp-loader-DLrp_oZJ.js +93 -0
  121. package/dist/memory-BCYvdqwo.js +273 -0
  122. package/dist/memory-BGgCBSx1.js +6 -0
  123. package/dist/memory-auto-Bh52cQJP.js +5 -0
  124. package/dist/memory-auto-Bow9u_L7.js +306 -0
  125. package/dist/memory-auto-BupvVwNd.js +306 -0
  126. package/dist/memory-auto-CgBAI8mm.js +5 -0
  127. package/dist/memory-integration-4oGqX6rr.js +91 -0
  128. package/dist/memory-integration-CveUEI3V.js +91 -0
  129. package/dist/moltbook-B3DNdh40.js +81 -0
  130. package/dist/moltbook-xP7VXKlX.js +81 -0
  131. package/dist/node-C4esBfbX.js +226 -0
  132. package/dist/node-urDjajMt.js +226 -0
  133. package/dist/nodes-registry-Cd4eWw80.js +52 -0
  134. package/dist/nodes-registry-DLUZhEMS.js +52 -0
  135. package/dist/oauth-flow-BbLQTzZk.js +148 -0
  136. package/dist/oauth-flow-Bt-LaRHV.js +148 -0
  137. package/dist/oauth-provider-CVTKgj35.js +111 -0
  138. package/dist/oauth-provider-UZyG84s7.js +111 -0
  139. package/dist/observability-BtLyuxcz.js +89 -0
  140. package/dist/observability-lwYm4aoB.js +89 -0
  141. package/dist/onboard-B3drurt-.js +3812 -0
  142. package/dist/onboard-BV5Poocl.js +13 -0
  143. package/dist/onboard-DEwuHrMj.js +14 -0
  144. package/dist/onboard-UiynbNQy.js +3909 -0
  145. package/dist/orchestrator-BXyIgAeH.js +189 -0
  146. package/dist/orchestrator-DMZkAVa5.js +189 -0
  147. package/dist/orchestrator-MLTc4NYu.js +6 -0
  148. package/dist/orchestrator-rVGu7yYr.js +6 -0
  149. package/dist/osint-Bsf6RGPv.js +283 -0
  150. package/dist/osint-chat-Ark94iFc.js +789 -0
  151. package/dist/osint-chat-Hn8qpsC1.js +836 -0
  152. package/dist/osint-f9DeXT6j.js +283 -0
  153. package/dist/pairing-2vAiDBjN.js +6 -0
  154. package/dist/pairing-B4NoBvyE.js +207 -0
  155. package/dist/pc-access-BLnc-DYp.js +858 -0
  156. package/dist/pc-access-CTNtG2LD.js +8 -0
  157. package/dist/pending-approval-C4ZaHHWl.js +22 -0
  158. package/dist/pending-approval-CHUZ_qT6.js +22 -0
  159. package/dist/reminders-store-BixTWL1h.js +58 -0
  160. package/dist/renderer-B1ToXngl.js +228 -0
  161. package/dist/rules-Cqen1Mpt.js +106 -0
  162. package/dist/run-main.js +98 -94
  163. package/dist/runner-B9xANekJ.js +1274 -0
  164. package/dist/runner-Cr1_mwnU.js +1274 -0
  165. package/dist/security--17Fxo5Z.js +4 -0
  166. package/dist/security-B4vH02lO.js +4 -0
  167. package/dist/security-DP1qtJfL.js +90 -0
  168. package/dist/security-HOOGCw5z.js +90 -0
  169. package/dist/server-CRhXiGI9.js +4 -0
  170. package/dist/server-DUDXqJSo.js +1365 -0
  171. package/dist/server-De4H45Ju.js +1365 -0
  172. package/dist/server-ha59nA8a.js +4 -0
  173. package/dist/session-store-7sEPyV16.js +5 -0
  174. package/dist/session-store-Ce2QMSL_.js +141 -0
  175. package/dist/sessions-tools-CWr_pDtp.js +5 -0
  176. package/dist/sessions-tools-DKVu9aIN.js +95 -0
  177. package/dist/skill-loader-DK19Jm4e.js +7 -0
  178. package/dist/skill-loader-Dfs9VNM-.js +160 -0
  179. package/dist/skill-runtime-BRp2D8Jb.js +5 -0
  180. package/dist/skill-runtime-BeKh2rD_.js +5 -0
  181. package/dist/skill-runtime-C8bNwKwz.js +104 -0
  182. package/dist/skill-runtime-CcpC2Zfc.js +104 -0
  183. package/dist/src-B8LzGLSY.js +63 -0
  184. package/dist/src-BxmkZ9RH.js +63 -0
  185. package/dist/src-DUoc6_kn.js +458 -0
  186. package/dist/src-DjTtmSRg.js +20 -0
  187. package/dist/src-n_46LPDi.js +458 -0
  188. package/dist/sub-agent-tools-CldaMfd5.js +39 -0
  189. package/dist/sub-agent-tools-q5JqEze_.js +39 -0
  190. package/dist/tool-policy-DtGf3Ifq.js +189 -0
  191. package/dist/tool-policy-QXF3MMxu.js +189 -0
  192. package/dist/tts-elevenlabs-1zWD3QJw.js +64 -0
  193. package/dist/tts-elevenlabs-y6HGWWDS.js +64 -0
  194. package/dist/update-check-C4te7JmY.js +6 -0
  195. package/dist/update-check-GDue_it1.js +98 -0
  196. package/dist/vision-DV2ubVjr.js +167 -0
  197. package/dist/vision-tools-Cb86uMdh.js +5 -0
  198. package/dist/vision-tools-CbVfyTZT.js +5 -0
  199. package/dist/vision-tools-DieVQp6s.js +51 -0
  200. package/dist/vision-tools-DlnxaZjg.js +51 -0
  201. package/dist/vision-u4kMThdo.js +167 -0
  202. package/dist/voice-transcription-BolTT_HG.js +170 -0
  203. package/dist/voice-transcription-DgON5qaF.js +170 -0
  204. package/dist/website-watch-tools-B8L_NgwT.js +5 -0
  205. package/dist/website-watch-tools-Drm5HjIX.js +176 -0
  206. package/package.json +4 -1
  207. package/static/chat.html +9 -3
@@ -0,0 +1,142 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const require_paths = require('./paths-AIyBxIzm.js');
3
+ const require_paths$1 = require('./paths-DPovhojT.js');
4
+ const chalk = require_chunk.__toESM(require("chalk"));
5
+ const inquirer = require_chunk.__toESM(require("inquirer"));
6
+ const ora = require_chunk.__toESM(require("ora"));
7
+ const fs_extra = require_chunk.__toESM(require("fs-extra"));
8
+ const path = require_chunk.__toESM(require("path"));
9
+
10
+ //#region src/commands/mcp.ts
11
+ require_paths$1.init_paths();
12
+ const getMcpFile = () => path.default.join(require_paths.getHyperClawDir(), "mcp-servers.json");
13
+ async function loadServers() {
14
+ try {
15
+ return await fs_extra.default.readJson(getMcpFile());
16
+ } catch {
17
+ return [];
18
+ }
19
+ }
20
+ async function saveServers(servers) {
21
+ const mcpFile = getMcpFile();
22
+ await fs_extra.default.ensureDir(path.default.dirname(mcpFile));
23
+ await fs_extra.default.writeJson(mcpFile, servers, { spaces: 2 });
24
+ }
25
+ async function mcpList() {
26
+ const servers = await loadServers();
27
+ console.log(chalk.default.bold.cyan("\n 🔌 MCP SERVERS\n"));
28
+ if (servers.length === 0) {
29
+ console.log(chalk.default.gray(" No MCP servers registered.\n"));
30
+ console.log(chalk.default.gray(" Add one: hyperclaw mcp add\n"));
31
+ console.log(chalk.default.gray(" Or install via skill hub: hyperclaw hub --install mcp-filesystem\n"));
32
+ return;
33
+ }
34
+ for (const s of servers) {
35
+ const dot = s.enabled ? chalk.default.green("●") : chalk.default.gray("○");
36
+ console.log(` ${dot} ${chalk.default.white(s.name)} ${chalk.default.gray(`[${s.transport}]`)}`);
37
+ if (s.command) console.log(` ${chalk.default.gray("cmd:")} ${s.command}`);
38
+ if (s.url) console.log(` ${chalk.default.gray("url:")} ${chalk.default.cyan(s.url)}`);
39
+ if (s.tools?.length) console.log(` ${chalk.default.gray("tools:")} ${s.tools.slice(0, 5).join(", ")}${s.tools.length > 5 ? ` +${s.tools.length - 5} more` : ""}`);
40
+ if (s.lastProbeAt) console.log(` ${chalk.default.gray(`last probe: ${new Date(s.lastProbeAt).toLocaleString()}`)}`);
41
+ console.log();
42
+ }
43
+ }
44
+ async function mcpAdd() {
45
+ console.log(chalk.default.bold.cyan("\n ➕ ADD MCP SERVER\n"));
46
+ const { name } = await inquirer.default.prompt([{
47
+ type: "input",
48
+ name: "name",
49
+ message: "Server name:",
50
+ validate: (v) => !!v.trim() || "Required"
51
+ }]);
52
+ const { transport } = await inquirer.default.prompt([{
53
+ type: "list",
54
+ name: "transport",
55
+ message: "Transport:",
56
+ choices: [
57
+ "stdio",
58
+ "sse",
59
+ "http"
60
+ ]
61
+ }]);
62
+ let command;
63
+ let url;
64
+ if (transport === "stdio") {
65
+ const res = await inquirer.default.prompt([{
66
+ type: "input",
67
+ name: "command",
68
+ message: "Start command (e.g. node /path/to/server.js):",
69
+ validate: (v) => !!v.trim() || "Required"
70
+ }]);
71
+ command = res.command;
72
+ } else {
73
+ const res = await inquirer.default.prompt([{
74
+ type: "input",
75
+ name: "url",
76
+ message: `URL (e.g. http://localhost:3001):`,
77
+ validate: (v) => v.startsWith("http") || "Must start with http"
78
+ }]);
79
+ url = res.url;
80
+ }
81
+ const server = {
82
+ id: name.toLowerCase().replace(/\s+/g, "-"),
83
+ name,
84
+ transport,
85
+ command,
86
+ url,
87
+ enabled: true,
88
+ addedAt: (/* @__PURE__ */ new Date()).toISOString()
89
+ };
90
+ const servers = await loadServers();
91
+ servers.push(server);
92
+ await saveServers(servers);
93
+ console.log(chalk.default.green(`\n ✔ MCP server added: ${name}`));
94
+ console.log(chalk.default.gray(" Run: hyperclaw mcp probe to test the connection\n"));
95
+ }
96
+ async function mcpRemove(id) {
97
+ const servers = await loadServers();
98
+ const idx = servers.findIndex((s) => s.id === id);
99
+ if (idx === -1) {
100
+ console.log(chalk.default.red(`\n ✖ Server not found: ${id}\n`));
101
+ return;
102
+ }
103
+ servers.splice(idx, 1);
104
+ await saveServers(servers);
105
+ console.log(chalk.default.green(`\n ✔ MCP server removed: ${id}\n`));
106
+ }
107
+ async function mcpProbe(id) {
108
+ const servers = await loadServers();
109
+ const targets = id ? servers.filter((s) => s.id === id) : servers;
110
+ if (targets.length === 0) {
111
+ console.log(chalk.default.gray("\n No servers to probe. Add one: hyperclaw mcp add\n"));
112
+ return;
113
+ }
114
+ console.log(chalk.default.bold.cyan("\n 🔍 PROBING MCP SERVERS\n"));
115
+ for (const server of targets) {
116
+ const spinner = (0, ora.default)(` Probing ${server.name}...`).start();
117
+ await new Promise((r) => setTimeout(r, 800));
118
+ if (server.transport === "http" || server.transport === "sse") try {
119
+ const axios = (await import("axios")).default;
120
+ const res = await axios.get(`${server.url}/tools`, { timeout: 3e3 });
121
+ server.tools = res.data?.tools?.map((t) => t.name) || [];
122
+ server.lastProbeAt = (/* @__PURE__ */ new Date()).toISOString();
123
+ await saveServers(servers);
124
+ spinner.succeed(`${server.name} — ${server.tools?.length ?? 0} tools`);
125
+ if ((server.tools?.length ?? 0) > 0) console.log(chalk.default.gray(` ${server.tools?.join(", ") ?? ""}`));
126
+ } catch {
127
+ spinner.warn(`${server.name} — unreachable (${server.url})`);
128
+ }
129
+ else {
130
+ server.lastProbeAt = (/* @__PURE__ */ new Date()).toISOString();
131
+ await saveServers(servers);
132
+ spinner.succeed(`${server.name} — stdio (probe requires running server)`);
133
+ }
134
+ console.log();
135
+ }
136
+ }
137
+
138
+ //#endregion
139
+ exports.mcpAdd = mcpAdd;
140
+ exports.mcpList = mcpList;
141
+ exports.mcpProbe = mcpProbe;
142
+ exports.mcpRemove = mcpRemove;
@@ -0,0 +1,142 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const require_paths = require('./paths-AIyBxIzm.js');
3
+ const require_paths$1 = require('./paths-DPovhojT.js');
4
+ const chalk = require_chunk.__toESM(require("chalk"));
5
+ const inquirer = require_chunk.__toESM(require("inquirer"));
6
+ const ora = require_chunk.__toESM(require("ora"));
7
+ const fs_extra = require_chunk.__toESM(require("fs-extra"));
8
+ const path = require_chunk.__toESM(require("path"));
9
+
10
+ //#region src/commands/mcp.ts
11
+ require_paths$1.init_paths();
12
+ const getMcpFile = () => path.default.join(require_paths.getHyperClawDir(), "mcp-servers.json");
13
+ async function loadServers() {
14
+ try {
15
+ return await fs_extra.default.readJson(getMcpFile());
16
+ } catch {
17
+ return [];
18
+ }
19
+ }
20
+ async function saveServers(servers) {
21
+ const mcpFile = getMcpFile();
22
+ await fs_extra.default.ensureDir(path.default.dirname(mcpFile));
23
+ await fs_extra.default.writeJson(mcpFile, servers, { spaces: 2 });
24
+ }
25
+ async function mcpList() {
26
+ const servers = await loadServers();
27
+ console.log(chalk.default.bold.cyan("\n 🔌 MCP SERVERS\n"));
28
+ if (servers.length === 0) {
29
+ console.log(chalk.default.gray(" No MCP servers registered.\n"));
30
+ console.log(chalk.default.gray(" Add one: hyperclaw mcp add\n"));
31
+ console.log(chalk.default.gray(" Or install via skill hub: hyperclaw hub --install mcp-filesystem\n"));
32
+ return;
33
+ }
34
+ for (const s of servers) {
35
+ const dot = s.enabled ? chalk.default.green("●") : chalk.default.gray("○");
36
+ console.log(` ${dot} ${chalk.default.white(s.name)} ${chalk.default.gray(`[${s.transport}]`)}`);
37
+ if (s.command) console.log(` ${chalk.default.gray("cmd:")} ${s.command}`);
38
+ if (s.url) console.log(` ${chalk.default.gray("url:")} ${chalk.default.cyan(s.url)}`);
39
+ if (s.tools?.length) console.log(` ${chalk.default.gray("tools:")} ${s.tools.slice(0, 5).join(", ")}${s.tools.length > 5 ? ` +${s.tools.length - 5} more` : ""}`);
40
+ if (s.lastProbeAt) console.log(` ${chalk.default.gray(`last probe: ${new Date(s.lastProbeAt).toLocaleString()}`)}`);
41
+ console.log();
42
+ }
43
+ }
44
+ async function mcpAdd() {
45
+ console.log(chalk.default.bold.cyan("\n ➕ ADD MCP SERVER\n"));
46
+ const { name } = await inquirer.default.prompt([{
47
+ type: "input",
48
+ name: "name",
49
+ message: "Server name:",
50
+ validate: (v) => !!v.trim() || "Required"
51
+ }]);
52
+ const { transport } = await inquirer.default.prompt([{
53
+ type: "list",
54
+ name: "transport",
55
+ message: "Transport:",
56
+ choices: [
57
+ "stdio",
58
+ "sse",
59
+ "http"
60
+ ]
61
+ }]);
62
+ let command;
63
+ let url;
64
+ if (transport === "stdio") {
65
+ const res = await inquirer.default.prompt([{
66
+ type: "input",
67
+ name: "command",
68
+ message: "Start command (e.g. node /path/to/server.js):",
69
+ validate: (v) => !!v.trim() || "Required"
70
+ }]);
71
+ command = res.command;
72
+ } else {
73
+ const res = await inquirer.default.prompt([{
74
+ type: "input",
75
+ name: "url",
76
+ message: `URL (e.g. http://localhost:3001):`,
77
+ validate: (v) => v.startsWith("http") || "Must start with http"
78
+ }]);
79
+ url = res.url;
80
+ }
81
+ const server = {
82
+ id: name.toLowerCase().replace(/\s+/g, "-"),
83
+ name,
84
+ transport,
85
+ command,
86
+ url,
87
+ enabled: true,
88
+ addedAt: (/* @__PURE__ */ new Date()).toISOString()
89
+ };
90
+ const servers = await loadServers();
91
+ servers.push(server);
92
+ await saveServers(servers);
93
+ console.log(chalk.default.green(`\n ✔ MCP server added: ${name}`));
94
+ console.log(chalk.default.gray(" Run: hyperclaw mcp probe to test the connection\n"));
95
+ }
96
+ async function mcpRemove(id) {
97
+ const servers = await loadServers();
98
+ const idx = servers.findIndex((s) => s.id === id);
99
+ if (idx === -1) {
100
+ console.log(chalk.default.red(`\n ✖ Server not found: ${id}\n`));
101
+ return;
102
+ }
103
+ servers.splice(idx, 1);
104
+ await saveServers(servers);
105
+ console.log(chalk.default.green(`\n ✔ MCP server removed: ${id}\n`));
106
+ }
107
+ async function mcpProbe(id) {
108
+ const servers = await loadServers();
109
+ const targets = id ? servers.filter((s) => s.id === id) : servers;
110
+ if (targets.length === 0) {
111
+ console.log(chalk.default.gray("\n No servers to probe. Add one: hyperclaw mcp add\n"));
112
+ return;
113
+ }
114
+ console.log(chalk.default.bold.cyan("\n 🔍 PROBING MCP SERVERS\n"));
115
+ for (const server of targets) {
116
+ const spinner = (0, ora.default)(` Probing ${server.name}...`).start();
117
+ await new Promise((r) => setTimeout(r, 800));
118
+ if (server.transport === "http" || server.transport === "sse") try {
119
+ const axios = (await import("axios")).default;
120
+ const res = await axios.get(`${server.url}/tools`, { timeout: 3e3 });
121
+ server.tools = res.data?.tools?.map((t) => t.name) || [];
122
+ server.lastProbeAt = (/* @__PURE__ */ new Date()).toISOString();
123
+ await saveServers(servers);
124
+ spinner.succeed(`${server.name} — ${server.tools?.length ?? 0} tools`);
125
+ if ((server.tools?.length ?? 0) > 0) console.log(chalk.default.gray(` ${server.tools?.join(", ") ?? ""}`));
126
+ } catch {
127
+ spinner.warn(`${server.name} — unreachable (${server.url})`);
128
+ }
129
+ else {
130
+ server.lastProbeAt = (/* @__PURE__ */ new Date()).toISOString();
131
+ await saveServers(servers);
132
+ spinner.succeed(`${server.name} — stdio (probe requires running server)`);
133
+ }
134
+ console.log();
135
+ }
136
+ }
137
+
138
+ //#endregion
139
+ exports.mcpAdd = mcpAdd;
140
+ exports.mcpList = mcpList;
141
+ exports.mcpProbe = mcpProbe;
142
+ exports.mcpRemove = mcpRemove;
@@ -0,0 +1,93 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const require_paths = require('./paths-AIyBxIzm.js');
3
+ const require_paths$1 = require('./paths-DPovhojT.js');
4
+ const fs_extra = require_chunk.__toESM(require("fs-extra"));
5
+
6
+ //#region src/services/mcp-loader.ts
7
+ async function getMCPConfig() {
8
+ try {
9
+ const cfg = await fs_extra.default.readJson(require_paths.getConfigPath());
10
+ const servers = cfg.mcp?.servers ?? [];
11
+ return Array.isArray(servers) ? servers : [];
12
+ } catch {
13
+ return [];
14
+ }
15
+ }
16
+ /** Load tools from all configured MCP servers. */
17
+ async function loadMCPTools() {
18
+ const servers = await getMCPConfig();
19
+ if (servers.length === 0) return [];
20
+ let Client;
21
+ let StdioClientTransport;
22
+ let StreamableHTTPClientTransport;
23
+ try {
24
+ const sdk = await import("@modelcontextprotocol/sdk");
25
+ Client = sdk.Client;
26
+ StdioClientTransport = sdk.StdioClientTransport;
27
+ StreamableHTTPClientTransport = sdk.StreamableHTTPClientTransport;
28
+ } catch {
29
+ return [];
30
+ }
31
+ const tools = [];
32
+ for (const srv of servers) try {
33
+ const client = new Client({
34
+ name: "hyperclaw",
35
+ version: "5.2.8"
36
+ });
37
+ if (srv.url) {
38
+ const transport = new StreamableHTTPClientTransport(new URL(srv.url));
39
+ await client.connect(transport);
40
+ } else if (srv.command) {
41
+ const transport = new StdioClientTransport({
42
+ command: srv.command,
43
+ args: srv.args ?? []
44
+ });
45
+ await client.connect(transport);
46
+ } else continue;
47
+ const allTools = [];
48
+ let cursor;
49
+ do {
50
+ const res = await client.listTools?.({ cursor }) ?? {
51
+ tools: [],
52
+ nextCursor: void 0
53
+ };
54
+ allTools.push(...res.tools ?? []);
55
+ cursor = res.nextCursor;
56
+ } while (cursor);
57
+ for (const t of allTools) {
58
+ const toolName = t.name;
59
+ const mcpClient = client;
60
+ tools.push({
61
+ name: `mcp_${srv.name}_${toolName}`.replace(/[^a-z0-9_]/gi, "_"),
62
+ description: (t.description ?? toolName).slice(0, 500),
63
+ input_schema: t.inputSchema && typeof t.inputSchema === "object" && "type" in t.inputSchema && "properties" in t.inputSchema ? t.inputSchema : {
64
+ type: "object",
65
+ properties: {}
66
+ },
67
+ handler: async (input) => {
68
+ try {
69
+ const result = await mcpClient.callTool?.({
70
+ name: toolName,
71
+ arguments: input
72
+ });
73
+ const content = result?.content;
74
+ if (Array.isArray(content)) return content.map((c) => c?.text ?? JSON.stringify(c)).join("\n");
75
+ return typeof content === "string" ? content : JSON.stringify(result ?? {});
76
+ } catch (e) {
77
+ return `MCP error: ${e.message}`;
78
+ }
79
+ }
80
+ });
81
+ }
82
+ } catch (e) {
83
+ console.error(`[mcp] Failed to load ${srv.name}:`, e.message);
84
+ }
85
+ return tools;
86
+ }
87
+ var init_mcp_loader = require_chunk.__esm({ "src/services/mcp-loader.ts"() {
88
+ require_paths$1.init_paths();
89
+ } });
90
+
91
+ //#endregion
92
+ init_mcp_loader();
93
+ exports.loadMCPTools = loadMCPTools;
@@ -0,0 +1,93 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const require_paths = require('./paths-AIyBxIzm.js');
3
+ const require_paths$1 = require('./paths-DPovhojT.js');
4
+ const fs_extra = require_chunk.__toESM(require("fs-extra"));
5
+
6
+ //#region src/services/mcp-loader.ts
7
+ async function getMCPConfig() {
8
+ try {
9
+ const cfg = await fs_extra.default.readJson(require_paths.getConfigPath());
10
+ const servers = cfg.mcp?.servers ?? [];
11
+ return Array.isArray(servers) ? servers : [];
12
+ } catch {
13
+ return [];
14
+ }
15
+ }
16
+ /** Load tools from all configured MCP servers. */
17
+ async function loadMCPTools() {
18
+ const servers = await getMCPConfig();
19
+ if (servers.length === 0) return [];
20
+ let Client;
21
+ let StdioClientTransport;
22
+ let StreamableHTTPClientTransport;
23
+ try {
24
+ const sdk = await import("@modelcontextprotocol/sdk");
25
+ Client = sdk.Client;
26
+ StdioClientTransport = sdk.StdioClientTransport;
27
+ StreamableHTTPClientTransport = sdk.StreamableHTTPClientTransport;
28
+ } catch {
29
+ return [];
30
+ }
31
+ const tools = [];
32
+ for (const srv of servers) try {
33
+ const client = new Client({
34
+ name: "hyperclaw",
35
+ version: "5.2.9"
36
+ });
37
+ if (srv.url) {
38
+ const transport = new StreamableHTTPClientTransport(new URL(srv.url));
39
+ await client.connect(transport);
40
+ } else if (srv.command) {
41
+ const transport = new StdioClientTransport({
42
+ command: srv.command,
43
+ args: srv.args ?? []
44
+ });
45
+ await client.connect(transport);
46
+ } else continue;
47
+ const allTools = [];
48
+ let cursor;
49
+ do {
50
+ const res = await client.listTools?.({ cursor }) ?? {
51
+ tools: [],
52
+ nextCursor: void 0
53
+ };
54
+ allTools.push(...res.tools ?? []);
55
+ cursor = res.nextCursor;
56
+ } while (cursor);
57
+ for (const t of allTools) {
58
+ const toolName = t.name;
59
+ const mcpClient = client;
60
+ tools.push({
61
+ name: `mcp_${srv.name}_${toolName}`.replace(/[^a-z0-9_]/gi, "_"),
62
+ description: (t.description ?? toolName).slice(0, 500),
63
+ input_schema: t.inputSchema && typeof t.inputSchema === "object" && "type" in t.inputSchema && "properties" in t.inputSchema ? t.inputSchema : {
64
+ type: "object",
65
+ properties: {}
66
+ },
67
+ handler: async (input) => {
68
+ try {
69
+ const result = await mcpClient.callTool?.({
70
+ name: toolName,
71
+ arguments: input
72
+ });
73
+ const content = result?.content;
74
+ if (Array.isArray(content)) return content.map((c) => c?.text ?? JSON.stringify(c)).join("\n");
75
+ return typeof content === "string" ? content : JSON.stringify(result ?? {});
76
+ } catch (e) {
77
+ return `MCP error: ${e.message}`;
78
+ }
79
+ }
80
+ });
81
+ }
82
+ } catch (e) {
83
+ console.error(`[mcp] Failed to load ${srv.name}:`, e.message);
84
+ }
85
+ return tools;
86
+ }
87
+ var init_mcp_loader = require_chunk.__esm({ "src/services/mcp-loader.ts"() {
88
+ require_paths$1.init_paths();
89
+ } });
90
+
91
+ //#endregion
92
+ init_mcp_loader();
93
+ exports.loadMCPTools = loadMCPTools;