hyperclaw 5.0.0 → 5.0.2

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 (199) hide show
  1. package/LICENSE +2 -1
  2. package/README.md +449 -99
  3. package/dist/a2ui-protocol-Gzm29Gaw.js +75 -0
  4. package/dist/agents-routing-Biy5ew4a.js +4 -0
  5. package/dist/agents-routing-CL3HQNoM.js +327 -0
  6. package/dist/api-keys-guide-CGn5BSF7.js +149 -0
  7. package/dist/api-keys-guide-ChbThbPj.js +149 -0
  8. package/dist/audit-BJohI_vC.js +441 -0
  9. package/dist/audit-NPIMmOSq.js +441 -0
  10. package/dist/bounty-tools-BUqUKjt0.js +211 -0
  11. package/dist/bounty-tools-CY_i91DU.js +211 -0
  12. package/dist/browser-tools-CxJY6pAn.js +5 -0
  13. package/dist/browser-tools-JZ9ji6AW.js +179 -0
  14. package/dist/chat-qVuqhlPu.js +258 -0
  15. package/dist/claw-tasks-B-8RRMdq.js +80 -0
  16. package/dist/claw-tasks-Cyzdbhz_.js +80 -0
  17. package/dist/connector-1x1rCBHz.js +162 -0
  18. package/dist/connector-B4jeCULG.js +305 -0
  19. package/dist/connector-B7qngfkT.js +286 -0
  20. package/dist/connector-B8BK0GBo.js +531 -0
  21. package/dist/connector-BE9eJs8-.js +182 -0
  22. package/dist/connector-BEe-DTGQ.js +189 -0
  23. package/dist/connector-BU7p5ZgB.js +167 -0
  24. package/dist/connector-BUzzq7Ij.js +568 -0
  25. package/dist/connector-BpDqLgnW.js +419 -0
  26. package/dist/connector-BpW88ut2.js +189 -0
  27. package/dist/connector-Bxv-gy8U.js +167 -0
  28. package/dist/connector-Bz14zcJv.js +213 -0
  29. package/dist/connector-C1zP5-5q.js +85 -0
  30. package/dist/connector-CAcpcovF.js +498 -0
  31. package/dist/connector-CJgVjS58.js +181 -0
  32. package/dist/connector-Cf53D6qV.js +425 -0
  33. package/dist/connector-CyHmlbNz.js +508 -0
  34. package/dist/connector-D22mJGVu.js +340 -0
  35. package/dist/connector-D6RtMmlL.js +225 -0
  36. package/dist/connector-D9EnT8A4.js +280 -0
  37. package/dist/connector-DNDwIh37.js +239 -0
  38. package/dist/connector-Di27MeO4.js +350 -0
  39. package/dist/connector-Do0BPiHt.js +194 -0
  40. package/dist/connector-DvLwOfJy.js +192 -0
  41. package/dist/connector-DvU83NSq.js +181 -0
  42. package/dist/connector-DxskpDc_.js +173 -0
  43. package/dist/connector-byy3eISx.js +552 -0
  44. package/dist/connector-vV89hsyd.js +218 -0
  45. package/dist/cost-tracker-Ca1UPZ33.js +103 -0
  46. package/dist/cost-tracker-fnaj_6M9.js +103 -0
  47. package/dist/credentials-store-BxijEirw.js +77 -0
  48. package/dist/credentials-store-CA8UtK0T.js +77 -0
  49. package/dist/credentials-store-CPkVO6-z.js +4 -0
  50. package/dist/credentials-store-Cm7DH-kh.js +4 -0
  51. package/dist/cron-tasks-L0mz1yyU.js +82 -0
  52. package/dist/cron-tasks-_pqQCmxc.js +82 -0
  53. package/dist/daemon-7ViroziB.js +5 -0
  54. package/dist/daemon-BfyKmZhr.js +318 -0
  55. package/dist/daemon-CNyunwkR.js +5 -0
  56. package/dist/daemon-CindY8OK.js +318 -0
  57. package/dist/delivery-DVHmv1IR.js +4 -0
  58. package/dist/delivery-DgiZcJBp.js +4 -0
  59. package/dist/delivery-DpMX0Yyc.js +95 -0
  60. package/dist/delivery-otAU4alM.js +95 -0
  61. package/dist/destructive-gate-CA0DtA5K.js +101 -0
  62. package/dist/destructive-gate-DZt71UZR.js +101 -0
  63. package/dist/developer-keys-Cnd1kswV.js +127 -0
  64. package/dist/developer-keys-DENo3ZA6.js +8 -0
  65. package/dist/doctor-Dgjoc3DG.js +230 -0
  66. package/dist/doctor-RwsOhtAl.js +6 -0
  67. package/dist/engine-B0kLfRL0.js +256 -0
  68. package/dist/engine-BJUpRUOv.js +7 -0
  69. package/dist/engine-D_VeoZHw.js +305 -0
  70. package/dist/engine-JjRnhlsE.js +7 -0
  71. package/dist/env-resolve-17ekEU6p.js +10 -0
  72. package/dist/env-resolve-BFJXWl94.js +115 -0
  73. package/dist/env-resolve-Z2XF6leB.js +115 -0
  74. package/dist/env-resolve-bDYssfih.js +10 -0
  75. package/dist/extraction-tools-DbxnxIco.js +5 -0
  76. package/dist/extraction-tools-Dg7AHS35.js +91 -0
  77. package/dist/form_data-CGAy4HE0.js +8657 -0
  78. package/dist/gmail-watch-setup-C3uSWznp.js +40 -0
  79. package/dist/health-DUjluWHQ.js +6 -0
  80. package/dist/health-DVfkpUQW.js +152 -0
  81. package/dist/heartbeat-engine-CrgL4mrP.js +83 -0
  82. package/dist/heartbeat-engine-Ut6pXBD6.js +83 -0
  83. package/dist/hub-9LaKnLjY.js +6 -0
  84. package/dist/hub-BO6bj8Yj.js +515 -0
  85. package/dist/hub-Bu52YZqW.js +6 -0
  86. package/dist/hub-CfwUz9YW.js +515 -0
  87. package/dist/hyperclawbot-BrcoYLOp.js +505 -0
  88. package/dist/hyperclawbot-CBiDSKsa.js +505 -0
  89. package/dist/inference-0mlFQqIm.js +922 -0
  90. package/dist/inference-DHR82Gh7.js +6 -0
  91. package/dist/inference-DhA8jpfH.js +2692 -0
  92. package/dist/inference-SzqFe_nk.js +6 -0
  93. package/dist/knowledge-graph-BrYpSgxW.js +131 -0
  94. package/dist/knowledge-graph-DE5lSF02.js +131 -0
  95. package/dist/loader-9JqY6Nlq.js +4 -0
  96. package/dist/loader-BkDi8MD9.js +400 -0
  97. package/dist/loader-Cjdd1kw4.js +400 -0
  98. package/dist/loader-DI2qDRPC.js +4 -0
  99. package/dist/logger-Cp8wC7F8.js +83 -0
  100. package/dist/logger-DCT2l9GV.js +83 -0
  101. package/dist/manager-3cq3DydI.js +4 -0
  102. package/dist/manager-B2Gls5RG.js +218 -0
  103. package/dist/manager-BUrFrPuq.js +117 -0
  104. package/dist/manager-Bi9UYyVR.js +105 -0
  105. package/dist/manager-Biz9ixWJ.js +40 -0
  106. package/dist/manager-CBUHJiY7.js +6 -0
  107. package/dist/manager-CVLLaKmq.js +218 -0
  108. package/dist/manager-CWNSML5D.js +117 -0
  109. package/dist/manager-SJe9gt-q.js +4 -0
  110. package/dist/mcp-CUoTCMw-.js +139 -0
  111. package/dist/mcp-loader-BIz-450x.js +94 -0
  112. package/dist/mcp-loader-CvxRDtPC.js +94 -0
  113. package/dist/memory-OL77OMOr.js +270 -0
  114. package/dist/memory-auto-CpQHZlEJ.js +306 -0
  115. package/dist/memory-auto-D-L2q21G.js +306 -0
  116. package/dist/memory-auto-DTcy5VBy.js +5 -0
  117. package/dist/memory-auto-Z6LCf-iK.js +5 -0
  118. package/dist/memory-gUi4VaIf.js +4 -0
  119. package/dist/memory-integration-B8RSN4pr.js +91 -0
  120. package/dist/memory-integration-g2vxwgoE.js +91 -0
  121. package/dist/moltbook-B-40gQOL.js +81 -0
  122. package/dist/moltbook-Cl8cQfxJ.js +81 -0
  123. package/dist/node-TWxRm84k.js +222 -0
  124. package/dist/nodes-registry-C9dCFwjh.js +52 -0
  125. package/dist/nodes-registry-DKRtsbNg.js +52 -0
  126. package/dist/oauth-flow-CeaaGAz0.js +150 -0
  127. package/dist/oauth-flow-JCfporKq.js +150 -0
  128. package/dist/oauth-provider-4R0EJlsT.js +110 -0
  129. package/dist/oauth-provider-B4dzn56l.js +110 -0
  130. package/dist/observability-CDZmeHfa.js +89 -0
  131. package/dist/observability-nZ3CBIxG.js +89 -0
  132. package/dist/onboard-BBBWcfhp.js +10 -0
  133. package/dist/onboard-BVOtKQdh.js +3641 -0
  134. package/dist/onboard-Bw28IRQ3.js +4070 -0
  135. package/dist/onboard-CGNIw27w.js +11 -0
  136. package/dist/orchestrator-BovkM63z.js +6 -0
  137. package/dist/orchestrator-CcKx1Ovk.js +189 -0
  138. package/dist/orchestrator-DSbpkP1X.js +189 -0
  139. package/dist/orchestrator-DcFfDLTX.js +6 -0
  140. package/dist/osint-B4_m3VHQ.js +277 -0
  141. package/dist/osint-B6BZKQAD.js +277 -0
  142. package/dist/pairing-B6RArWhD.js +196 -0
  143. package/dist/pairing-BsQ08DLq.js +4 -0
  144. package/dist/pc-access-B0KocJNe.js +819 -0
  145. package/dist/pc-access-DkzmugZ7.js +8 -0
  146. package/dist/pending-approval-BgNjjuI2.js +22 -0
  147. package/dist/pending-approval-C_HkX1QL.js +22 -0
  148. package/dist/providers-DxiamZSL.js +5 -0
  149. package/dist/providers-Dy15rDb7.js +657 -0
  150. package/dist/reminders-store-CzUY0zYx.js +58 -0
  151. package/dist/renderer-ANNfXsHn.js +225 -0
  152. package/dist/rules-BSQwwAYC.js +103 -0
  153. package/dist/run-main.js +142 -132
  154. package/dist/runner-BHRSOPEU.js +1271 -0
  155. package/dist/runner-CJFJUtPm.js +1271 -0
  156. package/dist/sdk/index.js +2 -2
  157. package/dist/sdk/index.mjs +2 -2
  158. package/dist/security--oQObeJO.js +4 -0
  159. package/dist/security-wBOg0TA8.js +73 -0
  160. package/dist/server-Brl_HQUB.js +1255 -0
  161. package/dist/server-CbTTpB5m.js +1255 -0
  162. package/dist/server-DP_bPzvI.js +4 -0
  163. package/dist/server-DhfipkwN.js +4 -0
  164. package/dist/session-store-B09r5HgB.js +5 -0
  165. package/dist/session-store-DCTQIVur.js +113 -0
  166. package/dist/sessions-tools-BdlN6Pb6.js +95 -0
  167. package/dist/sessions-tools-JVLDKSJ_.js +5 -0
  168. package/dist/skill-loader-B5oeliGu.js +7 -0
  169. package/dist/skill-loader-Wf3brNOj.js +160 -0
  170. package/dist/skill-runtime-BGlvly2s.js +102 -0
  171. package/dist/skill-runtime-BXWd-Ktf.js +102 -0
  172. package/dist/skill-runtime-DhL2T76p.js +5 -0
  173. package/dist/skill-runtime-jgklm02e.js +5 -0
  174. package/dist/src-BbPa6Q8p.js +63 -0
  175. package/dist/src-BeXtfkK2.js +458 -0
  176. package/dist/src-Bhybpk1J.js +63 -0
  177. package/dist/src-CGQjRI4N.js +20 -0
  178. package/dist/src-DMJ4-uqk.js +458 -0
  179. package/dist/sub-agent-tools-CmE345s_.js +39 -0
  180. package/dist/sub-agent-tools-DHY-4WWM.js +39 -0
  181. package/dist/theme-D0smfC_l.js +8 -0
  182. package/dist/theme-DajRRZbA.js +180 -0
  183. package/dist/tool-policy-DZvF8xlQ.js +189 -0
  184. package/dist/tool-policy-DgNqFWYn.js +189 -0
  185. package/dist/tts-elevenlabs-C06nUxMK.js +61 -0
  186. package/dist/tts-elevenlabs-JeFaGNJU.js +61 -0
  187. package/dist/update-check-BVEqHhFY.js +83 -0
  188. package/dist/update-check-w4XuxVl7.js +81 -0
  189. package/dist/vision-JOtOS1Br.js +121 -0
  190. package/dist/vision-fky3elEo.js +121 -0
  191. package/dist/vision-tools-C8B3776g.js +5 -0
  192. package/dist/vision-tools-CB28ZCO_.js +5 -0
  193. package/dist/vision-tools-dwn9p4el.js +51 -0
  194. package/dist/vision-tools-vPPwQ-0N.js +51 -0
  195. package/dist/voice-transcription-B6RtplmN.js +138 -0
  196. package/dist/voice-transcription-DBo5hXmu.js +138 -0
  197. package/dist/website-watch-tools-B-jRAeTe.js +139 -0
  198. package/dist/website-watch-tools-BC9xAL67.js +5 -0
  199. package/package.json +1 -1
