@feeble/blay-openclaw-plugin 0.1.17
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 +24 -0
- package/dist/channel/abort.d.ts +11 -0
- package/dist/channel/abort.js +20 -0
- package/dist/channel/abort.js.map +1 -0
- package/dist/channel/inbound.d.ts +53 -0
- package/dist/channel/inbound.js +384 -0
- package/dist/channel/inbound.js.map +1 -0
- package/dist/channel/plugin.d.ts +25 -0
- package/dist/channel/plugin.js +291 -0
- package/dist/channel/plugin.js.map +1 -0
- package/dist/channel/run-tracker.d.ts +54 -0
- package/dist/channel/run-tracker.js +137 -0
- package/dist/channel/run-tracker.js.map +1 -0
- package/dist/channel/runtime.d.ts +8 -0
- package/dist/channel/runtime.js +16 -0
- package/dist/channel/runtime.js.map +1 -0
- package/dist/channel/sse-client.d.ts +54 -0
- package/dist/channel/sse-client.js +154 -0
- package/dist/channel/sse-client.js.map +1 -0
- package/dist/channel/state.d.ts +6 -0
- package/dist/channel/state.js +11 -0
- package/dist/channel/state.js.map +1 -0
- package/dist/client.d.ts +23 -0
- package/dist/client.js +98 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +228 -0
- package/dist/index.js.map +1 -0
- package/dist/telemetry/pusher.d.ts +71 -0
- package/dist/telemetry/pusher.js +461 -0
- package/dist/telemetry/pusher.js.map +1 -0
- package/dist/telemetry/usage-collector.d.ts +39 -0
- package/dist/telemetry/usage-collector.js +60 -0
- package/dist/telemetry/usage-collector.js.map +1 -0
- package/dist/tools/action-items.d.ts +60 -0
- package/dist/tools/action-items.js +101 -0
- package/dist/tools/action-items.js.map +1 -0
- package/dist/tools/briefing.d.ts +15 -0
- package/dist/tools/briefing.js +138 -0
- package/dist/tools/briefing.js.map +1 -0
- package/dist/tools/comments.d.ts +43 -0
- package/dist/tools/comments.js +79 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/context.d.ts +20 -0
- package/dist/tools/context.js +31 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/instrumentation.d.ts +19 -0
- package/dist/tools/instrumentation.js +84 -0
- package/dist/tools/instrumentation.js.map +1 -0
- package/dist/tools/notifications.d.ts +29 -0
- package/dist/tools/notifications.js +57 -0
- package/dist/tools/notifications.js.map +1 -0
- package/dist/tools/org.d.ts +12 -0
- package/dist/tools/org.js +31 -0
- package/dist/tools/org.js.map +1 -0
- package/dist/tools/projects.d.ts +73 -0
- package/dist/tools/projects.js +121 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/search.d.ts +20 -0
- package/dist/tools/search.js +50 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/tasks.d.ts +110 -0
- package/dist/tools/tasks.js +168 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/users.d.ts +12 -0
- package/dist/tools/users.js +31 -0
- package/dist/tools/users.js.map +1 -0
- package/dist/types.d.ts +20 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/formatting.d.ts +16 -0
- package/dist/utils/formatting.js +196 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/webhook/handler.d.ts +10 -0
- package/dist/webhook/handler.js +70 -0
- package/dist/webhook/handler.js.map +1 -0
- package/openclaw.plugin.json +21 -0
- package/package.json +36 -0
- package/skills/blay/SKILL.md +25 -0
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TelemetryPusher — periodically pushes snapshots to the Blay API.
|
|
3
|
+
*
|
|
4
|
+
* Sends heartbeat data every 60 seconds including:
|
|
5
|
+
* - Phase 1: connection status, uptime, run counts
|
|
6
|
+
* - Phase 2: aggregate token usage (via UsageCollector)
|
|
7
|
+
* - Phase 3: cron job snapshots (from cron.json)
|
|
8
|
+
* - Phase 4: agent config snapshots (from runtime config)
|
|
9
|
+
*
|
|
10
|
+
* All pushes are fire-and-forget — telemetry failures must never
|
|
11
|
+
* break agent execution.
|
|
12
|
+
*/
|
|
13
|
+
const PUSH_INTERVAL_MS = 60_000; // 60 seconds
|
|
14
|
+
/**
|
|
15
|
+
* Convert OpenClaw's schedule object to a human-readable string.
|
|
16
|
+
* OpenClaw stores schedules as objects like:
|
|
17
|
+
* { kind: "at", at: "2026-02-17T04:45:00.000Z" }
|
|
18
|
+
* { kind: "cron", cron: "0 * * * *" }
|
|
19
|
+
* { kind: "interval", intervalMs: 60000 }
|
|
20
|
+
*/
|
|
21
|
+
function formatSchedule(schedule) {
|
|
22
|
+
if (typeof schedule === "string")
|
|
23
|
+
return schedule;
|
|
24
|
+
if (typeof schedule !== "object" || schedule === null)
|
|
25
|
+
return "unknown";
|
|
26
|
+
const s = schedule;
|
|
27
|
+
switch (s.kind) {
|
|
28
|
+
case "at":
|
|
29
|
+
return `once at ${s.at ?? "unknown"}`;
|
|
30
|
+
case "cron":
|
|
31
|
+
return String(s.cron ?? s.expression ?? "cron");
|
|
32
|
+
case "interval":
|
|
33
|
+
return s.intervalMs ? `every ${Math.round(Number(s.intervalMs) / 1000)}s` : `interval: ${s.interval ?? "unknown"}`;
|
|
34
|
+
default:
|
|
35
|
+
return JSON.stringify(schedule);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class TelemetryPusher {
|
|
39
|
+
client;
|
|
40
|
+
runtime;
|
|
41
|
+
interval = null;
|
|
42
|
+
startedAt = 0;
|
|
43
|
+
runsCompleted = 0;
|
|
44
|
+
runsFailed = 0;
|
|
45
|
+
lastConfigHash = "";
|
|
46
|
+
observedTools = new Set();
|
|
47
|
+
constructor(opts) {
|
|
48
|
+
this.client = opts.client;
|
|
49
|
+
this.runtime = opts.runtime;
|
|
50
|
+
}
|
|
51
|
+
/** Start periodic telemetry pushes. Called on gateway_start. */
|
|
52
|
+
start() {
|
|
53
|
+
this.startedAt = Date.now();
|
|
54
|
+
// Push an initial snapshot immediately
|
|
55
|
+
this.pushSnapshot().catch(() => { });
|
|
56
|
+
// Then push every 60 seconds
|
|
57
|
+
this.interval = setInterval(() => {
|
|
58
|
+
this.pushSnapshot().catch(() => { });
|
|
59
|
+
}, PUSH_INTERVAL_MS);
|
|
60
|
+
}
|
|
61
|
+
/** Stop periodic pushes. Called on gateway_stop. */
|
|
62
|
+
stop() {
|
|
63
|
+
if (this.interval) {
|
|
64
|
+
clearInterval(this.interval);
|
|
65
|
+
this.interval = null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Record a completed run (called from run tracker). */
|
|
69
|
+
recordRunCompleted() {
|
|
70
|
+
this.runsCompleted++;
|
|
71
|
+
}
|
|
72
|
+
/** Record a failed run (called from run tracker). */
|
|
73
|
+
recordRunFailed() {
|
|
74
|
+
this.runsFailed++;
|
|
75
|
+
}
|
|
76
|
+
/** Record an observed tool name (cumulative across the session). */
|
|
77
|
+
recordToolName(name) {
|
|
78
|
+
if (name)
|
|
79
|
+
this.observedTools.add(name);
|
|
80
|
+
}
|
|
81
|
+
/** Gather all telemetry data and POST to the API. */
|
|
82
|
+
async pushSnapshot() {
|
|
83
|
+
try {
|
|
84
|
+
const now = Date.now();
|
|
85
|
+
const payload = {
|
|
86
|
+
type: "heartbeat",
|
|
87
|
+
timestamp: now,
|
|
88
|
+
uptimeMs: now - this.startedAt,
|
|
89
|
+
runsCompleted: this.runsCompleted,
|
|
90
|
+
runsFailed: this.runsFailed,
|
|
91
|
+
};
|
|
92
|
+
// Phase 3: Read cron jobs from runtime state
|
|
93
|
+
const cronJobs = await this.readCronJobs();
|
|
94
|
+
if (cronJobs !== null) {
|
|
95
|
+
payload.cronJobs = cronJobs;
|
|
96
|
+
}
|
|
97
|
+
// Phase 4: Read config (only push if changed)
|
|
98
|
+
const config = await this.readConfig();
|
|
99
|
+
if (config !== null) {
|
|
100
|
+
payload.config = config;
|
|
101
|
+
}
|
|
102
|
+
// Reset counters after sending
|
|
103
|
+
const sentCompleted = this.runsCompleted;
|
|
104
|
+
const sentFailed = this.runsFailed;
|
|
105
|
+
await this.client.post("/api/v1/agent-telemetry", payload);
|
|
106
|
+
// Only reset the counts we actually sent (in case new ones arrived during POST)
|
|
107
|
+
this.runsCompleted -= sentCompleted;
|
|
108
|
+
this.runsFailed -= sentFailed;
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
// Fire-and-forget: never break the agent
|
|
112
|
+
console.error("[blay] Telemetry push failed:", err);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Phase 3: Read cron state from OpenClaw's state directory.
|
|
117
|
+
*
|
|
118
|
+
* OpenClaw stores cron data at:
|
|
119
|
+
* <stateDir>/cron/jobs.json — currently configured jobs ({version, jobs: [...]})
|
|
120
|
+
* <stateDir>/cron/runs/*.jsonl — per-job run history (one JSONL per job ID)
|
|
121
|
+
*
|
|
122
|
+
* We read both: configured jobs for current state, and recent run logs
|
|
123
|
+
* for historical visibility (last entry per JSONL = most recent run).
|
|
124
|
+
*/
|
|
125
|
+
async readCronJobs() {
|
|
126
|
+
try {
|
|
127
|
+
if (!this.runtime?.state?.resolveStateDir)
|
|
128
|
+
return null;
|
|
129
|
+
const stateDir = this.runtime.state.resolveStateDir();
|
|
130
|
+
const { readFile, readdir } = await import("node:fs/promises");
|
|
131
|
+
const { join } = await import("node:path");
|
|
132
|
+
const cronDir = join(stateDir, "cron");
|
|
133
|
+
// Read configured jobs
|
|
134
|
+
const jobsPath = join(cronDir, "jobs.json");
|
|
135
|
+
const raw = await readFile(jobsPath, "utf-8").catch(() => null);
|
|
136
|
+
let jobs = [];
|
|
137
|
+
if (raw) {
|
|
138
|
+
const parsed = JSON.parse(raw);
|
|
139
|
+
const jobList = Array.isArray(parsed) ? parsed : (parsed?.jobs ?? []);
|
|
140
|
+
jobs = jobList.map((entry) => ({
|
|
141
|
+
id: entry.id ?? entry.jobId ?? "unknown",
|
|
142
|
+
name: entry.name ?? entry.id ?? "unnamed",
|
|
143
|
+
schedule: formatSchedule(entry.schedule ?? entry.cron ?? entry.interval ?? "unknown"),
|
|
144
|
+
lastRun: entry.lastRun ?? entry.lastRunAt ?? entry.state?.lastRunAtMs ?? undefined,
|
|
145
|
+
nextRun: entry.nextRun ?? entry.nextRunAt ?? entry.state?.nextRunAtMs ?? undefined,
|
|
146
|
+
enabled: entry.enabled !== false,
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
// Read recent run logs (last entry from each JSONL file)
|
|
150
|
+
const recentRuns = [];
|
|
151
|
+
const runsDir = join(cronDir, "runs");
|
|
152
|
+
const runFiles = await readdir(runsDir).catch(() => []);
|
|
153
|
+
for (const file of runFiles) {
|
|
154
|
+
if (!file.endsWith(".jsonl"))
|
|
155
|
+
continue;
|
|
156
|
+
try {
|
|
157
|
+
const content = await readFile(join(runsDir, file), "utf-8");
|
|
158
|
+
const lines = content.trim().split("\n").filter(Boolean);
|
|
159
|
+
if (lines.length === 0)
|
|
160
|
+
continue;
|
|
161
|
+
// Last line = most recent run entry
|
|
162
|
+
const last = JSON.parse(lines[lines.length - 1]);
|
|
163
|
+
if (last.action === "finished" || last.action === "failed") {
|
|
164
|
+
recentRuns.push({
|
|
165
|
+
jobId: last.jobId ?? file.replace(".jsonl", ""),
|
|
166
|
+
status: last.status ?? last.action ?? "unknown",
|
|
167
|
+
summary: last.summary ? String(last.summary).slice(0, 300) : undefined,
|
|
168
|
+
runAt: last.runAtMs ?? last.ts ?? undefined,
|
|
169
|
+
durationMs: last.durationMs ?? undefined,
|
|
170
|
+
nextRunAt: last.nextRunAtMs ?? undefined,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Skip unparseable run files
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Sort by most recent first
|
|
179
|
+
recentRuns.sort((a, b) => (b.runAt ?? 0) - (a.runAt ?? 0));
|
|
180
|
+
// Only return if we have something
|
|
181
|
+
if (jobs.length === 0 && recentRuns.length === 0)
|
|
182
|
+
return null;
|
|
183
|
+
return { jobs, recentRuns: recentRuns.slice(0, 50) };
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Phase 4: Read agent config from OpenClaw runtime.
|
|
191
|
+
* Returns null if config hasn't changed since last push.
|
|
192
|
+
*/
|
|
193
|
+
async readConfig() {
|
|
194
|
+
try {
|
|
195
|
+
if (!this.runtime?.config?.loadConfig)
|
|
196
|
+
return null;
|
|
197
|
+
const config = await this.runtime.config.loadConfig();
|
|
198
|
+
if (!config)
|
|
199
|
+
return null;
|
|
200
|
+
// ── Model resolution ──────────────────────────────────────────
|
|
201
|
+
// 1. Check agents list for default/first agent
|
|
202
|
+
// 2. Agent model can be string ("provider/model") or object ({ primary: "..." })
|
|
203
|
+
// 3. Fall back to agents.defaults.model.primary
|
|
204
|
+
let model;
|
|
205
|
+
const agentsList = config.agents?.list;
|
|
206
|
+
if (Array.isArray(agentsList) && agentsList.length > 0) {
|
|
207
|
+
const agent = agentsList.find((a) => a.default) ?? agentsList[0];
|
|
208
|
+
const agentModel = agent?.model;
|
|
209
|
+
if (typeof agentModel === "string") {
|
|
210
|
+
model = agentModel;
|
|
211
|
+
}
|
|
212
|
+
else if (agentModel?.primary) {
|
|
213
|
+
model = String(agentModel.primary);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (!model) {
|
|
217
|
+
const defaultModel = config.agents?.defaults?.model;
|
|
218
|
+
if (typeof defaultModel === "string") {
|
|
219
|
+
model = defaultModel;
|
|
220
|
+
}
|
|
221
|
+
else if (defaultModel?.primary) {
|
|
222
|
+
model = String(defaultModel.primary);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// ── Tools: config-declared merged with observed ───────────────
|
|
226
|
+
const configTools = [];
|
|
227
|
+
if (Array.isArray(config.tools?.allow)) {
|
|
228
|
+
for (const t of config.tools.allow) {
|
|
229
|
+
if (typeof t === "string")
|
|
230
|
+
configTools.push(t);
|
|
231
|
+
else if (t?.name)
|
|
232
|
+
configTools.push(String(t.name));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const allTools = Array.from(new Set([...configTools, ...this.observedTools]));
|
|
236
|
+
// ── Channels: keys of config.channels, filtering defaults/disabled ─
|
|
237
|
+
const channels = [];
|
|
238
|
+
if (config.channels && typeof config.channels === "object") {
|
|
239
|
+
for (const [key, value] of Object.entries(config.channels)) {
|
|
240
|
+
if (key === "defaults")
|
|
241
|
+
continue;
|
|
242
|
+
if (value && typeof value === "object" && value.enabled === false)
|
|
243
|
+
continue;
|
|
244
|
+
channels.push(key);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// ── Skills: entries where enabled !== false, enriched with SKILL.md ─
|
|
248
|
+
const skills = [];
|
|
249
|
+
const skillEntries = config.skills?.entries;
|
|
250
|
+
if (skillEntries && typeof skillEntries === "object") {
|
|
251
|
+
const enabledSkillNames = [];
|
|
252
|
+
for (const [key, value] of Object.entries(skillEntries)) {
|
|
253
|
+
if (value && typeof value === "object" && value.enabled === false)
|
|
254
|
+
continue;
|
|
255
|
+
enabledSkillNames.push(key);
|
|
256
|
+
}
|
|
257
|
+
const skillMetadata = await this.readSkillMetadata(enabledSkillNames);
|
|
258
|
+
for (const name of enabledSkillNames) {
|
|
259
|
+
const meta = skillMetadata.get(name);
|
|
260
|
+
skills.push({
|
|
261
|
+
name,
|
|
262
|
+
description: meta?.description,
|
|
263
|
+
emoji: meta?.emoji,
|
|
264
|
+
skillMd: meta?.skillMd,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// ── Workspace files: list .md files with contents from workspace dir ─
|
|
269
|
+
const wsFiles = await this.readWorkspaceFiles();
|
|
270
|
+
const workspaceFiles = wsFiles.length > 0 ? wsFiles.map(f => f.name) : undefined;
|
|
271
|
+
const workspaceFileContents = {};
|
|
272
|
+
for (const f of wsFiles) {
|
|
273
|
+
if (f.content)
|
|
274
|
+
workspaceFileContents[f.name] = f.content;
|
|
275
|
+
}
|
|
276
|
+
const snapshot = {
|
|
277
|
+
model: model || undefined,
|
|
278
|
+
tools: allTools.length > 0 ? allTools : undefined,
|
|
279
|
+
channels: channels.length > 0 ? channels : undefined,
|
|
280
|
+
cronEnabled: config.cron?.enabled ?? undefined,
|
|
281
|
+
skills: skills.length > 0 ? skills : undefined,
|
|
282
|
+
workspaceFiles,
|
|
283
|
+
workspaceFileContents: Object.keys(workspaceFileContents).length > 0 ? workspaceFileContents : undefined,
|
|
284
|
+
};
|
|
285
|
+
// Simple hash comparison to avoid pushing unchanged config
|
|
286
|
+
const hash = JSON.stringify(snapshot);
|
|
287
|
+
if (hash === this.lastConfigHash)
|
|
288
|
+
return null;
|
|
289
|
+
this.lastConfigHash = hash;
|
|
290
|
+
return snapshot;
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Read markdown files from the agent's workspace directory.
|
|
298
|
+
* Returns filenames and contents. Each file capped at 50KB, total at 200KB.
|
|
299
|
+
*/
|
|
300
|
+
async readWorkspaceFiles() {
|
|
301
|
+
try {
|
|
302
|
+
if (!this.runtime?.state?.resolveStateDir)
|
|
303
|
+
return [];
|
|
304
|
+
const { readdir, readFile } = await import("node:fs/promises");
|
|
305
|
+
const { join } = await import("node:path");
|
|
306
|
+
const MAX_FILE_SIZE = 50 * 1024; // 50KB per file
|
|
307
|
+
const MAX_TOTAL_SIZE = 200 * 1024; // 200KB total
|
|
308
|
+
const stateDir = this.runtime.state.resolveStateDir();
|
|
309
|
+
const workspaceDir = join(stateDir, "workspace");
|
|
310
|
+
const entries = await readdir(workspaceDir).catch(() => []);
|
|
311
|
+
const mdFiles = entries.filter((f) => f.endsWith(".md")).sort();
|
|
312
|
+
const results = [];
|
|
313
|
+
let totalSize = 0;
|
|
314
|
+
for (const name of mdFiles) {
|
|
315
|
+
try {
|
|
316
|
+
let content = await readFile(join(workspaceDir, name), "utf-8");
|
|
317
|
+
if (content.length > MAX_FILE_SIZE) {
|
|
318
|
+
content = content.slice(0, MAX_FILE_SIZE);
|
|
319
|
+
}
|
|
320
|
+
if (totalSize + content.length > MAX_TOTAL_SIZE) {
|
|
321
|
+
// Still include filename but truncate content to fit
|
|
322
|
+
const remaining = MAX_TOTAL_SIZE - totalSize;
|
|
323
|
+
results.push({ name, content: remaining > 0 ? content.slice(0, remaining) : "" });
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
totalSize += content.length;
|
|
327
|
+
results.push({ name, content });
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
results.push({ name, content: "" });
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return results;
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
return [];
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Read SKILL.md files for the given skill names.
|
|
341
|
+
* Searches built-in skills dir and extension skill dirs.
|
|
342
|
+
* Parses YAML frontmatter for description and emoji.
|
|
343
|
+
* Returns a Map of skill name → metadata.
|
|
344
|
+
*/
|
|
345
|
+
async readSkillMetadata(skillNames) {
|
|
346
|
+
const result = new Map();
|
|
347
|
+
if (skillNames.length === 0)
|
|
348
|
+
return result;
|
|
349
|
+
try {
|
|
350
|
+
const { readFile, readdir, stat } = await import("node:fs/promises");
|
|
351
|
+
const { join, dirname } = await import("node:path");
|
|
352
|
+
// Collect candidate skill directories
|
|
353
|
+
const skillDirs = [];
|
|
354
|
+
// 1. Built-in skills: find openclaw's install dir via require.resolve or known paths
|
|
355
|
+
try {
|
|
356
|
+
const ocBin = await import("node:child_process").then(cp => cp.execSync("which openclaw", { encoding: "utf-8" }).trim());
|
|
357
|
+
// Resolve symlink to get real path
|
|
358
|
+
const { realpath } = await import("node:fs/promises");
|
|
359
|
+
const realBin = await realpath(ocBin);
|
|
360
|
+
// openclaw binary is at <prefix>/bin/openclaw or <prefix>/lib/node_modules/openclaw/dist/...
|
|
361
|
+
// Walk up to find the skills dir
|
|
362
|
+
let dir = dirname(realBin);
|
|
363
|
+
for (let i = 0; i < 5; i++) {
|
|
364
|
+
const candidate = join(dir, "skills");
|
|
365
|
+
try {
|
|
366
|
+
const s = await stat(candidate);
|
|
367
|
+
if (s.isDirectory()) {
|
|
368
|
+
skillDirs.push(candidate);
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
catch { }
|
|
373
|
+
// Also check lib/node_modules/openclaw/skills relative pattern
|
|
374
|
+
const nmCandidate = join(dir, "lib", "node_modules", "openclaw", "skills");
|
|
375
|
+
try {
|
|
376
|
+
const s = await stat(nmCandidate);
|
|
377
|
+
if (s.isDirectory()) {
|
|
378
|
+
skillDirs.push(nmCandidate);
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
catch { }
|
|
383
|
+
dir = dirname(dir);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
catch { }
|
|
387
|
+
// 2. Extension skill dirs (in ~/.openclaw/extensions/*/skills/)
|
|
388
|
+
try {
|
|
389
|
+
const homeDir = process.env.HOME || "/root";
|
|
390
|
+
const extDir = join(homeDir, ".openclaw", "extensions");
|
|
391
|
+
const extEntries = await readdir(extDir).catch(() => []);
|
|
392
|
+
for (const ext of extEntries) {
|
|
393
|
+
const extSkillDir = join(extDir, ext, "skills");
|
|
394
|
+
try {
|
|
395
|
+
const s = await stat(extSkillDir);
|
|
396
|
+
if (s.isDirectory())
|
|
397
|
+
skillDirs.push(extSkillDir);
|
|
398
|
+
}
|
|
399
|
+
catch { }
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
catch { }
|
|
403
|
+
// Read SKILL.md for each skill name from the candidate dirs
|
|
404
|
+
const MAX_SKILL_MD_SIZE = 10_000; // 10KB per SKILL.md
|
|
405
|
+
for (const name of skillNames) {
|
|
406
|
+
for (const dir of skillDirs) {
|
|
407
|
+
const skillMdPath = join(dir, name, "SKILL.md");
|
|
408
|
+
try {
|
|
409
|
+
let content = await readFile(skillMdPath, "utf-8");
|
|
410
|
+
if (content.length > MAX_SKILL_MD_SIZE) {
|
|
411
|
+
content = content.slice(0, MAX_SKILL_MD_SIZE);
|
|
412
|
+
}
|
|
413
|
+
// Parse YAML frontmatter
|
|
414
|
+
let description;
|
|
415
|
+
let emoji;
|
|
416
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
417
|
+
if (fmMatch) {
|
|
418
|
+
const fm = fmMatch[1];
|
|
419
|
+
// Extract description
|
|
420
|
+
const descMatch = fm.match(/description:\s*"([^"]+)"/);
|
|
421
|
+
if (descMatch)
|
|
422
|
+
description = descMatch[1];
|
|
423
|
+
else {
|
|
424
|
+
const descMatch2 = fm.match(/description:\s*'([^']+)'/);
|
|
425
|
+
if (descMatch2)
|
|
426
|
+
description = descMatch2[1];
|
|
427
|
+
else {
|
|
428
|
+
const descMatch3 = fm.match(/description:\s+(.+)/);
|
|
429
|
+
if (descMatch3)
|
|
430
|
+
description = descMatch3[1].trim();
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
// Extract emoji from metadata
|
|
434
|
+
const emojiMatch = fm.match(/"emoji":\s*"([^"]+)"/);
|
|
435
|
+
if (emojiMatch)
|
|
436
|
+
emoji = emojiMatch[1];
|
|
437
|
+
}
|
|
438
|
+
result.set(name, { description, emoji, skillMd: content });
|
|
439
|
+
break; // Found in this dir, no need to check others
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
// Not found in this dir, try next
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
// Non-fatal — return whatever we have
|
|
449
|
+
}
|
|
450
|
+
return result;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// ── Module-level singleton ──────────────────────────────────────────────
|
|
454
|
+
let _pusher = null;
|
|
455
|
+
export function setTelemetryPusher(pusher) {
|
|
456
|
+
_pusher = pusher;
|
|
457
|
+
}
|
|
458
|
+
export function getTelemetryPusher() {
|
|
459
|
+
return _pusher;
|
|
460
|
+
}
|
|
461
|
+
//# sourceMappingURL=pusher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pusher.js","sourceRoot":"","sources":["../../src/telemetry/pusher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UsageCollector — collects token usage from agent_end hook messages.
|
|
3
|
+
*
|
|
4
|
+
* The collector maintains per-run usage counters.
|
|
5
|
+
* RunTracker calls getAndResetUsage() at run completion to include
|
|
6
|
+
* token usage in the PATCH payload.
|
|
7
|
+
*/
|
|
8
|
+
export interface TokenUsage {
|
|
9
|
+
inputTokens: number;
|
|
10
|
+
outputTokens: number;
|
|
11
|
+
totalTokens: number;
|
|
12
|
+
estimatedCost: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class UsageCollector {
|
|
15
|
+
private runInputTokens;
|
|
16
|
+
private runOutputTokens;
|
|
17
|
+
private runEstimatedCost;
|
|
18
|
+
private _messageCountAtRunStart;
|
|
19
|
+
/** Store how many messages existed before the current run started. */
|
|
20
|
+
setRunStartMessageCount(count: number): void;
|
|
21
|
+
/** Get the message offset for the current run. */
|
|
22
|
+
getRunStartMessageCount(): number;
|
|
23
|
+
/**
|
|
24
|
+
* Record a model usage event.
|
|
25
|
+
* Called from the diagnostic event handler.
|
|
26
|
+
*/
|
|
27
|
+
recordUsage(data: {
|
|
28
|
+
inputTokens?: number;
|
|
29
|
+
outputTokens?: number;
|
|
30
|
+
cost?: number;
|
|
31
|
+
}): void;
|
|
32
|
+
/**
|
|
33
|
+
* Get usage for the current run and reset run counters.
|
|
34
|
+
* Called by RunTracker on complete()/fail().
|
|
35
|
+
*/
|
|
36
|
+
getAndResetUsage(): TokenUsage;
|
|
37
|
+
}
|
|
38
|
+
export declare function setUsageCollector(collector: UsageCollector | null): void;
|
|
39
|
+
export declare function getUsageCollector(): UsageCollector | null;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UsageCollector — collects token usage from agent_end hook messages.
|
|
3
|
+
*
|
|
4
|
+
* The collector maintains per-run usage counters.
|
|
5
|
+
* RunTracker calls getAndResetUsage() at run completion to include
|
|
6
|
+
* token usage in the PATCH payload.
|
|
7
|
+
*/
|
|
8
|
+
export class UsageCollector {
|
|
9
|
+
// Per-run accumulator (reset between runs)
|
|
10
|
+
runInputTokens = 0;
|
|
11
|
+
runOutputTokens = 0;
|
|
12
|
+
runEstimatedCost = 0;
|
|
13
|
+
// Tracks message count at run start so agent_end can skip old messages
|
|
14
|
+
_messageCountAtRunStart = 0;
|
|
15
|
+
/** Store how many messages existed before the current run started. */
|
|
16
|
+
setRunStartMessageCount(count) {
|
|
17
|
+
this._messageCountAtRunStart = count;
|
|
18
|
+
}
|
|
19
|
+
/** Get the message offset for the current run. */
|
|
20
|
+
getRunStartMessageCount() {
|
|
21
|
+
return this._messageCountAtRunStart;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Record a model usage event.
|
|
25
|
+
* Called from the diagnostic event handler.
|
|
26
|
+
*/
|
|
27
|
+
recordUsage(data) {
|
|
28
|
+
const input = data.inputTokens ?? 0;
|
|
29
|
+
const output = data.outputTokens ?? 0;
|
|
30
|
+
const cost = data.cost ?? 0;
|
|
31
|
+
this.runInputTokens += input;
|
|
32
|
+
this.runOutputTokens += output;
|
|
33
|
+
this.runEstimatedCost += cost;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get usage for the current run and reset run counters.
|
|
37
|
+
* Called by RunTracker on complete()/fail().
|
|
38
|
+
*/
|
|
39
|
+
getAndResetUsage() {
|
|
40
|
+
const usage = {
|
|
41
|
+
inputTokens: this.runInputTokens,
|
|
42
|
+
outputTokens: this.runOutputTokens,
|
|
43
|
+
totalTokens: this.runInputTokens + this.runOutputTokens,
|
|
44
|
+
estimatedCost: Math.round(this.runEstimatedCost * 1_000_000) / 1_000_000, // 6 decimal places
|
|
45
|
+
};
|
|
46
|
+
this.runInputTokens = 0;
|
|
47
|
+
this.runOutputTokens = 0;
|
|
48
|
+
this.runEstimatedCost = 0;
|
|
49
|
+
return usage;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// ── Module-level singleton ──────────────────────────────────────────────
|
|
53
|
+
let _collector = null;
|
|
54
|
+
export function setUsageCollector(collector) {
|
|
55
|
+
_collector = collector;
|
|
56
|
+
}
|
|
57
|
+
export function getUsageCollector() {
|
|
58
|
+
return _collector;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=usage-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-collector.js","sourceRoot":"","sources":["../../src/telemetry/usage-collector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,OAAO,cAAc;IACzB,2CAA2C;IACnC,cAAc,GAAW,CAAC,CAAC;IAC3B,eAAe,GAAW,CAAC,CAAC;IAC5B,gBAAgB,GAAW,CAAC,CAAC;IAErC,uEAAuE;IAC/D,uBAAuB,GAAW,CAAC,CAAC;IAE5C,sEAAsE;IACtE,uBAAuB,CAAC,KAAa;QACnC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;IACvC,CAAC;IAED,kDAAkD;IAClD,uBAAuB;QACrB,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,IAIX;QACC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAE5B,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC;QAC7B,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC;QAC/B,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACd,MAAM,KAAK,GAAe;YACxB,WAAW,EAAE,IAAI,CAAC,cAAc;YAChC,YAAY,EAAE,IAAI,CAAC,eAAe;YAClC,WAAW,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe;YACvD,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,SAAS,EAAE,mBAAmB;SAC9F,CAAC;QAEF,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAE1B,OAAO,KAAK,CAAC;IACf,CAAC;CAEF;AAED,2EAA2E;AAE3E,IAAI,UAAU,GAA0B,IAAI,CAAC;AAE7C,MAAM,UAAU,iBAAiB,CAAC,SAAgC;IAChE,UAAU,GAAG,SAAS,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Item Tools — blay_list_action_items, blay_create_action_item, blay_update_action_item
|
|
3
|
+
*/
|
|
4
|
+
import type { BlayClient } from "../client.js";
|
|
5
|
+
import type { ToolResult } from "../types.js";
|
|
6
|
+
export declare function createListActionItemsTool(client: BlayClient): {
|
|
7
|
+
name: string;
|
|
8
|
+
label: string;
|
|
9
|
+
description: string;
|
|
10
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
11
|
+
assigneeId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
12
|
+
status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
13
|
+
overdue: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
14
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
15
|
+
}>;
|
|
16
|
+
execute(_toolCallId: string, params: {
|
|
17
|
+
assigneeId?: string;
|
|
18
|
+
status?: string;
|
|
19
|
+
overdue?: boolean;
|
|
20
|
+
limit?: number;
|
|
21
|
+
}): Promise<ToolResult>;
|
|
22
|
+
};
|
|
23
|
+
export declare function createCreateActionItemTool(client: BlayClient): {
|
|
24
|
+
name: string;
|
|
25
|
+
label: string;
|
|
26
|
+
description: string;
|
|
27
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
28
|
+
title: import("@sinclair/typebox").TString;
|
|
29
|
+
targetUserId: import("@sinclair/typebox").TString;
|
|
30
|
+
priority: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
31
|
+
dueDate: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
32
|
+
projectId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
33
|
+
}>;
|
|
34
|
+
execute(_toolCallId: string, params: {
|
|
35
|
+
title: string;
|
|
36
|
+
targetUserId: string;
|
|
37
|
+
priority?: string;
|
|
38
|
+
dueDate?: number;
|
|
39
|
+
projectId?: string;
|
|
40
|
+
}): Promise<ToolResult>;
|
|
41
|
+
};
|
|
42
|
+
export declare function createUpdateActionItemTool(client: BlayClient): {
|
|
43
|
+
name: string;
|
|
44
|
+
label: string;
|
|
45
|
+
description: string;
|
|
46
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
47
|
+
actionItemId: import("@sinclair/typebox").TString;
|
|
48
|
+
title: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
49
|
+
status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
50
|
+
priority: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
51
|
+
dueDate: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
52
|
+
}>;
|
|
53
|
+
execute(_toolCallId: string, params: {
|
|
54
|
+
actionItemId: string;
|
|
55
|
+
title?: string;
|
|
56
|
+
status?: string;
|
|
57
|
+
priority?: string;
|
|
58
|
+
dueDate?: number;
|
|
59
|
+
}): Promise<ToolResult>;
|
|
60
|
+
};
|