hyperclaw 4.0.2 → 5.0.1

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 (194) hide show
  1. package/README.md +246 -60
  2. package/dist/a2ui-protocol-CfBI44-Q.js +75 -0
  3. package/dist/agents-routing-ChHiZp36.js +327 -0
  4. package/dist/agents-routing-ChqZ6l2S.js +4 -0
  5. package/dist/api-keys-guide-BCcOl0Q7.js +149 -0
  6. package/dist/api-keys-guide-CGn5BSF7.js +149 -0
  7. package/dist/audit-BJohI_vC.js +441 -0
  8. package/dist/audit-BaIiyWFu.js +441 -0
  9. package/dist/bounty-tools-CY_i91DU.js +211 -0
  10. package/dist/bounty-tools-DWudyZie.js +211 -0
  11. package/dist/browser-tools-BsTeGMnX.js +5 -0
  12. package/dist/browser-tools-D8_rLe2p.js +179 -0
  13. package/dist/claw-tasks-CgTsiNE8.js +80 -0
  14. package/dist/claw-tasks-Cyzdbhz_.js +80 -0
  15. package/dist/connector-5N0-X_xs.js +194 -0
  16. package/dist/connector-B3v0qcXg.js +425 -0
  17. package/dist/connector-B8R3iBY1.js +280 -0
  18. package/dist/connector-BAM-08NN.js +189 -0
  19. package/dist/connector-BC8FIVu4.js +181 -0
  20. package/dist/connector-BDmwwaVc.js +213 -0
  21. package/dist/connector-BGjbBy69.js +225 -0
  22. package/dist/connector-BO2SRzfG.js +218 -0
  23. package/dist/connector-BfXky0L3.js +167 -0
  24. package/dist/connector-BiiSJpx3.js +192 -0
  25. package/dist/connector-BnDmIhIu.js +85 -0
  26. package/dist/connector-C1HSoUyk.js +189 -0
  27. package/dist/connector-CKQHZOXg.js +568 -0
  28. package/dist/connector-CRl-iidy.js +239 -0
  29. package/dist/connector-Ci9glMD-.js +340 -0
  30. package/dist/connector-CjtZIEDj.js +181 -0
  31. package/dist/connector-Ck6JtOsX.js +531 -0
  32. package/dist/connector-D8Kelee0.js +286 -0
  33. package/dist/connector-DAnRJ0oP.js +162 -0
  34. package/dist/connector-DXTp5PE8.js +508 -0
  35. package/dist/connector-Dih6dUPP.js +173 -0
  36. package/dist/connector-DqTH_tPX.js +182 -0
  37. package/dist/connector-DrnEiiyP.js +419 -0
  38. package/dist/connector-DtR5GGTX.js +167 -0
  39. package/dist/connector-Tky_qS_K.js +350 -0
  40. package/dist/connector-ZSc3oTTy.js +305 -0
  41. package/dist/connector-sW5yhU1m.js +498 -0
  42. package/dist/connector-u3ICd3Ic.js +552 -0
  43. package/dist/cost-tracker-Ca1UPZ33.js +103 -0
  44. package/dist/cost-tracker-DD9wtWsr.js +103 -0
  45. package/dist/credentials-store-C6ir0Dae.js +4 -0
  46. package/dist/credentials-store-CA8UtK0T.js +77 -0
  47. package/dist/credentials-store-Cm7DH-kh.js +4 -0
  48. package/dist/credentials-store-H13LqOwJ.js +77 -0
  49. package/dist/cron-tasks-Bli7Kzd2.js +82 -0
  50. package/dist/cron-tasks-_pqQCmxc.js +82 -0
  51. package/dist/daemon-7ViroziB.js +5 -0
  52. package/dist/daemon-BfyKmZhr.js +318 -0
  53. package/dist/daemon-Bg4GtCmc.js +318 -0
  54. package/dist/daemon-DhmwY8k4.js +5 -0
  55. package/dist/delivery-BmIYy9VQ.js +4 -0
  56. package/dist/delivery-DVHmv1IR.js +4 -0
  57. package/dist/delivery-DpMX0Yyc.js +95 -0
  58. package/dist/delivery-pWUPBp1F.js +95 -0
  59. package/dist/destructive-gate-D6vWOdEl.js +101 -0
  60. package/dist/destructive-gate-DZt71UZR.js +101 -0
  61. package/dist/developer-keys-CPWT7Q6S.js +8 -0
  62. package/dist/developer-keys-DrrcUqFa.js +127 -0
  63. package/dist/doctor-BvCe8BBk.js +230 -0
  64. package/dist/doctor-CxyPLYsJ.js +6 -0
  65. package/dist/engine-B0kLfRL0.js +256 -0
  66. package/dist/engine-BJUpRUOv.js +7 -0
  67. package/dist/engine-CEDSqXfw.js +256 -0
  68. package/dist/engine-Da4JMNpI.js +7 -0
  69. package/dist/env-resolve-17ekEU6p.js +10 -0
  70. package/dist/env-resolve-CiXbWYwe.js +10 -0
  71. package/dist/env-resolve-CmGWhWXJ.js +115 -0
  72. package/dist/env-resolve-Z2XF6leB.js +115 -0
  73. package/dist/extraction-tools-HOZstZ0y.js +91 -0
  74. package/dist/extraction-tools-m4lmAv7l.js +5 -0
  75. package/dist/form_data-Cz040rio.js +8657 -0
  76. package/dist/gmail-watch-setup-Du7DVV7S.js +40 -0
  77. package/dist/health-B-asI__D.js +6 -0
  78. package/dist/health-Ds2YlpTB.js +152 -0
  79. package/dist/heartbeat-engine-BYT5ayQH.js +83 -0
  80. package/dist/heartbeat-engine-Ut6pXBD6.js +83 -0
  81. package/dist/hub-9LaKnLjY.js +6 -0
  82. package/dist/hub-CfwUz9YW.js +515 -0
  83. package/dist/hub-D0XwdjM-.js +515 -0
  84. package/dist/hub-LiD5Iztb.js +6 -0
  85. package/dist/hyperclawbot-CBiDSKsa.js +505 -0
  86. package/dist/hyperclawbot-zvczQgKx.js +505 -0
  87. package/dist/inference-0mlFQqIm.js +922 -0
  88. package/dist/inference-BKVkBREb.js +6 -0
  89. package/dist/inference-DCXH4Q3x.js +922 -0
  90. package/dist/inference-SzqFe_nk.js +6 -0
  91. package/dist/knowledge-graph-DE5lSF02.js +131 -0
  92. package/dist/knowledge-graph-iBG76fvm.js +131 -0
  93. package/dist/loader-BkDi8MD9.js +400 -0
  94. package/dist/loader-CC45xGpC.js +4 -0
  95. package/dist/loader-CnEdOyjT.js +400 -0
  96. package/dist/loader-DI2qDRPC.js +4 -0
  97. package/dist/logger-Cp8wC7F8.js +83 -0
  98. package/dist/logger-ybOp7VOC.js +83 -0
  99. package/dist/manager-03ipO9R0.js +105 -0
  100. package/dist/manager-B2Gls5RG.js +218 -0
  101. package/dist/manager-BpDfbDjg.js +117 -0
  102. package/dist/manager-Bxl0sqlh.js +4 -0
  103. package/dist/manager-CWNSML5D.js +117 -0
  104. package/dist/manager-CrVDn6eN.js +6 -0
  105. package/dist/manager-FCgF1plu.js +218 -0
  106. package/dist/manager-SJe9gt-q.js +4 -0
  107. package/dist/manager-rgCsaWT1.js +40 -0
  108. package/dist/mcp-CfoSU4Uz.js +139 -0
  109. package/dist/mcp-loader-CvxRDtPC.js +94 -0
  110. package/dist/mcp-loader-DkRBsLpk.js +94 -0
  111. package/dist/memory-BlHL7JCO.js +4 -0
  112. package/dist/memory-DsS_eFvJ.js +270 -0
  113. package/dist/memory-auto-BkvtSFUw.js +5 -0
  114. package/dist/memory-auto-Bnz_-1wP.js +306 -0
  115. package/dist/memory-auto-CpQHZlEJ.js +306 -0
  116. package/dist/memory-auto-Z6LCf-iK.js +5 -0
  117. package/dist/memory-integration-cSYkZyEo.js +91 -0
  118. package/dist/memory-integration-g2vxwgoE.js +91 -0
  119. package/dist/moltbook-BtLDZTfM.js +81 -0
  120. package/dist/moltbook-Cl8cQfxJ.js +81 -0
  121. package/dist/node-Dw2Gi-cP.js +222 -0
  122. package/dist/nodes-registry-B8dmrlLv.js +52 -0
  123. package/dist/nodes-registry-C9dCFwjh.js +52 -0
  124. package/dist/oauth-flow-CeaaGAz0.js +150 -0
  125. package/dist/oauth-flow-DQPvMHRH.js +150 -0
  126. package/dist/oauth-provider-B4dzn56l.js +110 -0
  127. package/dist/oauth-provider-Uo4Nib_c.js +110 -0
  128. package/dist/observability-BV-Yx0V9.js +89 -0
  129. package/dist/observability-nZ3CBIxG.js +89 -0
  130. package/dist/onboard-0WoDxbv_.js +10 -0
  131. package/dist/onboard-BBBWcfhp.js +10 -0
  132. package/dist/onboard-BXNXCQp4.js +4070 -0
  133. package/dist/onboard-Bw28IRQ3.js +4070 -0
  134. package/dist/orchestrator-BovkM63z.js +6 -0
  135. package/dist/orchestrator-DSbpkP1X.js +189 -0
  136. package/dist/orchestrator-DmnEvMaL.js +189 -0
  137. package/dist/orchestrator-RI3bpqqc.js +6 -0
  138. package/dist/osint-B4_m3VHQ.js +277 -0
  139. package/dist/pairing-6iM27aD8.js +196 -0
  140. package/dist/pairing-dGoiGepK.js +4 -0
  141. package/dist/pc-access-CgCsYrpt.js +8 -0
  142. package/dist/pc-access-_iH2aorG.js +819 -0
  143. package/dist/pending-approval-BgNjjuI2.js +22 -0
  144. package/dist/pending-approval-CUXjysAo.js +22 -0
  145. package/dist/reminders-store-Drjed_-h.js +58 -0
  146. package/dist/renderer-BVQrd0_g.js +225 -0
  147. package/dist/rules-BE4GV6cV.js +103 -0
  148. package/dist/run-main.js +1639 -460
  149. package/dist/runner-CJFJUtPm.js +1271 -0
  150. package/dist/runner-DatMMYYE.js +1271 -0
  151. package/dist/sdk/index.js +2 -2
  152. package/dist/sdk/index.mjs +2 -2
  153. package/dist/security-BqNyT4ID.js +4 -0
  154. package/dist/security-tpgqPWWH.js +73 -0
  155. package/dist/server-Brl_HQUB.js +1255 -0
  156. package/dist/server-D4wVHiX9.js +4 -0
  157. package/dist/server-Dh3JlBFB.js +1255 -0
  158. package/dist/server-DhfipkwN.js +4 -0
  159. package/dist/session-store-BUiPz0Vv.js +5 -0
  160. package/dist/session-store-is4B6qmD.js +113 -0
  161. package/dist/sessions-tools-CbUTFe4i.js +5 -0
  162. package/dist/sessions-tools-CeqD7iil.js +95 -0
  163. package/dist/skill-loader-BaNLVmJy.js +7 -0
  164. package/dist/skill-loader-HgpF6Vqs.js +159 -0
  165. package/dist/skill-runtime-BXWd-Ktf.js +102 -0
  166. package/dist/skill-runtime-CJN24QPW.js +102 -0
  167. package/dist/skill-runtime-jgklm02e.js +5 -0
  168. package/dist/skill-runtime-w1ig_lcw.js +5 -0
  169. package/dist/src-Bhybpk1J.js +63 -0
  170. package/dist/src-BxPHKO5x.js +63 -0
  171. package/dist/src-DIc-L2IG.js +20 -0
  172. package/dist/src-DMJ4-uqk.js +458 -0
  173. package/dist/src-g_rNx5rh.js +458 -0
  174. package/dist/sub-agent-tools-CHQoHz9c.js +39 -0
  175. package/dist/sub-agent-tools-DHY-4WWM.js +39 -0
  176. package/dist/theme-DcxwcUgZ.js +180 -0
  177. package/dist/theme-cx0fkgWC.js +8 -0
  178. package/dist/tool-policy-CNT-mF2Z.js +189 -0
  179. package/dist/tool-policy-DZvF8xlQ.js +189 -0
  180. package/dist/tts-elevenlabs-BRosZv-f.js +61 -0
  181. package/dist/tts-elevenlabs-C06nUxMK.js +61 -0
  182. package/dist/update-check-C2Dz85wJ.js +81 -0
  183. package/dist/update-check-w4XuxVl7.js +81 -0
  184. package/dist/vision-BMmiIKy7.js +121 -0
  185. package/dist/vision-JOtOS1Br.js +121 -0
  186. package/dist/vision-tools-CB28ZCO_.js +5 -0
  187. package/dist/vision-tools-DVuYc17I.js +51 -0
  188. package/dist/vision-tools-U3YC4L-g.js +5 -0
  189. package/dist/vision-tools-vPPwQ-0N.js +51 -0
  190. package/dist/voice-transcription-B555DbWR.js +138 -0
  191. package/dist/voice-transcription-DBo5hXmu.js +138 -0
  192. package/dist/website-watch-tools-DFMrJU-R.js +139 -0
  193. package/dist/website-watch-tools-Du3W5sN7.js +5 -0
  194. package/package.json +1 -1
