hyperclaw 5.4.1 → 5.4.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 (135) hide show
  1. package/dist/a2ui-protocol-CUqdJGh7.js +75 -0
  2. package/dist/agents-routing-B0D0vcp5.js +424 -0
  3. package/dist/agents-routing-BC6GndVe.js +7 -0
  4. package/dist/agents-routing-CyFBHvyk.js +424 -0
  5. package/dist/agents-routing-DdpszaMx.js +7 -0
  6. package/dist/api-key-validation-DrMrLEa0.js +66 -0
  7. package/dist/api-keys-guide-DmKF7tB-.js +149 -0
  8. package/dist/audit-Q-Uy5nem.js +445 -0
  9. package/dist/backup-CtHJEqGr.js +86 -0
  10. package/dist/banner-DYzQ8cCb.js +143 -0
  11. package/dist/banner-jW84OrYg.js +7 -0
  12. package/dist/bounty-tools-CCwY61YO.js +211 -0
  13. package/dist/chat-CJa0ph8c.js +528 -0
  14. package/dist/chat-CKnfxa1-.js +528 -0
  15. package/dist/chat-CQKCIrIY.js +528 -0
  16. package/dist/chat-npW_ZOmo.js +528 -0
  17. package/dist/claw-tasks-Dq38PrL5.js +80 -0
  18. package/dist/config-BzK_Xl4Y.js +261 -0
  19. package/dist/config-ClsdlpXc.js +261 -0
  20. package/dist/config-Dm394B6X.js +7 -0
  21. package/dist/config-SiLqEezw.js +7 -0
  22. package/dist/connector-BYPxgmsD.js +312 -0
  23. package/dist/cost-tracker-x9E8VKtk.js +103 -0
  24. package/dist/credentials-store-Ddhgmbpz.js +7 -0
  25. package/dist/credentials-store-onL1tYct.js +89 -0
  26. package/dist/cron-tasks-CF4MJoIU.js +89 -0
  27. package/dist/daemon-ApB1nMs2.js +421 -0
  28. package/dist/daemon-B2ghXB-I.js +7 -0
  29. package/dist/daemon-BldYSrDj.js +421 -0
  30. package/dist/daemon-BqTcxMZe.js +7 -0
  31. package/dist/daemon-CivMFYkD.js +7 -0
  32. package/dist/daemon-DBXFUMue.js +421 -0
  33. package/dist/delivery-BURWi8wu.js +4 -0
  34. package/dist/delivery-kZ2mVkU5.js +95 -0
  35. package/dist/destructive-gate-C1ny9ek2.js +116 -0
  36. package/dist/engine-B-JvIt_Y.js +7 -0
  37. package/dist/engine-BGZnBZ4m.js +7 -0
  38. package/dist/engine-BTSXJNba.js +346 -0
  39. package/dist/engine-C7LyH310.js +353 -0
  40. package/dist/engine-C_nC_Ioe.js +351 -0
  41. package/dist/engine-DCtJSbKU.js +7 -0
  42. package/dist/env-resolve-C0R8R7pb.js +167 -0
  43. package/dist/env-resolve-Dr-KfTtw.js +11 -0
  44. package/dist/gmail-watch-setup-BzbG0ICM.js +42 -0
  45. package/dist/heartbeat-engine-B9bhAHNi.js +89 -0
  46. package/dist/hyperclawbot-BEm8_87h.js +516 -0
  47. package/dist/hyperclawbot-DR6BgI_d.js +516 -0
  48. package/dist/hyperclawbot-hZv4pde0.js +516 -0
  49. package/dist/inference-C874-2MI.js +8 -0
  50. package/dist/inference-DCSz6Sb1.js +2880 -0
  51. package/dist/knowledge-graph-BiIvoxPt.js +134 -0
  52. package/dist/loader-DMMb9emn.js +410 -0
  53. package/dist/loader-JktrmJOG.js +6 -0
  54. package/dist/logger-Oty9sC13.js +86 -0
  55. package/dist/manager-BIc6zzZV.js +250 -0
  56. package/dist/manager-BwobWy0l.js +120 -0
  57. package/dist/mcp-CI2F3m8G.js +142 -0
  58. package/dist/mcp-loader-C-21ynRH.js +93 -0
  59. package/dist/mcp-loader-Di7n__ta.js +93 -0
  60. package/dist/memory-auto-BVCJeTwd.js +306 -0
  61. package/dist/memory-auto-DXKe2ayf.js +5 -0
  62. package/dist/memory-integration-D2RvZ-MB.js +91 -0
  63. package/dist/moltbook-DvV6GFFL.js +81 -0
  64. package/dist/node-DFKhz7Zn.js +251 -0
  65. package/dist/node-pending-queue-CIMXPU6K.js +32 -0
  66. package/dist/nodes-registry-BeiEjd9U.js +52 -0
  67. package/dist/oauth-flow-CZOsvU1v.js +148 -0
  68. package/dist/oauth-provider-Dk-6BmGL.js +111 -0
  69. package/dist/observability-B3dDQSdI.js +89 -0
  70. package/dist/onboard-BnyHie0K.js +14 -0
  71. package/dist/onboard-D-5gWzH0.js +3854 -0
  72. package/dist/onboard-D9pjgaVR.js +3854 -0
  73. package/dist/onboard-UhWVcTap.js +14 -0
  74. package/dist/onboard-W5DsxVf2.js +3854 -0
  75. package/dist/onboard-YszvVNgS.js +14 -0
  76. package/dist/onboard-pLDBUBpO.js +14 -0
  77. package/dist/onboard-zISipu-l.js +3854 -0
  78. package/dist/orchestrator-C0t11xj7.js +189 -0
  79. package/dist/orchestrator-CA4eKeGn.js +189 -0
  80. package/dist/orchestrator-CNxTIlOK.js +189 -0
  81. package/dist/orchestrator-Cg1vgEHb.js +6 -0
  82. package/dist/orchestrator-DV5t6wQ0.js +6 -0
  83. package/dist/orchestrator-eT0ZL4yl.js +6 -0
  84. package/dist/osint-47yIek6w.js +283 -0
  85. package/dist/osint-c-xDjLb-.js +283 -0
  86. package/dist/osint-chat-BJgnkFDm.js +789 -0
  87. package/dist/osint-chat-C09BvbGy.js +789 -0
  88. package/dist/osint-chat-zdeaaw7a.js +789 -0
  89. package/dist/osint-e6oBrtlj.js +283 -0
  90. package/dist/pending-approval-CEu_-DGQ.js +22 -0
  91. package/dist/providers-BfW-fgpw.js +5 -0
  92. package/dist/providers-Cs1h_TJA.js +1137 -0
  93. package/dist/renderer-B_ew6jRs.js +228 -0
  94. package/dist/rules-BAYXiKiJ.js +106 -0
  95. package/dist/run-main.js +112 -77
  96. package/dist/runner-B5uo6C5q.js +1310 -0
  97. package/dist/search-tools-DXVuVXW_.js +107 -0
  98. package/dist/server-BJkDIs8Z.js +1467 -0
  99. package/dist/server-CtFoXM88.js +4 -0
  100. package/dist/server-DVxVLu_G.js +1467 -0
  101. package/dist/server-DZj6Nobr.js +1467 -0
  102. package/dist/server-Diu80smx.js +4 -0
  103. package/dist/server-DszV63tu.js +4 -0
  104. package/dist/skill-runtime-BLkXA1mO.js +104 -0
  105. package/dist/skill-runtime-BMk-h6Dl.js +5 -0
  106. package/dist/skill-runtime-BaTX-RGy.js +5 -0
  107. package/dist/skill-runtime-CB9tnc-P.js +104 -0
  108. package/dist/skill-runtime-D6-rGzX1.js +104 -0
  109. package/dist/skill-runtime-Dej1Yr5V.js +5 -0
  110. package/dist/src-6dmkVQGq.js +63 -0
  111. package/dist/src-7yBXPAs6.js +315 -0
  112. package/dist/src-BOnuFlI4.js +23 -0
  113. package/dist/src-BkEtHLLy.js +462 -0
  114. package/dist/src-CDeWGebw.js +315 -0
  115. package/dist/src-CNAVUFC6.js +462 -0
  116. package/dist/src-DB6dPsbY.js +63 -0
  117. package/dist/src-DE4mH0BB.js +63 -0
  118. package/dist/src-krHV0uVj.js +315 -0
  119. package/dist/src-tF0sBtr3.js +462 -0
  120. package/dist/sub-agent-tools-BwOxHu6f.js +39 -0
  121. package/dist/sub-agent-tools-CJVEIF1F.js +39 -0
  122. package/dist/sub-agent-tools-f4X1M-li.js +39 -0
  123. package/dist/tool-policy-CfWEnRxy.js +190 -0
  124. package/dist/tts-elevenlabs-CCeOqqrh.js +64 -0
  125. package/dist/vision-BMRKyu3c.js +167 -0
  126. package/dist/vision-tools-DVYx9-Jw.js +5 -0
  127. package/dist/vision-tools-kYb3effk.js +51 -0
  128. package/dist/voice-transcription-B1D1rpca.js +170 -0
  129. package/package.json +1 -1
  130. package/static/chat.html +18 -4
  131. package/static/web/assets/index-D2ekZ-uM.js +75 -0
  132. package/static/web/assets/index-D_9lvvup.css +1 -0
  133. package/static/web/index.html +2 -2
  134. package/static/web/assets/index-8bDizzaq.js +0 -75
  135. package/static/web/assets/index-B5N1LHGR.css +0 -1
