@keyou007/agent-bot 0.1.2 → 0.1.4
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/.env.example +3 -1
- package/CHANGELOG.md +15 -0
- package/README.md +23 -8
- package/README.zh.md +23 -8
- package/config.example.yaml +1 -0
- package/dist/cli/FeishuAppConfiguration.js +10 -10
- package/dist/cli/FeishuAppConfiguration.js.map +1 -1
- package/dist/cli/FeishuAppRegistration.js +21 -11
- package/dist/cli/FeishuAppRegistration.js.map +1 -1
- package/dist/cli/Initializer.js +14 -8
- package/dist/cli/Initializer.js.map +1 -1
- package/dist/cli/LocalControlClient.js +2 -2
- package/dist/cli/LocalControlClient.js.map +1 -1
- package/dist/cli/LocalControlServer.js +1 -1
- package/dist/cli/LocalControlServer.js.map +1 -1
- package/dist/cli/ServerStarter.js +69 -0
- package/dist/cli/ServerStarter.js.map +1 -0
- package/dist/cli/SkillRegistry.js +4 -4
- package/dist/cli/SkillRegistry.js.map +1 -1
- package/dist/cli/help.js +5 -56
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/packageVersion.js +1 -1
- package/dist/cli/packageVersion.js.map +1 -1
- package/dist/cli/profile.js +40 -0
- package/dist/cli/profile.js.map +1 -0
- package/dist/cli/serverStatus.js +37 -0
- package/dist/cli/serverStatus.js.map +1 -0
- package/dist/cli/taskChatRoute.js +2 -2
- package/dist/cli/taskChatRoute.js.map +1 -1
- package/dist/cli.js +148 -168
- package/dist/cli.js.map +1 -1
- package/dist/config/loadConfig.js +7 -2
- package/dist/config/loadConfig.js.map +1 -1
- package/dist/config/paths.js +1 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/schema.js +1 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/feishu/CardRenderer.js +21 -3
- package/dist/feishu/CardRenderer.js.map +1 -1
- package/dist/feishu/FeishuConnector.js +7 -76
- package/dist/feishu/FeishuConnector.js.map +1 -1
- package/dist/feishu/transport.js +1 -1
- package/dist/feishu/transport.js.map +1 -1
- package/dist/index.js +18 -9
- package/dist/index.js.map +1 -1
- package/dist/proxy/ProxySessionController.js +28 -13
- package/dist/proxy/ProxySessionController.js.map +1 -1
- package/dist/startup/StartupNotifier.js +13 -2
- package/dist/startup/StartupNotifier.js.map +1 -1
- package/dist/startup/startFeishu.js +1 -1
- package/dist/startup/startFeishu.js.map +1 -1
- package/dist/supervision/SafeRestartNotifier.js +23 -7
- package/dist/supervision/SafeRestartNotifier.js.map +1 -1
- package/dist/supervision/SafeRestartScheduler.js +20 -2
- package/dist/supervision/SafeRestartScheduler.js.map +1 -1
- package/dist/supervision/SupervisorDiagnostics.js +209 -0
- package/dist/supervision/SupervisorDiagnostics.js.map +1 -0
- package/dist/supervisor.js +47 -12
- package/dist/supervisor.js.map +1 -1
- package/docs/technical-reference.md +25 -5
- package/docs/technical-reference.zh.md +25 -5
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/skills/agent-bot/SKILL.md +24 -4
- package/src/cli/FeishuAppConfiguration.ts +10 -10
- package/src/cli/FeishuAppRegistration.ts +23 -10
- package/src/cli/Initializer.ts +14 -7
- package/src/cli/LocalControlClient.ts +2 -2
- package/src/cli/LocalControlServer.ts +1 -1
- package/src/cli/ServerStarter.ts +106 -0
- package/src/cli/SkillRegistry.ts +4 -4
- package/src/cli/help.ts +5 -65
- package/src/cli/packageVersion.ts +1 -1
- package/src/cli/profile.ts +59 -0
- package/src/cli/serverStatus.ts +39 -0
- package/src/cli/taskChatRoute.ts +2 -2
- package/src/cli.ts +160 -167
- package/src/config/loadConfig.ts +12 -2
- package/src/config/paths.ts +1 -0
- package/src/config/schema.ts +1 -0
- package/src/feishu/CardRenderer.ts +25 -3
- package/src/feishu/FeishuConnector.ts +6 -87
- package/src/feishu/transport.ts +1 -1
- package/src/index.ts +22 -9
- package/src/proxy/ProxySessionController.ts +28 -13
- package/src/startup/StartupNotifier.ts +21 -4
- package/src/startup/startFeishu.ts +1 -1
- package/src/supervision/SafeRestartNotifier.ts +22 -7
- package/src/supervision/SafeRestartScheduler.ts +27 -3
- package/src/supervision/SupervisorDiagnostics.ts +268 -0
- package/src/supervisor.ts +46 -11
package/dist/index.js
CHANGED
|
@@ -29,6 +29,7 @@ import { STOP_EXIT_CODE } from "./supervision/restartPolicy.js";
|
|
|
29
29
|
import { replacementSupervisorEnvironment } from "./supervision/replacementSupervisor.js";
|
|
30
30
|
import { SafeRestartScheduler } from "./supervision/SafeRestartScheduler.js";
|
|
31
31
|
import { SafeRestartNotifier } from "./supervision/SafeRestartNotifier.js";
|
|
32
|
+
import { nodeDiagnosticReportArguments, prepareCrashReportDirectory, resolveSupervisorDiagnosticsPaths, } from "./supervision/SupervisorDiagnostics.js";
|
|
32
33
|
const processStartedAt = new Date();
|
|
33
34
|
const supervised = process.env.AGENT_BOT_SUPERVISED === "1";
|
|
34
35
|
const startupReason = process.env.AGENT_BOT_RESTART_REASON?.trim()
|
|
@@ -69,6 +70,7 @@ if (feishuOutbound) {
|
|
|
69
70
|
defaultAgentTitle: defaultAgent?.title ?? defaultAgentName,
|
|
70
71
|
cwd: path.resolve(config.defaults.cwd),
|
|
71
72
|
workspaceKind: defaultAgent?.kind === "codex" ? "projectless" : "project",
|
|
73
|
+
defaultUserOpenId: config.feishu.userOpenId,
|
|
72
74
|
}, metadataHydrator);
|
|
73
75
|
safeRestartNotifier = new SafeRestartNotifier(store, feishuOutbound, renderer, logger);
|
|
74
76
|
}
|
|
@@ -86,16 +88,17 @@ if (routes.length === 0)
|
|
|
86
88
|
const outbound = new OutboundRouter(routes);
|
|
87
89
|
let shuttingDown = false;
|
|
88
90
|
let restartRequested = false;
|
|
89
|
-
const controller = new ProxySessionController(config, store, runtimes, outbound, logger, {
|
|
90
|
-
supervised,
|
|
91
|
-
restart: requestRestart,
|
|
92
|
-
});
|
|
93
91
|
const safeRestart = new SafeRestartScheduler({
|
|
94
92
|
readActivity: () => store.getServerActivityState(),
|
|
95
93
|
onReady: (reason) => initiateRestart(reason),
|
|
96
94
|
onStatus: (status) => safeRestartNotifier?.update(status),
|
|
97
95
|
onStatusError: (error) => logger.warn({ error }, "Failed to publish safe restart status."),
|
|
98
96
|
});
|
|
97
|
+
const controller = new ProxySessionController(config, store, runtimes, outbound, logger, {
|
|
98
|
+
supervised,
|
|
99
|
+
restart: requestRestart,
|
|
100
|
+
cancelSafeRestart: (scheduleId) => safeRestart.cancelScheduled(scheduleId),
|
|
101
|
+
});
|
|
99
102
|
if (feishuOutbound)
|
|
100
103
|
feishuConnector = new FeishuConnector(config, controller, logger);
|
|
101
104
|
if (consoleEnabled)
|
|
@@ -148,6 +151,7 @@ async function handleControlRequest(request) {
|
|
|
148
151
|
pid: process.pid,
|
|
149
152
|
startedAt: processStartedAt.toISOString(),
|
|
150
153
|
supervised,
|
|
154
|
+
feishuAppId: config.feishu.appId ?? null,
|
|
151
155
|
safeRestartScheduled: safeRestart.scheduled,
|
|
152
156
|
safeRestartReason: safeRestart.pendingReason,
|
|
153
157
|
activity: store.getServerActivityState(),
|
|
@@ -159,16 +163,16 @@ async function handleControlRequest(request) {
|
|
|
159
163
|
return {
|
|
160
164
|
ok: true,
|
|
161
165
|
message: newlyScheduled
|
|
162
|
-
? "
|
|
163
|
-
: "
|
|
166
|
+
? "Safe restart scheduled. It will run after all tasks finish and the server stays idle for 15 seconds."
|
|
167
|
+
: "A safe restart is already pending. Its reason has been updated.",
|
|
164
168
|
};
|
|
165
169
|
}
|
|
166
170
|
setTimeout(() => void initiateRestart(request.reason), 25);
|
|
167
|
-
return { ok: true, message: "
|
|
171
|
+
return { ok: true, message: "Immediate restart requested." };
|
|
168
172
|
case "server_stop":
|
|
169
173
|
safeRestart.cancel();
|
|
170
174
|
setTimeout(() => void shutdown(STOP_EXIT_CODE), 25);
|
|
171
|
-
return { ok: true, message: "
|
|
175
|
+
return { ok: true, message: "Agent Bot server stop requested." };
|
|
172
176
|
case "task_status":
|
|
173
177
|
return { ok: true, data: await controller.controlGetTaskStatus(request.localSessionId) };
|
|
174
178
|
case "task_stop":
|
|
@@ -202,7 +206,12 @@ async function shutdown(exitCode, restartReason) {
|
|
|
202
206
|
}
|
|
203
207
|
function startReplacementSupervisor(restartReason) {
|
|
204
208
|
const supervisorEntry = fileURLToPath(new URL("./supervisor.js", import.meta.url));
|
|
205
|
-
const
|
|
209
|
+
const reportDirectory = resolveSupervisorDiagnosticsPaths(config).crashReportDirectory;
|
|
210
|
+
prepareCrashReportDirectory(reportDirectory);
|
|
211
|
+
const supervisor = spawn(process.execPath, [
|
|
212
|
+
...nodeDiagnosticReportArguments(reportDirectory),
|
|
213
|
+
supervisorEntry,
|
|
214
|
+
], {
|
|
206
215
|
cwd: process.cwd(),
|
|
207
216
|
detached: true,
|
|
208
217
|
windowsHide: true,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,eAAe,EAA6C,MAAM,0BAA0B,CAAC;AACtG,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAsB,MAAM,kCAAkC,CAAC;AACtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,9 +60,8 @@ export class ProxySessionController {
|
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
62
|
async onMessage(message) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
63
|
+
// The durable deduplication claim is the only operation allowed before acknowledgement.
|
|
64
|
+
// It prevents event retries from adding duplicate reactions.
|
|
66
65
|
if (!this.store.claimInboundEvent(message.messageId, "message"))
|
|
67
66
|
return;
|
|
68
67
|
try {
|
|
@@ -74,6 +73,9 @@ export class ProxySessionController {
|
|
|
74
73
|
catch (error) {
|
|
75
74
|
this.logger.warn({ error, messageId: message.messageId, contextKey: message.contextKey }, "Failed to acknowledge the incoming Feishu message with a reaction.");
|
|
76
75
|
}
|
|
76
|
+
if (message.chatId && message.chatType) {
|
|
77
|
+
this.store.recordChatContext(baseChatContextKey(message.contextKey), message.chatType);
|
|
78
|
+
}
|
|
77
79
|
const replyTarget = message.replyInThread
|
|
78
80
|
? { messageId: message.messageId, replyInThread: true }
|
|
79
81
|
: undefined;
|
|
@@ -176,6 +178,19 @@ export class ProxySessionController {
|
|
|
176
178
|
else if (kind === "queued_prompt_cancel") {
|
|
177
179
|
await this.cancelQueuedPrompt(scopedAction);
|
|
178
180
|
}
|
|
181
|
+
else if (kind === "safe_restart_cancel") {
|
|
182
|
+
const scheduleId = Number(scopedAction.value.scheduleId);
|
|
183
|
+
if (!Number.isSafeInteger(scheduleId) || scheduleId <= 0) {
|
|
184
|
+
throw new Error("安全重启卡片无效,请使用最新的状态卡片。");
|
|
185
|
+
}
|
|
186
|
+
if (!this.lifecycle?.cancelSafeRestart) {
|
|
187
|
+
throw new Error("当前运行方式不支持取消安全重启。");
|
|
188
|
+
}
|
|
189
|
+
const cancelled = await this.lifecycle.cancelSafeRestart(scheduleId);
|
|
190
|
+
if (!cancelled) {
|
|
191
|
+
await this.outbound.sendText(contextKey, "该安全重启计划已失效,请查看最新状态卡片。");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
179
194
|
else if (kind === "session_more") {
|
|
180
195
|
await this.refreshSessionsCardFromAction(scopedAction, undefined, true);
|
|
181
196
|
}
|
|
@@ -269,14 +284,14 @@ export class ProxySessionController {
|
|
|
269
284
|
async controlStopTask(localSessionId) {
|
|
270
285
|
const record = this.store.getSession(localSessionId);
|
|
271
286
|
if (!record || record.status === "closed")
|
|
272
|
-
throw new Error(
|
|
287
|
+
throw new Error(`Task not found: ${localSessionId}`);
|
|
273
288
|
await this.cancelSession(record);
|
|
274
|
-
return
|
|
289
|
+
return `Task stop requested: ${record.title ?? record.remoteSessionId ?? record.localSessionId}`;
|
|
275
290
|
}
|
|
276
291
|
async controlGetTaskStatus(localSessionId) {
|
|
277
292
|
const record = this.store.getSession(localSessionId);
|
|
278
293
|
if (!record)
|
|
279
|
-
throw new Error(
|
|
294
|
+
throw new Error(`Task not found: ${localSessionId}`);
|
|
280
295
|
let remote;
|
|
281
296
|
if (record.remoteSessionId) {
|
|
282
297
|
const runtime = this.runtimes.forAgent(this.ensureAgent(record.agentName));
|
|
@@ -298,10 +313,10 @@ export class ProxySessionController {
|
|
|
298
313
|
async controlSetTaskTitle(localSessionId, title) {
|
|
299
314
|
const normalizedTitle = normalizeTaskTitle(title);
|
|
300
315
|
if (!normalizedTitle)
|
|
301
|
-
throw new Error("
|
|
316
|
+
throw new Error("The task title cannot be empty.");
|
|
302
317
|
const record = this.store.getSession(localSessionId);
|
|
303
318
|
if (!record || record.status === "closed")
|
|
304
|
-
throw new Error(
|
|
319
|
+
throw new Error(`Task not found: ${localSessionId}`);
|
|
305
320
|
const loaded = await this.loadSession(record);
|
|
306
321
|
if (loaded.runtime.setTitle)
|
|
307
322
|
await loaded.runtime.setTitle(record.localSessionId, normalizedTitle);
|
|
@@ -314,15 +329,15 @@ export class ProxySessionController {
|
|
|
314
329
|
title: normalizedTitle,
|
|
315
330
|
source: "cli",
|
|
316
331
|
});
|
|
317
|
-
return
|
|
332
|
+
return `Task title changed to: ${normalizedTitle}`;
|
|
318
333
|
}
|
|
319
334
|
async controlSendTaskPrompt(localSessionId, text) {
|
|
320
335
|
const promptText = text.trim();
|
|
321
336
|
if (!promptText)
|
|
322
|
-
throw new Error("Prompt
|
|
337
|
+
throw new Error("The Prompt cannot be empty.");
|
|
323
338
|
const record = this.store.getSession(localSessionId);
|
|
324
339
|
if (!record || record.status === "closed")
|
|
325
|
-
throw new Error(
|
|
340
|
+
throw new Error(`Task not found: ${localSessionId}`);
|
|
326
341
|
const runtime = this.runtimes.forAgent(this.ensureAgent(record.agentName));
|
|
327
342
|
const activeTurnId = runtime.getSession(localSessionId)?.activeTurnId;
|
|
328
343
|
const routedContextKey = this.outbound.getSessionContextKey(localSessionId);
|
|
@@ -342,7 +357,7 @@ export class ProxySessionController {
|
|
|
342
357
|
?? lastSnapshot?.replyTarget
|
|
343
358
|
?? routedReplyTarget;
|
|
344
359
|
if (isThreadContextKey(responseContextKey) && !existingReplyTarget) {
|
|
345
|
-
throw new Error("
|
|
360
|
+
throw new Error("Could not resolve the target task's thread reply location. The Prompt was not sent.");
|
|
346
361
|
}
|
|
347
362
|
const scopedRecord = this.store.getSessionForContext(localSessionId, responseContextKey)
|
|
348
363
|
?? { ...record, contextKey: responseContextKey };
|
|
@@ -369,7 +384,7 @@ export class ProxySessionController {
|
|
|
369
384
|
if (this.messageQueues.get(responseContextKey) === next)
|
|
370
385
|
this.messageQueues.delete(responseContextKey);
|
|
371
386
|
}
|
|
372
|
-
return
|
|
387
|
+
return `The Prompt was posted to the original chat and submitted to the task: ${record.title ?? record.remoteSessionId ?? record.localSessionId}`;
|
|
373
388
|
}
|
|
374
389
|
cardActionContextKey(action) {
|
|
375
390
|
const explicit = typeof action.value.contextKey === "string" ? action.value.contextKey : undefined;
|