@@ -0,0 +1,40 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const fs_extra = require_chunk.__toESM(require("fs-extra"));
3
+ const path = require_chunk.__toESM(require("path"));
4
+ const os = require_chunk.__toESM(require("os"));
5
+
6
+ //#region src/commands/gmail-watch-setup.ts
7
+ const HC_DIR = path.default.join(os.default.homedir(), ".hyperclaw");
8
+ async function getGmailAccessToken() {
9
+ const paths = [path.default.join(HC_DIR, "oauth-google-gmail.json"), path.default.join(HC_DIR, "oauth-google.json")];
10
+ for (const p of paths) {
11
+ if (!await fs_extra.default.pathExists(p)) continue;
12
+ const data = await fs_extra.default.readJson(p);
13
+ if (data.access_token) return data.access_token;
14
+ }
15
+ throw new Error("No Gmail OAuth token found. Run: hyperclaw auth oauth google-gmail");
16
+ }
17
+ async function setupGmailWatch(opts) {
18
+ const token = await getGmailAccessToken();
19
+ const body = JSON.stringify({
20
+ topicName: opts.topicName,
21
+ labelIds: opts.labelIds || ["INBOX"],
22
+ labelFilterBehavior: "INCLUDE"
23
+ });
24
+ const res = await fetch("https://gmail.googleapis.com/gmail/v1/users/me/watch", {
25
+ method: "POST",
26
+ headers: {
27
+ Authorization: `Bearer ${token}`,
28
+ "Content-Type": "application/json"
29
+ },
30
+ body
31
+ });
32
+ if (!res.ok) {
33
+ const err = await res.text();
34
+ throw new Error(`Gmail API error ${res.status}: ${err}`);
35
+ }
36
+ return res.json();
37
+ }
38
+
39
+ //#endregion
40
+ exports.setupGmailWatch = setupGmailWatch;
@@ -0,0 +1,6 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ require('./paths-AIyBxIzm.js');
3
+ require('./paths-DPovhojT.js');
4
+ const require_health = require('./health-DVfkpUQW.js');
5
+
6
+ exports.resolveGatewayUrl = require_health.resolveGatewayUrl;
@@ -0,0 +1,152 @@
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 fs_extra = require_chunk.__toESM(require("fs-extra"));
6
+ const http = require_chunk.__toESM(require("http"));
7
+ const net = require_chunk.__toESM(require("net"));
8
+
9
+ //#region src/commands/health.ts
10
+ require_paths$1.init_paths();
11
+ function tcpOpen(host, port, timeoutMs = 800) {
12
+ return new Promise((resolve) => {
13
+ const s = new net.default.Socket();
14
+ s.setTimeout(timeoutMs);
15
+ s.on("connect", () => {
16
+ s.destroy();
17
+ resolve(true);
18
+ });
19
+ s.on("error", () => resolve(false));
20
+ s.on("timeout", () => {
21
+ s.destroy();
22
+ resolve(false);
23
+ });
24
+ try {
25
+ s.connect(port, host);
26
+ } catch {
27
+ resolve(false);
28
+ }
29
+ });
30
+ }
31
+ function httpGet(url, timeoutMs = 1500) {
32
+ return new Promise((resolve) => {
33
+ const req = http.default.get(url, { timeout: timeoutMs }, (res) => {
34
+ let body = "";
35
+ res.on("data", (chunk) => {
36
+ body += chunk.toString();
37
+ });
38
+ res.on("end", () => resolve({
39
+ ok: (res.statusCode ?? 0) < 400,
40
+ status: res.statusCode,
41
+ body
42
+ }));
43
+ });
44
+ req.on("error", () => resolve({ ok: false }));
45
+ req.on("timeout", () => {
46
+ req.destroy();
47
+ resolve({ ok: false });
48
+ });
49
+ });
50
+ }
51
+ /** Resolve gateway base URL for health/status probes. Uses gateway.remote when mode is "remote". */
52
+ function resolveGatewayUrl(cfg) {
53
+ const port = cfg?.gateway?.port ?? 18789;
54
+ if (cfg?.gateway?.mode === "remote" && cfg?.gateway?.remote?.url) {
55
+ let u = cfg.gateway.remote.url;
56
+ if (!u.startsWith("http://") && !u.startsWith("https://")) u = `http://${u}`;
57
+ return {
58
+ gatewayUrl: u.replace(/\/+$/, ""),
59
+ port: new URL(u).port ? parseInt(new URL(u).port, 10) || port : port
60
+ };
61
+ }
62
+ return {
63
+ gatewayUrl: `http://127.0.0.1:${port}`,
64
+ port
65
+ };
66
+ }
67
+ async function runHealth(opts = {}) {
68
+ let cfg = null;
69
+ try {
70
+ cfg = await fs_extra.default.readJson(require_paths.getConfigPath());
71
+ } catch {}
72
+ const { gatewayUrl, port } = resolveGatewayUrl(cfg);
73
+ const channels = cfg?.gateway?.enabledChannels ?? cfg?.channels ?? [];
74
+ const envOverrides = {};
75
+ if (process.env.HYPERCLAW_HOME) envOverrides.HYPERCLAW_HOME = process.env.HYPERCLAW_HOME;
76
+ if (process.env.HYPERCLAW_STATE_DIR) envOverrides.HYPERCLAW_STATE_DIR = process.env.HYPERCLAW_STATE_DIR;
77
+ if (process.env.HYPERCLAW_CONFIG_PATH) envOverrides.HYPERCLAW_CONFIG_PATH = process.env.HYPERCLAW_CONFIG_PATH;
78
+ const u = new URL(gatewayUrl);
79
+ const host = u.hostname || "127.0.0.1";
80
+ const tcpPort = u.port ? parseInt(u.port, 10) : port;
81
+ const tcpUp = await tcpOpen(host, tcpPort);
82
+ const runtime = tcpUp ? "running" : "stopped";
83
+ let rpcProbe = "unreachable";
84
+ let rpcStatus;
85
+ if (tcpUp) {
86
+ const resp = await httpGet(`${gatewayUrl}/api/health`);
87
+ rpcStatus = resp.status;
88
+ rpcProbe = resp.ok ? "ok" : "error";
89
+ if (rpcStatus && rpcStatus < 400) rpcProbe = "ok";
90
+ }
91
+ const allOk = runtime === "running" && rpcProbe === "ok";
92
+ const result = {
93
+ runtime,
94
+ rpcProbe,
95
+ rpcStatus,
96
+ channels: channels.length,
97
+ port,
98
+ gatewayUrl,
99
+ envOverrides,
100
+ allOk
101
+ };
102
+ if (opts.json) {
103
+ console.log(JSON.stringify(result, null, 2));
104
+ return result;
105
+ }
106
+ console.log(chalk.default.bold.cyan("\n 🩺 HEALTH\n"));
107
+ const runtimeColor = runtime === "running" ? chalk.default.green : chalk.default.red;
108
+ const rpcColor = rpcProbe === "ok" ? chalk.default.green : rpcProbe === "error" ? chalk.default.yellow : chalk.default.red;
109
+ console.log(` Runtime: ${runtimeColor(runtime)}`);
110
+ console.log(` RPC probe: ${rpcColor(rpcProbe)}${rpcStatus ? chalk.default.gray(` (HTTP ${rpcStatus})`) : ""}`);
111
+ console.log(` Port: ${chalk.default.white(port)} ${chalk.default.gray(gatewayUrl)}`);
112
+ console.log(` Channels: ${chalk.default.white(channels.length)} configured${channels.length > 0 ? chalk.default.gray(" " + channels.slice(0, 5).join(", ") + (channels.length > 5 ? "…" : "")) : ""}`);
113
+ if (opts.verbose) {
114
+ console.log(` State dir: ${chalk.default.gray(require_paths.getHyperClawDir())}`);
115
+ console.log(` Config: ${chalk.default.gray(require_paths.getConfigPath())}`);
116
+ if (Object.keys(envOverrides).length > 0) {
117
+ console.log(chalk.default.yellow("\n Env overrides:"));
118
+ for (const [k, v] of Object.entries(envOverrides)) console.log(` ${chalk.default.gray(k)}=${chalk.default.white(v)}`);
119
+ }
120
+ }
121
+ console.log();
122
+ if (!allOk) {
123
+ if (runtime === "stopped") {
124
+ console.log(chalk.default.red(" ✖ Gateway is not reachable."));
125
+ if (cfg?.gateway?.mode === "remote") {
126
+ console.log(chalk.default.gray(" Remote mode: ensure SSH tunnel is up: ssh -N -L 18789:127.0.0.1:18789 user@host"));
127
+ console.log(chalk.default.gray(" See: docs/remote-gateway-setup.md\n"));
128
+ } else {
129
+ console.log(chalk.default.gray(" Start it: hyperclaw gateway start"));
130
+ console.log(chalk.default.gray(" Or: hyperclaw daemon start\n"));
131
+ }
132
+ } else if (rpcProbe !== "ok") {
133
+ console.log(chalk.default.yellow(" ⚠ Gateway TCP is up but RPC probe failed."));
134
+ console.log(chalk.default.gray(" Check logs: hyperclaw logs --follow\n"));
135
+ }
136
+ } else console.log(chalk.default.green(" ✔ Gateway healthy\n"));
137
+ return result;
138
+ }
139
+
140
+ //#endregion
141
+ Object.defineProperty(exports, 'resolveGatewayUrl', {
142
+ enumerable: true,
143
+ get: function () {
144
+ return resolveGatewayUrl;
145
+ }
146
+ });
147
+ Object.defineProperty(exports, 'runHealth', {
148
+ enumerable: true,
149
+ get: function () {
150
+ return runHealth;
151
+ }
152
+ });
@@ -0,0 +1,83 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const fs_extra = require_chunk.__toESM(require("fs-extra"));
3
+ const path = require_chunk.__toESM(require("path"));
4
+ const os = require_chunk.__toESM(require("os"));
5
+ const http = require_chunk.__toESM(require("http"));
6
+
7
+ //#region src/services/heartbeat-engine.ts
8
+ const HC_DIR = path.default.join(os.default.homedir(), ".hyperclaw");
9
+ async function getGatewayConfig() {
10
+ try {
11
+ const cfg = await fs_extra.default.readJson(path.default.join(HC_DIR, "hyperclaw.json"));
12
+ const authToken = cfg?.gateway?.authToken || process.env.HYPERCLAW_GATEWAY_TOKEN || "";
13
+ return {
14
+ port: cfg?.gateway?.port ?? 18789,
15
+ authToken: authToken || void 0
16
+ };
17
+ } catch {
18
+ return { port: 18789 };
19
+ }
20
+ }
21
+ /** Generate morning briefing via agent (POST /api/chat). */
22
+ async function runMorningBriefing() {
23
+ const { port, authToken } = await getGatewayConfig();
24
+ const prompt = `Generate a brief morning briefing (3-5 bullets) for the user based on:
25
+ - MEMORY.md and knowledge graph (projects, preferences, recent facts)
26
+ - Today's reminders (list_reminders)
27
+ - Any relevant context
28
+
29
+ Be concise. Format as markdown bullets. No preamble.`;
30
+ return new Promise((resolve, reject) => {
31
+ const payload = JSON.stringify({ message: prompt });
32
+ const headers = {
33
+ "Content-Type": "application/json",
34
+ "Content-Length": String(Buffer.byteLength(payload))
35
+ };
36
+ if (authToken) headers["Authorization"] = `Bearer ${authToken}`;
37
+ const req = http.default.request({
38
+ hostname: "127.0.0.1",
39
+ port,
40
+ path: "/api/chat",
41
+ method: "POST",
42
+ headers
43
+ }, (res) => {
44
+ let data = "";
45
+ res.on("data", (c) => data += c);
46
+ res.on("end", () => {
47
+ try {
48
+ const j = JSON.parse(data);
49
+ resolve(j.response || j.error || "(no response)");
50
+ } catch {
51
+ resolve(data || "(parse error)");
52
+ }
53
+ });
54
+ });
55
+ req.on("error", reject);
56
+ req.setTimeout(6e4, () => {
57
+ req.destroy();
58
+ reject(new Error("Briefing timeout"));
59
+ });
60
+ req.write(payload);
61
+ req.end();
62
+ });
63
+ }
64
+ /** Persist briefing to HEARTBEAT.md and daily log. */
65
+ async function persistBriefing(text) {
66
+ const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
67
+ const ts = (/* @__PURE__ */ new Date()).toISOString();
68
+ const heartbeatPath = path.default.join(HC_DIR, "HEARTBEAT.md");
69
+ const content = `## Morning Briefing — ${today}\n\n${text}\n\n---\n*Generated ${ts}*\n`;
70
+ await fs_extra.default.ensureDir(HC_DIR);
71
+ if (await fs_extra.default.pathExists(heartbeatPath)) {
72
+ const existing = await fs_extra.default.readFile(heartbeatPath, "utf8");
73
+ await fs_extra.default.writeFile(heartbeatPath, content + "\n" + existing.slice(0, 8e3), "utf8");
74
+ } else await fs_extra.default.writeFile(heartbeatPath, `# HEARTBEAT.md — Proactive Briefings\n\n${content}`, "utf8");
75
+ const logDir = path.default.join(HC_DIR, "logs");
76
+ const logPath = path.default.join(logDir, `heartbeat-${today}.md`);
77
+ await fs_extra.default.ensureDir(logDir);
78
+ await fs_extra.default.appendFile(logPath, `\n## ${ts}\n\n${text}\n`, "utf8");
79
+ }
80
+
81
+ //#endregion
82
+ exports.persistBriefing = persistBriefing;
83
+ exports.runMorningBriefing = runMorningBriefing;
@@ -0,0 +1,83 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const fs_extra = require_chunk.__toESM(require("fs-extra"));
3
+ const path = require_chunk.__toESM(require("path"));
4
+ const os = require_chunk.__toESM(require("os"));
5
+ const http = require_chunk.__toESM(require("http"));
6
+
7
+ //#region src/services/heartbeat-engine.ts
8
+ const HC_DIR = path.default.join(os.default.homedir(), ".hyperclaw");
9
+ async function getGatewayConfig() {
10
+ try {
11
+ const cfg = await fs_extra.default.readJson(path.default.join(HC_DIR, "hyperclaw.json"));
12
+ const authToken = cfg?.gateway?.authToken || process.env.HYPERCLAW_GATEWAY_TOKEN || "";
13
+ return {
14
+ port: cfg?.gateway?.port ?? 18789,
15
+ authToken: authToken || void 0
16
+ };
17
+ } catch {
18
+ return { port: 18789 };
19
+ }
20
+ }
21
+ /** Generate morning briefing via agent (POST /api/chat). */
22
+ async function runMorningBriefing() {
23
+ const { port, authToken } = await getGatewayConfig();
24
+ const prompt = `Generate a brief morning briefing (3-5 bullets) for the user based on:
25
+ - MEMORY.md and knowledge graph (projects, preferences, recent facts)
26
+ - Today's reminders (list_reminders)
27
+ - Any relevant context
28
+
29
+ Be concise. Format as markdown bullets. No preamble.`;
30
+ return new Promise((resolve, reject) => {
31
+ const payload = JSON.stringify({ message: prompt });
32
+ const headers = {
33
+ "Content-Type": "application/json",
34
+ "Content-Length": String(Buffer.byteLength(payload))
35
+ };
36
+ if (authToken) headers["Authorization"] = `Bearer ${authToken}`;
37
+ const req = http.default.request({
38
+ hostname: "127.0.0.1",
39
+ port,
40
+ path: "/api/chat",
41
+ method: "POST",
42
+ headers
43
+ }, (res) => {
44
+ let data = "";
45
+ res.on("data", (c) => data += c);
46
+ res.on("end", () => {
47
+ try {
48
+ const j = JSON.parse(data);
49
+ resolve(j.response || j.error || "(no response)");
50
+ } catch {
51
+ resolve(data || "(parse error)");
52
+ }
53
+ });
54
+ });
55
+ req.on("error", reject);
56
+ req.setTimeout(6e4, () => {
57
+ req.destroy();
58
+ reject(new Error("Briefing timeout"));
59
+ });
60
+ req.write(payload);
61
+ req.end();
62
+ });
63
+ }
64
+ /** Persist briefing to HEARTBEAT.md and daily log. */
65
+ async function persistBriefing(text) {
66
+ const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
67
+ const ts = (/* @__PURE__ */ new Date()).toISOString();
68
+ const heartbeatPath = path.default.join(HC_DIR, "HEARTBEAT.md");
69
+ const content = `## Morning Briefing — ${today}\n\n${text}\n\n---\n*Generated ${ts}*\n`;
70
+ await fs_extra.default.ensureDir(HC_DIR);
71
+ if (await fs_extra.default.pathExists(heartbeatPath)) {
72
+ const existing = await fs_extra.default.readFile(heartbeatPath, "utf8");
73
+ await fs_extra.default.writeFile(heartbeatPath, content + "\n" + existing.slice(0, 8e3), "utf8");
74
+ } else await fs_extra.default.writeFile(heartbeatPath, `# HEARTBEAT.md — Proactive Briefings\n\n${content}`, "utf8");
75
+ const logDir = path.default.join(HC_DIR, "logs");
76
+ const logPath = path.default.join(logDir, `heartbeat-${today}.md`);
77
+ await fs_extra.default.ensureDir(logDir);
78
+ await fs_extra.default.appendFile(logPath, `\n## ${ts}\n\n${text}\n`, "utf8");
79
+ }
80
+
81
+ //#endregion
82
+ exports.persistBriefing = persistBriefing;
83
+ exports.runMorningBriefing = runMorningBriefing;
@@ -0,0 +1,6 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ require('./paths-AIyBxIzm.js');
3
+ require('./paths-DPovhojT.js');
4
+ const require_hub = require('./hub-CfwUz9YW.js');
5
+
6
+ exports.SkillHub = require_hub.SkillHub;