@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 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"}
@@ -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: "claw-manager-api",
56
- accountId: "global",
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: "claw-manager-api",
76
+ channel: API_CHANNEL_ID,
72
77
  to: inbound.To,
73
- accountId: "global",
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: "claw-manager-api",
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: "claw-manager-api",
261
+ id: API_CHANNEL_ID,
118
262
  meta: {
119
- id: "claw-manager-api",
120
- label: "claw-manager-api",
263
+ id: API_CHANNEL_ID,
264
+ label: API_CHANNEL_ID,
121
265
  selectionLabel: "Claw Manager API",
122
- docsPath: "/channels/claw-manager-api",
123
- docsLabel: "claw-manager-api",
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: () => ["global"],
284
+ listAccountIds: () => [API_ACCOUNT_ID],
141
285
  resolveAccount: () => ({}),
142
286
  isConfigured: () => true,
143
287
  describeAccount: () => ({
144
- accountId: "global",
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: "claw-manager-api",
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: "global",
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: "global",
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
- sendMessage: async (ctx) => dispatchApiMessage(ctx),
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
@@ -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":"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"}
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
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "claw-manager-api",
3
- "version": "2026.6.27",
3
+ "version": "2026.6.29",
4
4
  "channels": [
5
5
  "claw-manager-api"
6
6
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claw-manager/openclaw-api-channel",
3
- "version": "2026.6.27",
3
+ "version": "2026.6.29",
4
4
  "description": "OpenClaw API channel for Claw Manager",
5
5
  "license": "MIT",
6
6
  "type": "module",
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?: { info?: (message: string) => void; error?: (message: string) => void };
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: "claw-manager-api",
99
- accountId: "global",
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: "claw-manager-api",
146
+ channel: API_CHANNEL_ID,
117
147
  to: inbound.To,
118
- accountId: "global",
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: "claw-manager-api",
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: "claw-manager-api",
347
+ id: API_CHANNEL_ID,
166
348
  meta: {
167
- id: "claw-manager-api",
168
- label: "claw-manager-api",
349
+ id: API_CHANNEL_ID,
350
+ label: API_CHANNEL_ID,
169
351
  selectionLabel: "Claw Manager API",
170
- docsPath: "/channels/claw-manager-api",
171
- docsLabel: "claw-manager-api",
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: () => ["global"],
370
+ listAccountIds: () => [API_ACCOUNT_ID],
189
371
  resolveAccount: () => ({}),
190
372
  isConfigured: () => true,
191
373
  describeAccount: () => ({
192
- accountId: "global",
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: "claw-manager-api",
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: "global",
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: "global",
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
- sendMessage: async (ctx: GatewaySendMessageContext) => dispatchApiMessage(ctx),
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
+ }