hyperclaw 4.0.2 → 5.0.0
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 +54 -3
- 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/audit-BaIiyWFu.js +441 -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/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-DD9wtWsr.js +103 -0
- package/dist/credentials-store-C6ir0Dae.js +4 -0
- package/dist/credentials-store-H13LqOwJ.js +77 -0
- package/dist/cron-tasks-Bli7Kzd2.js +82 -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-pWUPBp1F.js +95 -0
- package/dist/destructive-gate-D6vWOdEl.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-CEDSqXfw.js +256 -0
- package/dist/engine-Da4JMNpI.js +7 -0
- package/dist/env-resolve-CiXbWYwe.js +10 -0
- package/dist/env-resolve-CmGWhWXJ.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/hub-D0XwdjM-.js +515 -0
- package/dist/hub-LiD5Iztb.js +6 -0
- package/dist/hyperclawbot-zvczQgKx.js +505 -0
- package/dist/inference-BKVkBREb.js +6 -0
- package/dist/inference-DCXH4Q3x.js +922 -0
- package/dist/knowledge-graph-iBG76fvm.js +131 -0
- package/dist/loader-CC45xGpC.js +4 -0
- package/dist/loader-CnEdOyjT.js +400 -0
- package/dist/logger-ybOp7VOC.js +83 -0
- package/dist/manager-03ipO9R0.js +105 -0
- package/dist/manager-BpDfbDjg.js +117 -0
- package/dist/manager-Bxl0sqlh.js +4 -0
- package/dist/manager-CrVDn6eN.js +6 -0
- package/dist/manager-FCgF1plu.js +218 -0
- package/dist/manager-rgCsaWT1.js +40 -0
- package/dist/mcp-CfoSU4Uz.js +139 -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-integration-cSYkZyEo.js +91 -0
- package/dist/moltbook-BtLDZTfM.js +81 -0
- package/dist/node-Dw2Gi-cP.js +222 -0
- package/dist/nodes-registry-B8dmrlLv.js +52 -0
- package/dist/oauth-flow-DQPvMHRH.js +150 -0
- package/dist/oauth-provider-Uo4Nib_c.js +110 -0
- package/dist/observability-BV-Yx0V9.js +89 -0
- package/dist/onboard-0WoDxbv_.js +10 -0
- package/dist/onboard-BXNXCQp4.js +4070 -0
- package/dist/orchestrator-DmnEvMaL.js +189 -0
- package/dist/orchestrator-RI3bpqqc.js +6 -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-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 +1607 -443
- 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-D4wVHiX9.js +4 -0
- package/dist/server-Dh3JlBFB.js +1255 -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-CJN24QPW.js +102 -0
- package/dist/skill-runtime-w1ig_lcw.js +5 -0
- package/dist/src-BxPHKO5x.js +63 -0
- package/dist/src-DIc-L2IG.js +20 -0
- package/dist/src-g_rNx5rh.js +458 -0
- package/dist/sub-agent-tools-CHQoHz9c.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/tts-elevenlabs-BRosZv-f.js +61 -0
- package/dist/update-check-C2Dz85wJ.js +81 -0
- package/dist/vision-BMmiIKy7.js +121 -0
- package/dist/vision-tools-DVuYc17I.js +51 -0
- package/dist/vision-tools-U3YC4L-g.js +5 -0
- package/dist/voice-transcription-B555DbWR.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,22 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
|
|
3
|
+
//#region src/infra/pending-approval.ts
|
|
4
|
+
function getPending(sessionId) {
|
|
5
|
+
return pending.get(sessionId);
|
|
6
|
+
}
|
|
7
|
+
function setPending(sessionId, action) {
|
|
8
|
+
pending.set(sessionId, action);
|
|
9
|
+
}
|
|
10
|
+
function clearPending(sessionId) {
|
|
11
|
+
return pending.delete(sessionId);
|
|
12
|
+
}
|
|
13
|
+
var pending;
|
|
14
|
+
var init_pending_approval = require_chunk.__esm({ "src/infra/pending-approval.ts"() {
|
|
15
|
+
pending = /* @__PURE__ */ new Map();
|
|
16
|
+
} });
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
init_pending_approval();
|
|
20
|
+
exports.clearPending = clearPending;
|
|
21
|
+
exports.getPending = getPending;
|
|
22
|
+
exports.setPending = setPending;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
const fs_extra = require_chunk.__toESM(require("fs-extra"));
|
|
3
|
+
const path = require_chunk.__toESM(require("path"));
|
|
4
|
+
const os = require_chunk.__toESM(require("os"));
|
|
5
|
+
|
|
6
|
+
//#region packages/core/src/agent/reminders-store.ts
|
|
7
|
+
async function load() {
|
|
8
|
+
if (cache) return cache;
|
|
9
|
+
try {
|
|
10
|
+
cache = await fs_extra.default.readJson(STORE);
|
|
11
|
+
return cache;
|
|
12
|
+
} catch {
|
|
13
|
+
cache = [];
|
|
14
|
+
return cache;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function save(data) {
|
|
18
|
+
await fs_extra.default.ensureDir(path.default.dirname(STORE));
|
|
19
|
+
await fs_extra.default.writeJson(STORE, data, { spaces: 2 });
|
|
20
|
+
cache = data;
|
|
21
|
+
}
|
|
22
|
+
async function addReminder(message, dueAt) {
|
|
23
|
+
const items = await load();
|
|
24
|
+
const id = `r${Date.now()}`;
|
|
25
|
+
const r = {
|
|
26
|
+
id,
|
|
27
|
+
message,
|
|
28
|
+
dueAt,
|
|
29
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
30
|
+
completed: false
|
|
31
|
+
};
|
|
32
|
+
items.push(r);
|
|
33
|
+
await save(items);
|
|
34
|
+
return r;
|
|
35
|
+
}
|
|
36
|
+
async function listReminders(includeCompleted = false) {
|
|
37
|
+
const items = await load();
|
|
38
|
+
return includeCompleted ? items : items.filter((r) => !r.completed);
|
|
39
|
+
}
|
|
40
|
+
async function completeReminder(id) {
|
|
41
|
+
const items = await load();
|
|
42
|
+
const r = items.find((x) => x.id === id);
|
|
43
|
+
if (!r) return false;
|
|
44
|
+
r.completed = true;
|
|
45
|
+
await save(items);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
var STORE, cache;
|
|
49
|
+
var init_reminders_store = require_chunk.__esm({ "packages/core/src/agent/reminders-store.ts"() {
|
|
50
|
+
STORE = path.default.join(os.default.homedir(), ".hyperclaw", "reminders.json");
|
|
51
|
+
cache = null;
|
|
52
|
+
} });
|
|
53
|
+
|
|
54
|
+
//#endregion
|
|
55
|
+
init_reminders_store();
|
|
56
|
+
exports.addReminder = addReminder;
|
|
57
|
+
exports.completeReminder = completeReminder;
|
|
58
|
+
exports.listReminders = listReminders;
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
const chalk = require_chunk.__toESM(require("chalk"));
|
|
3
|
+
const fs_extra = require_chunk.__toESM(require("fs-extra"));
|
|
4
|
+
const path = require_chunk.__toESM(require("path"));
|
|
5
|
+
const os = require_chunk.__toESM(require("os"));
|
|
6
|
+
const crypto = require_chunk.__toESM(require("crypto"));
|
|
7
|
+
|
|
8
|
+
//#region src/canvas/renderer.ts
|
|
9
|
+
function randomId() {
|
|
10
|
+
return crypto.default.randomBytes(4).toString("hex");
|
|
11
|
+
}
|
|
12
|
+
var CANVAS_DIR, COMPONENT_TEMPLATES, CanvasRenderer;
|
|
13
|
+
var init_renderer = require_chunk.__esm({ "src/canvas/renderer.ts"() {
|
|
14
|
+
CANVAS_DIR = path.default.join(os.default.homedir(), ".hyperclaw", "canvas");
|
|
15
|
+
COMPONENT_TEMPLATES = {
|
|
16
|
+
chart: (title, data) => `
|
|
17
|
+
function ${title.replace(/\W/g, "")}Component({ data }) {
|
|
18
|
+
const { LineChart, Line, XAxis, YAxis, Tooltip, ResponsiveContainer } = window.Recharts || {};
|
|
19
|
+
if (!data || !ResponsiveContainer) return <div className="p-4 text-gray-400">Loading chart...</div>;
|
|
20
|
+
return (
|
|
21
|
+
<div className="p-4">
|
|
22
|
+
<h3 className="text-lg font-bold text-cyan-400 mb-4">${title}</h3>
|
|
23
|
+
<ResponsiveContainer width="100%" height={300}>
|
|
24
|
+
<LineChart data={data}>
|
|
25
|
+
<XAxis dataKey="label" stroke="#9ca3af" />
|
|
26
|
+
<YAxis stroke="#9ca3af" />
|
|
27
|
+
<Tooltip contentStyle={{ background: '#1f2937', border: '1px solid #374151' }} />
|
|
28
|
+
<Line type="monotone" dataKey="value" stroke="#06b6d4" strokeWidth={2} dot={false} />
|
|
29
|
+
</LineChart>
|
|
30
|
+
</ResponsiveContainer>
|
|
31
|
+
</div>
|
|
32
|
+
);
|
|
33
|
+
}`,
|
|
34
|
+
table: (title, data) => `
|
|
35
|
+
function ${title.replace(/\W/g, "")}Component({ data }) {
|
|
36
|
+
if (!Array.isArray(data) || data.length === 0) return <div className="p-4 text-gray-400">No data</div>;
|
|
37
|
+
const keys = Object.keys(data[0]);
|
|
38
|
+
return (
|
|
39
|
+
<div className="p-4">
|
|
40
|
+
<h3 className="text-lg font-bold text-cyan-400 mb-4">${title}</h3>
|
|
41
|
+
<div className="overflow-x-auto">
|
|
42
|
+
<table className="w-full text-sm text-left text-gray-300">
|
|
43
|
+
<thead className="text-xs text-gray-400 uppercase bg-gray-800">
|
|
44
|
+
<tr>{keys.map(k => <th key={k} className="px-4 py-2">{k}</th>)}</tr>
|
|
45
|
+
</thead>
|
|
46
|
+
<tbody>
|
|
47
|
+
{data.map((row, i) => (
|
|
48
|
+
<tr key={i} className="border-b border-gray-700 hover:bg-gray-800">
|
|
49
|
+
{keys.map(k => <td key={k} className="px-4 py-2">{String(row[k])}</td>)}
|
|
50
|
+
</tr>
|
|
51
|
+
))}
|
|
52
|
+
</tbody>
|
|
53
|
+
</table>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
);
|
|
57
|
+
}`,
|
|
58
|
+
form: (title) => `
|
|
59
|
+
function ${title.replace(/\W/g, "")}Component({ onSubmit }) {
|
|
60
|
+
const [values, setValues] = React.useState({});
|
|
61
|
+
return (
|
|
62
|
+
<div className="p-4">
|
|
63
|
+
<h3 className="text-lg font-bold text-cyan-400 mb-4">${title}</h3>
|
|
64
|
+
<form onSubmit={e => { e.preventDefault(); onSubmit?.(values); }}
|
|
65
|
+
className="space-y-4">
|
|
66
|
+
<input
|
|
67
|
+
name="input"
|
|
68
|
+
className="w-full bg-gray-800 border border-gray-600 rounded px-3 py-2 text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-cyan-500"
|
|
69
|
+
placeholder="Type your answer…"
|
|
70
|
+
autoComplete="off"
|
|
71
|
+
onChange={e => setValues(v => ({ ...v, input: e.target.value }))}
|
|
72
|
+
/>
|
|
73
|
+
<button type="submit"
|
|
74
|
+
className="bg-cyan-600 hover:bg-cyan-700 text-white px-4 py-2 rounded">
|
|
75
|
+
Submit
|
|
76
|
+
</button>
|
|
77
|
+
</form>
|
|
78
|
+
</div>
|
|
79
|
+
);
|
|
80
|
+
}`,
|
|
81
|
+
markdown: (title, data) => `
|
|
82
|
+
function ${title.replace(/\W/g, "")}Component({ data }) {
|
|
83
|
+
return (
|
|
84
|
+
<div className="p-4 prose prose-invert max-w-none">
|
|
85
|
+
<h3 className="text-lg font-bold text-cyan-400 mb-2">${title}</h3>
|
|
86
|
+
<div className="text-gray-300 text-sm whitespace-pre-wrap">{data || ''}</div>
|
|
87
|
+
</div>
|
|
88
|
+
);
|
|
89
|
+
}`,
|
|
90
|
+
image: (title, data) => `
|
|
91
|
+
function ${title.replace(/\W/g, "")}Component({ data }) {
|
|
92
|
+
return (
|
|
93
|
+
<div className="p-4">
|
|
94
|
+
<h3 className="text-lg font-bold text-cyan-400 mb-2">${title}</h3>
|
|
95
|
+
{data ? <img src={data} alt="${title}" className="max-w-full rounded" />
|
|
96
|
+
: <div className="text-gray-400">No image</div>}
|
|
97
|
+
</div>
|
|
98
|
+
);
|
|
99
|
+
}`,
|
|
100
|
+
custom: (title) => `
|
|
101
|
+
function ${title.replace(/\W/g, "")}Component({ data }) {
|
|
102
|
+
return (
|
|
103
|
+
<div className="p-4">
|
|
104
|
+
<h3 className="text-lg font-bold text-cyan-400 mb-2">${title}</h3>
|
|
105
|
+
<pre className="text-green-400 text-xs overflow-auto">{JSON.stringify(data, null, 2)}</pre>
|
|
106
|
+
</div>
|
|
107
|
+
);
|
|
108
|
+
}`,
|
|
109
|
+
script: (title) => `
|
|
110
|
+
function ${title.replace(/\W/g, "")}Component({ data }) {
|
|
111
|
+
const raw = (data && data.script) || '';
|
|
112
|
+
const esc = raw.replace(/</g, '\\\\u003c').replace(/>/g, '\\\\u003e');
|
|
113
|
+
const html = '<!DOCTYPE html><html><body><script>' + esc + '<\\\\/script></body></html>';
|
|
114
|
+
return (
|
|
115
|
+
<div className="p-4">
|
|
116
|
+
<h3 className="text-lg font-bold text-cyan-400 mb-2">${title}</h3>
|
|
117
|
+
<iframe title="Run" srcDoc={html} sandbox="allow-scripts" className="w-full border border-gray-700 rounded" style={{ minHeight: 200 }} />
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
}`
|
|
121
|
+
};
|
|
122
|
+
CanvasRenderer = class {
|
|
123
|
+
canvasFile;
|
|
124
|
+
constructor() {
|
|
125
|
+
this.canvasFile = path.default.join(CANVAS_DIR, "state.json");
|
|
126
|
+
fs_extra.default.ensureDirSync(CANVAS_DIR);
|
|
127
|
+
}
|
|
128
|
+
async getOrCreate(sessionId) {
|
|
129
|
+
try {
|
|
130
|
+
return await fs_extra.default.readJson(this.canvasFile);
|
|
131
|
+
} catch {
|
|
132
|
+
return this.createCanvas(sessionId);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
createCanvas(sessionId) {
|
|
136
|
+
return {
|
|
137
|
+
id: randomId(),
|
|
138
|
+
sessionId,
|
|
139
|
+
title: "HyperClaw Canvas",
|
|
140
|
+
components: [],
|
|
141
|
+
layout: "grid",
|
|
142
|
+
theme: "dark",
|
|
143
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
144
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
async addComponent(type, title, data) {
|
|
148
|
+
const canvas = await this.getOrCreate();
|
|
149
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
150
|
+
const component = {
|
|
151
|
+
id: randomId(),
|
|
152
|
+
type,
|
|
153
|
+
title,
|
|
154
|
+
jsx: COMPONENT_TEMPLATES[type](title, data),
|
|
155
|
+
data,
|
|
156
|
+
width: "half",
|
|
157
|
+
createdAt: now,
|
|
158
|
+
updatedAt: now
|
|
159
|
+
};
|
|
160
|
+
canvas.components.push(component);
|
|
161
|
+
canvas.updatedAt = now;
|
|
162
|
+
await fs_extra.default.writeJson(this.canvasFile, canvas, { spaces: 2 });
|
|
163
|
+
console.log(chalk.default.green(`\n ✔ Canvas component added: ${type}/${title}`));
|
|
164
|
+
console.log(chalk.default.gray(` View at: http://localhost:18789/canvas\n`));
|
|
165
|
+
return component;
|
|
166
|
+
}
|
|
167
|
+
async clear() {
|
|
168
|
+
const canvas = await this.getOrCreate();
|
|
169
|
+
canvas.components = [];
|
|
170
|
+
canvas.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
171
|
+
await fs_extra.default.writeJson(this.canvasFile, canvas, { spaces: 2 });
|
|
172
|
+
console.log(chalk.default.green(" ✔ Canvas cleared\n"));
|
|
173
|
+
}
|
|
174
|
+
async show() {
|
|
175
|
+
const canvas = await this.getOrCreate();
|
|
176
|
+
console.log(chalk.default.bold.cyan("\n 🎨 CANVAS\n"));
|
|
177
|
+
if (canvas.components.length === 0) {
|
|
178
|
+
console.log(chalk.default.gray(" Canvas is empty."));
|
|
179
|
+
console.log(chalk.default.gray(" Add a component: hyperclaw canvas add chart \"My Chart\"\n"));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
for (const c of canvas.components) console.log(` ${chalk.default.cyan(c.type.padEnd(10))} ${chalk.default.white(c.title)} ${chalk.default.gray(c.id)}`);
|
|
183
|
+
console.log();
|
|
184
|
+
console.log(chalk.default.gray(` View live at: http://localhost:18789/canvas`));
|
|
185
|
+
console.log(chalk.default.gray(` ${canvas.components.length} component(s)\n`));
|
|
186
|
+
}
|
|
187
|
+
async exportHtml() {
|
|
188
|
+
const canvas = await this.getOrCreate();
|
|
189
|
+
const componentsCode = canvas.components.map((c) => c.jsx).join("\n\n");
|
|
190
|
+
return `<!DOCTYPE html>
|
|
191
|
+
<html lang="en" class="dark">
|
|
192
|
+
<head>
|
|
193
|
+
<meta charset="UTF-8">
|
|
194
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
195
|
+
<title>${canvas.title}</title>
|
|
196
|
+
<script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
|
|
197
|
+
<script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
|
|
198
|
+
<script src="https://unpkg.com/recharts/umd/Recharts.js"></script>
|
|
199
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
200
|
+
<style>body { background: #0f172a; color: #e2e8f0; font-family: 'Inter', sans-serif; }</style>
|
|
201
|
+
</head>
|
|
202
|
+
<body>
|
|
203
|
+
<div id="root"></div>
|
|
204
|
+
<script>
|
|
205
|
+
${componentsCode}
|
|
206
|
+
|
|
207
|
+
function HyperClawCanvas() {
|
|
208
|
+
return React.createElement('div', { className: 'grid grid-cols-2 gap-4 p-4 min-h-screen' },
|
|
209
|
+
${canvas.components.map((c, i) => `React.createElement(${c.title.replace(/\W/g, "")}Component, { key: '${c.id}', data: ${JSON.stringify(c.data)} })`).join(",\n ")}
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
ReactDOM.createRoot(document.getElementById('root')).render(
|
|
214
|
+
React.createElement(HyperClawCanvas)
|
|
215
|
+
);
|
|
216
|
+
</script>
|
|
217
|
+
</body>
|
|
218
|
+
</html>`;
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
} });
|
|
222
|
+
|
|
223
|
+
//#endregion
|
|
224
|
+
init_renderer();
|
|
225
|
+
exports.CanvasRenderer = CanvasRenderer;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
const chalk = require_chunk.__toESM(require("chalk"));
|
|
3
|
+
const fs_extra = require_chunk.__toESM(require("fs-extra"));
|
|
4
|
+
const path = require_chunk.__toESM(require("path"));
|
|
5
|
+
const os = require_chunk.__toESM(require("os"));
|
|
6
|
+
|
|
7
|
+
//#region src/auto-reply/rules.ts
|
|
8
|
+
const RULES_FILE = path.default.join(os.default.homedir(), ".hyperclaw", "auto-reply-rules.json");
|
|
9
|
+
function matchCondition(cond, msg) {
|
|
10
|
+
const text = msg.content.toLowerCase();
|
|
11
|
+
const val = (cond.value || "").toLowerCase();
|
|
12
|
+
switch (cond.type) {
|
|
13
|
+
case "always": return true;
|
|
14
|
+
case "contains": return text.includes(val);
|
|
15
|
+
case "startsWith": return text.startsWith(val);
|
|
16
|
+
case "endsWith": return text.endsWith(val);
|
|
17
|
+
case "from": return msg.from === cond.value;
|
|
18
|
+
case "channel": return msg.channelId === cond.value;
|
|
19
|
+
case "regex": try {
|
|
20
|
+
const re = new RegExp(cond.value || "", cond.flags || "i");
|
|
21
|
+
return re.test(msg.content);
|
|
22
|
+
} catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
default: return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function matchRule(rule, msg) {
|
|
29
|
+
if (!rule.enabled) return false;
|
|
30
|
+
if (rule.conditions.length === 0) return false;
|
|
31
|
+
const results = rule.conditions.map((c) => matchCondition(c, msg));
|
|
32
|
+
return rule.conditionLogic === "AND" ? results.every(Boolean) : results.some(Boolean);
|
|
33
|
+
}
|
|
34
|
+
var AutoReplyEngine = class {
|
|
35
|
+
rules = [];
|
|
36
|
+
async load() {
|
|
37
|
+
try {
|
|
38
|
+
this.rules = await fs_extra.default.readJson(RULES_FILE);
|
|
39
|
+
} catch {
|
|
40
|
+
this.rules = [];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async save() {
|
|
44
|
+
await fs_extra.default.ensureDir(path.default.dirname(RULES_FILE));
|
|
45
|
+
await fs_extra.default.writeJson(RULES_FILE, this.rules, { spaces: 2 });
|
|
46
|
+
}
|
|
47
|
+
async evaluate(msg) {
|
|
48
|
+
await this.load();
|
|
49
|
+
const sorted = [...this.rules].sort((a, b) => a.priority - b.priority);
|
|
50
|
+
for (const rule of sorted) if (matchRule(rule, msg)) {
|
|
51
|
+
rule.hitCount++;
|
|
52
|
+
rule.lastHitAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
53
|
+
await this.save();
|
|
54
|
+
return rule.action;
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
async add(rule) {
|
|
59
|
+
await this.load();
|
|
60
|
+
const full = {
|
|
61
|
+
...rule,
|
|
62
|
+
id: Math.random().toString(36).slice(2, 10),
|
|
63
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
64
|
+
hitCount: 0
|
|
65
|
+
};
|
|
66
|
+
this.rules.push(full);
|
|
67
|
+
await this.save();
|
|
68
|
+
return full;
|
|
69
|
+
}
|
|
70
|
+
async remove(id) {
|
|
71
|
+
await this.load();
|
|
72
|
+
this.rules = this.rules.filter((r) => r.id !== id);
|
|
73
|
+
await this.save();
|
|
74
|
+
}
|
|
75
|
+
async toggle(id) {
|
|
76
|
+
await this.load();
|
|
77
|
+
const rule = this.rules.find((r) => r.id === id);
|
|
78
|
+
if (rule) {
|
|
79
|
+
rule.enabled = !rule.enabled;
|
|
80
|
+
await this.save();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
showList() {
|
|
84
|
+
console.log(chalk.default.bold.cyan("\n 🦅 AUTO-REPLY RULES\n"));
|
|
85
|
+
if (this.rules.length === 0) {
|
|
86
|
+
console.log(chalk.default.gray(" No rules configured.\n"));
|
|
87
|
+
console.log(chalk.default.gray(" Add a rule: hyperclaw auto-reply add\n"));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
for (const rule of [...this.rules].sort((a, b) => a.priority - b.priority)) {
|
|
91
|
+
const dot = rule.enabled ? chalk.default.green("●") : chalk.default.gray("○");
|
|
92
|
+
console.log(` ${dot} ${chalk.default.white(rule.name)} ${chalk.default.gray(`#${rule.id}`)}`);
|
|
93
|
+
console.log(` ${chalk.default.gray(`Priority: ${rule.priority} Hits: ${rule.hitCount} Logic: ${rule.conditionLogic}`)}`);
|
|
94
|
+
for (const c of rule.conditions) console.log(` ${chalk.default.cyan("if")} ${c.type} ${chalk.default.yellow(c.value || "*")}`);
|
|
95
|
+
console.log(` ${chalk.default.cyan("then")} ${rule.action.type}${rule.action.reply ? `: "${rule.action.reply.slice(0, 40)}"` : ""}`);
|
|
96
|
+
if (rule.stopOnMatch) console.log(` ${chalk.default.gray("(stop on match)")}`);
|
|
97
|
+
console.log();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
//#endregion
|
|
103
|
+
exports.AutoReplyEngine = AutoReplyEngine;
|