@@ -0,0 +1,346 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const require_paths = require('./paths-AIyBxIzm.js');
3
+ const require_src = require('./src-lltU5gkh.js');
4
+ const fs_extra = require_chunk.__toESM(require("fs-extra"));
5
+ const path = require_chunk.__toESM(require("path"));
6
+
7
+ //#region packages/core/src/agent/engine.ts
8
+ /**
9
+
10
+ * Load workspace context: SOUL, AGENTS, MEMORY + custom .md
11
+
12
+ */
13
+ async function loadWorkspaceContext(hcDir) {
14
+ const dir = hcDir || require_paths.getHyperClawDir();
15
+ let context = "";
16
+ const core = [
17
+ "SOUL.md",
18
+ "AGENTS.md",
19
+ "MEMORY.md"
20
+ ];
21
+ for (const f of core) {
22
+ const fp = path.default.join(dir, f);
23
+ try {
24
+ context += `## ${f}\n${fs_extra.default.readFileSync(fp, "utf8")}\n\n`;
25
+ } catch {}
26
+ }
27
+ try {
28
+ const entries = fs_extra.default.readdirSync(dir);
29
+ for (const f of entries) if (f.endsWith(".md") && !core.includes(f)) {
30
+ const fp = path.default.join(dir, f);
31
+ try {
32
+ context += `## ${f}\n${fs_extra.default.readFileSync(fp, "utf8")}\n\n`;
33
+ } catch {}
34
+ }
35
+ } catch {}
36
+ return context;
37
+ }
38
+ /**
39
+
40
+ * Load skills context (bundled + workspace)
41
+
42
+ */
43
+ async function loadSkillsContext() {
44
+ const { loadSkills, buildSkillsContext } = await Promise.resolve().then(() => require("./skill-loader-DVpEgYV2.js"));
45
+ const skills = await loadSkills();
46
+ return skills.length > 0 ? buildSkillsContext(skills) : "";
47
+ }
48
+ /**
49
+
50
+ * Resolve tools with policy, PC access, elevation.
51
+
52
+ */
53
+ async function resolveTools(opts) {
54
+ const { config, source, elevated, sessionId, daemonMode, activeServer } = opts;
55
+ const cfg = config;
56
+ const sandboxNonMain = cfg?.agents?.defaults?.sandbox?.mode === "non-main" && source && CHANNEL_SOURCES.includes(source);
57
+ const { loadPCAccessConfig, getPCAccessTools } = await Promise.resolve().then(() => require("./pc-access-CAoM6WN4.js"));
58
+ const pcCfg = await loadPCAccessConfig({ daemonMode });
59
+ const dockerSandbox = cfg?.tools?.dockerSandbox?.enabled === true;
60
+ const pcTools = pcCfg.enabled && (!sandboxNonMain || elevated) ? getPCAccessTools({ dockerSandbox }) : [];
61
+ const { getSessionsTools } = await Promise.resolve().then(() => require("./sessions-tools-JHSZ6Bns.js"));
62
+ const sessionsTools = getSessionsTools(() => activeServer ?? null, sessionId);
63
+ const { InferenceEngine, getBuiltinTools } = await Promise.resolve().then(() => require("./inference-C874-2MI.js"));
64
+ const { getSubAgentTools } = await Promise.resolve().then(() => require("./sub-agent-tools-CJVEIF1F.js"));
65
+ const { getBrowserTools } = await Promise.resolve().then(() => require("./browser-tools-Ay-wU_a4.js"));
66
+ const { getExtractionTools } = await Promise.resolve().then(() => require("./extraction-tools-BjzXD9LW.js"));
67
+ const { getWebsiteWatchTools } = await Promise.resolve().then(() => require("./website-watch-tools-CSSEu3Qy.js"));
68
+ const { getVisionTools } = await Promise.resolve().then(() => require("./vision-tools-DVYx9-Jw.js"));
69
+ const { getBountyTools } = await Promise.resolve().then(() => require("./bounty-tools-CCwY61YO.js"));
70
+ const { getSearchTools } = await Promise.resolve().then(() => require("./search-tools-DXVuVXW_.js"));
71
+ const { getMultiAgentTools } = await Promise.resolve().then(() => require("./multi-agent-tools-jzfvT4zP.js"));
72
+ const { loadMCPTools } = await Promise.resolve().then(() => require("./mcp-loader-Di7n__ta.js"));
73
+ const { applyToolPolicy } = await Promise.resolve().then(() => require("./tool-policy-CfWEnRxy.js"));
74
+ const CUSTOM_BASEURL_PROVIDERS = new Set([
75
+ "groq",
76
+ "mistral",
77
+ "deepseek",
78
+ "perplexity",
79
+ "huggingface",
80
+ "ollama",
81
+ "lmstudio",
82
+ "local",
83
+ "xai",
84
+ "openai",
85
+ "google",
86
+ "minimax",
87
+ "moonshot",
88
+ "qwen",
89
+ "zai",
90
+ "litellm",
91
+ "cloudflare",
92
+ "copilot",
93
+ "vercel-ai",
94
+ "opencode-zen",
95
+ "opencode-go"
96
+ ]);
97
+ const isLocal = cfg?.provider?.providerId === "local" || cfg?.provider?.providerId === "ollama" || cfg?.provider?.providerId === "lmstudio";
98
+ const provider = cfg?.provider?.providerId === "anthropic" || cfg?.provider?.providerId === "anthropic-oauth" || cfg?.provider?.providerId === "anthropic-setup-token" ? "anthropic" : cfg?.provider?.providerId === "custom" || isLocal || CUSTOM_BASEURL_PROVIDERS.has(cfg?.provider?.providerId ?? "") ? "custom" : "openrouter";
99
+ const visionProvider = cfg?.provider?.providerId === "custom" || isLocal ? "openrouter" : provider === "anthropic" ? "anthropic" : "openrouter";
100
+ const apiKey = await (await Promise.resolve().then(() => require("./env-resolve-Dr-KfTtw.js"))).getProviderCredentialAsync(cfg);
101
+ const visionTools = getVisionTools({
102
+ apiKey: apiKey || "",
103
+ provider: visionProvider
104
+ });
105
+ const bountyTools = getBountyTools(cfg);
106
+ const searchTools = getSearchTools(cfg);
107
+ const multiAgentTools = getMultiAgentTools(cfg);
108
+ let skillInvokeTools = [];
109
+ try {
110
+ const { loadSkills } = await Promise.resolve().then(() => require("./skill-loader-DVpEgYV2.js"));
111
+ const { getSkillInvokeTools } = await Promise.resolve().then(() => require("./skill-runtime-Dej1Yr5V.js"));
112
+ const loaded = await loadSkills();
113
+ skillInvokeTools = getSkillInvokeTools(loaded);
114
+ } catch (e) {
115
+ if (typeof process !== "undefined" && process.env?.DEBUG) console.error("[engine] loadSkills failed:", e?.message ?? e);
116
+ }
117
+ let allTools = [
118
+ ...getBuiltinTools(),
119
+ ...getSubAgentTools(),
120
+ ...sessionsTools,
121
+ ...pcTools,
122
+ ...getBrowserTools(),
123
+ ...getExtractionTools(),
124
+ ...getWebsiteWatchTools(),
125
+ ...visionTools,
126
+ ...bountyTools,
127
+ ...searchTools,
128
+ ...multiAgentTools,
129
+ ...skillInvokeTools
130
+ ];
131
+ try {
132
+ const mcpTools = await loadMCPTools();
133
+ if (mcpTools.length > 0) allTools = [...allTools, ...mcpTools];
134
+ } catch {}
135
+ const policyConfig = cfg?.tools ? {
136
+ profile: cfg.tools.profile,
137
+ allow: cfg.tools.allow ?? cfg.tools.allowlist,
138
+ deny: cfg.tools.deny ?? cfg.tools.blocklist,
139
+ byProvider: cfg.tools.byProvider
140
+ } : void 0;
141
+ let tools = applyToolPolicy(allTools, policyConfig, {
142
+ provider: cfg?.provider?.providerId === "anthropic" ? "anthropic" : "openrouter",
143
+ model: cfg?.provider?.modelId
144
+ });
145
+ const { applyDestructiveGate } = await Promise.resolve().then(() => require("./destructive-gate-C1ny9ek2.js"));
146
+ tools = applyDestructiveGate(tools, {
147
+ elevated: elevated ?? false,
148
+ source,
149
+ sessionId
150
+ });
151
+ return tools;
152
+ }
153
+ /**
154
+
155
+ * Run agent: context + tools + inference.
156
+
157
+ */
158
+ async function runAgentEngine(message, opts) {
159
+ const cfg = await fs_extra.default.readJson(require_paths.getConfigPath()).catch(() => ({}));
160
+ const CUSTOM_BASEURL_IDS = new Set([
161
+ "groq",
162
+ "mistral",
163
+ "deepseek",
164
+ "perplexity",
165
+ "huggingface",
166
+ "ollama",
167
+ "lmstudio",
168
+ "local",
169
+ "xai",
170
+ "openai",
171
+ "google",
172
+ "minimax",
173
+ "moonshot",
174
+ "qwen",
175
+ "zai",
176
+ "litellm",
177
+ "cloudflare",
178
+ "copilot",
179
+ "vercel-ai",
180
+ "opencode-zen",
181
+ "opencode-go"
182
+ ]);
183
+ const isLocalProvider = cfg?.provider?.providerId === "local" || cfg?.provider?.providerId === "ollama" || cfg?.provider?.providerId === "lmstudio";
184
+ const apiKey = await (await Promise.resolve().then(() => require("./env-resolve-Dr-KfTtw.js"))).getProviderCredentialAsync(cfg);
185
+ if (!apiKey && !isLocalProvider) return {
186
+ text: "No API key configured. Run: hyperclaw config set-key",
187
+ error: "no_api_key"
188
+ };
189
+ const { getProvider } = await Promise.resolve().then(() => require("./providers-DrZP0NeR.js"));
190
+ const providerMeta = getProvider(cfg?.provider?.providerId ?? "");
191
+ const registryBaseUrl = providerMeta?.baseUrl;
192
+ const sid = opts.sessionId;
193
+ const sessionKey = opts.sessionKey;
194
+ const effectiveKey = sessionKey || sid;
195
+ if (sessionKey && !opts.getTranscript && !opts.appendTranscript) console.warn("[engine] sessionKey provided but getTranscript/appendTranscript missing — session continuity disabled");
196
+ const userContent = opts.imageBlocks?.length ? [...message ? [{
197
+ type: "text",
198
+ text: message
199
+ }] : [], ...opts.imageBlocks.map((img) => ({
200
+ type: "image",
201
+ source: {
202
+ type: "base64",
203
+ media_type: img.mimeType || "image/png",
204
+ data: img.data
205
+ }
206
+ }))] : message;
207
+ let messagesForInference = [{
208
+ role: "user",
209
+ content: userContent
210
+ }];
211
+ if (effectiveKey && opts.getTranscript) try {
212
+ const restored = await opts.getTranscript(effectiveKey);
213
+ if (restored && restored.length > 0) {
214
+ const valid = restored.filter((t) => (t.role === "user" || t.role === "assistant") && typeof t.content === "string");
215
+ messagesForInference = [...valid, {
216
+ role: "user",
217
+ content: userContent
218
+ }];
219
+ }
220
+ } catch (e) {
221
+ console.warn("[engine] Failed to restore transcript for", effectiveKey, e.message);
222
+ }
223
+ if (effectiveKey && opts.appendTranscript) opts.appendTranscript(effectiveKey, "user", message, opts.source);
224
+ let context = await loadWorkspaceContext(opts.workspace);
225
+ try {
226
+ const { getContextSummary } = await Promise.resolve().then(() => require("./knowledge-graph-BiIvoxPt.js"));
227
+ const kg = await getContextSummary(25);
228
+ if (kg) context += kg + "\n\n";
229
+ } catch {}
230
+ context += await loadSkillsContext();
231
+ const serviceKeys = cfg?.skills?.apiKeys ? Object.keys(cfg.skills.apiKeys) : [];
232
+ if (serviceKeys.length > 0) context += `\n## Service API Keys (configured)\nAvailable for research/skills: ${serviceKeys.join(", ")}. Use hackerone_list_programs, bugcrowd_list_programs, synack_list_targets when applicable, or create_skill for custom integrations.\n\n`;
233
+ const tools = await resolveTools({
234
+ config: cfg,
235
+ source: opts.source,
236
+ elevated: opts.elevated,
237
+ sessionId: sid,
238
+ daemonMode: opts.daemonMode,
239
+ activeServer: opts.activeServer
240
+ });
241
+ const rawModel = opts.modelOverride || cfg?.provider?.modelId || "claude-sonnet-4-5";
242
+ const isLocal2 = cfg?.provider?.providerId === "local" || cfg?.provider?.providerId === "ollama" || cfg?.provider?.providerId === "lmstudio";
243
+ const model = rawModel.startsWith("ollama/") ? rawModel.slice(7) : rawModel;
244
+ const isAnthropicVariant = cfg?.provider?.providerId === "anthropic" || cfg?.provider?.providerId === "anthropic-oauth" || cfg?.provider?.providerId === "anthropic-setup-token";
245
+ const provider = isAnthropicVariant ? "anthropic" : cfg?.provider?.providerId === "custom" || isLocal2 || CUSTOM_BASEURL_IDS.has(cfg?.provider?.providerId ?? "") ? "custom" : "openrouter";
246
+ const resolvedBaseUrl = cfg?.provider?.baseUrl || registryBaseUrl || (isLocal2 ? "http://localhost:11434/v1" : void 0);
247
+ const ollamaBaseUrl = isLocal2 ? cfg?.provider?.baseUrl || "http://localhost:11434/v1" : void 0;
248
+ const thinkingBudget = opts.thinkingBudget ?? 0;
249
+ const maxTokens = thinkingBudget > 0 ? thinkingBudget + 4096 : 4096;
250
+ try {
251
+ const { InferenceEngine } = await Promise.resolve().then(() => require("./inference-C874-2MI.js"));
252
+ const engineOpts = {
253
+ model,
254
+ apiKey,
255
+ provider,
256
+ system: context || void 0,
257
+ tools,
258
+ maxTokens,
259
+ onToken: opts.onToken ?? (() => {}),
260
+ onThinking: opts.onThinking,
261
+ onToolCall: opts.onToolCall,
262
+ onToolResult: opts.onToolResult,
263
+ ...provider === "custom" ? { baseUrl: ollamaBaseUrl || resolvedBaseUrl || "" } : {},
264
+ ...thinkingBudget > 0 && (model.includes("claude") || model.includes("anthropic")) ? { thinking: { budget_tokens: thinkingBudget } } : {}
265
+ };
266
+ const engine = new InferenceEngine(engineOpts);
267
+ const result = await engine.run(messagesForInference);
268
+ const text = result.text || "(empty)";
269
+ if (effectiveKey && opts.appendTranscript) opts.appendTranscript(effectiveKey, "assistant", text, opts.source);
270
+ try {
271
+ const { AutoMemory } = await Promise.resolve().then(() => require("./memory-auto-DXKe2ayf.js"));
272
+ const mem = new AutoMemory({ extractEveryNTurns: 1 });
273
+ mem.addTurn("user", message);
274
+ mem.addTurn("assistant", text);
275
+ await mem.extract();
276
+ } catch {}
277
+ opts.onDone?.(text);
278
+ opts.onRunEnd?.(result.usage);
279
+ return {
280
+ text,
281
+ usage: result.usage
282
+ };
283
+ } catch (e) {
284
+ const errText = `Error: ${e.message}`;
285
+ opts.onDone?.(errText);
286
+ opts.onRunEnd?.(void 0, e.message);
287
+ return {
288
+ text: errText,
289
+ error: e.message
290
+ };
291
+ }
292
+ }
293
+ var CHANNEL_SOURCES;
294
+ var init_engine = require_chunk.__esm({ "packages/core/src/agent/engine.ts"() {
295
+ require_src.init_src();
296
+ CHANNEL_SOURCES = [
297
+ "telegram",
298
+ "discord",
299
+ "whatsapp",
300
+ "slack",
301
+ "signal",
302
+ "matrix",
303
+ "line",
304
+ "nostr",
305
+ "feishu",
306
+ "msteams",
307
+ "teams",
308
+ "instagram",
309
+ "messenger",
310
+ "twitter",
311
+ "viber",
312
+ "zalo"
313
+ ];
314
+ } });
315
+
316
+ //#endregion
317
+ Object.defineProperty(exports, 'init_engine', {
318
+ enumerable: true,
319
+ get: function () {
320
+ return init_engine;
321
+ }
322
+ });
323
+ Object.defineProperty(exports, 'loadSkillsContext', {
324
+ enumerable: true,
325
+ get: function () {
326
+ return loadSkillsContext;
327
+ }
328
+ });
329
+ Object.defineProperty(exports, 'loadWorkspaceContext', {
330
+ enumerable: true,
331
+ get: function () {
332
+ return loadWorkspaceContext;
333
+ }
334
+ });
335
+ Object.defineProperty(exports, 'resolveTools', {
336
+ enumerable: true,
337
+ get: function () {
338
+ return resolveTools;
339
+ }
340
+ });
341
+ Object.defineProperty(exports, 'runAgentEngine', {
342
+ enumerable: true,
343
+ get: function () {
344
+ return runAgentEngine;
345
+ }
346
+ });
@@ -0,0 +1,353 @@
1
+ const require_chunk = require('./chunk-jS-bbMI5.js');
2
+ const require_paths = require('./paths-AIyBxIzm.js');
3
+ const require_src = require('./src-lltU5gkh.js');
4
+ const fs_extra = require_chunk.__toESM(require("fs-extra"));
5
+ const path = require_chunk.__toESM(require("path"));
6
+
7
+ //#region packages/core/src/agent/engine.ts
8
+ /**
9
+
10
+ * Load workspace context: SOUL, AGENTS, MEMORY + custom .md
11
+
12
+ */
13
+ async function loadWorkspaceContext(hcDir) {
14
+ const dir = hcDir || require_paths.getHyperClawDir();
15
+ let context = "";
16
+ const core = [
17
+ "SOUL.md",
18
+ "AGENTS.md",
19
+ "MEMORY.md"
20
+ ];
21
+ for (const f of core) {
22
+ const fp = path.default.join(dir, f);
23
+ try {
24
+ context += `## ${f}\n${fs_extra.default.readFileSync(fp, "utf8")}\n\n`;
25
+ } catch {}
26
+ }
27
+ try {
28
+ const entries = fs_extra.default.readdirSync(dir);
29
+ for (const f of entries) if (f.endsWith(".md") && !core.includes(f)) {
30
+ const fp = path.default.join(dir, f);
31
+ try {
32
+ context += `## ${f}\n${fs_extra.default.readFileSync(fp, "utf8")}\n\n`;
33
+ } catch {}
34
+ }
35
+ } catch {}
36
+ return context;
37
+ }
38
+ /**
39
+
40
+ * Load skills context (bundled + workspace)
41
+
42
+ */
43
+ async function loadSkillsContext() {
44
+ const { loadSkills, buildSkillsContext } = await Promise.resolve().then(() => require("./skill-loader-DVpEgYV2.js"));
45
+ const skills = await loadSkills();
46
+ return skills.length > 0 ? buildSkillsContext(skills) : "";
47
+ }
48
+ /**
49
+
50
+ * Resolve tools with policy, PC access, elevation.
51
+
52
+ */
53
+ async function resolveTools(opts) {
54
+ const { config, source, elevated, sessionId, daemonMode, activeServer } = opts;
55
+ const cfg = config;
56
+ const sandboxNonMain = cfg?.agents?.defaults?.sandbox?.mode === "non-main" && source && CHANNEL_SOURCES.includes(source);
57
+ const { loadPCAccessConfig, getPCAccessTools } = await Promise.resolve().then(() => require("./pc-access-CAoM6WN4.js"));
58
+ const pcCfg = await loadPCAccessConfig({ daemonMode });
59
+ const dockerSandbox = cfg?.tools?.dockerSandbox?.enabled === true;
60
+ const pcTools = pcCfg.enabled && (!sandboxNonMain || elevated) ? getPCAccessTools({ dockerSandbox }) : [];
61
+ const { getSessionsTools } = await Promise.resolve().then(() => require("./sessions-tools-JHSZ6Bns.js"));
62
+ const sessionsTools = getSessionsTools(() => activeServer ?? null, sessionId);
63
+ const { InferenceEngine, getBuiltinTools } = await Promise.resolve().then(() => require("./inference-C874-2MI.js"));
64
+ const { getSubAgentTools } = await Promise.resolve().then(() => require("./sub-agent-tools-f4X1M-li.js"));
65
+ const { getBrowserTools } = await Promise.resolve().then(() => require("./browser-tools-Ay-wU_a4.js"));
66
+ const { getExtractionTools } = await Promise.resolve().then(() => require("./extraction-tools-BjzXD9LW.js"));
67
+ const { getWebsiteWatchTools } = await Promise.resolve().then(() => require("./website-watch-tools-CSSEu3Qy.js"));
68
+ const { getVisionTools } = await Promise.resolve().then(() => require("./vision-tools-DVYx9-Jw.js"));
69
+ const { getBountyTools } = await Promise.resolve().then(() => require("./bounty-tools-CCwY61YO.js"));
70
+ const { getSearchTools } = await Promise.resolve().then(() => require("./search-tools-DXVuVXW_.js"));
71
+ const { getMultiAgentTools } = await Promise.resolve().then(() => require("./multi-agent-tools-jzfvT4zP.js"));
72
+ const { loadMCPTools } = await Promise.resolve().then(() => require("./mcp-loader-C-21ynRH.js"));
73
+ const { applyToolPolicy } = await Promise.resolve().then(() => require("./tool-policy-CfWEnRxy.js"));
74
+ const CUSTOM_BASEURL_PROVIDERS = new Set([
75
+ "groq",
76
+ "mistral",
77
+ "deepseek",
78
+ "perplexity",
79
+ "huggingface",
80
+ "ollama",
81
+ "lmstudio",
82
+ "local",
83
+ "xai",
84
+ "openai",
85
+ "google",
86
+ "minimax",
87
+ "moonshot",
88
+ "qwen",
89
+ "zai",
90
+ "litellm",
91
+ "cloudflare",
92
+ "copilot",
93
+ "vercel-ai",
94
+ "opencode-zen",
95
+ "opencode-go",
96
+ "hyperclaw"
97
+ ]);
98
+ const isLocal = cfg?.provider?.providerId === "local" || cfg?.provider?.providerId === "ollama" || cfg?.provider?.providerId === "lmstudio";
99
+ const provider = cfg?.provider?.providerId === "anthropic" || cfg?.provider?.providerId === "anthropic-oauth" || cfg?.provider?.providerId === "anthropic-setup-token" ? "anthropic" : cfg?.provider?.providerId === "custom" || isLocal || CUSTOM_BASEURL_PROVIDERS.has(cfg?.provider?.providerId ?? "") ? "custom" : "openrouter";
100
+ const visionProvider = cfg?.provider?.providerId === "custom" || isLocal ? "openrouter" : provider === "anthropic" ? "anthropic" : "openrouter";
101
+ const apiKey = await (await Promise.resolve().then(() => require("./env-resolve-Dr-KfTtw.js"))).getProviderCredentialAsync(cfg);
102
+ const visionTools = getVisionTools({
103
+ apiKey: apiKey || "",
104
+ provider: visionProvider
105
+ });
106
+ const bountyTools = getBountyTools(cfg);
107
+ const searchTools = getSearchTools(cfg);
108
+ const multiAgentTools = getMultiAgentTools(cfg);
109
+ let skillInvokeTools = [];
110
+ try {
111
+ const { loadSkills } = await Promise.resolve().then(() => require("./skill-loader-DVpEgYV2.js"));
112
+ const { getSkillInvokeTools } = await Promise.resolve().then(() => require("./skill-runtime-BMk-h6Dl.js"));
113
+ const loaded = await loadSkills();
114
+ skillInvokeTools = getSkillInvokeTools(loaded);
115
+ } catch (e) {
116
+ if (typeof process !== "undefined" && process.env?.DEBUG) console.error("[engine] loadSkills failed:", e?.message ?? e);
117
+ }
118
+ let allTools = [
119
+ ...getBuiltinTools(),
120
+ ...getSubAgentTools(),
121
+ ...sessionsTools,
122
+ ...pcTools,
123
+ ...getBrowserTools(),
124
+ ...getExtractionTools(),
125
+ ...getWebsiteWatchTools(),
126
+ ...visionTools,
127
+ ...bountyTools,
128
+ ...searchTools,
129
+ ...multiAgentTools,
130
+ ...skillInvokeTools
131
+ ];
132
+ try {
133
+ const mcpTools = await loadMCPTools();
134
+ if (mcpTools.length > 0) allTools = [...allTools, ...mcpTools];
135
+ } catch {}
136
+ const policyConfig = cfg?.tools ? {
137
+ profile: cfg.tools.profile,
138
+ allow: cfg.tools.allow ?? cfg.tools.allowlist,
139
+ deny: cfg.tools.deny ?? cfg.tools.blocklist,
140
+ byProvider: cfg.tools.byProvider
141
+ } : void 0;
142
+ let tools = applyToolPolicy(allTools, policyConfig, {
143
+ provider: cfg?.provider?.providerId === "anthropic" ? "anthropic" : "openrouter",
144
+ model: cfg?.provider?.modelId
145
+ });
146
+ const { applyDestructiveGate } = await Promise.resolve().then(() => require("./destructive-gate-C1ny9ek2.js"));
147
+ tools = applyDestructiveGate(tools, {
148
+ elevated: elevated ?? false,
149
+ source,
150
+ sessionId
151
+ });
152
+ return tools;
153
+ }
154
+ /**
155
+
156
+ * Run agent: context + tools + inference.
157
+
158
+ */
159
+ async function runAgentEngine(message, opts) {
160
+ const cfg = await fs_extra.default.readJson(require_paths.getConfigPath()).catch(() => ({}));
161
+ const CUSTOM_BASEURL_IDS = new Set([
162
+ "groq",
163
+ "mistral",
164
+ "deepseek",
165
+ "perplexity",
166
+ "huggingface",
167
+ "ollama",
168
+ "lmstudio",
169
+ "local",
170
+ "xai",
171
+ "openai",
172
+ "google",
173
+ "minimax",
174
+ "moonshot",
175
+ "qwen",
176
+ "zai",
177
+ "litellm",
178
+ "cloudflare",
179
+ "copilot",
180
+ "vercel-ai",
181
+ "opencode-zen",
182
+ "opencode-go",
183
+ "hyperclaw"
184
+ ]);
185
+ const isLocalProvider = cfg?.provider?.providerId === "local" || cfg?.provider?.providerId === "ollama" || cfg?.provider?.providerId === "lmstudio";
186
+ const apiKey = await (await Promise.resolve().then(() => require("./env-resolve-Dr-KfTtw.js"))).getProviderCredentialAsync(cfg);
187
+ if (!apiKey && !isLocalProvider) return {
188
+ text: "No API key configured. Run: hyperclaw config set-key",
189
+ error: "no_api_key"
190
+ };
191
+ const { getProvider } = await Promise.resolve().then(() => require("./providers-BfW-fgpw.js"));
192
+ const providerMeta = getProvider(cfg?.provider?.providerId ?? "");
193
+ const registryBaseUrl = providerMeta?.baseUrl;
194
+ const sid = opts.sessionId;
195
+ const sessionKey = opts.sessionKey;
196
+ const effectiveKey = sessionKey || sid;
197
+ if (sessionKey && !opts.getTranscript && !opts.appendTranscript) console.warn("[engine] sessionKey provided but getTranscript/appendTranscript missing — session continuity disabled");
198
+ const userContent = opts.imageBlocks?.length ? [...message ? [{
199
+ type: "text",
200
+ text: message
201
+ }] : [], ...opts.imageBlocks.map((img) => ({
202
+ type: "image",
203
+ source: {
204
+ type: "base64",
205
+ media_type: img.mimeType || "image/png",
206
+ data: img.data
207
+ }
208
+ }))] : message;
209
+ let messagesForInference = [{
210
+ role: "user",
211
+ content: userContent
212
+ }];
213
+ if (effectiveKey && opts.getTranscript) try {
214
+ const restored = await opts.getTranscript(effectiveKey);
215
+ if (restored && restored.length > 0) {
216
+ const valid = restored.filter((t) => (t.role === "user" || t.role === "assistant") && typeof t.content === "string");
217
+ messagesForInference = [...valid, {
218
+ role: "user",
219
+ content: userContent
220
+ }];
221
+ }
222
+ } catch (e) {
223
+ console.warn("[engine] Failed to restore transcript for", effectiveKey, e.message);
224
+ }
225
+ if (effectiveKey && opts.appendTranscript) opts.appendTranscript(effectiveKey, "user", message, opts.source);
226
+ let workspaceDir = opts.workspace;
227
+ if (!workspaceDir && opts.userId && (cfg?.agents?.runtime)?.userWorkspaceEnabled) {
228
+ const userDir = path.default.join(require_paths.getHyperClawDir(), "users", opts.userId);
229
+ if (await fs_extra.default.pathExists(userDir)) workspaceDir = userDir;
230
+ }
231
+ let context = await loadWorkspaceContext(workspaceDir);
232
+ try {
233
+ const { getContextSummary } = await Promise.resolve().then(() => require("./knowledge-graph-BiIvoxPt.js"));
234
+ const kg = await getContextSummary(25);
235
+ if (kg) context += kg + "\n\n";
236
+ } catch {}
237
+ context += await loadSkillsContext();
238
+ const serviceKeys = cfg?.skills?.apiKeys ? Object.keys(cfg.skills.apiKeys) : [];
239
+ if (serviceKeys.length > 0) context += `\n## Service API Keys (configured)\nAvailable for research/skills: ${serviceKeys.join(", ")}. Use hackerone_list_programs, bugcrowd_list_programs, synack_list_targets when applicable, or create_skill for custom integrations.\n\n`;
240
+ const tools = await resolveTools({
241
+ config: cfg,
242
+ source: opts.source,
243
+ elevated: opts.elevated,
244
+ sessionId: sid,
245
+ daemonMode: opts.daemonMode,
246
+ activeServer: opts.activeServer
247
+ });
248
+ const rawModel = opts.modelOverride || cfg?.provider?.modelId || "claude-sonnet-4-5";
249
+ const isLocal2 = cfg?.provider?.providerId === "local" || cfg?.provider?.providerId === "ollama" || cfg?.provider?.providerId === "lmstudio";
250
+ const model = rawModel.startsWith("ollama/") ? rawModel.slice(7) : rawModel;
251
+ const isAnthropicVariant = cfg?.provider?.providerId === "anthropic" || cfg?.provider?.providerId === "anthropic-oauth" || cfg?.provider?.providerId === "anthropic-setup-token";
252
+ const provider = isAnthropicVariant ? "anthropic" : cfg?.provider?.providerId === "custom" || isLocal2 || CUSTOM_BASEURL_IDS.has(cfg?.provider?.providerId ?? "") ? "custom" : "openrouter";
253
+ const resolvedBaseUrl = cfg?.provider?.baseUrl || registryBaseUrl || (isLocal2 ? "http://localhost:11434/v1" : void 0);
254
+ const ollamaBaseUrl = isLocal2 ? cfg?.provider?.baseUrl || "http://localhost:11434/v1" : void 0;
255
+ const thinkingBudget = opts.thinkingBudget ?? 0;
256
+ const maxTokens = thinkingBudget > 0 ? thinkingBudget + 4096 : 4096;
257
+ try {
258
+ const { InferenceEngine } = await Promise.resolve().then(() => require("./inference-C874-2MI.js"));
259
+ const engineOpts = {
260
+ model,
261
+ apiKey,
262
+ provider,
263
+ system: context || void 0,
264
+ tools,
265
+ maxTokens,
266
+ onToken: opts.onToken ?? (() => {}),
267
+ onThinking: opts.onThinking,
268
+ onToolCall: opts.onToolCall,
269
+ onToolResult: opts.onToolResult,
270
+ ...provider === "custom" ? { baseUrl: ollamaBaseUrl || resolvedBaseUrl || "" } : {},
271
+ ...thinkingBudget > 0 && (model.includes("claude") || model.includes("anthropic")) ? { thinking: { budget_tokens: thinkingBudget } } : {}
272
+ };
273
+ const engine = new InferenceEngine(engineOpts);
274
+ const result = await engine.run(messagesForInference);
275
+ const text = result.text || "(empty)";
276
+ if (effectiveKey && opts.appendTranscript) opts.appendTranscript(effectiveKey, "assistant", text, opts.source);
277
+ try {
278
+ const { AutoMemory } = await Promise.resolve().then(() => require("./memory-auto-DXKe2ayf.js"));
279
+ const mem = new AutoMemory({ extractEveryNTurns: 1 });
280
+ mem.addTurn("user", message);
281
+ mem.addTurn("assistant", text);
282
+ await mem.extract();
283
+ } catch {}
284
+ opts.onDone?.(text);
285
+ opts.onRunEnd?.(result.usage);
286
+ return {
287
+ text,
288
+ usage: result.usage
289
+ };
290
+ } catch (e) {
291
+ const errText = `Error: ${e.message}`;
292
+ opts.onDone?.(errText);
293
+ opts.onRunEnd?.(void 0, e.message);
294
+ return {
295
+ text: errText,
296
+ error: e.message
297
+ };
298
+ }
299
+ }
300
+ var CHANNEL_SOURCES;
301
+ var init_engine = require_chunk.__esm({ "packages/core/src/agent/engine.ts"() {
302
+ require_src.init_src();
303
+ CHANNEL_SOURCES = [
304
+ "telegram",
305
+ "discord",
306
+ "whatsapp",
307
+ "slack",
308
+ "signal",
309
+ "matrix",
310
+ "line",
311
+ "nostr",
312
+ "feishu",
313
+ "msteams",
314
+ "teams",
315
+ "instagram",
316
+ "messenger",
317
+ "twitter",
318
+ "viber",
319
+ "zalo"
320
+ ];
321
+ } });
322
+
323
+ //#endregion
324
+ Object.defineProperty(exports, 'init_engine', {
325
+ enumerable: true,
326
+ get: function () {
327
+ return init_engine;
328
+ }
329
+ });
330
+ Object.defineProperty(exports, 'loadSkillsContext', {
331
+ enumerable: true,
332
+ get: function () {
333
+ return loadSkillsContext;
334
+ }
335
+ });
336
+ Object.defineProperty(exports, 'loadWorkspaceContext', {
337
+ enumerable: true,
338
+ get: function () {
339
+ return loadWorkspaceContext;
340
+ }
341
+ });
342
+ Object.defineProperty(exports, 'resolveTools', {
343
+ enumerable: true,
344
+ get: function () {
345
+ return resolveTools;
346
+ }
347
+ });
348
+ Object.defineProperty(exports, 'runAgentEngine', {
349
+ enumerable: true,
350
+ get: function () {
351
+ return runAgentEngine;
352
+ }
353
+ });