@@ -0,0 +1,91 @@
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
+ const path = require_chunk.__toESM(require("path"));
6
+
7
+ //#region src/services/memory-integration.ts
8
+ async function getConfig() {
9
+ try {
10
+ const cfg = await fs_extra.default.readJson(require_paths.getConfigPath());
11
+ return cfg.memoryIntegration ?? {};
12
+ } catch {
13
+ return {};
14
+ }
15
+ }
16
+ /** Sync MEMORY.md to vault (Obsidian / Raycast / Hazel). */
17
+ async function syncMemoryToVault(vaultDir) {
18
+ const target = path.default.join(vaultDir, "HyperClaw-MEMORY.md");
19
+ if (await fs_extra.default.pathExists(MEMORY_FILE)) {
20
+ await fs_extra.default.ensureDir(vaultDir);
21
+ await fs_extra.default.copy(MEMORY_FILE, target, { overwrite: true });
22
+ }
23
+ }
24
+ /** Write daily note with session summary and new facts. */
25
+ async function writeDailyNote(vaultDir, date, content) {
26
+ const filename = `${date}.md`;
27
+ const target = path.default.join(vaultDir, "HyperClaw", filename);
28
+ await fs_extra.default.ensureDir(path.default.dirname(target));
29
+ const lines = [
30
+ `# HyperClaw — ${date}`,
31
+ "",
32
+ `> Auto-generated daily note from HyperClaw interactions.`,
33
+ ""
34
+ ];
35
+ if (content.sessionId && (content.turnCount ?? 0) > 0) {
36
+ lines.push(`## Session ${content.sessionId}`);
37
+ lines.push(`- Turns: ${content.turnCount}`);
38
+ lines.push("");
39
+ }
40
+ if (content.newFacts?.length) {
41
+ lines.push("## New memories");
42
+ for (const f of content.newFacts) lines.push(`- ${f}`);
43
+ lines.push("");
44
+ }
45
+ const body = lines.join("\n");
46
+ if (await fs_extra.default.pathExists(target)) await fs_extra.default.appendFile(target, "\n---\n" + body);
47
+ else await fs_extra.default.writeFile(target, body);
48
+ }
49
+ /** Append new fact to daily note (for incremental updates). */
50
+ async function appendToDailyNote(vaultDir, date, fact) {
51
+ const filename = `${date}.md`;
52
+ const target = path.default.join(vaultDir, "HyperClaw", filename);
53
+ await fs_extra.default.ensureDir(path.default.dirname(target));
54
+ const line = `- ${(/* @__PURE__ */ new Date()).toISOString().slice(11, 19)} ${fact}\n`;
55
+ if (!await fs_extra.default.pathExists(target)) await fs_extra.default.writeFile(target, `# HyperClaw — ${date}\n\n`);
56
+ await fs_extra.default.appendFile(target, line);
57
+ }
58
+ /** Called after MEMORY.md append — sync to vault + optionally add to daily note. */
59
+ async function onMemoryAppended(facts) {
60
+ const cfg = await getConfig();
61
+ const vaultDir = cfg.vaultDir;
62
+ if (!vaultDir) return;
63
+ if (cfg.syncOnAppend !== false) await syncMemoryToVault(vaultDir);
64
+ if (cfg.dailyNotes && facts.length > 0) {
65
+ const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
66
+ for (const f of facts) await appendToDailyNote(vaultDir, today, f.fact);
67
+ }
68
+ }
69
+ /** Called on session end — sync + write session summary to daily note. */
70
+ async function onSessionEnd(payload) {
71
+ const cfg = await getConfig();
72
+ const vaultDir = cfg.vaultDir;
73
+ if (!vaultDir || !cfg.dailyNotes) return;
74
+ await syncMemoryToVault(vaultDir);
75
+ const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
76
+ await writeDailyNote(vaultDir, today, {
77
+ sessionId: payload.sessionId,
78
+ turnCount: payload.turnCount,
79
+ newFacts: payload.newFacts
80
+ });
81
+ }
82
+ var MEMORY_FILE;
83
+ var init_memory_integration = require_chunk.__esm({ "src/services/memory-integration.ts"() {
84
+ require_paths$1.init_paths();
85
+ MEMORY_FILE = path.default.join(require_paths.getHyperClawDir(), "MEMORY.md");
86
+ } });
87
+
88
+ //#endregion
89
+ init_memory_integration();
90
+ exports.onMemoryAppended = onMemoryAppended;
91
+ exports.onSessionEnd = onSessionEnd;
@@ -0,0 +1,91 @@
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
+ const path = require_chunk.__toESM(require("path"));
6
+
7
+ //#region src/services/memory-integration.ts
8
+ async function getConfig() {
9
+ try {
10
+ const cfg = await fs_extra.default.readJson(require_paths.getConfigPath());
11
+ return cfg.memoryIntegration ?? {};
12
+ } catch {
13
+ return {};
14
+ }
15
+ }
16
+ /** Sync MEMORY.md to vault (Obsidian / Raycast / Hazel). */
17
+ async function syncMemoryToVault(vaultDir) {
18
+ const target = path.default.join(vaultDir, "HyperClaw-MEMORY.md");
19
+ if (await fs_extra.default.pathExists(MEMORY_FILE)) {
20
+ await fs_extra.default.ensureDir(vaultDir);
21
+ await fs_extra.default.copy(MEMORY_FILE, target, { overwrite: true });
22
+ }
23
+ }
24
+ /** Write daily note with session summary and new facts. */
25
+ async function writeDailyNote(vaultDir, date, content) {
26
+ const filename = `${date}.md`;
27
+ const target = path.default.join(vaultDir, "HyperClaw", filename);
28
+ await fs_extra.default.ensureDir(path.default.dirname(target));
29
+ const lines = [
30
+ `# HyperClaw — ${date}`,
31
+ "",
32
+ `> Auto-generated daily note from HyperClaw interactions.`,
33
+ ""
34
+ ];
35
+ if (content.sessionId && (content.turnCount ?? 0) > 0) {
36
+ lines.push(`## Session ${content.sessionId}`);
37
+ lines.push(`- Turns: ${content.turnCount}`);
38
+ lines.push("");
39
+ }
40
+ if (content.newFacts?.length) {
41
+ lines.push("## New memories");
42
+ for (const f of content.newFacts) lines.push(`- ${f}`);
43
+ lines.push("");
44
+ }
45
+ const body = lines.join("\n");
46
+ if (await fs_extra.default.pathExists(target)) await fs_extra.default.appendFile(target, "\n---\n" + body);
47
+ else await fs_extra.default.writeFile(target, body);
48
+ }
49
+ /** Append new fact to daily note (for incremental updates). */
50
+ async function appendToDailyNote(vaultDir, date, fact) {
51
+ const filename = `${date}.md`;
52
+ const target = path.default.join(vaultDir, "HyperClaw", filename);
53
+ await fs_extra.default.ensureDir(path.default.dirname(target));
54
+ const line = `- ${(/* @__PURE__ */ new Date()).toISOString().slice(11, 19)} ${fact}\n`;
55
+ if (!await fs_extra.default.pathExists(target)) await fs_extra.default.writeFile(target, `# HyperClaw — ${date}\n\n`);
56
+ await fs_extra.default.appendFile(target, line);
57
+ }
58
+ /** Called after MEMORY.md append — sync to vault + optionally add to daily note. */
59
+ async function onMemoryAppended(facts) {
60
+ const cfg = await getConfig();
61
+ const vaultDir = cfg.vaultDir;
62
+ if (!vaultDir) return;
63
+ if (cfg.syncOnAppend !== false) await syncMemoryToVault(vaultDir);
64
+ if (cfg.dailyNotes && facts.length > 0) {
65
+ const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
66
+ for (const f of facts) await appendToDailyNote(vaultDir, today, f.fact);
67
+ }
68
+ }
69
+ /** Called on session end — sync + write session summary to daily note. */
70
+ async function onSessionEnd(payload) {
71
+ const cfg = await getConfig();
72
+ const vaultDir = cfg.vaultDir;
73
+ if (!vaultDir || !cfg.dailyNotes) return;
74
+ await syncMemoryToVault(vaultDir);
75
+ const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
76
+ await writeDailyNote(vaultDir, today, {
77
+ sessionId: payload.sessionId,
78
+ turnCount: payload.turnCount,
79
+ newFacts: payload.newFacts
80
+ });
81
+ }
82
+ var MEMORY_FILE;
83
+ var init_memory_integration = require_chunk.__esm({ "src/services/memory-integration.ts"() {
84
+ require_paths$1.init_paths();
85
+ MEMORY_FILE = path.default.join(require_paths.getHyperClawDir(), "MEMORY.md");
86
+ } });
87
+
88
+ //#endregion
89
+ init_memory_integration();
90
+ exports.onMemoryAppended = onMemoryAppended;
91
+ exports.onSessionEnd = onSessionEnd;
@@ -0,0 +1,81 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const https = require_chunk.__toESM(require("https"));
3
+
4
+ //#region src/services/moltbook.ts
5
+ /** List feed (public or for connected agents). */
6
+ async function getFeed(limit = 20) {
7
+ if (!MOLTBOOK_API) return [];
8
+ try {
9
+ const body = await fetchJson(`${MOLTBOOK_API}/api/feed?limit=${limit}`);
10
+ return Array.isArray(body.posts) ? body.posts : [];
11
+ } catch {
12
+ return [];
13
+ }
14
+ }
15
+ /** Publish a post as the configured agent. */
16
+ async function publishPost(content, opts) {
17
+ if (!MOLTBOOK_API) return null;
18
+ try {
19
+ const body = await postJson(`${MOLTBOOK_API}/api/posts`, { content }, opts?.agentToken);
20
+ return body.post || null;
21
+ } catch {
22
+ return null;
23
+ }
24
+ }
25
+ function fetchJson(url) {
26
+ return new Promise((resolve, reject) => {
27
+ const u = new URL(url);
28
+ const req = https.default.get(url, (res) => {
29
+ let data = "";
30
+ res.on("data", (c) => data += c);
31
+ res.on("end", () => {
32
+ try {
33
+ resolve(JSON.parse(data));
34
+ } catch {
35
+ reject(new Error("Invalid JSON"));
36
+ }
37
+ });
38
+ });
39
+ req.on("error", reject);
40
+ });
41
+ }
42
+ function postJson(url, payload, token) {
43
+ return new Promise((resolve, reject) => {
44
+ const u = new URL(url);
45
+ const body = JSON.stringify(payload);
46
+ const opts = {
47
+ hostname: u.hostname,
48
+ port: 443,
49
+ path: u.pathname,
50
+ method: "POST",
51
+ headers: {
52
+ "Content-Type": "application/json",
53
+ "Content-Length": Buffer.byteLength(body),
54
+ ...token ? { Authorization: `Bearer ${token}` } : {}
55
+ }
56
+ };
57
+ const req = https.default.request(opts, (res) => {
58
+ let data = "";
59
+ res.on("data", (c) => data += c);
60
+ res.on("end", () => {
61
+ try {
62
+ resolve(JSON.parse(data || "{}"));
63
+ } catch {
64
+ resolve({});
65
+ }
66
+ });
67
+ });
68
+ req.on("error", reject);
69
+ req.write(body);
70
+ req.end();
71
+ });
72
+ }
73
+ var MOLTBOOK_API;
74
+ var init_moltbook = require_chunk.__esm({ "src/services/moltbook.ts"() {
75
+ MOLTBOOK_API = process.env.MOLTBOOK_API_URL || "";
76
+ } });
77
+
78
+ //#endregion
79
+ init_moltbook();
80
+ exports.getFeed = getFeed;
81
+ exports.publishPost = publishPost;
@@ -0,0 +1,81 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const https = require_chunk.__toESM(require("https"));
3
+
4
+ //#region src/services/moltbook.ts
5
+ /** List feed (public or for connected agents). */
6
+ async function getFeed(limit = 20) {
7
+ if (!MOLTBOOK_API) return [];
8
+ try {
9
+ const body = await fetchJson(`${MOLTBOOK_API}/api/feed?limit=${limit}`);
10
+ return Array.isArray(body.posts) ? body.posts : [];
11
+ } catch {
12
+ return [];
13
+ }
14
+ }
15
+ /** Publish a post as the configured agent. */
16
+ async function publishPost(content, opts) {
17
+ if (!MOLTBOOK_API) return null;
18
+ try {
19
+ const body = await postJson(`${MOLTBOOK_API}/api/posts`, { content }, opts?.agentToken);
20
+ return body.post || null;
21
+ } catch {
22
+ return null;
23
+ }
24
+ }
25
+ function fetchJson(url) {
26
+ return new Promise((resolve, reject) => {
27
+ const u = new URL(url);
28
+ const req = https.default.get(url, (res) => {
29
+ let data = "";
30
+ res.on("data", (c) => data += c);
31
+ res.on("end", () => {
32
+ try {
33
+ resolve(JSON.parse(data));
34
+ } catch {
35
+ reject(new Error("Invalid JSON"));
36
+ }
37
+ });
38
+ });
39
+ req.on("error", reject);
40
+ });
41
+ }
42
+ function postJson(url, payload, token) {
43
+ return new Promise((resolve, reject) => {
44
+ const u = new URL(url);
45
+ const body = JSON.stringify(payload);
46
+ const opts = {
47
+ hostname: u.hostname,
48
+ port: 443,
49
+ path: u.pathname,
50
+ method: "POST",
51
+ headers: {
52
+ "Content-Type": "application/json",
53
+ "Content-Length": Buffer.byteLength(body),
54
+ ...token ? { Authorization: `Bearer ${token}` } : {}
55
+ }
56
+ };
57
+ const req = https.default.request(opts, (res) => {
58
+ let data = "";
59
+ res.on("data", (c) => data += c);
60
+ res.on("end", () => {
61
+ try {
62
+ resolve(JSON.parse(data || "{}"));
63
+ } catch {
64
+ resolve({});
65
+ }
66
+ });
67
+ });
68
+ req.on("error", reject);
69
+ req.write(body);
70
+ req.end();
71
+ });
72
+ }
73
+ var MOLTBOOK_API;
74
+ var init_moltbook = require_chunk.__esm({ "src/services/moltbook.ts"() {
75
+ MOLTBOOK_API = process.env.MOLTBOOK_API_URL || "";
76
+ } });
77
+
78
+ //#endregion
79
+ init_moltbook();
80
+ exports.getFeed = getFeed;
81
+ exports.publishPost = publishPost;
@@ -0,0 +1,222 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const chalk = require_chunk.__toESM(require("chalk"));
3
+ const inquirer = require_chunk.__toESM(require("inquirer"));
4
+ const ora = require_chunk.__toESM(require("ora"));
5
+ const fs_extra = require_chunk.__toESM(require("fs-extra"));
6
+ const path = require_chunk.__toESM(require("path"));
7
+ const os = require_chunk.__toESM(require("os"));
8
+
9
+ //#region src/commands/node.ts
10
+ const NODES_FILE = path.default.join(os.default.homedir(), ".hyperclaw", "nodes.json");
11
+ async function loadNodes() {
12
+ try {
13
+ return await fs_extra.default.readJson(NODES_FILE);
14
+ } catch {
15
+ return [];
16
+ }
17
+ }
18
+ async function saveNodes(nodes) {
19
+ await fs_extra.default.ensureDir(path.default.dirname(NODES_FILE));
20
+ await fs_extra.default.writeJson(NODES_FILE, nodes, { spaces: 2 });
21
+ }
22
+ const TYPE_EMOJI = {
23
+ local: "💻",
24
+ remote: "🖥️",
25
+ android: "📱",
26
+ raspberrypi: "🍓",
27
+ docker: "🐳",
28
+ vm: "☁️"
29
+ };
30
+ const STATUS_COLOR = {
31
+ online: chalk.default.green,
32
+ offline: chalk.default.red,
33
+ unknown: chalk.default.gray,
34
+ degraded: chalk.default.yellow
35
+ };
36
+ async function nodeList() {
37
+ const nodes = await loadNodes();
38
+ console.log(chalk.default.bold.cyan("\n 🖧 HYPERCLAW NODES\n"));
39
+ console.log(` ${chalk.default.green("●")} ${chalk.default.white("Local (this machine)".padEnd(22))} ${chalk.default.cyan("[local]")} ${chalk.default.green("online")}`);
40
+ console.log(` ${chalk.default.gray(`Node.js ${process.version} ${os.default.platform()} ${os.default.arch()} port 18789`)}`);
41
+ console.log();
42
+ if (nodes.length === 0) {
43
+ console.log(chalk.default.gray(" No additional nodes registered."));
44
+ console.log(chalk.default.gray(" Add a remote node: hyperclaw node add\n"));
45
+ return;
46
+ }
47
+ for (const node of nodes) {
48
+ const dot = STATUS_COLOR[node.status]("●");
49
+ const emoji = TYPE_EMOJI[node.type];
50
+ const status = STATUS_COLOR[node.status](node.status);
51
+ console.log(` ${dot} ${chalk.default.white(node.name.padEnd(22))} ${chalk.default.cyan(`[${node.type}]`)} ${status}`);
52
+ if (node.host) console.log(` ${chalk.default.gray(`${node.host}:${node.port || 18789}`)}`);
53
+ if (node.androidDeviceId) console.log(` ${chalk.default.gray(`adb: ${node.androidDeviceId}`)}`);
54
+ if (node.capabilities.length > 0) console.log(` ${chalk.default.gray("caps:")} ${node.capabilities.join(", ")}`);
55
+ if (node.lastSeenAt) {
56
+ const ago = Math.round((Date.now() - new Date(node.lastSeenAt).getTime()) / 1e3 / 60);
57
+ console.log(` ${chalk.default.gray(`last seen: ${ago}m ago`)}`);
58
+ }
59
+ console.log();
60
+ }
61
+ }
62
+ async function nodeAdd() {
63
+ console.log(chalk.default.bold.cyan("\n ➕ ADD NODE\n"));
64
+ const { type } = await inquirer.default.prompt([{
65
+ type: "list",
66
+ name: "type",
67
+ message: "Node type:",
68
+ choices: [
69
+ {
70
+ name: "🖥️ Remote server (SSH)",
71
+ value: "remote"
72
+ },
73
+ {
74
+ name: "📱 Android device (ADB)",
75
+ value: "android"
76
+ },
77
+ {
78
+ name: "🍓 Raspberry Pi",
79
+ value: "raspberrypi"
80
+ },
81
+ {
82
+ name: "🐳 Docker container",
83
+ value: "docker"
84
+ },
85
+ {
86
+ name: "☁️ VM / cloud instance",
87
+ value: "vm"
88
+ }
89
+ ]
90
+ }]);
91
+ const { name } = await inquirer.default.prompt([{
92
+ type: "input",
93
+ name: "name",
94
+ message: "Node name:",
95
+ validate: (v) => !!v.trim() || "Required"
96
+ }]);
97
+ let extras = {};
98
+ if (type === "android") {
99
+ const { deviceId } = await inquirer.default.prompt([{
100
+ type: "input",
101
+ name: "deviceId",
102
+ message: "ADB device ID (run: adb devices):",
103
+ validate: (v) => !!v.trim() || "Required"
104
+ }]);
105
+ extras.androidDeviceId = deviceId;
106
+ extras.capabilities = ["channel:host", "always-on"];
107
+ } else {
108
+ const { host, port } = await inquirer.default.prompt([{
109
+ type: "input",
110
+ name: "host",
111
+ message: "Hostname or IP:",
112
+ validate: (v) => !!v.trim() || "Required"
113
+ }, {
114
+ type: "number",
115
+ name: "port",
116
+ message: "Gateway port:",
117
+ default: 18789
118
+ }]);
119
+ const { caps } = await inquirer.default.prompt([{
120
+ type: "checkbox",
121
+ name: "caps",
122
+ message: "Capabilities:",
123
+ choices: [
124
+ {
125
+ name: "Run agent inference",
126
+ value: "agent:run",
127
+ checked: true
128
+ },
129
+ {
130
+ name: "Host channel connections",
131
+ value: "channel:host"
132
+ },
133
+ {
134
+ name: "Execute code",
135
+ value: "code:execute"
136
+ },
137
+ {
138
+ name: "GPU acceleration",
139
+ value: "gpu"
140
+ },
141
+ {
142
+ name: "Always-on (24/7)",
143
+ value: "always-on"
144
+ }
145
+ ]
146
+ }]);
147
+ extras = {
148
+ host,
149
+ port,
150
+ capabilities: caps
151
+ };
152
+ }
153
+ const node = {
154
+ id: name.toLowerCase().replace(/\s+/g, "-"),
155
+ name,
156
+ type,
157
+ status: "unknown",
158
+ addedAt: (/* @__PURE__ */ new Date()).toISOString(),
159
+ capabilities: extras.capabilities || [],
160
+ ...extras
161
+ };
162
+ const nodes = await loadNodes();
163
+ nodes.push(node);
164
+ await saveNodes(nodes);
165
+ console.log(chalk.default.green(`\n ✔ Node added: ${name}`));
166
+ console.log(chalk.default.gray(" Run: hyperclaw node probe to test the connection\n"));
167
+ }
168
+ async function nodeProbe(id) {
169
+ const nodes = await loadNodes();
170
+ const targets = id ? nodes.filter((n) => n.id === id) : nodes;
171
+ console.log(chalk.default.bold.cyan("\n 🔍 PROBING NODES\n"));
172
+ console.log(` ${chalk.default.cyan("○")} Local...`);
173
+ await new Promise((r) => setTimeout(r, 300));
174
+ console.log(` ${chalk.default.green("✔")} Local — online (${os.default.platform()} ${os.default.arch()})\n`);
175
+ for (const node of targets) {
176
+ const spinner = (0, ora.default)(` Probing ${node.name} (${node.host || node.androidDeviceId || node.type})...`).start();
177
+ await new Promise((r) => setTimeout(r, 1e3));
178
+ try {
179
+ if (node.host) {
180
+ const axios = (await import("axios")).default;
181
+ const res = await axios.get(`http://${node.host}:${node.port || 18789}/api/status`, { timeout: 3e3 });
182
+ node.status = "online";
183
+ node.version = res.data?.version;
184
+ node.lastSeenAt = (/* @__PURE__ */ new Date()).toISOString();
185
+ spinner.succeed(`${node.name} — online${node.version ? ` (v${node.version})` : ""}`);
186
+ } else if (node.type === "android") {
187
+ const { exec } = await import("child_process");
188
+ const { promisify } = await import("util");
189
+ const execAsync = promisify(exec);
190
+ await execAsync(`adb -s ${node.androidDeviceId} shell echo ok`);
191
+ node.status = "online";
192
+ node.lastSeenAt = (/* @__PURE__ */ new Date()).toISOString();
193
+ spinner.succeed(`${node.name} — online (ADB connected)`);
194
+ } else {
195
+ node.status = "unknown";
196
+ spinner.warn(`${node.name} — probe not supported for ${node.type}`);
197
+ }
198
+ } catch {
199
+ node.status = "offline";
200
+ spinner.fail(`${node.name} — offline / unreachable`);
201
+ }
202
+ console.log();
203
+ }
204
+ await saveNodes(nodes);
205
+ }
206
+ async function nodeRemove(id) {
207
+ const nodes = await loadNodes();
208
+ const idx = nodes.findIndex((n) => n.id === id);
209
+ if (idx === -1) {
210
+ console.log(chalk.default.red(`\n ✖ Node not found: ${id}\n`));
211
+ return;
212
+ }
213
+ nodes.splice(idx, 1);
214
+ await saveNodes(nodes);
215
+ console.log(chalk.default.green(`\n ✔ Node removed: ${id}\n`));
216
+ }
217
+
218
+ //#endregion
219
+ exports.nodeAdd = nodeAdd;
220
+ exports.nodeList = nodeList;
221
+ exports.nodeProbe = nodeProbe;
222
+ exports.nodeRemove = nodeRemove;
@@ -0,0 +1,52 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const events = require_chunk.__toESM(require("events"));
3
+
4
+ //#region src/services/nodes-registry.ts
5
+ var NodeRegistryImpl, NodeRegistry;
6
+ var init_nodes_registry = require_chunk.__esm({ "src/services/nodes-registry.ts"() {
7
+ NodeRegistryImpl = class extends events.EventEmitter {
8
+ nodes = /* @__PURE__ */ new Map();
9
+ pendingCommands = /* @__PURE__ */ new Map();
10
+ register(node) {
11
+ this.nodes.set(node.nodeId, node);
12
+ this.emit("node:registered", node);
13
+ }
14
+ unregister(nodeId) {
15
+ this.nodes.delete(nodeId);
16
+ this.emit("node:unregistered", nodeId);
17
+ }
18
+ getNodes() {
19
+ return Array.from(this.nodes.values());
20
+ }
21
+ getNode(nodeId) {
22
+ return this.nodes.get(nodeId);
23
+ }
24
+ /** Send a command to a node. Returns result or error. */
25
+ async sendCommand(nodeId, cmd) {
26
+ const node = this.nodes.get(nodeId);
27
+ if (!node) return {
28
+ ok: false,
29
+ error: `Node ${nodeId} not connected`
30
+ };
31
+ return node.send(cmd);
32
+ }
33
+ /** Handle response from a node (called when node replies to a command). */
34
+ handleCommandResponse(cmdId, result) {
35
+ const pending = this.pendingCommands.get(cmdId);
36
+ if (pending) {
37
+ clearTimeout(pending.timeout);
38
+ this.pendingCommands.delete(cmdId);
39
+ pending.resolve(result);
40
+ }
41
+ }
42
+ updateLastSeen(nodeId) {
43
+ const node = this.nodes.get(nodeId);
44
+ if (node) node.lastSeenAt = (/* @__PURE__ */ new Date()).toISOString();
45
+ }
46
+ };
47
+ NodeRegistry = new NodeRegistryImpl();
48
+ } });
49
+
50
+ //#endregion
51
+ init_nodes_registry();
52
+ exports.NodeRegistry = NodeRegistry;
@@ -0,0 +1,52 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const events = require_chunk.__toESM(require("events"));
3
+
4
+ //#region src/services/nodes-registry.ts
5
+ var NodeRegistryImpl, NodeRegistry;
6
+ var init_nodes_registry = require_chunk.__esm({ "src/services/nodes-registry.ts"() {
7
+ NodeRegistryImpl = class extends events.EventEmitter {
8
+ nodes = /* @__PURE__ */ new Map();
9
+ pendingCommands = /* @__PURE__ */ new Map();
10
+ register(node) {
11
+ this.nodes.set(node.nodeId, node);
12
+ this.emit("node:registered", node);
13
+ }
14
+ unregister(nodeId) {
15
+ this.nodes.delete(nodeId);
16
+ this.emit("node:unregistered", nodeId);
17
+ }
18
+ getNodes() {
19
+ return Array.from(this.nodes.values());
20
+ }
21
+ getNode(nodeId) {
22
+ return this.nodes.get(nodeId);
23
+ }
24
+ /** Send a command to a node. Returns result or error. */
25
+ async sendCommand(nodeId, cmd) {
26
+ const node = this.nodes.get(nodeId);
27
+ if (!node) return {
28
+ ok: false,
29
+ error: `Node ${nodeId} not connected`
30
+ };
31
+ return node.send(cmd);
32
+ }
33
+ /** Handle response from a node (called when node replies to a command). */
34
+ handleCommandResponse(cmdId, result) {
35
+ const pending = this.pendingCommands.get(cmdId);
36
+ if (pending) {
37
+ clearTimeout(pending.timeout);
38
+ this.pendingCommands.delete(cmdId);
39
+ pending.resolve(result);
40
+ }
41
+ }
42
+ updateLastSeen(nodeId) {
43
+ const node = this.nodes.get(nodeId);
44
+ if (node) node.lastSeenAt = (/* @__PURE__ */ new Date()).toISOString();
45
+ }
46
+ };
47
+ NodeRegistry = new NodeRegistryImpl();
48
+ } });
49
+
50
+ //#endregion
51
+ init_nodes_registry();
52
+ exports.NodeRegistry = NodeRegistry;