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.
- package/README.md +246 -60
- package/dist/a2ui-protocol-CfBI44-Q.js +75 -0
- package/dist/agents-routing-ChHiZp36.js +327 -0
- package/dist/agents-routing-ChqZ6l2S.js +4 -0
- package/dist/api-keys-guide-BCcOl0Q7.js +149 -0
- package/dist/api-keys-guide-CGn5BSF7.js +149 -0
- package/dist/audit-BJohI_vC.js +441 -0
- package/dist/audit-BaIiyWFu.js +441 -0
- package/dist/bounty-tools-CY_i91DU.js +211 -0
- package/dist/bounty-tools-DWudyZie.js +211 -0
- package/dist/browser-tools-BsTeGMnX.js +5 -0
- package/dist/browser-tools-D8_rLe2p.js +179 -0
- package/dist/claw-tasks-CgTsiNE8.js +80 -0
- package/dist/claw-tasks-Cyzdbhz_.js +80 -0
- package/dist/connector-5N0-X_xs.js +194 -0
- package/dist/connector-B3v0qcXg.js +425 -0
- package/dist/connector-B8R3iBY1.js +280 -0
- package/dist/connector-BAM-08NN.js +189 -0
- package/dist/connector-BC8FIVu4.js +181 -0
- package/dist/connector-BDmwwaVc.js +213 -0
- package/dist/connector-BGjbBy69.js +225 -0
- package/dist/connector-BO2SRzfG.js +218 -0
- package/dist/connector-BfXky0L3.js +167 -0
- package/dist/connector-BiiSJpx3.js +192 -0
- package/dist/connector-BnDmIhIu.js +85 -0
- package/dist/connector-C1HSoUyk.js +189 -0
- package/dist/connector-CKQHZOXg.js +568 -0
- package/dist/connector-CRl-iidy.js +239 -0
- package/dist/connector-Ci9glMD-.js +340 -0
- package/dist/connector-CjtZIEDj.js +181 -0
- package/dist/connector-Ck6JtOsX.js +531 -0
- package/dist/connector-D8Kelee0.js +286 -0
- package/dist/connector-DAnRJ0oP.js +162 -0
- package/dist/connector-DXTp5PE8.js +508 -0
- package/dist/connector-Dih6dUPP.js +173 -0
- package/dist/connector-DqTH_tPX.js +182 -0
- package/dist/connector-DrnEiiyP.js +419 -0
- package/dist/connector-DtR5GGTX.js +167 -0
- package/dist/connector-Tky_qS_K.js +350 -0
- package/dist/connector-ZSc3oTTy.js +305 -0
- package/dist/connector-sW5yhU1m.js +498 -0
- package/dist/connector-u3ICd3Ic.js +552 -0
- package/dist/cost-tracker-Ca1UPZ33.js +103 -0
- package/dist/cost-tracker-DD9wtWsr.js +103 -0
- package/dist/credentials-store-C6ir0Dae.js +4 -0
- package/dist/credentials-store-CA8UtK0T.js +77 -0
- package/dist/credentials-store-Cm7DH-kh.js +4 -0
- package/dist/credentials-store-H13LqOwJ.js +77 -0
- package/dist/cron-tasks-Bli7Kzd2.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-Bg4GtCmc.js +318 -0
- package/dist/daemon-DhmwY8k4.js +5 -0
- package/dist/delivery-BmIYy9VQ.js +4 -0
- package/dist/delivery-DVHmv1IR.js +4 -0
- package/dist/delivery-DpMX0Yyc.js +95 -0
- package/dist/delivery-pWUPBp1F.js +95 -0
- package/dist/destructive-gate-D6vWOdEl.js +101 -0
- package/dist/destructive-gate-DZt71UZR.js +101 -0
- package/dist/developer-keys-CPWT7Q6S.js +8 -0
- package/dist/developer-keys-DrrcUqFa.js +127 -0
- package/dist/doctor-BvCe8BBk.js +230 -0
- package/dist/doctor-CxyPLYsJ.js +6 -0
- package/dist/engine-B0kLfRL0.js +256 -0
- package/dist/engine-BJUpRUOv.js +7 -0
- package/dist/engine-CEDSqXfw.js +256 -0
- package/dist/engine-Da4JMNpI.js +7 -0
- package/dist/env-resolve-17ekEU6p.js +10 -0
- package/dist/env-resolve-CiXbWYwe.js +10 -0
- package/dist/env-resolve-CmGWhWXJ.js +115 -0
- package/dist/env-resolve-Z2XF6leB.js +115 -0
- package/dist/extraction-tools-HOZstZ0y.js +91 -0
- package/dist/extraction-tools-m4lmAv7l.js +5 -0
- package/dist/form_data-Cz040rio.js +8657 -0
- package/dist/gmail-watch-setup-Du7DVV7S.js +40 -0
- package/dist/health-B-asI__D.js +6 -0
- package/dist/health-Ds2YlpTB.js +152 -0
- package/dist/heartbeat-engine-BYT5ayQH.js +83 -0
- package/dist/heartbeat-engine-Ut6pXBD6.js +83 -0
- package/dist/hub-9LaKnLjY.js +6 -0
- package/dist/hub-CfwUz9YW.js +515 -0
- package/dist/hub-D0XwdjM-.js +515 -0
- package/dist/hub-LiD5Iztb.js +6 -0
- package/dist/hyperclawbot-CBiDSKsa.js +505 -0
- package/dist/hyperclawbot-zvczQgKx.js +505 -0
- package/dist/inference-0mlFQqIm.js +922 -0
- package/dist/inference-BKVkBREb.js +6 -0
- package/dist/inference-DCXH4Q3x.js +922 -0
- package/dist/inference-SzqFe_nk.js +6 -0
- package/dist/knowledge-graph-DE5lSF02.js +131 -0
- package/dist/knowledge-graph-iBG76fvm.js +131 -0
- package/dist/loader-BkDi8MD9.js +400 -0
- package/dist/loader-CC45xGpC.js +4 -0
- package/dist/loader-CnEdOyjT.js +400 -0
- package/dist/loader-DI2qDRPC.js +4 -0
- package/dist/logger-Cp8wC7F8.js +83 -0
- package/dist/logger-ybOp7VOC.js +83 -0
- package/dist/manager-03ipO9R0.js +105 -0
- package/dist/manager-B2Gls5RG.js +218 -0
- package/dist/manager-BpDfbDjg.js +117 -0
- package/dist/manager-Bxl0sqlh.js +4 -0
- package/dist/manager-CWNSML5D.js +117 -0
- package/dist/manager-CrVDn6eN.js +6 -0
- package/dist/manager-FCgF1plu.js +218 -0
- package/dist/manager-SJe9gt-q.js +4 -0
- package/dist/manager-rgCsaWT1.js +40 -0
- package/dist/mcp-CfoSU4Uz.js +139 -0
- package/dist/mcp-loader-CvxRDtPC.js +94 -0
- package/dist/mcp-loader-DkRBsLpk.js +94 -0
- package/dist/memory-BlHL7JCO.js +4 -0
- package/dist/memory-DsS_eFvJ.js +270 -0
- package/dist/memory-auto-BkvtSFUw.js +5 -0
- package/dist/memory-auto-Bnz_-1wP.js +306 -0
- package/dist/memory-auto-CpQHZlEJ.js +306 -0
- package/dist/memory-auto-Z6LCf-iK.js +5 -0
- package/dist/memory-integration-cSYkZyEo.js +91 -0
- package/dist/memory-integration-g2vxwgoE.js +91 -0
- package/dist/moltbook-BtLDZTfM.js +81 -0
- package/dist/moltbook-Cl8cQfxJ.js +81 -0
- package/dist/node-Dw2Gi-cP.js +222 -0
- package/dist/nodes-registry-B8dmrlLv.js +52 -0
- package/dist/nodes-registry-C9dCFwjh.js +52 -0
- package/dist/oauth-flow-CeaaGAz0.js +150 -0
- package/dist/oauth-flow-DQPvMHRH.js +150 -0
- package/dist/oauth-provider-B4dzn56l.js +110 -0
- package/dist/oauth-provider-Uo4Nib_c.js +110 -0
- package/dist/observability-BV-Yx0V9.js +89 -0
- package/dist/observability-nZ3CBIxG.js +89 -0
- package/dist/onboard-0WoDxbv_.js +10 -0
- package/dist/onboard-BBBWcfhp.js +10 -0
- package/dist/onboard-BXNXCQp4.js +4070 -0
- package/dist/onboard-Bw28IRQ3.js +4070 -0
- package/dist/orchestrator-BovkM63z.js +6 -0
- package/dist/orchestrator-DSbpkP1X.js +189 -0
- package/dist/orchestrator-DmnEvMaL.js +189 -0
- package/dist/orchestrator-RI3bpqqc.js +6 -0
- package/dist/osint-B4_m3VHQ.js +277 -0
- package/dist/pairing-6iM27aD8.js +196 -0
- package/dist/pairing-dGoiGepK.js +4 -0
- package/dist/pc-access-CgCsYrpt.js +8 -0
- package/dist/pc-access-_iH2aorG.js +819 -0
- package/dist/pending-approval-BgNjjuI2.js +22 -0
- package/dist/pending-approval-CUXjysAo.js +22 -0
- package/dist/reminders-store-Drjed_-h.js +58 -0
- package/dist/renderer-BVQrd0_g.js +225 -0
- package/dist/rules-BE4GV6cV.js +103 -0
- package/dist/run-main.js +1639 -460
- package/dist/runner-CJFJUtPm.js +1271 -0
- package/dist/runner-DatMMYYE.js +1271 -0
- package/dist/sdk/index.js +2 -2
- package/dist/sdk/index.mjs +2 -2
- package/dist/security-BqNyT4ID.js +4 -0
- package/dist/security-tpgqPWWH.js +73 -0
- package/dist/server-Brl_HQUB.js +1255 -0
- package/dist/server-D4wVHiX9.js +4 -0
- package/dist/server-Dh3JlBFB.js +1255 -0
- package/dist/server-DhfipkwN.js +4 -0
- package/dist/session-store-BUiPz0Vv.js +5 -0
- package/dist/session-store-is4B6qmD.js +113 -0
- package/dist/sessions-tools-CbUTFe4i.js +5 -0
- package/dist/sessions-tools-CeqD7iil.js +95 -0
- package/dist/skill-loader-BaNLVmJy.js +7 -0
- package/dist/skill-loader-HgpF6Vqs.js +159 -0
- package/dist/skill-runtime-BXWd-Ktf.js +102 -0
- package/dist/skill-runtime-CJN24QPW.js +102 -0
- package/dist/skill-runtime-jgklm02e.js +5 -0
- package/dist/skill-runtime-w1ig_lcw.js +5 -0
- package/dist/src-Bhybpk1J.js +63 -0
- package/dist/src-BxPHKO5x.js +63 -0
- package/dist/src-DIc-L2IG.js +20 -0
- package/dist/src-DMJ4-uqk.js +458 -0
- package/dist/src-g_rNx5rh.js +458 -0
- package/dist/sub-agent-tools-CHQoHz9c.js +39 -0
- package/dist/sub-agent-tools-DHY-4WWM.js +39 -0
- package/dist/theme-DcxwcUgZ.js +180 -0
- package/dist/theme-cx0fkgWC.js +8 -0
- package/dist/tool-policy-CNT-mF2Z.js +189 -0
- package/dist/tool-policy-DZvF8xlQ.js +189 -0
- package/dist/tts-elevenlabs-BRosZv-f.js +61 -0
- package/dist/tts-elevenlabs-C06nUxMK.js +61 -0
- package/dist/update-check-C2Dz85wJ.js +81 -0
- package/dist/update-check-w4XuxVl7.js +81 -0
- package/dist/vision-BMmiIKy7.js +121 -0
- package/dist/vision-JOtOS1Br.js +121 -0
- package/dist/vision-tools-CB28ZCO_.js +5 -0
- package/dist/vision-tools-DVuYc17I.js +51 -0
- package/dist/vision-tools-U3YC4L-g.js +5 -0
- package/dist/vision-tools-vPPwQ-0N.js +51 -0
- package/dist/voice-transcription-B555DbWR.js +138 -0
- package/dist/voice-transcription-DBo5hXmu.js +138 -0
- package/dist/website-watch-tools-DFMrJU-R.js +139 -0
- package/dist/website-watch-tools-Du3W5sN7.js +5 -0
- package/package.json +1 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
const require_orchestrator = require('./orchestrator-DSbpkP1X.js');
|
|
3
|
+
|
|
4
|
+
require_orchestrator.init_orchestrator();
|
|
5
|
+
exports.runMultiStep = require_orchestrator.runMultiStep;
|
|
6
|
+
exports.runMultiStepParallel = require_orchestrator.runMultiStepParallel;
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
|
|
3
|
+
//#region packages/core/src/agent/orchestrator.ts
|
|
4
|
+
/** Parse parallel plan into waves: [['A'], ['B','C'], ['D']] = A then B||C then D. */
|
|
5
|
+
function parseParallelWaves(text) {
|
|
6
|
+
const waves = [];
|
|
7
|
+
const lines = (text || "").trim().split(/\n/);
|
|
8
|
+
for (const line of lines) {
|
|
9
|
+
const m = line.match(/^\s*\d+\.\s*(.+)$/);
|
|
10
|
+
if (!m) continue;
|
|
11
|
+
const parts = m[1].split(/\|/).map((s) => s.trim()).filter(Boolean);
|
|
12
|
+
if (parts.length > 0) waves.push(parts);
|
|
13
|
+
}
|
|
14
|
+
return waves;
|
|
15
|
+
}
|
|
16
|
+
/** Parse "1. X\n2. Y" into step strings. */
|
|
17
|
+
function parseSteps(text) {
|
|
18
|
+
const steps = [];
|
|
19
|
+
const lines = (text || "").trim().split(/\n/);
|
|
20
|
+
for (const line of lines) {
|
|
21
|
+
const m = line.match(/^\s*\d+\.\s*(.+)$/);
|
|
22
|
+
if (m) steps.push(m[1].trim());
|
|
23
|
+
}
|
|
24
|
+
return steps.length > 0 ? steps : [];
|
|
25
|
+
}
|
|
26
|
+
/** Multi-step with retry, session context, checkpointing, error recovery. */
|
|
27
|
+
async function runMultiStep(goal, opts) {
|
|
28
|
+
const { runAgentEngine } = await Promise.resolve().then(() => require("./engine-BJUpRUOv.js"));
|
|
29
|
+
const maxRetries = opts.maxStepRetries ?? 2;
|
|
30
|
+
const checkpointable = opts.checkpointable ?? false;
|
|
31
|
+
let steps;
|
|
32
|
+
let results = [];
|
|
33
|
+
let startIndex = 0;
|
|
34
|
+
if (opts.checkpoint && opts.checkpoint.goal === goal && opts.checkpoint.steps.length > 0) {
|
|
35
|
+
steps = opts.checkpoint.steps;
|
|
36
|
+
results = [...opts.checkpoint.results ?? []];
|
|
37
|
+
startIndex = results.length;
|
|
38
|
+
} else {
|
|
39
|
+
const planOpts = opts.sessionId && opts.appendTranscript ? opts : {
|
|
40
|
+
...opts,
|
|
41
|
+
sessionId: opts.sessionId,
|
|
42
|
+
appendTranscript: opts.appendTranscript
|
|
43
|
+
};
|
|
44
|
+
const planResult = await runAgentEngine(`${PLAN_PROMPT}\n\nGoal: ${goal}`, planOpts);
|
|
45
|
+
steps = parseSteps(planResult.text);
|
|
46
|
+
if (steps.length === 0) return runAgentEngine(goal, opts);
|
|
47
|
+
}
|
|
48
|
+
let lastUsage;
|
|
49
|
+
for (let i = startIndex; i < steps.length; i++) {
|
|
50
|
+
const step = steps[i];
|
|
51
|
+
const ctx = results.length > 0 ? `Previous results:\n${results.map((r, j) => `Step ${j + 1}: ${r.slice(0, 400)}${r.length > 400 ? "..." : ""}`).join("\n")}\n\n` : "";
|
|
52
|
+
const message = `${ctx}Step ${i + 1}: ${step}`;
|
|
53
|
+
let lastErr;
|
|
54
|
+
let stepResult;
|
|
55
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
56
|
+
stepResult = await runAgentEngine(message, opts);
|
|
57
|
+
if (stepResult.usage) lastUsage = stepResult.usage;
|
|
58
|
+
if (!stepResult.error) {
|
|
59
|
+
results.push(stepResult.text);
|
|
60
|
+
if (checkpointable && opts.onCheckpoint) await Promise.resolve(opts.onCheckpoint({
|
|
61
|
+
goal,
|
|
62
|
+
steps,
|
|
63
|
+
completedIndices: [...Array(results.length)].map((_, k) => k),
|
|
64
|
+
results: [...results]
|
|
65
|
+
}));
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
lastErr = stepResult.error;
|
|
69
|
+
if (attempt < maxRetries && opts.onToken) opts.onToken(`[Retry ${attempt + 1}/${maxRetries} for step ${i + 1}…]\n`);
|
|
70
|
+
}
|
|
71
|
+
if (lastErr) {
|
|
72
|
+
const summary$1 = results.length > 0 ? results.map((r, j) => `**Step ${j + 1}**\n${r}`).join("\n\n---\n\n") + `\n\n**Step ${i + 1}** (failed): ${lastErr}` : `Step ${i + 1} failed: ${lastErr}`;
|
|
73
|
+
opts.onDone?.(summary$1);
|
|
74
|
+
return {
|
|
75
|
+
text: summary$1,
|
|
76
|
+
error: lastErr,
|
|
77
|
+
usage: lastUsage
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const summary = results.map((r, i) => `**Step ${i + 1}**\n${r}`).join("\n\n---\n\n");
|
|
82
|
+
opts.onDone?.(summary);
|
|
83
|
+
return {
|
|
84
|
+
text: summary,
|
|
85
|
+
usage: lastUsage
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** Parallel sub-agents: plan waves → run each wave in parallel (Promise.all) → aggregate. */
|
|
89
|
+
async function runMultiStepParallel(goal, opts) {
|
|
90
|
+
const { runAgentEngine } = await Promise.resolve().then(() => require("./engine-BJUpRUOv.js"));
|
|
91
|
+
const planOpts = {
|
|
92
|
+
...opts,
|
|
93
|
+
sessionId: void 0,
|
|
94
|
+
appendTranscript: void 0
|
|
95
|
+
};
|
|
96
|
+
const planResult = await runAgentEngine(`${PARALLEL_PLAN_PROMPT}\n\nGoal: ${goal}`, planOpts);
|
|
97
|
+
const waves = parseParallelWaves(planResult.text);
|
|
98
|
+
if (waves.length === 0) return runAgentEngine(goal, opts);
|
|
99
|
+
const allResults = [];
|
|
100
|
+
let lastUsage = planResult.usage;
|
|
101
|
+
for (let w = 0; w < waves.length; w++) {
|
|
102
|
+
const wave = waves[w];
|
|
103
|
+
const ctx = allResults.length > 0 ? `Previous results:\n${allResults.map((r, j) => `Result ${j + 1}: ${r.slice(0, 300)}${r.length > 300 ? "..." : ""}`).join("\n")}\n\n` : "";
|
|
104
|
+
const messages = wave.map((step, i) => `${ctx}Sub-task ${w + 1}.${i + 1}: ${step}`);
|
|
105
|
+
const runOpts = {
|
|
106
|
+
...opts,
|
|
107
|
+
onToken: void 0,
|
|
108
|
+
onDone: void 0
|
|
109
|
+
};
|
|
110
|
+
const results = await Promise.all(messages.map((msg) => runAgentEngine(msg, runOpts)));
|
|
111
|
+
for (const r of results) {
|
|
112
|
+
if (r.usage) lastUsage = r.usage;
|
|
113
|
+
if (r.error) {
|
|
114
|
+
const summary$1 = allResults.map((r0, j) => `**Sub-agent ${j + 1}**\n${r0}`).join("\n\n---\n\n") + `\n\n**Failed**\n${r.text}`;
|
|
115
|
+
opts.onDone?.(summary$1);
|
|
116
|
+
return {
|
|
117
|
+
text: summary$1,
|
|
118
|
+
error: r.error,
|
|
119
|
+
usage: lastUsage
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
allResults.push(r.text);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const summary = allResults.map((r, i) => `**Sub-agent ${i + 1}**\n${r}`).join("\n\n---\n\n");
|
|
126
|
+
opts.onDone?.(summary);
|
|
127
|
+
return {
|
|
128
|
+
text: summary,
|
|
129
|
+
usage: lastUsage
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** Single-run passthrough (unchanged). */
|
|
133
|
+
async function runWithPlan(message, opts) {
|
|
134
|
+
const { runAgentEngine } = await Promise.resolve().then(() => require("./engine-BJUpRUOv.js"));
|
|
135
|
+
return runAgentEngine(message, opts);
|
|
136
|
+
}
|
|
137
|
+
async function planSteps(goal) {
|
|
138
|
+
const { runAgentEngine } = await Promise.resolve().then(() => require("./engine-BJUpRUOv.js"));
|
|
139
|
+
const r = await runAgentEngine(`${PLAN_PROMPT}\n\nGoal: ${goal}`, {});
|
|
140
|
+
return parseSteps(r.text).map((g) => ({ goal: g }));
|
|
141
|
+
}
|
|
142
|
+
var PLAN_PROMPT, PARALLEL_PLAN_PROMPT;
|
|
143
|
+
var init_orchestrator = require_chunk.__esm({ "packages/core/src/agent/orchestrator.ts"() {
|
|
144
|
+
PLAN_PROMPT = `Break this goal into 1-4 concrete, executable steps. Output ONLY numbered lines.
|
|
145
|
+
Format: 1. step one
|
|
146
|
+
2. step two
|
|
147
|
+
...
|
|
148
|
+
No other text.`;
|
|
149
|
+
PARALLEL_PLAN_PROMPT = `Break this goal into 2-6 steps. Steps that can run IN PARALLEL (independent) put on the SAME line with | between them.
|
|
150
|
+
Format:
|
|
151
|
+
1. step one
|
|
152
|
+
2. step A | step B
|
|
153
|
+
3. step three
|
|
154
|
+
Example: "Compare Python vs Node for APIs" → 1. research Python for APIs | research Node for APIs
|
|
155
|
+
2. summarize comparison
|
|
156
|
+
Output ONLY numbered lines. No other text.`;
|
|
157
|
+
} });
|
|
158
|
+
|
|
159
|
+
//#endregion
|
|
160
|
+
Object.defineProperty(exports, 'init_orchestrator', {
|
|
161
|
+
enumerable: true,
|
|
162
|
+
get: function () {
|
|
163
|
+
return init_orchestrator;
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
Object.defineProperty(exports, 'planSteps', {
|
|
167
|
+
enumerable: true,
|
|
168
|
+
get: function () {
|
|
169
|
+
return planSteps;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
Object.defineProperty(exports, 'runMultiStep', {
|
|
173
|
+
enumerable: true,
|
|
174
|
+
get: function () {
|
|
175
|
+
return runMultiStep;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
Object.defineProperty(exports, 'runMultiStepParallel', {
|
|
179
|
+
enumerable: true,
|
|
180
|
+
get: function () {
|
|
181
|
+
return runMultiStepParallel;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
Object.defineProperty(exports, 'runWithPlan', {
|
|
185
|
+
enumerable: true,
|
|
186
|
+
get: function () {
|
|
187
|
+
return runWithPlan;
|
|
188
|
+
}
|
|
189
|
+
});
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
|
|
3
|
+
//#region packages/core/src/agent/orchestrator.ts
|
|
4
|
+
/** Parse parallel plan into waves: [['A'], ['B','C'], ['D']] = A then B||C then D. */
|
|
5
|
+
function parseParallelWaves(text) {
|
|
6
|
+
const waves = [];
|
|
7
|
+
const lines = (text || "").trim().split(/\n/);
|
|
8
|
+
for (const line of lines) {
|
|
9
|
+
const m = line.match(/^\s*\d+\.\s*(.+)$/);
|
|
10
|
+
if (!m) continue;
|
|
11
|
+
const parts = m[1].split(/\|/).map((s) => s.trim()).filter(Boolean);
|
|
12
|
+
if (parts.length > 0) waves.push(parts);
|
|
13
|
+
}
|
|
14
|
+
return waves;
|
|
15
|
+
}
|
|
16
|
+
/** Parse "1. X\n2. Y" into step strings. */
|
|
17
|
+
function parseSteps(text) {
|
|
18
|
+
const steps = [];
|
|
19
|
+
const lines = (text || "").trim().split(/\n/);
|
|
20
|
+
for (const line of lines) {
|
|
21
|
+
const m = line.match(/^\s*\d+\.\s*(.+)$/);
|
|
22
|
+
if (m) steps.push(m[1].trim());
|
|
23
|
+
}
|
|
24
|
+
return steps.length > 0 ? steps : [];
|
|
25
|
+
}
|
|
26
|
+
/** Multi-step with retry, session context, checkpointing, error recovery. */
|
|
27
|
+
async function runMultiStep(goal, opts) {
|
|
28
|
+
const { runAgentEngine } = await Promise.resolve().then(() => require("./engine-Da4JMNpI.js"));
|
|
29
|
+
const maxRetries = opts.maxStepRetries ?? 2;
|
|
30
|
+
const checkpointable = opts.checkpointable ?? false;
|
|
31
|
+
let steps;
|
|
32
|
+
let results = [];
|
|
33
|
+
let startIndex = 0;
|
|
34
|
+
if (opts.checkpoint && opts.checkpoint.goal === goal && opts.checkpoint.steps.length > 0) {
|
|
35
|
+
steps = opts.checkpoint.steps;
|
|
36
|
+
results = [...opts.checkpoint.results ?? []];
|
|
37
|
+
startIndex = results.length;
|
|
38
|
+
} else {
|
|
39
|
+
const planOpts = opts.sessionId && opts.appendTranscript ? opts : {
|
|
40
|
+
...opts,
|
|
41
|
+
sessionId: opts.sessionId,
|
|
42
|
+
appendTranscript: opts.appendTranscript
|
|
43
|
+
};
|
|
44
|
+
const planResult = await runAgentEngine(`${PLAN_PROMPT}\n\nGoal: ${goal}`, planOpts);
|
|
45
|
+
steps = parseSteps(planResult.text);
|
|
46
|
+
if (steps.length === 0) return runAgentEngine(goal, opts);
|
|
47
|
+
}
|
|
48
|
+
let lastUsage;
|
|
49
|
+
for (let i = startIndex; i < steps.length; i++) {
|
|
50
|
+
const step = steps[i];
|
|
51
|
+
const ctx = results.length > 0 ? `Previous results:\n${results.map((r, j) => `Step ${j + 1}: ${r.slice(0, 400)}${r.length > 400 ? "..." : ""}`).join("\n")}\n\n` : "";
|
|
52
|
+
const message = `${ctx}Step ${i + 1}: ${step}`;
|
|
53
|
+
let lastErr;
|
|
54
|
+
let stepResult;
|
|
55
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
56
|
+
stepResult = await runAgentEngine(message, opts);
|
|
57
|
+
if (stepResult.usage) lastUsage = stepResult.usage;
|
|
58
|
+
if (!stepResult.error) {
|
|
59
|
+
results.push(stepResult.text);
|
|
60
|
+
if (checkpointable && opts.onCheckpoint) await Promise.resolve(opts.onCheckpoint({
|
|
61
|
+
goal,
|
|
62
|
+
steps,
|
|
63
|
+
completedIndices: [...Array(results.length)].map((_, k) => k),
|
|
64
|
+
results: [...results]
|
|
65
|
+
}));
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
lastErr = stepResult.error;
|
|
69
|
+
if (attempt < maxRetries && opts.onToken) opts.onToken(`[Retry ${attempt + 1}/${maxRetries} for step ${i + 1}…]\n`);
|
|
70
|
+
}
|
|
71
|
+
if (lastErr) {
|
|
72
|
+
const summary$1 = results.length > 0 ? results.map((r, j) => `**Step ${j + 1}**\n${r}`).join("\n\n---\n\n") + `\n\n**Step ${i + 1}** (failed): ${lastErr}` : `Step ${i + 1} failed: ${lastErr}`;
|
|
73
|
+
opts.onDone?.(summary$1);
|
|
74
|
+
return {
|
|
75
|
+
text: summary$1,
|
|
76
|
+
error: lastErr,
|
|
77
|
+
usage: lastUsage
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const summary = results.map((r, i) => `**Step ${i + 1}**\n${r}`).join("\n\n---\n\n");
|
|
82
|
+
opts.onDone?.(summary);
|
|
83
|
+
return {
|
|
84
|
+
text: summary,
|
|
85
|
+
usage: lastUsage
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** Parallel sub-agents: plan waves → run each wave in parallel (Promise.all) → aggregate. */
|
|
89
|
+
async function runMultiStepParallel(goal, opts) {
|
|
90
|
+
const { runAgentEngine } = await Promise.resolve().then(() => require("./engine-Da4JMNpI.js"));
|
|
91
|
+
const planOpts = {
|
|
92
|
+
...opts,
|
|
93
|
+
sessionId: void 0,
|
|
94
|
+
appendTranscript: void 0
|
|
95
|
+
};
|
|
96
|
+
const planResult = await runAgentEngine(`${PARALLEL_PLAN_PROMPT}\n\nGoal: ${goal}`, planOpts);
|
|
97
|
+
const waves = parseParallelWaves(planResult.text);
|
|
98
|
+
if (waves.length === 0) return runAgentEngine(goal, opts);
|
|
99
|
+
const allResults = [];
|
|
100
|
+
let lastUsage = planResult.usage;
|
|
101
|
+
for (let w = 0; w < waves.length; w++) {
|
|
102
|
+
const wave = waves[w];
|
|
103
|
+
const ctx = allResults.length > 0 ? `Previous results:\n${allResults.map((r, j) => `Result ${j + 1}: ${r.slice(0, 300)}${r.length > 300 ? "..." : ""}`).join("\n")}\n\n` : "";
|
|
104
|
+
const messages = wave.map((step, i) => `${ctx}Sub-task ${w + 1}.${i + 1}: ${step}`);
|
|
105
|
+
const runOpts = {
|
|
106
|
+
...opts,
|
|
107
|
+
onToken: void 0,
|
|
108
|
+
onDone: void 0
|
|
109
|
+
};
|
|
110
|
+
const results = await Promise.all(messages.map((msg) => runAgentEngine(msg, runOpts)));
|
|
111
|
+
for (const r of results) {
|
|
112
|
+
if (r.usage) lastUsage = r.usage;
|
|
113
|
+
if (r.error) {
|
|
114
|
+
const summary$1 = allResults.map((r0, j) => `**Sub-agent ${j + 1}**\n${r0}`).join("\n\n---\n\n") + `\n\n**Failed**\n${r.text}`;
|
|
115
|
+
opts.onDone?.(summary$1);
|
|
116
|
+
return {
|
|
117
|
+
text: summary$1,
|
|
118
|
+
error: r.error,
|
|
119
|
+
usage: lastUsage
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
allResults.push(r.text);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const summary = allResults.map((r, i) => `**Sub-agent ${i + 1}**\n${r}`).join("\n\n---\n\n");
|
|
126
|
+
opts.onDone?.(summary);
|
|
127
|
+
return {
|
|
128
|
+
text: summary,
|
|
129
|
+
usage: lastUsage
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** Single-run passthrough (unchanged). */
|
|
133
|
+
async function runWithPlan(message, opts) {
|
|
134
|
+
const { runAgentEngine } = await Promise.resolve().then(() => require("./engine-Da4JMNpI.js"));
|
|
135
|
+
return runAgentEngine(message, opts);
|
|
136
|
+
}
|
|
137
|
+
async function planSteps(goal) {
|
|
138
|
+
const { runAgentEngine } = await Promise.resolve().then(() => require("./engine-Da4JMNpI.js"));
|
|
139
|
+
const r = await runAgentEngine(`${PLAN_PROMPT}\n\nGoal: ${goal}`, {});
|
|
140
|
+
return parseSteps(r.text).map((g) => ({ goal: g }));
|
|
141
|
+
}
|
|
142
|
+
var PLAN_PROMPT, PARALLEL_PLAN_PROMPT;
|
|
143
|
+
var init_orchestrator = require_chunk.__esm({ "packages/core/src/agent/orchestrator.ts"() {
|
|
144
|
+
PLAN_PROMPT = `Break this goal into 1-4 concrete, executable steps. Output ONLY numbered lines.
|
|
145
|
+
Format: 1. step one
|
|
146
|
+
2. step two
|
|
147
|
+
...
|
|
148
|
+
No other text.`;
|
|
149
|
+
PARALLEL_PLAN_PROMPT = `Break this goal into 2-6 steps. Steps that can run IN PARALLEL (independent) put on the SAME line with | between them.
|
|
150
|
+
Format:
|
|
151
|
+
1. step one
|
|
152
|
+
2. step A | step B
|
|
153
|
+
3. step three
|
|
154
|
+
Example: "Compare Python vs Node for APIs" → 1. research Python for APIs | research Node for APIs
|
|
155
|
+
2. summarize comparison
|
|
156
|
+
Output ONLY numbered lines. No other text.`;
|
|
157
|
+
} });
|
|
158
|
+
|
|
159
|
+
//#endregion
|
|
160
|
+
Object.defineProperty(exports, 'init_orchestrator', {
|
|
161
|
+
enumerable: true,
|
|
162
|
+
get: function () {
|
|
163
|
+
return init_orchestrator;
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
Object.defineProperty(exports, 'planSteps', {
|
|
167
|
+
enumerable: true,
|
|
168
|
+
get: function () {
|
|
169
|
+
return planSteps;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
Object.defineProperty(exports, 'runMultiStep', {
|
|
173
|
+
enumerable: true,
|
|
174
|
+
get: function () {
|
|
175
|
+
return runMultiStep;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
Object.defineProperty(exports, 'runMultiStepParallel', {
|
|
179
|
+
enumerable: true,
|
|
180
|
+
get: function () {
|
|
181
|
+
return runMultiStepParallel;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
Object.defineProperty(exports, 'runWithPlan', {
|
|
185
|
+
enumerable: true,
|
|
186
|
+
get: function () {
|
|
187
|
+
return runWithPlan;
|
|
188
|
+
}
|
|
189
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
const require_orchestrator = require('./orchestrator-DmnEvMaL.js');
|
|
3
|
+
|
|
4
|
+
require_orchestrator.init_orchestrator();
|
|
5
|
+
exports.runMultiStep = require_orchestrator.runMultiStep;
|
|
6
|
+
exports.runMultiStepParallel = require_orchestrator.runMultiStepParallel;
|
|
@@ -0,0 +1,277 @@
|
|
|
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/osint.ts
|
|
10
|
+
const HC_DIR = path.default.join(os.default.homedir(), ".hyperclaw");
|
|
11
|
+
const CONFIG_FILE = path.default.join(HC_DIR, "hyperclaw.json");
|
|
12
|
+
const OSINT_PROFILE_FILE = path.default.join(HC_DIR, "osint-profile.json");
|
|
13
|
+
const MODE_DESCRIPTIONS = {
|
|
14
|
+
recon: "Passive reconnaissance — WHOIS, DNS, subdomains, public info gathering",
|
|
15
|
+
bugbounty: "Bug bounty workflow — target scope, vulnerability research, report drafting",
|
|
16
|
+
pentest: "Penetration testing — active recon, service enumeration, exploit research",
|
|
17
|
+
footprint: "Digital footprint — social media, email leaks, username tracking",
|
|
18
|
+
custom: "Custom — configure your own tools and system prompt"
|
|
19
|
+
};
|
|
20
|
+
const MODE_SYSTEM_PROMPTS = {
|
|
21
|
+
recon: `You are a professional OSINT analyst specializing in passive reconnaissance.
|
|
22
|
+
Your goal is to gather publicly available information about the target without triggering detection.
|
|
23
|
+
Use DNS lookups, WHOIS data, web scraping, and public databases.
|
|
24
|
+
Always cite sources and stay within legal boundaries.
|
|
25
|
+
Never attempt active exploitation — only passive information gathering.`,
|
|
26
|
+
bugbounty: `You are an experienced bug bounty hunter working within an authorized scope.
|
|
27
|
+
Your goal is to identify security vulnerabilities in web applications and infrastructure.
|
|
28
|
+
Follow responsible disclosure principles. Report findings clearly with reproduction steps.
|
|
29
|
+
Focus on: XSS, SQLi, SSRF, authentication issues, business logic flaws, IDOR.
|
|
30
|
+
Use tools methodically. Document everything for your report.`,
|
|
31
|
+
pentest: `You are a professional penetration tester with explicit written authorization.
|
|
32
|
+
Conduct a thorough security assessment following the PTES methodology.
|
|
33
|
+
Phases: Intelligence Gathering → Scanning → Exploitation → Post-Exploitation → Reporting.
|
|
34
|
+
Document all findings with CVSS scores. Stay within defined scope at all times.
|
|
35
|
+
Never exfiltrate real data — only demonstrate access.`,
|
|
36
|
+
footprint: `You are a digital forensics investigator mapping a target's online presence.
|
|
37
|
+
Your goal is to build a comprehensive profile using only public sources.
|
|
38
|
+
Search social media, data breach databases (HaveIBeenPwned, Dehashed), LinkedIn, GitHub.
|
|
39
|
+
Create a timeline of online activity. Identify connected accounts, email patterns, usernames.
|
|
40
|
+
This is for defensive intelligence gathering and authorized investigations only.`,
|
|
41
|
+
custom: `You are a security researcher with access to OSINT and analysis tools.
|
|
42
|
+
Use available tools to assist with the research task.`
|
|
43
|
+
};
|
|
44
|
+
const MODE_MCP_SERVERS = {
|
|
45
|
+
recon: ["mcp-browser", "mcp-filesystem"],
|
|
46
|
+
bugbounty: [
|
|
47
|
+
"mcp-browser",
|
|
48
|
+
"mcp-filesystem",
|
|
49
|
+
"mcp-github"
|
|
50
|
+
],
|
|
51
|
+
pentest: [
|
|
52
|
+
"mcp-browser",
|
|
53
|
+
"mcp-filesystem",
|
|
54
|
+
"mcp-terminal",
|
|
55
|
+
"mcp-github"
|
|
56
|
+
],
|
|
57
|
+
footprint: ["mcp-browser", "mcp-filesystem"],
|
|
58
|
+
custom: ["mcp-browser", "mcp-filesystem"]
|
|
59
|
+
};
|
|
60
|
+
function printBanner() {
|
|
61
|
+
console.log();
|
|
62
|
+
console.log(chalk.default.red.bold(" ██████╗ ███████╗██╗███╗ ██╗████████╗"));
|
|
63
|
+
console.log(chalk.default.red.bold(" ██╔═══██╗██╔════╝██║████╗ ██║╚══██╔══╝"));
|
|
64
|
+
console.log(chalk.default.yellow.bold(" ██║ ██║███████╗██║██╔██╗ ██║ ██║ "));
|
|
65
|
+
console.log(chalk.default.yellow.bold(" ██║ ██║╚════██║██║██║╚██╗██║ ██║ "));
|
|
66
|
+
console.log(chalk.default.red.bold(" ╚██████╔╝███████║██║██║ ╚████║ ██║ "));
|
|
67
|
+
console.log(chalk.default.red.bold(" ╚═════╝ ╚══════╝╚═╝╚═╝ ╚═══╝ ╚═╝ "));
|
|
68
|
+
console.log();
|
|
69
|
+
console.log(chalk.default.gray(" HyperClaw OSINT / Ethical Hacking Mode"));
|
|
70
|
+
console.log(chalk.default.gray(" ────────────────────────────────────────────"));
|
|
71
|
+
console.log(chalk.default.yellow(" ⚠️ For authorized security research only."));
|
|
72
|
+
console.log(chalk.default.yellow(" ⚠️ Always have explicit written permission."));
|
|
73
|
+
console.log();
|
|
74
|
+
}
|
|
75
|
+
async function osintSetup(options) {
|
|
76
|
+
printBanner();
|
|
77
|
+
if (options.show) {
|
|
78
|
+
try {
|
|
79
|
+
const profile$1 = await fs_extra.default.readJson(OSINT_PROFILE_FILE);
|
|
80
|
+
console.log(chalk.default.cyan.bold(" Current OSINT Profile:\n"));
|
|
81
|
+
console.log(` Mode: ${chalk.default.yellow(profile$1.mode)}`);
|
|
82
|
+
console.log(` Target: ${chalk.default.white(profile$1.target || "(not set)")}`);
|
|
83
|
+
console.log(` Type: ${profile$1.targetType || "N/A"}`);
|
|
84
|
+
console.log(` MCP: ${profile$1.mcpServers.join(", ")}`);
|
|
85
|
+
console.log(` Created: ${profile$1.createdAt}`);
|
|
86
|
+
if (profile$1.notes) console.log(` Notes: ${profile$1.notes}`);
|
|
87
|
+
console.log();
|
|
88
|
+
} catch {
|
|
89
|
+
console.log(chalk.default.gray(" No OSINT profile saved yet. Run: hyperclaw osint setup\n"));
|
|
90
|
+
}
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (options.reset) {
|
|
94
|
+
await fs_extra.default.remove(OSINT_PROFILE_FILE);
|
|
95
|
+
console.log(chalk.default.green(" ✔ OSINT profile cleared.\n"));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
console.log(chalk.default.bold(" Select OSINT workflow:\n"));
|
|
99
|
+
for (const [mode$1, desc] of Object.entries(MODE_DESCRIPTIONS)) console.log(` ${chalk.default.cyan(mode$1.padEnd(12))} ${chalk.default.gray(desc)}`);
|
|
100
|
+
console.log();
|
|
101
|
+
const { mode } = await inquirer.default.prompt([{
|
|
102
|
+
type: "list",
|
|
103
|
+
name: "mode",
|
|
104
|
+
message: "Workflow:",
|
|
105
|
+
choices: Object.keys(MODE_DESCRIPTIONS).map((m) => ({
|
|
106
|
+
name: `${m.padEnd(12)} — ${MODE_DESCRIPTIONS[m]}`,
|
|
107
|
+
value: m
|
|
108
|
+
})),
|
|
109
|
+
default: options.mode || "recon"
|
|
110
|
+
}]);
|
|
111
|
+
const { hasTarget } = await inquirer.default.prompt([{
|
|
112
|
+
type: "confirm",
|
|
113
|
+
name: "hasTarget",
|
|
114
|
+
message: "Set a target for this session?",
|
|
115
|
+
default: true
|
|
116
|
+
}]);
|
|
117
|
+
let target;
|
|
118
|
+
let targetType;
|
|
119
|
+
if (hasTarget) {
|
|
120
|
+
const resp = await inquirer.default.prompt([{
|
|
121
|
+
type: "list",
|
|
122
|
+
name: "targetType",
|
|
123
|
+
message: "Target type:",
|
|
124
|
+
choices: [
|
|
125
|
+
"domain",
|
|
126
|
+
"ip",
|
|
127
|
+
"username",
|
|
128
|
+
"email",
|
|
129
|
+
"org",
|
|
130
|
+
"custom"
|
|
131
|
+
]
|
|
132
|
+
}, {
|
|
133
|
+
type: "input",
|
|
134
|
+
name: "target",
|
|
135
|
+
message: "Target value (e.g. example.com):",
|
|
136
|
+
validate: (v) => v.trim().length > 0 || "Required"
|
|
137
|
+
}]);
|
|
138
|
+
target = resp.target.trim();
|
|
139
|
+
targetType = resp.targetType;
|
|
140
|
+
}
|
|
141
|
+
const { notes } = await inquirer.default.prompt([{
|
|
142
|
+
type: "input",
|
|
143
|
+
name: "notes",
|
|
144
|
+
message: "Session notes (optional, e.g. \"HackerOne program XYZ\"):"
|
|
145
|
+
}]);
|
|
146
|
+
console.log();
|
|
147
|
+
const { confirmed } = await inquirer.default.prompt([{
|
|
148
|
+
type: "confirm",
|
|
149
|
+
name: "confirmed",
|
|
150
|
+
message: chalk.default.yellow("I confirm I have explicit written authorization to test this target."),
|
|
151
|
+
default: false
|
|
152
|
+
}]);
|
|
153
|
+
if (!confirmed) {
|
|
154
|
+
console.log(chalk.default.red("\n Aborted. OSINT mode requires authorization confirmation.\n"));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const spinner = (0, ora.default)("Applying OSINT configuration...").start();
|
|
158
|
+
const mcpServers = MODE_MCP_SERVERS[mode];
|
|
159
|
+
const systemPrompt = MODE_SYSTEM_PROMPTS[mode];
|
|
160
|
+
const profile = {
|
|
161
|
+
mode,
|
|
162
|
+
target,
|
|
163
|
+
targetType,
|
|
164
|
+
notes: notes || void 0,
|
|
165
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
166
|
+
mcpServers,
|
|
167
|
+
systemPromptOverride: systemPrompt
|
|
168
|
+
};
|
|
169
|
+
await fs_extra.default.ensureDir(HC_DIR);
|
|
170
|
+
await fs_extra.default.writeJson(OSINT_PROFILE_FILE, profile, { spaces: 2 });
|
|
171
|
+
let config = {};
|
|
172
|
+
try {
|
|
173
|
+
config = await fs_extra.default.readJson(CONFIG_FILE);
|
|
174
|
+
} catch {}
|
|
175
|
+
if (!config.agent) config.agent = {};
|
|
176
|
+
const agent = config.agent;
|
|
177
|
+
agent.systemPromptOverride = systemPrompt;
|
|
178
|
+
agent.osintMode = mode;
|
|
179
|
+
if (target) agent.osintTarget = `${targetType}: ${target}`;
|
|
180
|
+
const mcpFile = path.default.join(HC_DIR, "mcp-servers.json");
|
|
181
|
+
let mcpServersJson = [];
|
|
182
|
+
try {
|
|
183
|
+
mcpServersJson = await fs_extra.default.readJson(mcpFile);
|
|
184
|
+
} catch {}
|
|
185
|
+
const extensionsDir = path.default.join(path.default.dirname(CONFIG_FILE), "..", "..");
|
|
186
|
+
const serverDefs = {
|
|
187
|
+
"mcp-filesystem": {
|
|
188
|
+
command: `node ${path.default.join(process.cwd(), "extensions/mcp-filesystem/server.mjs")}`,
|
|
189
|
+
label: "Filesystem (OSINT)"
|
|
190
|
+
},
|
|
191
|
+
"mcp-browser": {
|
|
192
|
+
command: `node ${path.default.join(process.cwd(), "extensions/mcp-browser/server.mjs")}`,
|
|
193
|
+
label: "Browser/Web (OSINT)"
|
|
194
|
+
},
|
|
195
|
+
"mcp-terminal": {
|
|
196
|
+
command: `node ${path.default.join(process.cwd(), "extensions/mcp-terminal/server.mjs")}`,
|
|
197
|
+
label: "Terminal (OSINT)"
|
|
198
|
+
},
|
|
199
|
+
"mcp-github": {
|
|
200
|
+
command: `node ${path.default.join(process.cwd(), "extensions/mcp-github/server.mjs")}`,
|
|
201
|
+
label: "GitHub (OSINT)"
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
for (const serverId of mcpServers) {
|
|
205
|
+
const already = mcpServersJson.find((s) => s.id === serverId);
|
|
206
|
+
if (!already && serverDefs[serverId]) mcpServersJson.push({
|
|
207
|
+
id: serverId,
|
|
208
|
+
name: serverDefs[serverId].label,
|
|
209
|
+
transport: "stdio",
|
|
210
|
+
command: serverDefs[serverId].command,
|
|
211
|
+
enabled: true,
|
|
212
|
+
addedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
213
|
+
});
|
|
214
|
+
else if (already) already.enabled = true;
|
|
215
|
+
}
|
|
216
|
+
await fs_extra.default.ensureDir(path.default.dirname(mcpFile));
|
|
217
|
+
await fs_extra.default.writeJson(mcpFile, mcpServersJson, { spaces: 2 });
|
|
218
|
+
await fs_extra.default.writeJson(CONFIG_FILE, config, { spaces: 2 });
|
|
219
|
+
spinner.succeed("OSINT configuration applied");
|
|
220
|
+
console.log();
|
|
221
|
+
console.log(chalk.default.bold.cyan(" ✔ HyperClaw is now in OSINT mode:\n"));
|
|
222
|
+
console.log(` Workflow: ${chalk.default.yellow(mode)}`);
|
|
223
|
+
if (target) console.log(` Target: ${chalk.default.white(target)} ${chalk.default.gray(`(${targetType})`)}`);
|
|
224
|
+
console.log(` MCP: ${chalk.default.cyan(mcpServers.join(", "))}`);
|
|
225
|
+
console.log();
|
|
226
|
+
console.log(chalk.default.bold(" Start your session:"));
|
|
227
|
+
console.log(` ${chalk.default.cyan("hyperclaw daemon start")} — start the assistant`);
|
|
228
|
+
console.log(` ${chalk.default.cyan("hyperclaw agent --message \"...\"")} — send a message from CLI`);
|
|
229
|
+
console.log();
|
|
230
|
+
console.log(chalk.default.bold(" Example prompts:"));
|
|
231
|
+
if (mode === "recon" && target) {
|
|
232
|
+
console.log(chalk.default.gray(` "Perform passive recon on ${target}: WHOIS, DNS, subdomains"`));
|
|
233
|
+
console.log(chalk.default.gray(` "Find all public GitHub repos for ${target}"`));
|
|
234
|
+
console.log(chalk.default.gray(` "Search for email addresses associated with ${target}"`));
|
|
235
|
+
} else if (mode === "bugbounty") {
|
|
236
|
+
console.log(chalk.default.gray(` "What are common vulnerabilities in web login forms?"`));
|
|
237
|
+
console.log(chalk.default.gray(` "Draft a bug bounty report for an XSS vulnerability"`));
|
|
238
|
+
console.log(chalk.default.gray(` "Help me test for SSRF on the /api/fetch endpoint"`));
|
|
239
|
+
} else if (mode === "pentest") {
|
|
240
|
+
console.log(chalk.default.gray(` "Create a pentest report template for a web application"`));
|
|
241
|
+
console.log(chalk.default.gray(` "What ports should I check on a Linux server?"`));
|
|
242
|
+
console.log(chalk.default.gray(` "Explain how to test for SQLi safely in a controlled environment"`));
|
|
243
|
+
} else if (mode === "footprint") {
|
|
244
|
+
console.log(chalk.default.gray(` "Search for the digital footprint of the username 'target_user'"`));
|
|
245
|
+
console.log(chalk.default.gray(` "Check HaveIBeenPwned for emails from domain example.com"`));
|
|
246
|
+
}
|
|
247
|
+
console.log();
|
|
248
|
+
console.log(chalk.default.gray(" To view profile: hyperclaw osint --show"));
|
|
249
|
+
console.log(chalk.default.gray(" To reset: hyperclaw osint --reset"));
|
|
250
|
+
console.log();
|
|
251
|
+
}
|
|
252
|
+
async function osintQuickStart(mode) {
|
|
253
|
+
printBanner();
|
|
254
|
+
console.log(chalk.default.bold(" Available OSINT workflows:\n"));
|
|
255
|
+
for (const [m, desc] of Object.entries(MODE_DESCRIPTIONS)) {
|
|
256
|
+
const isActive = m === mode;
|
|
257
|
+
const bullet = isActive ? chalk.default.green("▶") : chalk.default.gray("○");
|
|
258
|
+
console.log(` ${bullet} ${chalk.default.cyan(m.padEnd(12))} ${chalk.default.white(desc)}`);
|
|
259
|
+
}
|
|
260
|
+
console.log();
|
|
261
|
+
console.log(chalk.default.bold(" Commands:\n"));
|
|
262
|
+
console.log(` ${chalk.default.cyan("hyperclaw osint setup")} — interactive OSINT session setup`);
|
|
263
|
+
console.log(` ${chalk.default.cyan("hyperclaw osint --show")} — show current profile`);
|
|
264
|
+
console.log(` ${chalk.default.cyan("hyperclaw osint --reset")} — clear OSINT profile`);
|
|
265
|
+
console.log();
|
|
266
|
+
console.log(chalk.default.bold(" MCP servers for OSINT:\n"));
|
|
267
|
+
console.log(` ${chalk.default.cyan("mcp-browser")} — web_fetch, web_search, dns_lookup, whois_lookup, extract_links`);
|
|
268
|
+
console.log(` ${chalk.default.cyan("mcp-filesystem")} — read_file, write_file, search_files (for saving reports)`);
|
|
269
|
+
console.log(` ${chalk.default.cyan("mcp-github")} — list_repos, search_code, get_file`);
|
|
270
|
+
console.log(` ${chalk.default.cyan("mcp-terminal")} — run_command (pentest mode only, requires authorization)`);
|
|
271
|
+
console.log();
|
|
272
|
+
console.log(chalk.default.yellow(" ⚠️ Always operate within authorized scope and applicable laws.\n"));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
//#endregion
|
|
276
|
+
exports.osintQuickStart = osintQuickStart;
|
|
277
|
+
exports.osintSetup = osintSetup;
|