@claw-manager/openclaw-api-channel 2026.6.27 → 2026.6.29
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/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/src/channel.js +169 -16
- package/dist/src/channel.js.map +1 -1
- package/index.ts +6 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/src/channel.ts +209 -17
package/dist/index.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { apiChannelPlugin } from "./src/channel.js";
|
|
2
|
+
export const API_GATEWAY_METHOD = "claw-manager-api.sendMessage";
|
|
2
3
|
export default {
|
|
3
4
|
id: "claw-manager-api",
|
|
4
5
|
name: "Claw Manager API",
|
|
5
6
|
description: "External API channel for Claw Manager",
|
|
6
7
|
register(api) {
|
|
8
|
+
api.logger?.info?.(`claw-manager-api: register channel mode=${String(api.registrationMode ?? "unknown")} ` +
|
|
9
|
+
`hasGatewayMethod=${String(typeof api.registerGatewayMethod === "function")}`);
|
|
7
10
|
api.registerChannel({ plugin: apiChannelPlugin });
|
|
8
11
|
},
|
|
9
12
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,eAAe;IACb,EAAE,EAAE,kBAAkB;IACtB,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,uCAAuC;IACpD,QAAQ,CAAC,GAAsB;QAC7B,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;AAEjE,eAAe;IACb,EAAE,EAAE,kBAAkB;IACtB,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,uCAAuC;IACpD,QAAQ,CAAC,GAAsB;QAC7B,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAChB,2CAA2C,MAAM,CAAC,GAAG,CAAC,gBAAgB,IAAI,SAAS,CAAC,GAAG;YACrF,oBAAoB,MAAM,CAAC,OAAO,GAAG,CAAC,qBAAqB,KAAK,UAAU,CAAC,EAAE,CAChF,CAAC;QACF,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC"}
|
package/dist/src/channel.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
2
4
|
import { createTypingCallbacks } from "openclaw/plugin-sdk/channel-runtime";
|
|
5
|
+
const API_CHANNEL_ID = "claw-manager-api";
|
|
6
|
+
const API_ACCOUNT_ID = "global";
|
|
7
|
+
const API_QUEUE_POLL_MS = 200;
|
|
3
8
|
export function buildApiInboundContext(params) {
|
|
4
9
|
const message = trim(params.message);
|
|
5
10
|
const openVikingUserId = trim(params.openVikingUserId) || trim(params.openvikingUserId);
|
|
@@ -52,8 +57,8 @@ export async function dispatchApiMessage(ctx) {
|
|
|
52
57
|
const inbound = buildApiInboundContext(ctx);
|
|
53
58
|
const route = runtime.routing.resolveAgentRoute({
|
|
54
59
|
cfg: ctx.cfg,
|
|
55
|
-
channel:
|
|
56
|
-
accountId:
|
|
60
|
+
channel: API_CHANNEL_ID,
|
|
61
|
+
accountId: API_ACCOUNT_ID,
|
|
57
62
|
peer: { kind: "direct", id: inbound.To },
|
|
58
63
|
});
|
|
59
64
|
const sessionKey = route.sessionKey ?? inbound.SessionKey;
|
|
@@ -68,9 +73,9 @@ export async function dispatchApiMessage(ctx) {
|
|
|
68
73
|
ctx: finalized,
|
|
69
74
|
updateLastRoute: {
|
|
70
75
|
sessionKey: route.mainSessionKey ?? sessionKey,
|
|
71
|
-
channel:
|
|
76
|
+
channel: API_CHANNEL_ID,
|
|
72
77
|
to: inbound.To,
|
|
73
|
-
accountId:
|
|
78
|
+
accountId: API_ACCOUNT_ID,
|
|
74
79
|
},
|
|
75
80
|
onRecordError: (error) => ctx.log?.error?.(`recordInboundSession: ${String(error)}`),
|
|
76
81
|
});
|
|
@@ -108,19 +113,158 @@ export async function dispatchApiMessage(ctx) {
|
|
|
108
113
|
markDispatchIdle();
|
|
109
114
|
}
|
|
110
115
|
return {
|
|
111
|
-
channel:
|
|
116
|
+
channel: API_CHANNEL_ID,
|
|
112
117
|
messageId: trim(ctx.requestId) || randomUUID(),
|
|
113
118
|
text: replyText,
|
|
114
119
|
};
|
|
115
120
|
}
|
|
121
|
+
export function resolveApiQueueRoot() {
|
|
122
|
+
const home = trim(process.env.OPENCLAW_HOME) || trim(process.env.HOME) || process.cwd();
|
|
123
|
+
return path.join(home, ".openclaw", API_CHANNEL_ID);
|
|
124
|
+
}
|
|
125
|
+
export async function monitorApiQueue(ctx) {
|
|
126
|
+
if (!ctx.channelRuntime) {
|
|
127
|
+
throw new Error("ctx.channelRuntime missing");
|
|
128
|
+
}
|
|
129
|
+
if (!ctx.cfg) {
|
|
130
|
+
throw new Error("ctx.cfg missing");
|
|
131
|
+
}
|
|
132
|
+
const root = resolveApiQueueRoot();
|
|
133
|
+
const dirs = {
|
|
134
|
+
root,
|
|
135
|
+
requests: path.join(root, "requests"),
|
|
136
|
+
processing: path.join(root, "processing"),
|
|
137
|
+
responses: path.join(root, "responses"),
|
|
138
|
+
failed: path.join(root, "failed"),
|
|
139
|
+
};
|
|
140
|
+
await Promise.all(Object.values(dirs).map((dir) => fs.mkdir(dir, { recursive: true })));
|
|
141
|
+
ctx.log?.info?.(`[${API_ACCOUNT_ID}] claw-manager-api queue monitor started (${root})`);
|
|
142
|
+
ctx.setStatus?.({
|
|
143
|
+
accountId: API_ACCOUNT_ID,
|
|
144
|
+
running: true,
|
|
145
|
+
configured: true,
|
|
146
|
+
lastStartAt: Date.now(),
|
|
147
|
+
lastError: null,
|
|
148
|
+
});
|
|
149
|
+
while (!ctx.abortSignal?.aborted) {
|
|
150
|
+
await processPendingApiRequests(ctx, dirs);
|
|
151
|
+
await sleep(API_QUEUE_POLL_MS, ctx.abortSignal);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async function processPendingApiRequests(ctx, dirs) {
|
|
155
|
+
let files = [];
|
|
156
|
+
try {
|
|
157
|
+
files = (await fs.readdir(dirs.requests))
|
|
158
|
+
.filter((file) => file.endsWith(".json"))
|
|
159
|
+
.sort();
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
ctx.log?.error?.(`[${API_ACCOUNT_ID}] read queue failed: ${errorMessage(error)}`);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
for (const file of files) {
|
|
166
|
+
if (ctx.abortSignal?.aborted) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const requestPath = path.join(dirs.requests, file);
|
|
170
|
+
const processingPath = path.join(dirs.processing, file);
|
|
171
|
+
try {
|
|
172
|
+
await fs.rename(requestPath, processingPath);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
await processApiRequestFile(ctx, processingPath, path.join(dirs.responses, file), path.join(dirs.failed, file));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function processApiRequestFile(ctx, processingPath, responsePath, failedPath) {
|
|
181
|
+
let request = {};
|
|
182
|
+
let requestId = path.basename(processingPath, ".json");
|
|
183
|
+
try {
|
|
184
|
+
request = JSON.parse(await fs.readFile(processingPath, "utf8"));
|
|
185
|
+
requestId = trim(request.requestId) || requestId;
|
|
186
|
+
ctx.log?.info?.(`[${API_ACCOUNT_ID}] api request received requestId=${requestId} user=${trim(request.openVikingUserId) || trim(request.openvikingUserId) || "missing"}`);
|
|
187
|
+
ctx.setStatus?.({
|
|
188
|
+
accountId: API_ACCOUNT_ID,
|
|
189
|
+
running: true,
|
|
190
|
+
lastInboundAt: Date.now(),
|
|
191
|
+
lastEventAt: Date.now(),
|
|
192
|
+
});
|
|
193
|
+
const result = await dispatchApiMessage({
|
|
194
|
+
...request,
|
|
195
|
+
requestId,
|
|
196
|
+
cfg: ctx.cfg,
|
|
197
|
+
channelRuntime: ctx.channelRuntime,
|
|
198
|
+
log: ctx.log,
|
|
199
|
+
});
|
|
200
|
+
await writeQueueResponse(responsePath, {
|
|
201
|
+
ok: true,
|
|
202
|
+
requestId,
|
|
203
|
+
messageId: result.messageId,
|
|
204
|
+
text: result.text,
|
|
205
|
+
finishedAt: new Date().toISOString(),
|
|
206
|
+
});
|
|
207
|
+
ctx.setStatus?.({
|
|
208
|
+
accountId: API_ACCOUNT_ID,
|
|
209
|
+
running: true,
|
|
210
|
+
lastOutboundAt: Date.now(),
|
|
211
|
+
lastEventAt: Date.now(),
|
|
212
|
+
lastError: null,
|
|
213
|
+
});
|
|
214
|
+
ctx.log?.info?.(`[${API_ACCOUNT_ID}] api request completed requestId=${requestId} textLen=${result.text.length}`);
|
|
215
|
+
await safeUnlink(processingPath);
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
const message = errorMessage(error);
|
|
219
|
+
ctx.log?.error?.(`[${API_ACCOUNT_ID}] api request failed requestId=${requestId}: ${message}`);
|
|
220
|
+
await writeQueueResponse(responsePath, {
|
|
221
|
+
ok: false,
|
|
222
|
+
requestId,
|
|
223
|
+
error: message,
|
|
224
|
+
finishedAt: new Date().toISOString(),
|
|
225
|
+
});
|
|
226
|
+
await fs.mkdir(path.dirname(failedPath), { recursive: true });
|
|
227
|
+
await fs.rename(processingPath, failedPath).catch(() => safeUnlink(processingPath));
|
|
228
|
+
ctx.setStatus?.({
|
|
229
|
+
accountId: API_ACCOUNT_ID,
|
|
230
|
+
running: true,
|
|
231
|
+
lastError: message,
|
|
232
|
+
lastEventAt: Date.now(),
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
async function writeQueueResponse(responsePath, response) {
|
|
237
|
+
await fs.mkdir(path.dirname(responsePath), { recursive: true });
|
|
238
|
+
const tmpPath = `${responsePath}.tmp-${process.pid}-${Date.now()}`;
|
|
239
|
+
await fs.writeFile(tmpPath, JSON.stringify(response), "utf8");
|
|
240
|
+
await fs.rename(tmpPath, responsePath);
|
|
241
|
+
}
|
|
242
|
+
async function safeUnlink(file) {
|
|
243
|
+
try {
|
|
244
|
+
await fs.unlink(file);
|
|
245
|
+
}
|
|
246
|
+
catch { }
|
|
247
|
+
}
|
|
248
|
+
function sleep(ms, signal) {
|
|
249
|
+
if (signal?.aborted) {
|
|
250
|
+
return Promise.resolve();
|
|
251
|
+
}
|
|
252
|
+
return new Promise((resolve) => {
|
|
253
|
+
const timer = setTimeout(resolve, ms);
|
|
254
|
+
signal?.addEventListener("abort", () => {
|
|
255
|
+
clearTimeout(timer);
|
|
256
|
+
resolve();
|
|
257
|
+
}, { once: true });
|
|
258
|
+
});
|
|
259
|
+
}
|
|
116
260
|
export const apiChannelPlugin = {
|
|
117
|
-
id:
|
|
261
|
+
id: API_CHANNEL_ID,
|
|
118
262
|
meta: {
|
|
119
|
-
id:
|
|
120
|
-
label:
|
|
263
|
+
id: API_CHANNEL_ID,
|
|
264
|
+
label: API_CHANNEL_ID,
|
|
121
265
|
selectionLabel: "Claw Manager API",
|
|
122
|
-
docsPath:
|
|
123
|
-
docsLabel:
|
|
266
|
+
docsPath: `/channels/${API_CHANNEL_ID}`,
|
|
267
|
+
docsLabel: API_CHANNEL_ID,
|
|
124
268
|
blurb: "External API channel.",
|
|
125
269
|
order: 80,
|
|
126
270
|
},
|
|
@@ -137,11 +281,11 @@ export const apiChannelPlugin = {
|
|
|
137
281
|
blockStreaming: true,
|
|
138
282
|
},
|
|
139
283
|
config: {
|
|
140
|
-
listAccountIds: () => [
|
|
284
|
+
listAccountIds: () => [API_ACCOUNT_ID],
|
|
141
285
|
resolveAccount: () => ({}),
|
|
142
286
|
isConfigured: () => true,
|
|
143
287
|
describeAccount: () => ({
|
|
144
|
-
accountId:
|
|
288
|
+
accountId: API_ACCOUNT_ID,
|
|
145
289
|
name: "Claw Manager API",
|
|
146
290
|
enabled: true,
|
|
147
291
|
configured: true,
|
|
@@ -151,14 +295,14 @@ export const apiChannelPlugin = {
|
|
|
151
295
|
deliveryMode: "direct",
|
|
152
296
|
textChunkLimit: 8000,
|
|
153
297
|
sendText: async (ctx) => ({
|
|
154
|
-
channel:
|
|
298
|
+
channel: API_CHANNEL_ID,
|
|
155
299
|
messageId: randomUUID(),
|
|
156
300
|
text: ctx.text ?? "",
|
|
157
301
|
}),
|
|
158
302
|
},
|
|
159
303
|
status: {
|
|
160
304
|
defaultRuntime: {
|
|
161
|
-
accountId:
|
|
305
|
+
accountId: API_ACCOUNT_ID,
|
|
162
306
|
lastError: null,
|
|
163
307
|
lastInboundAt: null,
|
|
164
308
|
lastOutboundAt: null,
|
|
@@ -172,17 +316,26 @@ export const apiChannelPlugin = {
|
|
|
172
316
|
}),
|
|
173
317
|
buildAccountSnapshot: ({ runtime }) => ({
|
|
174
318
|
...runtime,
|
|
175
|
-
accountId:
|
|
319
|
+
accountId: API_ACCOUNT_ID,
|
|
176
320
|
name: "Claw Manager API",
|
|
177
321
|
enabled: true,
|
|
178
322
|
configured: true,
|
|
179
323
|
}),
|
|
180
324
|
},
|
|
181
325
|
gateway: {
|
|
182
|
-
|
|
326
|
+
startAccount: async (ctx) => monitorApiQueue(ctx),
|
|
327
|
+
stopAccount: async (ctx) => {
|
|
328
|
+
ctx.log?.info?.(`[${API_ACCOUNT_ID}] claw-manager-api queue monitor stopping`);
|
|
329
|
+
},
|
|
183
330
|
},
|
|
184
331
|
};
|
|
185
332
|
function trim(value) {
|
|
186
333
|
return typeof value === "string" ? value.trim() : "";
|
|
187
334
|
}
|
|
335
|
+
function errorMessage(error) {
|
|
336
|
+
if (error instanceof Error && error.message.trim()) {
|
|
337
|
+
return error.message;
|
|
338
|
+
}
|
|
339
|
+
return String(error);
|
|
340
|
+
}
|
|
188
341
|
//# sourceMappingURL=channel.js.map
|
package/dist/src/channel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAkE5E,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAC1C,MAAM,cAAc,GAAG,QAAQ,CAAC;AAChC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,UAAU,sBAAsB,CAAC,MAA4B;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACxF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClF,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,UAAU,EAAE,CAAC;IACjC,MAAM,EAAE,GAAG,OAAO,UAAU,IAAI,gBAAgB,EAAE,CAAC;IACnD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,IAAI;QACV,EAAE,EAAE,EAAE;QACN,SAAS,EAAE,QAAQ;QACnB,kBAAkB,EAAE,kBAAkB;QACtC,aAAa,EAAE,EAAE;QACjB,UAAU,EAAE,oBAAoB,UAAU,EAAE,EAAE;QAC9C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,QAAQ,EAAE,kBAAkB;QAC5B,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,OAAO,UAAU,IAAI,gBAAgB,EAAE;QACnD,QAAQ,EAAE,QAAQ;QAClB,QAAQ;QACR,iBAAiB,EAAE,QAAQ;QAC3B,gBAAgB;QAChB,gBAAgB,EAAE,gBAAgB;QAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAA8B;IACrE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,CAAC;IACnC,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC9C,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,OAAO,EAAE,cAAc;QACvB,SAAS,EAAE,cAAc;QACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;KACzC,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;IAC1D,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAChC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE;QACzE,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CACpD,OAAqE,CACT,CAAC;IAC/D,MAAM,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;QACzC,SAAS;QACT,UAAU;QACV,GAAG,EAAE,SAA8E;QACnF,eAAe,EAAE;YACf,UAAU,EAAE,KAAK,CAAC,cAAc,IAAI,UAAU;YAC9C,OAAO,EAAE,cAAc;YACvB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,SAAS,EAAE,cAAc;SAC1B;QACD,aAAa,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,yBAAyB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;KAC9F,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC;QACnG,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC;QACzE,eAAe,EAAE,qBAAqB,CAAC;YACrC,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;YACrB,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;YACpB,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;YACtB,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;SACtB,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,OAA0B,EAAE,EAAE;YAC5C,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,EAAE,CAAC,KAAc,EAAE,EAAE;YAC1B,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC;YACtC,UAAU;YACV,GAAG,EAAE,GAAG,EAAE,CACR,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC;gBACpC,GAAG,EAAE,SAAS;gBACd,GAAG,EAAE,GAAG,CAAC,GAAI;gBACb,UAAU;gBACV,YAAY,EAAE;oBACZ,GAAG,YAAY;oBACf,qBAAqB,EAAE,IAAI;iBAC5B;aACF,CAAC;SACL,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,gBAAgB,EAAE,CAAC;IACrB,CAAC;IACD,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,UAAU,EAAE;QAC9C,IAAI,EAAE,SAAS;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACxF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAA2B;IAC/D,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QACrC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;QACzC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QACvC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;KAClC,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxF,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,cAAc,6CAA6C,IAAI,GAAG,CAAC,CAAC;IACxF,GAAG,CAAC,SAAS,EAAE,CAAC;QACd,SAAS,EAAE,cAAc;QACzB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;QACvB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;QACjC,MAAM,yBAAyB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,GAA2B,EAC3B,IAAiF;IAEjF,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aACtC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACxC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,cAAc,wBAAwB,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,qBAAqB,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAClH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,GAA2B,EAC3B,cAAsB,EACtB,YAAoB,EACpB,UAAkB;IAElB,IAAI,OAAO,GAAyB,EAAE,CAAC;IACvC,IAAI,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAyB,CAAC;QACxF,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;QACjD,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,cAAc,oCAAoC,SAAS,SAAS,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;QACzK,GAAG,CAAC,SAAS,EAAE,CAAC;YACd,SAAS,EAAE,cAAc;YACzB,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;YACzB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;YACtC,GAAG,OAAO;YACV,SAAS;YACT,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,GAAG,EAAE,GAAG,CAAC,GAAG;SACb,CAAC,CAAC;QACH,MAAM,kBAAkB,CAAC,YAAY,EAAE;YACrC,EAAE,EAAE,IAAI;YACR,SAAS;YACT,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;QACH,GAAG,CAAC,SAAS,EAAE,CAAC;YACd,SAAS,EAAE,cAAc;YACzB,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;YAC1B,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;YACvB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,cAAc,qCAAqC,SAAS,YAAY,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAClH,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,cAAc,kCAAkC,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9F,MAAM,kBAAkB,CAAC,YAAY,EAAE;YACrC,EAAE,EAAE,KAAK;YACT,SAAS;YACT,KAAK,EAAE,OAAO;YACd,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;QACpF,GAAG,CAAC,SAAS,EAAE,CAAC;YACd,SAAS,EAAE,cAAc;YACzB,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,OAAO;YAClB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,YAAoB,EAAE,QAA0B;IAChF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,GAAG,YAAY,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACnE,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAoB;IAC7C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACrC,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAyC;IACpE,EAAE,EAAE,cAAc;IAClB,IAAI,EAAE;QACJ,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,cAAc;QACrB,cAAc,EAAE,kBAAkB;QAClC,QAAQ,EAAE,aAAa,cAAc,EAAE;QACvC,SAAS,EAAE,cAAc;QACzB,KAAK,EAAE,uBAAuB;QAC9B,KAAK,EAAE,EAAE;KACV;IACD,YAAY,EAAE;QACZ,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,IAAI;YAC1B,UAAU,EAAE,EAAE;SACf;KACF;IACD,YAAY,EAAE;QACZ,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,KAAK,EAAE,KAAK;QACZ,cAAc,EAAE,IAAI;KACrB;IACD,MAAM,EAAE;QACN,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,cAAc,CAAC;QACtC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1B,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI;QACxB,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;YACtB,SAAS,EAAE,cAAc;YACzB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;SACjB,CAAC;KACH;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,QAAQ;QACtB,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,KAAK,EAAE,GAAsB,EAAE,EAAE,CAAC,CAAC;YAC3C,OAAO,EAAE,cAAc;YACvB,SAAS,EAAE,UAAU,EAAE;YACvB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;SACrB,CAAC;KACH;IACD,MAAM,EAAE;QACN,cAAc,EAAE;YACd,SAAS,EAAE,cAAc;YACzB,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI;SACrB;QACD,mBAAmB,EAAE,GAAG,EAAE,CAAC,EAAE;QAC7B,mBAAmB,EAAE,CAAC,EAAE,QAAQ,EAAyC,EAAE,EAAE,CAAC,CAAC;YAC7E,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI;YACrC,aAAa,EAAE,QAAQ,CAAC,aAAa,IAAI,IAAI;YAC7C,cAAc,EAAE,QAAQ,CAAC,cAAc,IAAI,IAAI;SAChD,CAAC;QACF,oBAAoB,EAAE,CAAC,EAAE,OAAO,EAAwC,EAAE,EAAE,CAAC,CAAC;YAC5E,GAAG,OAAO;YACV,SAAS,EAAE,cAAc;YACzB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;SACjB,CAAC;KACH;IACD,OAAO,EAAE;QACP,YAAY,EAAE,KAAK,EAAE,GAA2B,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC;QACzE,WAAW,EAAE,KAAK,EAAE,GAAyB,EAAE,EAAE;YAC/C,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,cAAc,2CAA2C,CAAC,CAAC;QACjF,CAAC;KACF;CACiD,CAAC;AAErD,SAAS,IAAI,CAAC,KAAc;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
|
package/index.ts
CHANGED
|
@@ -2,11 +2,17 @@ import type { OpenClawPluginApi } from "openclaw/plugin-sdk/plugin-entry";
|
|
|
2
2
|
|
|
3
3
|
import { apiChannelPlugin } from "./src/channel.js";
|
|
4
4
|
|
|
5
|
+
export const API_GATEWAY_METHOD = "claw-manager-api.sendMessage";
|
|
6
|
+
|
|
5
7
|
export default {
|
|
6
8
|
id: "claw-manager-api",
|
|
7
9
|
name: "Claw Manager API",
|
|
8
10
|
description: "External API channel for Claw Manager",
|
|
9
11
|
register(api: OpenClawPluginApi) {
|
|
12
|
+
api.logger?.info?.(
|
|
13
|
+
`claw-manager-api: register channel mode=${String(api.registrationMode ?? "unknown")} ` +
|
|
14
|
+
`hasGatewayMethod=${String(typeof api.registerGatewayMethod === "function")}`,
|
|
15
|
+
);
|
|
10
16
|
api.registerChannel({ plugin: apiChannelPlugin });
|
|
11
17
|
},
|
|
12
18
|
};
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
package/src/channel.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
2
4
|
|
|
3
5
|
import { createTypingCallbacks } from "openclaw/plugin-sdk/channel-runtime";
|
|
4
6
|
import type { ChannelPlugin, OpenClawConfig, PluginRuntime } from "openclaw/plugin-sdk/core";
|
|
@@ -39,9 +41,37 @@ export type ApiMsgContext = {
|
|
|
39
41
|
type GatewaySendMessageContext = ApiSendMessageParams & {
|
|
40
42
|
cfg?: OpenClawConfig;
|
|
41
43
|
channelRuntime?: PluginRuntime["channel"];
|
|
42
|
-
log?:
|
|
44
|
+
log?: ApiLogSink;
|
|
43
45
|
};
|
|
44
46
|
|
|
47
|
+
type ApiLogSink = {
|
|
48
|
+
debug?: (message: string) => void;
|
|
49
|
+
info?: (message: string) => void;
|
|
50
|
+
warn?: (message: string) => void;
|
|
51
|
+
error?: (message: string) => void;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
type ApiGatewayStartContext = {
|
|
55
|
+
cfg?: OpenClawConfig;
|
|
56
|
+
channelRuntime?: PluginRuntime["channel"];
|
|
57
|
+
abortSignal?: AbortSignal;
|
|
58
|
+
log?: ApiLogSink;
|
|
59
|
+
setStatus?: (next: Record<string, unknown>) => void;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
type ApiQueueResponse = {
|
|
63
|
+
ok: boolean;
|
|
64
|
+
requestId: string;
|
|
65
|
+
messageId?: string;
|
|
66
|
+
text?: string;
|
|
67
|
+
error?: string;
|
|
68
|
+
finishedAt: string;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const API_CHANNEL_ID = "claw-manager-api";
|
|
72
|
+
const API_ACCOUNT_ID = "global";
|
|
73
|
+
const API_QUEUE_POLL_MS = 200;
|
|
74
|
+
|
|
45
75
|
export function buildApiInboundContext(params: ApiSendMessageParams): ApiMsgContext {
|
|
46
76
|
const message = trim(params.message);
|
|
47
77
|
const openVikingUserId = trim(params.openVikingUserId) || trim(params.openvikingUserId);
|
|
@@ -95,8 +125,8 @@ export async function dispatchApiMessage(ctx: GatewaySendMessageContext): Promis
|
|
|
95
125
|
const inbound = buildApiInboundContext(ctx);
|
|
96
126
|
const route = runtime.routing.resolveAgentRoute({
|
|
97
127
|
cfg: ctx.cfg,
|
|
98
|
-
channel:
|
|
99
|
-
accountId:
|
|
128
|
+
channel: API_CHANNEL_ID,
|
|
129
|
+
accountId: API_ACCOUNT_ID,
|
|
100
130
|
peer: { kind: "direct", id: inbound.To },
|
|
101
131
|
});
|
|
102
132
|
const sessionKey = route.sessionKey ?? inbound.SessionKey;
|
|
@@ -113,9 +143,9 @@ export async function dispatchApiMessage(ctx: GatewaySendMessageContext): Promis
|
|
|
113
143
|
ctx: finalized as Parameters<typeof runtime.session.recordInboundSession>[0]["ctx"],
|
|
114
144
|
updateLastRoute: {
|
|
115
145
|
sessionKey: route.mainSessionKey ?? sessionKey,
|
|
116
|
-
channel:
|
|
146
|
+
channel: API_CHANNEL_ID,
|
|
117
147
|
to: inbound.To,
|
|
118
|
-
accountId:
|
|
148
|
+
accountId: API_ACCOUNT_ID,
|
|
119
149
|
},
|
|
120
150
|
onRecordError: (error: unknown) => ctx.log?.error?.(`recordInboundSession: ${String(error)}`),
|
|
121
151
|
});
|
|
@@ -155,20 +185,172 @@ export async function dispatchApiMessage(ctx: GatewaySendMessageContext): Promis
|
|
|
155
185
|
markDispatchIdle();
|
|
156
186
|
}
|
|
157
187
|
return {
|
|
158
|
-
channel:
|
|
188
|
+
channel: API_CHANNEL_ID,
|
|
159
189
|
messageId: trim(ctx.requestId) || randomUUID(),
|
|
160
190
|
text: replyText,
|
|
161
191
|
};
|
|
162
192
|
}
|
|
163
193
|
|
|
194
|
+
export function resolveApiQueueRoot(): string {
|
|
195
|
+
const home = trim(process.env.OPENCLAW_HOME) || trim(process.env.HOME) || process.cwd();
|
|
196
|
+
return path.join(home, ".openclaw", API_CHANNEL_ID);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export async function monitorApiQueue(ctx: ApiGatewayStartContext): Promise<void> {
|
|
200
|
+
if (!ctx.channelRuntime) {
|
|
201
|
+
throw new Error("ctx.channelRuntime missing");
|
|
202
|
+
}
|
|
203
|
+
if (!ctx.cfg) {
|
|
204
|
+
throw new Error("ctx.cfg missing");
|
|
205
|
+
}
|
|
206
|
+
const root = resolveApiQueueRoot();
|
|
207
|
+
const dirs = {
|
|
208
|
+
root,
|
|
209
|
+
requests: path.join(root, "requests"),
|
|
210
|
+
processing: path.join(root, "processing"),
|
|
211
|
+
responses: path.join(root, "responses"),
|
|
212
|
+
failed: path.join(root, "failed"),
|
|
213
|
+
};
|
|
214
|
+
await Promise.all(Object.values(dirs).map((dir) => fs.mkdir(dir, { recursive: true })));
|
|
215
|
+
ctx.log?.info?.(`[${API_ACCOUNT_ID}] claw-manager-api queue monitor started (${root})`);
|
|
216
|
+
ctx.setStatus?.({
|
|
217
|
+
accountId: API_ACCOUNT_ID,
|
|
218
|
+
running: true,
|
|
219
|
+
configured: true,
|
|
220
|
+
lastStartAt: Date.now(),
|
|
221
|
+
lastError: null,
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
while (!ctx.abortSignal?.aborted) {
|
|
225
|
+
await processPendingApiRequests(ctx, dirs);
|
|
226
|
+
await sleep(API_QUEUE_POLL_MS, ctx.abortSignal);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
async function processPendingApiRequests(
|
|
231
|
+
ctx: ApiGatewayStartContext,
|
|
232
|
+
dirs: { requests: string; processing: string; responses: string; failed: string },
|
|
233
|
+
): Promise<void> {
|
|
234
|
+
let files: string[] = [];
|
|
235
|
+
try {
|
|
236
|
+
files = (await fs.readdir(dirs.requests))
|
|
237
|
+
.filter((file) => file.endsWith(".json"))
|
|
238
|
+
.sort();
|
|
239
|
+
} catch (error) {
|
|
240
|
+
ctx.log?.error?.(`[${API_ACCOUNT_ID}] read queue failed: ${errorMessage(error)}`);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
for (const file of files) {
|
|
245
|
+
if (ctx.abortSignal?.aborted) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const requestPath = path.join(dirs.requests, file);
|
|
249
|
+
const processingPath = path.join(dirs.processing, file);
|
|
250
|
+
try {
|
|
251
|
+
await fs.rename(requestPath, processingPath);
|
|
252
|
+
} catch {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
await processApiRequestFile(ctx, processingPath, path.join(dirs.responses, file), path.join(dirs.failed, file));
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
async function processApiRequestFile(
|
|
260
|
+
ctx: ApiGatewayStartContext,
|
|
261
|
+
processingPath: string,
|
|
262
|
+
responsePath: string,
|
|
263
|
+
failedPath: string,
|
|
264
|
+
): Promise<void> {
|
|
265
|
+
let request: ApiSendMessageParams = {};
|
|
266
|
+
let requestId = path.basename(processingPath, ".json");
|
|
267
|
+
try {
|
|
268
|
+
request = JSON.parse(await fs.readFile(processingPath, "utf8")) as ApiSendMessageParams;
|
|
269
|
+
requestId = trim(request.requestId) || requestId;
|
|
270
|
+
ctx.log?.info?.(`[${API_ACCOUNT_ID}] api request received requestId=${requestId} user=${trim(request.openVikingUserId) || trim(request.openvikingUserId) || "missing"}`);
|
|
271
|
+
ctx.setStatus?.({
|
|
272
|
+
accountId: API_ACCOUNT_ID,
|
|
273
|
+
running: true,
|
|
274
|
+
lastInboundAt: Date.now(),
|
|
275
|
+
lastEventAt: Date.now(),
|
|
276
|
+
});
|
|
277
|
+
const result = await dispatchApiMessage({
|
|
278
|
+
...request,
|
|
279
|
+
requestId,
|
|
280
|
+
cfg: ctx.cfg,
|
|
281
|
+
channelRuntime: ctx.channelRuntime,
|
|
282
|
+
log: ctx.log,
|
|
283
|
+
});
|
|
284
|
+
await writeQueueResponse(responsePath, {
|
|
285
|
+
ok: true,
|
|
286
|
+
requestId,
|
|
287
|
+
messageId: result.messageId,
|
|
288
|
+
text: result.text,
|
|
289
|
+
finishedAt: new Date().toISOString(),
|
|
290
|
+
});
|
|
291
|
+
ctx.setStatus?.({
|
|
292
|
+
accountId: API_ACCOUNT_ID,
|
|
293
|
+
running: true,
|
|
294
|
+
lastOutboundAt: Date.now(),
|
|
295
|
+
lastEventAt: Date.now(),
|
|
296
|
+
lastError: null,
|
|
297
|
+
});
|
|
298
|
+
ctx.log?.info?.(`[${API_ACCOUNT_ID}] api request completed requestId=${requestId} textLen=${result.text.length}`);
|
|
299
|
+
await safeUnlink(processingPath);
|
|
300
|
+
} catch (error) {
|
|
301
|
+
const message = errorMessage(error);
|
|
302
|
+
ctx.log?.error?.(`[${API_ACCOUNT_ID}] api request failed requestId=${requestId}: ${message}`);
|
|
303
|
+
await writeQueueResponse(responsePath, {
|
|
304
|
+
ok: false,
|
|
305
|
+
requestId,
|
|
306
|
+
error: message,
|
|
307
|
+
finishedAt: new Date().toISOString(),
|
|
308
|
+
});
|
|
309
|
+
await fs.mkdir(path.dirname(failedPath), { recursive: true });
|
|
310
|
+
await fs.rename(processingPath, failedPath).catch(() => safeUnlink(processingPath));
|
|
311
|
+
ctx.setStatus?.({
|
|
312
|
+
accountId: API_ACCOUNT_ID,
|
|
313
|
+
running: true,
|
|
314
|
+
lastError: message,
|
|
315
|
+
lastEventAt: Date.now(),
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
async function writeQueueResponse(responsePath: string, response: ApiQueueResponse): Promise<void> {
|
|
321
|
+
await fs.mkdir(path.dirname(responsePath), { recursive: true });
|
|
322
|
+
const tmpPath = `${responsePath}.tmp-${process.pid}-${Date.now()}`;
|
|
323
|
+
await fs.writeFile(tmpPath, JSON.stringify(response), "utf8");
|
|
324
|
+
await fs.rename(tmpPath, responsePath);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
async function safeUnlink(file: string): Promise<void> {
|
|
328
|
+
try {
|
|
329
|
+
await fs.unlink(file);
|
|
330
|
+
} catch {}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function sleep(ms: number, signal?: AbortSignal): Promise<void> {
|
|
334
|
+
if (signal?.aborted) {
|
|
335
|
+
return Promise.resolve();
|
|
336
|
+
}
|
|
337
|
+
return new Promise((resolve) => {
|
|
338
|
+
const timer = setTimeout(resolve, ms);
|
|
339
|
+
signal?.addEventListener("abort", () => {
|
|
340
|
+
clearTimeout(timer);
|
|
341
|
+
resolve();
|
|
342
|
+
}, { once: true });
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
|
|
164
346
|
export const apiChannelPlugin: ChannelPlugin<Record<string, never>> = {
|
|
165
|
-
id:
|
|
347
|
+
id: API_CHANNEL_ID,
|
|
166
348
|
meta: {
|
|
167
|
-
id:
|
|
168
|
-
label:
|
|
349
|
+
id: API_CHANNEL_ID,
|
|
350
|
+
label: API_CHANNEL_ID,
|
|
169
351
|
selectionLabel: "Claw Manager API",
|
|
170
|
-
docsPath:
|
|
171
|
-
docsLabel:
|
|
352
|
+
docsPath: `/channels/${API_CHANNEL_ID}`,
|
|
353
|
+
docsLabel: API_CHANNEL_ID,
|
|
172
354
|
blurb: "External API channel.",
|
|
173
355
|
order: 80,
|
|
174
356
|
},
|
|
@@ -185,11 +367,11 @@ export const apiChannelPlugin: ChannelPlugin<Record<string, never>> = {
|
|
|
185
367
|
blockStreaming: true,
|
|
186
368
|
},
|
|
187
369
|
config: {
|
|
188
|
-
listAccountIds: () => [
|
|
370
|
+
listAccountIds: () => [API_ACCOUNT_ID],
|
|
189
371
|
resolveAccount: () => ({}),
|
|
190
372
|
isConfigured: () => true,
|
|
191
373
|
describeAccount: () => ({
|
|
192
|
-
accountId:
|
|
374
|
+
accountId: API_ACCOUNT_ID,
|
|
193
375
|
name: "Claw Manager API",
|
|
194
376
|
enabled: true,
|
|
195
377
|
configured: true,
|
|
@@ -199,14 +381,14 @@ export const apiChannelPlugin: ChannelPlugin<Record<string, never>> = {
|
|
|
199
381
|
deliveryMode: "direct",
|
|
200
382
|
textChunkLimit: 8000,
|
|
201
383
|
sendText: async (ctx: { text?: string }) => ({
|
|
202
|
-
channel:
|
|
384
|
+
channel: API_CHANNEL_ID,
|
|
203
385
|
messageId: randomUUID(),
|
|
204
386
|
text: ctx.text ?? "",
|
|
205
387
|
}),
|
|
206
388
|
},
|
|
207
389
|
status: {
|
|
208
390
|
defaultRuntime: {
|
|
209
|
-
accountId:
|
|
391
|
+
accountId: API_ACCOUNT_ID,
|
|
210
392
|
lastError: null,
|
|
211
393
|
lastInboundAt: null,
|
|
212
394
|
lastOutboundAt: null,
|
|
@@ -220,17 +402,27 @@ export const apiChannelPlugin: ChannelPlugin<Record<string, never>> = {
|
|
|
220
402
|
}),
|
|
221
403
|
buildAccountSnapshot: ({ runtime }: { runtime: Record<string, unknown> }) => ({
|
|
222
404
|
...runtime,
|
|
223
|
-
accountId:
|
|
405
|
+
accountId: API_ACCOUNT_ID,
|
|
224
406
|
name: "Claw Manager API",
|
|
225
407
|
enabled: true,
|
|
226
408
|
configured: true,
|
|
227
409
|
}),
|
|
228
410
|
},
|
|
229
411
|
gateway: {
|
|
230
|
-
|
|
412
|
+
startAccount: async (ctx: ApiGatewayStartContext) => monitorApiQueue(ctx),
|
|
413
|
+
stopAccount: async (ctx: { log?: ApiLogSink }) => {
|
|
414
|
+
ctx.log?.info?.(`[${API_ACCOUNT_ID}] claw-manager-api queue monitor stopping`);
|
|
415
|
+
},
|
|
231
416
|
},
|
|
232
417
|
} as unknown as ChannelPlugin<Record<string, never>>;
|
|
233
418
|
|
|
234
419
|
function trim(value: unknown): string {
|
|
235
420
|
return typeof value === "string" ? value.trim() : "";
|
|
236
421
|
}
|
|
422
|
+
|
|
423
|
+
function errorMessage(error: unknown): string {
|
|
424
|
+
if (error instanceof Error && error.message.trim()) {
|
|
425
|
+
return error.message;
|
|
426
|
+
}
|
|
427
|
+
return String(error);
|
|
428
|
+
}
|