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.
- package/LICENSE +2 -1
- package/README.md +449 -99
- package/dist/a2ui-protocol-Gzm29Gaw.js +75 -0
- package/dist/agents-routing-Biy5ew4a.js +4 -0
- package/dist/agents-routing-CL3HQNoM.js +327 -0
- package/dist/api-keys-guide-CGn5BSF7.js +149 -0
- package/dist/api-keys-guide-ChbThbPj.js +149 -0
- package/dist/audit-BJohI_vC.js +441 -0
- package/dist/audit-NPIMmOSq.js +441 -0
- package/dist/bounty-tools-BUqUKjt0.js +211 -0
- package/dist/bounty-tools-CY_i91DU.js +211 -0
- package/dist/browser-tools-CxJY6pAn.js +5 -0
- package/dist/browser-tools-JZ9ji6AW.js +179 -0
- package/dist/chat-qVuqhlPu.js +258 -0
- package/dist/claw-tasks-B-8RRMdq.js +80 -0
- package/dist/claw-tasks-Cyzdbhz_.js +80 -0
- package/dist/connector-1x1rCBHz.js +162 -0
- package/dist/connector-B4jeCULG.js +305 -0
- package/dist/connector-B7qngfkT.js +286 -0
- package/dist/connector-B8BK0GBo.js +531 -0
- package/dist/connector-BE9eJs8-.js +182 -0
- package/dist/connector-BEe-DTGQ.js +189 -0
- package/dist/connector-BU7p5ZgB.js +167 -0
- package/dist/connector-BUzzq7Ij.js +568 -0
- package/dist/connector-BpDqLgnW.js +419 -0
- package/dist/connector-BpW88ut2.js +189 -0
- package/dist/connector-Bxv-gy8U.js +167 -0
- package/dist/connector-Bz14zcJv.js +213 -0
- package/dist/connector-C1zP5-5q.js +85 -0
- package/dist/connector-CAcpcovF.js +498 -0
- package/dist/connector-CJgVjS58.js +181 -0
- package/dist/connector-Cf53D6qV.js +425 -0
- package/dist/connector-CyHmlbNz.js +508 -0
- package/dist/connector-D22mJGVu.js +340 -0
- package/dist/connector-D6RtMmlL.js +225 -0
- package/dist/connector-D9EnT8A4.js +280 -0
- package/dist/connector-DNDwIh37.js +239 -0
- package/dist/connector-Di27MeO4.js +350 -0
- package/dist/connector-Do0BPiHt.js +194 -0
- package/dist/connector-DvLwOfJy.js +192 -0
- package/dist/connector-DvU83NSq.js +181 -0
- package/dist/connector-DxskpDc_.js +173 -0
- package/dist/connector-byy3eISx.js +552 -0
- package/dist/connector-vV89hsyd.js +218 -0
- package/dist/cost-tracker-Ca1UPZ33.js +103 -0
- package/dist/cost-tracker-fnaj_6M9.js +103 -0
- package/dist/credentials-store-BxijEirw.js +77 -0
- package/dist/credentials-store-CA8UtK0T.js +77 -0
- package/dist/credentials-store-CPkVO6-z.js +4 -0
- package/dist/credentials-store-Cm7DH-kh.js +4 -0
- package/dist/cron-tasks-L0mz1yyU.js +82 -0
- package/dist/cron-tasks-_pqQCmxc.js +82 -0
- package/dist/daemon-7ViroziB.js +5 -0
- package/dist/daemon-BfyKmZhr.js +318 -0
- package/dist/daemon-CNyunwkR.js +5 -0
- package/dist/daemon-CindY8OK.js +318 -0
- package/dist/delivery-DVHmv1IR.js +4 -0
- package/dist/delivery-DgiZcJBp.js +4 -0
- package/dist/delivery-DpMX0Yyc.js +95 -0
- package/dist/delivery-otAU4alM.js +95 -0
- package/dist/destructive-gate-CA0DtA5K.js +101 -0
- package/dist/destructive-gate-DZt71UZR.js +101 -0
- package/dist/developer-keys-Cnd1kswV.js +127 -0
- package/dist/developer-keys-DENo3ZA6.js +8 -0
- package/dist/doctor-Dgjoc3DG.js +230 -0
- package/dist/doctor-RwsOhtAl.js +6 -0
- package/dist/engine-B0kLfRL0.js +256 -0
- package/dist/engine-BJUpRUOv.js +7 -0
- package/dist/engine-D_VeoZHw.js +305 -0
- package/dist/engine-JjRnhlsE.js +7 -0
- package/dist/env-resolve-17ekEU6p.js +10 -0
- package/dist/env-resolve-BFJXWl94.js +115 -0
- package/dist/env-resolve-Z2XF6leB.js +115 -0
- package/dist/env-resolve-bDYssfih.js +10 -0
- package/dist/extraction-tools-DbxnxIco.js +5 -0
- package/dist/extraction-tools-Dg7AHS35.js +91 -0
- package/dist/form_data-CGAy4HE0.js +8657 -0
- package/dist/gmail-watch-setup-C3uSWznp.js +40 -0
- package/dist/health-DUjluWHQ.js +6 -0
- package/dist/health-DVfkpUQW.js +152 -0
- package/dist/heartbeat-engine-CrgL4mrP.js +83 -0
- package/dist/heartbeat-engine-Ut6pXBD6.js +83 -0
- package/dist/hub-9LaKnLjY.js +6 -0
- package/dist/hub-BO6bj8Yj.js +515 -0
- package/dist/hub-Bu52YZqW.js +6 -0
- package/dist/hub-CfwUz9YW.js +515 -0
- package/dist/hyperclawbot-BrcoYLOp.js +505 -0
- package/dist/hyperclawbot-CBiDSKsa.js +505 -0
- package/dist/inference-0mlFQqIm.js +922 -0
- package/dist/inference-DHR82Gh7.js +6 -0
- package/dist/inference-DhA8jpfH.js +2692 -0
- package/dist/inference-SzqFe_nk.js +6 -0
- package/dist/knowledge-graph-BrYpSgxW.js +131 -0
- package/dist/knowledge-graph-DE5lSF02.js +131 -0
- package/dist/loader-9JqY6Nlq.js +4 -0
- package/dist/loader-BkDi8MD9.js +400 -0
- package/dist/loader-Cjdd1kw4.js +400 -0
- package/dist/loader-DI2qDRPC.js +4 -0
- package/dist/logger-Cp8wC7F8.js +83 -0
- package/dist/logger-DCT2l9GV.js +83 -0
- package/dist/manager-3cq3DydI.js +4 -0
- package/dist/manager-B2Gls5RG.js +218 -0
- package/dist/manager-BUrFrPuq.js +117 -0
- package/dist/manager-Bi9UYyVR.js +105 -0
- package/dist/manager-Biz9ixWJ.js +40 -0
- package/dist/manager-CBUHJiY7.js +6 -0
- package/dist/manager-CVLLaKmq.js +218 -0
- package/dist/manager-CWNSML5D.js +117 -0
- package/dist/manager-SJe9gt-q.js +4 -0
- package/dist/mcp-CUoTCMw-.js +139 -0
- package/dist/mcp-loader-BIz-450x.js +94 -0
- package/dist/mcp-loader-CvxRDtPC.js +94 -0
- package/dist/memory-OL77OMOr.js +270 -0
- package/dist/memory-auto-CpQHZlEJ.js +306 -0
- package/dist/memory-auto-D-L2q21G.js +306 -0
- package/dist/memory-auto-DTcy5VBy.js +5 -0
- package/dist/memory-auto-Z6LCf-iK.js +5 -0
- package/dist/memory-gUi4VaIf.js +4 -0
- package/dist/memory-integration-B8RSN4pr.js +91 -0
- package/dist/memory-integration-g2vxwgoE.js +91 -0
- package/dist/moltbook-B-40gQOL.js +81 -0
- package/dist/moltbook-Cl8cQfxJ.js +81 -0
- package/dist/node-TWxRm84k.js +222 -0
- package/dist/nodes-registry-C9dCFwjh.js +52 -0
- package/dist/nodes-registry-DKRtsbNg.js +52 -0
- package/dist/oauth-flow-CeaaGAz0.js +150 -0
- package/dist/oauth-flow-JCfporKq.js +150 -0
- package/dist/oauth-provider-4R0EJlsT.js +110 -0
- package/dist/oauth-provider-B4dzn56l.js +110 -0
- package/dist/observability-CDZmeHfa.js +89 -0
- package/dist/observability-nZ3CBIxG.js +89 -0
- package/dist/onboard-BBBWcfhp.js +10 -0
- package/dist/onboard-BVOtKQdh.js +3641 -0
- package/dist/onboard-Bw28IRQ3.js +4070 -0
- package/dist/onboard-CGNIw27w.js +11 -0
- package/dist/orchestrator-BovkM63z.js +6 -0
- package/dist/orchestrator-CcKx1Ovk.js +189 -0
- package/dist/orchestrator-DSbpkP1X.js +189 -0
- package/dist/orchestrator-DcFfDLTX.js +6 -0
- package/dist/osint-B4_m3VHQ.js +277 -0
- package/dist/osint-B6BZKQAD.js +277 -0
- package/dist/pairing-B6RArWhD.js +196 -0
- package/dist/pairing-BsQ08DLq.js +4 -0
- package/dist/pc-access-B0KocJNe.js +819 -0
- package/dist/pc-access-DkzmugZ7.js +8 -0
- package/dist/pending-approval-BgNjjuI2.js +22 -0
- package/dist/pending-approval-C_HkX1QL.js +22 -0
- package/dist/providers-DxiamZSL.js +5 -0
- package/dist/providers-Dy15rDb7.js +657 -0
- package/dist/reminders-store-CzUY0zYx.js +58 -0
- package/dist/renderer-ANNfXsHn.js +225 -0
- package/dist/rules-BSQwwAYC.js +103 -0
- package/dist/run-main.js +142 -132
- package/dist/runner-BHRSOPEU.js +1271 -0
- package/dist/runner-CJFJUtPm.js +1271 -0
- package/dist/sdk/index.js +2 -2
- package/dist/sdk/index.mjs +2 -2
- package/dist/security--oQObeJO.js +4 -0
- package/dist/security-wBOg0TA8.js +73 -0
- package/dist/server-Brl_HQUB.js +1255 -0
- package/dist/server-CbTTpB5m.js +1255 -0
- package/dist/server-DP_bPzvI.js +4 -0
- package/dist/server-DhfipkwN.js +4 -0
- package/dist/session-store-B09r5HgB.js +5 -0
- package/dist/session-store-DCTQIVur.js +113 -0
- package/dist/sessions-tools-BdlN6Pb6.js +95 -0
- package/dist/sessions-tools-JVLDKSJ_.js +5 -0
- package/dist/skill-loader-B5oeliGu.js +7 -0
- package/dist/skill-loader-Wf3brNOj.js +160 -0
- package/dist/skill-runtime-BGlvly2s.js +102 -0
- package/dist/skill-runtime-BXWd-Ktf.js +102 -0
- package/dist/skill-runtime-DhL2T76p.js +5 -0
- package/dist/skill-runtime-jgklm02e.js +5 -0
- package/dist/src-BbPa6Q8p.js +63 -0
- package/dist/src-BeXtfkK2.js +458 -0
- package/dist/src-Bhybpk1J.js +63 -0
- package/dist/src-CGQjRI4N.js +20 -0
- package/dist/src-DMJ4-uqk.js +458 -0
- package/dist/sub-agent-tools-CmE345s_.js +39 -0
- package/dist/sub-agent-tools-DHY-4WWM.js +39 -0
- package/dist/theme-D0smfC_l.js +8 -0
- package/dist/theme-DajRRZbA.js +180 -0
- package/dist/tool-policy-DZvF8xlQ.js +189 -0
- package/dist/tool-policy-DgNqFWYn.js +189 -0
- package/dist/tts-elevenlabs-C06nUxMK.js +61 -0
- package/dist/tts-elevenlabs-JeFaGNJU.js +61 -0
- package/dist/update-check-BVEqHhFY.js +83 -0
- package/dist/update-check-w4XuxVl7.js +81 -0
- package/dist/vision-JOtOS1Br.js +121 -0
- package/dist/vision-fky3elEo.js +121 -0
- package/dist/vision-tools-C8B3776g.js +5 -0
- package/dist/vision-tools-CB28ZCO_.js +5 -0
- package/dist/vision-tools-dwn9p4el.js +51 -0
- package/dist/vision-tools-vPPwQ-0N.js +51 -0
- package/dist/voice-transcription-B6RtplmN.js +138 -0
- package/dist/voice-transcription-DBo5hXmu.js +138 -0
- package/dist/website-watch-tools-B-jRAeTe.js +139 -0
- package/dist/website-watch-tools-BC9xAL67.js +5 -0
- package/package.json +1 -1
|
@@ -0,0 +1,110 @@
|
|
|
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 https = require_chunk.__toESM(require("https"));
|
|
6
|
+
|
|
7
|
+
//#region src/services/oauth-provider.ts
|
|
8
|
+
function defaultTokenPath(providerId) {
|
|
9
|
+
return path.default.join(HC_DIR, `oauth-${providerId}.json`);
|
|
10
|
+
}
|
|
11
|
+
async function getProviderCredentialAsync(cfg) {
|
|
12
|
+
if (!cfg?.provider) return "";
|
|
13
|
+
const authType = cfg.provider.authType ?? "api_key";
|
|
14
|
+
if (authType === "api_key") {
|
|
15
|
+
const key = cfg.provider.apiKey;
|
|
16
|
+
if (key) return key;
|
|
17
|
+
const pid = cfg.provider.providerId || "openrouter";
|
|
18
|
+
switch (pid) {
|
|
19
|
+
case "openrouter": return process.env.OPENROUTER_API_KEY || "";
|
|
20
|
+
case "anthropic": return process.env.ANTHROPIC_API_KEY || "";
|
|
21
|
+
case "openai": return process.env.OPENAI_API_KEY || "";
|
|
22
|
+
case "xai": return process.env.XAI_API_KEY || "";
|
|
23
|
+
case "google": return process.env.GOOGLE_AI_API_KEY || "";
|
|
24
|
+
default: return process.env.OPENROUTER_API_KEY || process.env.ANTHROPIC_API_KEY || "";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const tokenPath = cfg.provider.oauthTokenPath || defaultTokenPath(cfg.provider.providerId || "default");
|
|
28
|
+
if (!await fs_extra.default.pathExists(tokenPath)) return "";
|
|
29
|
+
let data;
|
|
30
|
+
try {
|
|
31
|
+
data = await fs_extra.default.readJson(tokenPath);
|
|
32
|
+
} catch {
|
|
33
|
+
return "";
|
|
34
|
+
}
|
|
35
|
+
if (!data.access_token) return "";
|
|
36
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
37
|
+
const expiresAt = data.expires_at ?? 0;
|
|
38
|
+
if (expiresAt > 0 && now < expiresAt - 60) return data.access_token;
|
|
39
|
+
if (!data.refresh_token) return data.access_token;
|
|
40
|
+
const tokenUrl = data.token_url || DEFAULT_REFRESH_URLS[cfg.provider.providerId || ""] || "";
|
|
41
|
+
if (!tokenUrl) return data.access_token;
|
|
42
|
+
const refreshed = await refreshAccessToken({
|
|
43
|
+
token_url: tokenUrl,
|
|
44
|
+
refresh_token: data.refresh_token,
|
|
45
|
+
client_id: data.client_id || process.env.OAUTH_CLIENT_ID,
|
|
46
|
+
client_secret: data.client_secret || process.env.OAUTH_CLIENT_SECRET
|
|
47
|
+
});
|
|
48
|
+
if (refreshed.access_token) {
|
|
49
|
+
data.access_token = refreshed.access_token;
|
|
50
|
+
if (refreshed.expires_in) data.expires_at = now + refreshed.expires_in;
|
|
51
|
+
await fs_extra.default.writeJson(tokenPath, data, { spaces: 2 });
|
|
52
|
+
return data.access_token;
|
|
53
|
+
}
|
|
54
|
+
return data.access_token;
|
|
55
|
+
}
|
|
56
|
+
async function refreshAccessToken(opts) {
|
|
57
|
+
const body = new URLSearchParams({
|
|
58
|
+
grant_type: "refresh_token",
|
|
59
|
+
refresh_token: opts.refresh_token
|
|
60
|
+
});
|
|
61
|
+
if (opts.client_id) body.set("client_id", opts.client_id);
|
|
62
|
+
if (opts.client_secret) body.set("client_secret", opts.client_secret);
|
|
63
|
+
const u = new URL(opts.token_url);
|
|
64
|
+
return new Promise((resolve) => {
|
|
65
|
+
const req = https.default.request({
|
|
66
|
+
hostname: u.hostname,
|
|
67
|
+
port: 443,
|
|
68
|
+
path: u.pathname + u.search,
|
|
69
|
+
method: "POST",
|
|
70
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" }
|
|
71
|
+
}, (res) => {
|
|
72
|
+
let data = "";
|
|
73
|
+
res.on("data", (c) => data += c);
|
|
74
|
+
res.on("end", () => {
|
|
75
|
+
try {
|
|
76
|
+
const j = JSON.parse(data);
|
|
77
|
+
resolve({
|
|
78
|
+
access_token: j.access_token,
|
|
79
|
+
expires_in: j.expires_in
|
|
80
|
+
});
|
|
81
|
+
} catch {
|
|
82
|
+
resolve({});
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
req.on("error", () => resolve({}));
|
|
87
|
+
req.write(body.toString());
|
|
88
|
+
req.end();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/** Write token file (e.g. after OAuth callback or manual paste). */
|
|
92
|
+
async function writeOAuthToken(providerId, token, customPath) {
|
|
93
|
+
const p = customPath || defaultTokenPath(providerId);
|
|
94
|
+
await fs_extra.default.ensureDir(path.default.dirname(p));
|
|
95
|
+
await fs_extra.default.writeJson(p, token, { spaces: 2 });
|
|
96
|
+
}
|
|
97
|
+
var HC_DIR, DEFAULT_REFRESH_URLS;
|
|
98
|
+
var init_oauth_provider = require_chunk.__esm({ "src/services/oauth-provider.ts"() {
|
|
99
|
+
HC_DIR = path.default.join(os.default.homedir(), ".hyperclaw");
|
|
100
|
+
DEFAULT_REFRESH_URLS = {
|
|
101
|
+
google: "https://oauth2.googleapis.com/token",
|
|
102
|
+
openai: "https://api.openai.com/v1/auth/refresh",
|
|
103
|
+
anthropic: ""
|
|
104
|
+
};
|
|
105
|
+
} });
|
|
106
|
+
|
|
107
|
+
//#endregion
|
|
108
|
+
init_oauth_provider();
|
|
109
|
+
exports.getProviderCredentialAsync = getProviderCredentialAsync;
|
|
110
|
+
exports.writeOAuthToken = writeOAuthToken;
|
|
@@ -0,0 +1,110 @@
|
|
|
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 https = require_chunk.__toESM(require("https"));
|
|
6
|
+
|
|
7
|
+
//#region src/services/oauth-provider.ts
|
|
8
|
+
function defaultTokenPath(providerId) {
|
|
9
|
+
return path.default.join(HC_DIR, `oauth-${providerId}.json`);
|
|
10
|
+
}
|
|
11
|
+
async function getProviderCredentialAsync(cfg) {
|
|
12
|
+
if (!cfg?.provider) return "";
|
|
13
|
+
const authType = cfg.provider.authType ?? "api_key";
|
|
14
|
+
if (authType === "api_key") {
|
|
15
|
+
const key = cfg.provider.apiKey;
|
|
16
|
+
if (key) return key;
|
|
17
|
+
const pid = cfg.provider.providerId || "openrouter";
|
|
18
|
+
switch (pid) {
|
|
19
|
+
case "openrouter": return process.env.OPENROUTER_API_KEY || "";
|
|
20
|
+
case "anthropic": return process.env.ANTHROPIC_API_KEY || "";
|
|
21
|
+
case "openai": return process.env.OPENAI_API_KEY || "";
|
|
22
|
+
case "xai": return process.env.XAI_API_KEY || "";
|
|
23
|
+
case "google": return process.env.GOOGLE_AI_API_KEY || "";
|
|
24
|
+
default: return process.env.OPENROUTER_API_KEY || process.env.ANTHROPIC_API_KEY || "";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const tokenPath = cfg.provider.oauthTokenPath || defaultTokenPath(cfg.provider.providerId || "default");
|
|
28
|
+
if (!await fs_extra.default.pathExists(tokenPath)) return "";
|
|
29
|
+
let data;
|
|
30
|
+
try {
|
|
31
|
+
data = await fs_extra.default.readJson(tokenPath);
|
|
32
|
+
} catch {
|
|
33
|
+
return "";
|
|
34
|
+
}
|
|
35
|
+
if (!data.access_token) return "";
|
|
36
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
37
|
+
const expiresAt = data.expires_at ?? 0;
|
|
38
|
+
if (expiresAt > 0 && now < expiresAt - 60) return data.access_token;
|
|
39
|
+
if (!data.refresh_token) return data.access_token;
|
|
40
|
+
const tokenUrl = data.token_url || DEFAULT_REFRESH_URLS[cfg.provider.providerId || ""] || "";
|
|
41
|
+
if (!tokenUrl) return data.access_token;
|
|
42
|
+
const refreshed = await refreshAccessToken({
|
|
43
|
+
token_url: tokenUrl,
|
|
44
|
+
refresh_token: data.refresh_token,
|
|
45
|
+
client_id: data.client_id || process.env.OAUTH_CLIENT_ID,
|
|
46
|
+
client_secret: data.client_secret || process.env.OAUTH_CLIENT_SECRET
|
|
47
|
+
});
|
|
48
|
+
if (refreshed.access_token) {
|
|
49
|
+
data.access_token = refreshed.access_token;
|
|
50
|
+
if (refreshed.expires_in) data.expires_at = now + refreshed.expires_in;
|
|
51
|
+
await fs_extra.default.writeJson(tokenPath, data, { spaces: 2 });
|
|
52
|
+
return data.access_token;
|
|
53
|
+
}
|
|
54
|
+
return data.access_token;
|
|
55
|
+
}
|
|
56
|
+
async function refreshAccessToken(opts) {
|
|
57
|
+
const body = new URLSearchParams({
|
|
58
|
+
grant_type: "refresh_token",
|
|
59
|
+
refresh_token: opts.refresh_token
|
|
60
|
+
});
|
|
61
|
+
if (opts.client_id) body.set("client_id", opts.client_id);
|
|
62
|
+
if (opts.client_secret) body.set("client_secret", opts.client_secret);
|
|
63
|
+
const u = new URL(opts.token_url);
|
|
64
|
+
return new Promise((resolve) => {
|
|
65
|
+
const req = https.default.request({
|
|
66
|
+
hostname: u.hostname,
|
|
67
|
+
port: 443,
|
|
68
|
+
path: u.pathname + u.search,
|
|
69
|
+
method: "POST",
|
|
70
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" }
|
|
71
|
+
}, (res) => {
|
|
72
|
+
let data = "";
|
|
73
|
+
res.on("data", (c) => data += c);
|
|
74
|
+
res.on("end", () => {
|
|
75
|
+
try {
|
|
76
|
+
const j = JSON.parse(data);
|
|
77
|
+
resolve({
|
|
78
|
+
access_token: j.access_token,
|
|
79
|
+
expires_in: j.expires_in
|
|
80
|
+
});
|
|
81
|
+
} catch {
|
|
82
|
+
resolve({});
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
req.on("error", () => resolve({}));
|
|
87
|
+
req.write(body.toString());
|
|
88
|
+
req.end();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/** Write token file (e.g. after OAuth callback or manual paste). */
|
|
92
|
+
async function writeOAuthToken(providerId, token, customPath) {
|
|
93
|
+
const p = customPath || defaultTokenPath(providerId);
|
|
94
|
+
await fs_extra.default.ensureDir(path.default.dirname(p));
|
|
95
|
+
await fs_extra.default.writeJson(p, token, { spaces: 2 });
|
|
96
|
+
}
|
|
97
|
+
var HC_DIR, DEFAULT_REFRESH_URLS;
|
|
98
|
+
var init_oauth_provider = require_chunk.__esm({ "src/services/oauth-provider.ts"() {
|
|
99
|
+
HC_DIR = path.default.join(os.default.homedir(), ".hyperclaw");
|
|
100
|
+
DEFAULT_REFRESH_URLS = {
|
|
101
|
+
google: "https://oauth2.googleapis.com/token",
|
|
102
|
+
openai: "https://api.openai.com/v1/auth/refresh",
|
|
103
|
+
anthropic: ""
|
|
104
|
+
};
|
|
105
|
+
} });
|
|
106
|
+
|
|
107
|
+
//#endregion
|
|
108
|
+
init_oauth_provider();
|
|
109
|
+
exports.getProviderCredentialAsync = getProviderCredentialAsync;
|
|
110
|
+
exports.writeOAuthToken = writeOAuthToken;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
|
|
3
|
+
//#region src/infra/observability.ts
|
|
4
|
+
/** Rough cost per 1M tokens (Claude Sonnet ballpark). */
|
|
5
|
+
const COST_PER_1M_INPUT = 3;
|
|
6
|
+
const COST_PER_1M_OUTPUT = 15;
|
|
7
|
+
function estimateCost(usage) {
|
|
8
|
+
if (!usage) return 0;
|
|
9
|
+
const inp = (usage.input || 0) + (usage.cacheRead || 0);
|
|
10
|
+
return inp / 1e6 * COST_PER_1M_INPUT + (usage.output || 0) / 1e6 * COST_PER_1M_OUTPUT;
|
|
11
|
+
}
|
|
12
|
+
function createRunTracer(sessionId, source) {
|
|
13
|
+
const startTime = (/* @__PURE__ */ new Date()).toISOString();
|
|
14
|
+
const toolCalls = [];
|
|
15
|
+
const pending = [];
|
|
16
|
+
const trace = {
|
|
17
|
+
sessionId,
|
|
18
|
+
source,
|
|
19
|
+
startTime,
|
|
20
|
+
toolCalls
|
|
21
|
+
};
|
|
22
|
+
return {
|
|
23
|
+
trace,
|
|
24
|
+
onToolCall(name, input) {
|
|
25
|
+
pending.push({
|
|
26
|
+
name,
|
|
27
|
+
input
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
onToolResult(name, result) {
|
|
31
|
+
const head = pending.shift();
|
|
32
|
+
toolCalls.push({
|
|
33
|
+
name: name || head?.name || "unknown",
|
|
34
|
+
input: head?.input ?? {},
|
|
35
|
+
result: result.slice(0, 500),
|
|
36
|
+
at: (/* @__PURE__ */ new Date()).toISOString()
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
onRunEnd(usage, error) {
|
|
40
|
+
trace.endTime = (/* @__PURE__ */ new Date()).toISOString();
|
|
41
|
+
trace.usage = usage;
|
|
42
|
+
trace.costUsd = estimateCost(usage);
|
|
43
|
+
trace.error = error;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** List trace files (for querying). */
|
|
48
|
+
async function listTraces(baseDir, limit = 50) {
|
|
49
|
+
try {
|
|
50
|
+
const fs = await import("fs-extra");
|
|
51
|
+
const path = await import("path");
|
|
52
|
+
const dir = path.join(baseDir, "traces");
|
|
53
|
+
if (!await fs.pathExists(dir)) return [];
|
|
54
|
+
const files = (await fs.readdir(dir)).filter((f) => f.endsWith(".json")).map((f) => path.join(dir, f));
|
|
55
|
+
const stats = await Promise.all(files.map(async (fp) => ({
|
|
56
|
+
fp,
|
|
57
|
+
mtime: (await fs.stat(fp)).mtime.getTime()
|
|
58
|
+
})));
|
|
59
|
+
stats.sort((a, b) => b.mtime - a.mtime);
|
|
60
|
+
const out = [];
|
|
61
|
+
for (const { fp } of stats.slice(0, limit)) try {
|
|
62
|
+
out.push(await fs.readJson(fp));
|
|
63
|
+
} catch {}
|
|
64
|
+
return out;
|
|
65
|
+
} catch {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Write trace to file (e.g. ~/.hyperclaw/traces/). */
|
|
70
|
+
async function writeTraceToFile(baseDir, trace) {
|
|
71
|
+
try {
|
|
72
|
+
const fs = await import("fs-extra");
|
|
73
|
+
const path = await import("path");
|
|
74
|
+
const dir = path.join(baseDir, "traces");
|
|
75
|
+
await fs.ensureDir(dir);
|
|
76
|
+
const name = `run-${trace.startTime.replace(/[:.]/g, "-")}.json`;
|
|
77
|
+
const fp = path.join(dir, name);
|
|
78
|
+
await fs.writeJson(fp, trace, { spaces: 0 });
|
|
79
|
+
return fp;
|
|
80
|
+
} catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
//#endregion
|
|
86
|
+
exports.createRunTracer = createRunTracer;
|
|
87
|
+
exports.estimateCost = estimateCost;
|
|
88
|
+
exports.listTraces = listTraces;
|
|
89
|
+
exports.writeTraceToFile = writeTraceToFile;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
|
|
3
|
+
//#region src/infra/observability.ts
|
|
4
|
+
/** Rough cost per 1M tokens (Claude Sonnet ballpark). */
|
|
5
|
+
const COST_PER_1M_INPUT = 3;
|
|
6
|
+
const COST_PER_1M_OUTPUT = 15;
|
|
7
|
+
function estimateCost(usage) {
|
|
8
|
+
if (!usage) return 0;
|
|
9
|
+
const inp = (usage.input || 0) + (usage.cacheRead || 0);
|
|
10
|
+
return inp / 1e6 * COST_PER_1M_INPUT + (usage.output || 0) / 1e6 * COST_PER_1M_OUTPUT;
|
|
11
|
+
}
|
|
12
|
+
function createRunTracer(sessionId, source) {
|
|
13
|
+
const startTime = (/* @__PURE__ */ new Date()).toISOString();
|
|
14
|
+
const toolCalls = [];
|
|
15
|
+
const pending = [];
|
|
16
|
+
const trace = {
|
|
17
|
+
sessionId,
|
|
18
|
+
source,
|
|
19
|
+
startTime,
|
|
20
|
+
toolCalls
|
|
21
|
+
};
|
|
22
|
+
return {
|
|
23
|
+
trace,
|
|
24
|
+
onToolCall(name, input) {
|
|
25
|
+
pending.push({
|
|
26
|
+
name,
|
|
27
|
+
input
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
onToolResult(name, result) {
|
|
31
|
+
const head = pending.shift();
|
|
32
|
+
toolCalls.push({
|
|
33
|
+
name: name || head?.name || "unknown",
|
|
34
|
+
input: head?.input ?? {},
|
|
35
|
+
result: result.slice(0, 500),
|
|
36
|
+
at: (/* @__PURE__ */ new Date()).toISOString()
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
onRunEnd(usage, error) {
|
|
40
|
+
trace.endTime = (/* @__PURE__ */ new Date()).toISOString();
|
|
41
|
+
trace.usage = usage;
|
|
42
|
+
trace.costUsd = estimateCost(usage);
|
|
43
|
+
trace.error = error;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** List trace files (for querying). */
|
|
48
|
+
async function listTraces(baseDir, limit = 50) {
|
|
49
|
+
try {
|
|
50
|
+
const fs = await import("fs-extra");
|
|
51
|
+
const path = await import("path");
|
|
52
|
+
const dir = path.join(baseDir, "traces");
|
|
53
|
+
if (!await fs.pathExists(dir)) return [];
|
|
54
|
+
const files = (await fs.readdir(dir)).filter((f) => f.endsWith(".json")).map((f) => path.join(dir, f));
|
|
55
|
+
const stats = await Promise.all(files.map(async (fp) => ({
|
|
56
|
+
fp,
|
|
57
|
+
mtime: (await fs.stat(fp)).mtime.getTime()
|
|
58
|
+
})));
|
|
59
|
+
stats.sort((a, b) => b.mtime - a.mtime);
|
|
60
|
+
const out = [];
|
|
61
|
+
for (const { fp } of stats.slice(0, limit)) try {
|
|
62
|
+
out.push(await fs.readJson(fp));
|
|
63
|
+
} catch {}
|
|
64
|
+
return out;
|
|
65
|
+
} catch {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Write trace to file (e.g. ~/.hyperclaw/traces/). */
|
|
70
|
+
async function writeTraceToFile(baseDir, trace) {
|
|
71
|
+
try {
|
|
72
|
+
const fs = await import("fs-extra");
|
|
73
|
+
const path = await import("path");
|
|
74
|
+
const dir = path.join(baseDir, "traces");
|
|
75
|
+
await fs.ensureDir(dir);
|
|
76
|
+
const name = `run-${trace.startTime.replace(/[:.]/g, "-")}.json`;
|
|
77
|
+
const fp = path.join(dir, name);
|
|
78
|
+
await fs.writeJson(fp, trace, { spaces: 0 });
|
|
79
|
+
return fp;
|
|
80
|
+
} catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
//#endregion
|
|
86
|
+
exports.createRunTracer = createRunTracer;
|
|
87
|
+
exports.estimateCost = estimateCost;
|
|
88
|
+
exports.listTraces = listTraces;
|
|
89
|
+
exports.writeTraceToFile = writeTraceToFile;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
require('./paths-AIyBxIzm.js');
|
|
3
|
+
require('./paths-DPovhojT.js');
|
|
4
|
+
require('./env-resolve-Z2XF6leB.js');
|
|
5
|
+
const require_onboard = require('./onboard-Bw28IRQ3.js');
|
|
6
|
+
require('./server-Brl_HQUB.js');
|
|
7
|
+
require('./daemon-BfyKmZhr.js');
|
|
8
|
+
require('./theme-DcxwcUgZ.js');
|
|
9
|
+
|
|
10
|
+
exports.HyperClawWizard = require_onboard.HyperClawWizard;
|