@keyou007/agent-bot 0.1.2 → 0.1.3
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 +9 -0
- package/README.md +20 -7
- package/README.zh.md +20 -7
- package/config.example.yaml +1 -0
- package/dist/cli/FeishuAppRegistration.js +12 -2
- package/dist/cli/FeishuAppRegistration.js.map +1 -1
- package/dist/cli/Initializer.js +10 -4
- package/dist/cli/Initializer.js.map +1 -1
- package/dist/cli/ServerStarter.js +69 -0
- package/dist/cli/ServerStarter.js.map +1 -0
- package/dist/cli/help.js +6 -2
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/profile.js +40 -0
- package/dist/cli/profile.js.map +1 -0
- package/dist/cli.js +40 -56
- 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/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/dist/proxy/ProxySessionController.js +18 -3
- 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 +23 -5
- package/docs/technical-reference.zh.md +23 -5
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/skills/agent-bot/SKILL.md +23 -3
- package/src/cli/FeishuAppRegistration.ts +14 -1
- package/src/cli/Initializer.ts +10 -3
- package/src/cli/ServerStarter.ts +106 -0
- package/src/cli/help.ts +6 -2
- package/src/cli/profile.ts +59 -0
- package/src/cli.ts +51 -52
- 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/index.ts +17 -5
- package/src/proxy/ProxySessionController.ts +18 -3
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartupNotifier.js","sourceRoot":"","sources":["../../src/startup/StartupNotifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"StartupNotifier.js","sourceRoot":"","sources":["../../src/startup/StartupNotifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAsB9E,MAAM,OAAO,eAAe;IAEP,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,gBAAgB;IANnC,YACmB,KAAiB,EACjB,QAAwB,EACxB,QAAsB,EACtB,MAA4B,EAC5B,OAAmC,EACnC,gBAA8C;qBAL9C,KAAK;wBACL,QAAQ;wBACR,QAAQ;sBACR,MAAM;uBACN,OAAO;gCACP,gBAAgB;IAChC,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,SAAe,EAAE,aAAqB;QACjD,IAAI,OAAoC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG;gBACZ,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC;gBACrC,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,gBAAgB,CAAC;qBAC3D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC;aAC/C,CAAC;YACF,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;aACpD,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,8CAA8C,CAAC,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,8CAA8C,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;YACjE,IAAI,CAAC,iBAAiB;gBAAE,OAAO;YAC/B,OAAO,GAAG,CAAC,EAAE,UAAU,EAAE,WAAW,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;YACjF,IAAI,OAAO,GAAG,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACtG,IAAI,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACzD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,cAAc,EAAE,EAC5C,0CAA0C,CAC3C,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YAC7C,MAAM,aAAa,GAAG,OAAO;gBAC3B,CAAC,CAAC,CAAC,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;gBACvE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBAC7C,SAAS;gBACT,aAAa;gBACb,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB;gBAC/C,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB;gBACjD,GAAG;gBACH,aAAa;gBACb,WAAW,EAAE,OAAO;oBAClB,CAAC,CAAC;wBACE,EAAE,EAAE,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,cAAc;wBACrD,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,eAAe,EAAE,OAAO,CAAC,eAAe;wBACxC,cAAc,EAAE,OAAO,CAAC,cAAc;wBACtC,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,aAAa,EAAE,OAAO,CAAC,MAAM;wBAC7B,cAAc,EAAE,OAAO,CAAC,cAAc;qBACvC;oBACH,CAAC,CAAC,SAAS;aACd,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBAC1D,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,UAAU,EAAE,EACrB,6CAA6C,CAC9C,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export async function startFeishu(connector, notifier, startedAt, restartReason, prepare, onConnected) {
|
|
2
2
|
await prepare?.();
|
|
3
3
|
await connector.start();
|
|
4
|
-
onConnected?.();
|
|
5
4
|
await notifier.notify(startedAt, restartReason);
|
|
5
|
+
onConnected?.();
|
|
6
6
|
}
|
|
7
7
|
//# sourceMappingURL=startFeishu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startFeishu.js","sourceRoot":"","sources":["../../src/startup/startFeishu.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAmC,EACnC,QAAmC,EACnC,SAAe,EACf,aAAqB,EACrB,OAA6B,EAC7B,WAAwB;IAExB,MAAM,OAAO,EAAE,EAAE,CAAC;IAClB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IACxB,
|
|
1
|
+
{"version":3,"file":"startFeishu.js","sourceRoot":"","sources":["../../src/startup/startFeishu.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAmC,EACnC,QAAmC,EACnC,SAAe,EACf,aAAqB,EACrB,OAA6B,EAC7B,WAAwB;IAExB,MAAM,OAAO,EAAE,EAAE,CAAC;IAClB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IACxB,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAChD,WAAW,EAAE,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -8,6 +8,7 @@ export class SafeRestartNotifier {
|
|
|
8
8
|
messageIds = new Map();
|
|
9
9
|
cardHashes = new Map();
|
|
10
10
|
activeScheduleId;
|
|
11
|
+
terminalScheduleId;
|
|
11
12
|
pendingInitialStatus;
|
|
12
13
|
initialCardTimer;
|
|
13
14
|
queue = Promise.resolve();
|
|
@@ -19,13 +20,25 @@ export class SafeRestartNotifier {
|
|
|
19
20
|
this.options = options;
|
|
20
21
|
}
|
|
21
22
|
update(status) {
|
|
23
|
+
if (this.terminalScheduleId !== undefined && status.scheduleId <= this.terminalScheduleId) {
|
|
24
|
+
if (status.phase !== "cancelled")
|
|
25
|
+
return Promise.resolve();
|
|
26
|
+
}
|
|
27
|
+
if (this.activeScheduleId !== undefined && status.scheduleId < this.activeScheduleId) {
|
|
28
|
+
return Promise.resolve();
|
|
29
|
+
}
|
|
30
|
+
if (status.phase === "cancelled") {
|
|
31
|
+
this.terminalScheduleId = Math.max(this.terminalScheduleId ?? 0, status.scheduleId);
|
|
32
|
+
}
|
|
22
33
|
if (this.activeScheduleId !== status.scheduleId) {
|
|
23
34
|
this.activeScheduleId = status.scheduleId;
|
|
24
35
|
this.messageIds.clear();
|
|
25
36
|
this.cardHashes.clear();
|
|
26
37
|
this.clearInitialCardTimer();
|
|
27
38
|
this.pendingInitialStatus = status;
|
|
28
|
-
const delayMs =
|
|
39
|
+
const delayMs = status.phase === "cancelled"
|
|
40
|
+
? 0
|
|
41
|
+
: this.options.initialCardDelayMs ?? DEFAULT_INITIAL_CARD_DELAY_MS;
|
|
29
42
|
if (delayMs <= 0)
|
|
30
43
|
return this.publishPendingInitialStatus();
|
|
31
44
|
this.initialCardTimer = setTimeout(() => {
|
|
@@ -70,13 +83,16 @@ export class SafeRestartNotifier {
|
|
|
70
83
|
const targets = this.store.listChatContexts("p2p");
|
|
71
84
|
if (targets.length === 0)
|
|
72
85
|
return;
|
|
73
|
-
const waitingTasks =
|
|
74
|
-
|
|
75
|
-
.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
86
|
+
const waitingTasks = status.phase === "cancelled"
|
|
87
|
+
? []
|
|
88
|
+
: this.store.listAllSessions()
|
|
89
|
+
.filter((session) => session.status === "running" || this.store.countQueuedPrompts(session.localSessionId) > 0)
|
|
90
|
+
.map((session) => ({
|
|
91
|
+
id: session.remoteSessionId ?? session.localSessionId,
|
|
92
|
+
title: session.title,
|
|
93
|
+
}));
|
|
79
94
|
const card = this.renderer.renderSafeRestartStatus({
|
|
95
|
+
scheduleId: status.scheduleId,
|
|
80
96
|
reason: status.reason,
|
|
81
97
|
phase: status.phase,
|
|
82
98
|
remainingMs: status.remainingMs,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SafeRestartNotifier.js","sourceRoot":"","sources":["../../src/supervision/SafeRestartNotifier.ts"],"names":[],"mappings":"AAMA,MAAM,6BAA6B,GAAG,KAAK,CAAC;AAM5C,MAAM,OAAO,mBAAmB;
|
|
1
|
+
{"version":3,"file":"SafeRestartNotifier.js","sourceRoot":"","sources":["../../src/supervision/SafeRestartNotifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,23 @@ export class SafeRestartScheduler {
|
|
|
30
30
|
return newlyScheduled;
|
|
31
31
|
}
|
|
32
32
|
cancel() {
|
|
33
|
+
this.clear();
|
|
34
|
+
}
|
|
35
|
+
async cancelScheduled(expectedScheduleId) {
|
|
36
|
+
const reason = this.reason;
|
|
37
|
+
if (!reason || this.scheduleId !== expectedScheduleId)
|
|
38
|
+
return false;
|
|
39
|
+
const activity = this.options.readActivity();
|
|
40
|
+
this.clear();
|
|
41
|
+
await this.emitStatus({
|
|
42
|
+
scheduleId: expectedScheduleId,
|
|
43
|
+
reason,
|
|
44
|
+
phase: "cancelled",
|
|
45
|
+
activity,
|
|
46
|
+
});
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
clear() {
|
|
33
50
|
if (this.timer)
|
|
34
51
|
clearInterval(this.timer);
|
|
35
52
|
this.timer = undefined;
|
|
@@ -91,8 +108,9 @@ export class SafeRestartScheduler {
|
|
|
91
108
|
}
|
|
92
109
|
return;
|
|
93
110
|
}
|
|
94
|
-
|
|
95
|
-
this.
|
|
111
|
+
const scheduleId = this.scheduleId;
|
|
112
|
+
this.clear();
|
|
113
|
+
await this.emitStatus({ scheduleId, reason, phase: "restarting", activity: confirmed, remainingMs: 0 });
|
|
96
114
|
await this.options.onReady(reason);
|
|
97
115
|
}
|
|
98
116
|
requestPoll() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SafeRestartScheduler.js","sourceRoot":"","sources":["../../src/supervision/SafeRestartScheduler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SafeRestartScheduler.js","sourceRoot":"","sources":["../../src/supervision/SafeRestartScheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const MAX_LOG_BYTES = 10 * 1024 * 1024;
|
|
4
|
+
const LOG_BACKUP_COUNT = 3;
|
|
5
|
+
export class SupervisorDiagnostics {
|
|
6
|
+
paths;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.paths = resolveSupervisorDiagnosticsPaths(config);
|
|
9
|
+
}
|
|
10
|
+
initialize() {
|
|
11
|
+
try {
|
|
12
|
+
ensurePrivateDirectory(path.dirname(this.paths.supervisorLogPath));
|
|
13
|
+
ensurePrivateDirectory(this.paths.crashReportDirectory);
|
|
14
|
+
rotateLogFile(this.paths.supervisorLogPath);
|
|
15
|
+
rotateLogFile(this.paths.workerStderrPath);
|
|
16
|
+
this.configureCurrentProcessReports();
|
|
17
|
+
this.writeEvent("diagnostics_initialized", {
|
|
18
|
+
nodeVersion: process.versions.node,
|
|
19
|
+
supervisorLogPath: this.paths.supervisorLogPath,
|
|
20
|
+
workerStderrPath: this.paths.workerStderrPath,
|
|
21
|
+
crashReportDirectory: this.paths.crashReportDirectory,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
writeFallbackDiagnostic("initialize_failed", error);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
writeEvent(event, data = {}) {
|
|
29
|
+
const line = `${JSON.stringify({
|
|
30
|
+
component: "agent-bot-supervisor",
|
|
31
|
+
event,
|
|
32
|
+
time: new Date().toISOString(),
|
|
33
|
+
...data,
|
|
34
|
+
})}\n`;
|
|
35
|
+
try {
|
|
36
|
+
fs.appendFileSync(this.paths.supervisorLogPath, line, { encoding: "utf8", mode: 0o600 });
|
|
37
|
+
restrictFilePermissions(this.paths.supervisorLogPath);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
writeFallbackDiagnostic(event, error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
openWorkerStderr() {
|
|
44
|
+
try {
|
|
45
|
+
rotateLogFile(this.paths.workerStderrPath);
|
|
46
|
+
fs.appendFileSync(this.paths.workerStderrPath, `${JSON.stringify({ event: "worker_started", time: new Date().toISOString() })}\n`, { encoding: "utf8", mode: 0o600 });
|
|
47
|
+
restrictFilePermissions(this.paths.workerStderrPath);
|
|
48
|
+
return fs.openSync(this.paths.workerStderrPath, "a", 0o600);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
this.writeEvent("worker_stderr_open_failed", { error: errorMessage(error) });
|
|
52
|
+
return "ignore";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
closeWorkerStderr(target) {
|
|
56
|
+
if (typeof target !== "number")
|
|
57
|
+
return;
|
|
58
|
+
try {
|
|
59
|
+
fs.closeSync(target);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
this.writeEvent("worker_stderr_close_failed", { error: errorMessage(error) });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
recordCrash(context) {
|
|
66
|
+
try {
|
|
67
|
+
const record = {
|
|
68
|
+
version: 1,
|
|
69
|
+
...context,
|
|
70
|
+
supervisorPid: process.pid,
|
|
71
|
+
nodeVersion: process.versions.node,
|
|
72
|
+
executablePath: process.execPath,
|
|
73
|
+
cwd: process.cwd(),
|
|
74
|
+
supervisorLogPath: this.paths.supervisorLogPath,
|
|
75
|
+
workerStderrPath: this.paths.workerStderrPath,
|
|
76
|
+
crashReportDirectory: this.paths.crashReportDirectory,
|
|
77
|
+
diagnosticReports: findDiagnosticReports(this.paths.crashReportDirectory, context.workerPid, Date.parse(context.startedAt)),
|
|
78
|
+
};
|
|
79
|
+
const crashPath = path.join(this.paths.crashReportDirectory, crashRecordFilename(context.exitedAt, context.workerPid));
|
|
80
|
+
writePrivateJson(crashPath, record);
|
|
81
|
+
writePrivateJson(this.paths.lastCrashPath, record);
|
|
82
|
+
this.writeEvent("crash_context_saved", {
|
|
83
|
+
crashPath,
|
|
84
|
+
lastCrashPath: this.paths.lastCrashPath,
|
|
85
|
+
diagnosticReports: record.diagnosticReports,
|
|
86
|
+
});
|
|
87
|
+
return record;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
this.writeEvent("crash_context_save_failed", { error: errorMessage(error) });
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
configureCurrentProcessReports() {
|
|
95
|
+
const report = process.report;
|
|
96
|
+
report.directory = this.paths.crashReportDirectory;
|
|
97
|
+
report.reportOnFatalError = true;
|
|
98
|
+
report.reportOnUncaughtException = true;
|
|
99
|
+
if ("excludeEnv" in report)
|
|
100
|
+
report.excludeEnv = true;
|
|
101
|
+
if ("excludeNetwork" in report)
|
|
102
|
+
report.excludeNetwork = true;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export function resolveSupervisorDiagnosticsPaths(config) {
|
|
106
|
+
const logDirectory = path.dirname(config.logging.path);
|
|
107
|
+
const dataDirectory = path.dirname(config.storage.sqlitePath);
|
|
108
|
+
return {
|
|
109
|
+
supervisorLogPath: path.join(logDirectory, "supervisor.log"),
|
|
110
|
+
workerStderrPath: path.join(logDirectory, "worker.stderr.log"),
|
|
111
|
+
crashReportDirectory: path.join(dataDirectory, "crash-reports"),
|
|
112
|
+
lastCrashPath: path.join(dataDirectory, "last-crash.json"),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
export function nodeDiagnosticReportArguments(reportDirectory, allowedFlags = process.allowedNodeEnvironmentFlags) {
|
|
116
|
+
const args = [
|
|
117
|
+
"--report-on-fatalerror",
|
|
118
|
+
"--report-uncaught-exception",
|
|
119
|
+
`--report-directory=${reportDirectory}`,
|
|
120
|
+
];
|
|
121
|
+
if (allowedFlags.has("--report-exclude-env"))
|
|
122
|
+
args.push("--report-exclude-env");
|
|
123
|
+
if (allowedFlags.has("--report-exclude-network"))
|
|
124
|
+
args.push("--report-exclude-network");
|
|
125
|
+
return args;
|
|
126
|
+
}
|
|
127
|
+
export function prepareCrashReportDirectory(reportDirectory) {
|
|
128
|
+
try {
|
|
129
|
+
ensurePrivateDirectory(reportDirectory);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function ensurePrivateDirectory(directoryPath) {
|
|
137
|
+
fs.mkdirSync(directoryPath, { recursive: true, mode: 0o700 });
|
|
138
|
+
try {
|
|
139
|
+
fs.chmodSync(directoryPath, 0o700);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Windows and some mounted filesystems do not implement POSIX modes.
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function rotateLogFile(filePath) {
|
|
146
|
+
const size = fs.statSync(filePath, { throwIfNoEntry: false })?.size ?? 0;
|
|
147
|
+
if (size < MAX_LOG_BYTES)
|
|
148
|
+
return;
|
|
149
|
+
for (let index = LOG_BACKUP_COUNT; index >= 1; index -= 1) {
|
|
150
|
+
const source = index === 1 ? filePath : `${filePath}.${index - 1}`;
|
|
151
|
+
const target = `${filePath}.${index}`;
|
|
152
|
+
if (!fs.existsSync(source))
|
|
153
|
+
continue;
|
|
154
|
+
fs.rmSync(target, { force: true });
|
|
155
|
+
fs.renameSync(source, target);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function findDiagnosticReports(reportDirectory, workerPid, startedAtMs) {
|
|
159
|
+
if (!fs.existsSync(reportDirectory))
|
|
160
|
+
return [];
|
|
161
|
+
const pidToken = workerPid === undefined ? undefined : `.${workerPid}.`;
|
|
162
|
+
return fs.readdirSync(reportDirectory, { withFileTypes: true })
|
|
163
|
+
.filter((entry) => entry.isFile() && /^report\..+\.json$/i.test(entry.name))
|
|
164
|
+
.filter((entry) => {
|
|
165
|
+
if (pidToken && entry.name.includes(pidToken))
|
|
166
|
+
return true;
|
|
167
|
+
const modifiedAt = fs.statSync(path.join(reportDirectory, entry.name)).mtimeMs;
|
|
168
|
+
return workerPid === undefined && modifiedAt >= startedAtMs - 1_000;
|
|
169
|
+
})
|
|
170
|
+
.map((entry) => path.join(reportDirectory, entry.name))
|
|
171
|
+
.sort();
|
|
172
|
+
}
|
|
173
|
+
function crashRecordFilename(exitedAt, workerPid) {
|
|
174
|
+
const timestamp = exitedAt.replace(/\D/g, "");
|
|
175
|
+
return `crash-${timestamp}-${workerPid ?? "unknown"}.json`;
|
|
176
|
+
}
|
|
177
|
+
function writePrivateJson(filePath, value) {
|
|
178
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });
|
|
179
|
+
fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, {
|
|
180
|
+
encoding: "utf8",
|
|
181
|
+
mode: 0o600,
|
|
182
|
+
});
|
|
183
|
+
restrictFilePermissions(filePath);
|
|
184
|
+
}
|
|
185
|
+
function restrictFilePermissions(filePath) {
|
|
186
|
+
try {
|
|
187
|
+
fs.chmodSync(filePath, 0o600);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Windows and some mounted filesystems do not implement POSIX modes.
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function writeFallbackDiagnostic(event, error) {
|
|
194
|
+
try {
|
|
195
|
+
process.stderr.write(`${JSON.stringify({
|
|
196
|
+
component: "agent-bot-supervisor",
|
|
197
|
+
event,
|
|
198
|
+
time: new Date().toISOString(),
|
|
199
|
+
error: errorMessage(error),
|
|
200
|
+
})}\n`);
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// Diagnostics must never prevent the supervisor from keeping the worker alive.
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function errorMessage(error) {
|
|
207
|
+
return error instanceof Error ? error.message : String(error);
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=SupervisorDiagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupervisorDiagnostics.js","sourceRoot":"","sources":["../../src/supervision/SupervisorDiagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/supervisor.js
CHANGED
|
@@ -5,11 +5,14 @@ import { controlEndpoint } from "./cli/controlProtocol.js";
|
|
|
5
5
|
import { loadConfig } from "./config/loadConfig.js";
|
|
6
6
|
import { requireServerFeishuTransport } from "./feishu/transport.js";
|
|
7
7
|
import { crashRestartDelayMs, describeRestartReason, INTENTIONAL_RESTART_DELAY_MS, RESTART_EXIT_CODE, STABLE_UPTIME_MS, STOP_EXIT_CODE, } from "./supervision/restartPolicy.js";
|
|
8
|
+
import { SupervisorDiagnostics, nodeDiagnosticReportArguments } from "./supervision/SupervisorDiagnostics.js";
|
|
8
9
|
const childEntry = fileURLToPath(new URL("./index.js", import.meta.url));
|
|
9
10
|
const config = loadConfig();
|
|
10
11
|
requireServerFeishuTransport(config.feishu);
|
|
11
12
|
const sqlitePath = config.storage.sqlitePath;
|
|
12
13
|
const serverEndpoint = controlEndpoint(sqlitePath);
|
|
14
|
+
const diagnostics = new SupervisorDiagnostics(config);
|
|
15
|
+
diagnostics.initialize();
|
|
13
16
|
let child;
|
|
14
17
|
let restartTimer;
|
|
15
18
|
let stopping = false;
|
|
@@ -26,24 +29,39 @@ async function startChild() {
|
|
|
26
29
|
const startedAt = Date.now();
|
|
27
30
|
const restartReason = nextStartReason;
|
|
28
31
|
nextStartReason = "Supervisor 重新拉起进程";
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
const workerStderr = diagnostics.openWorkerStderr();
|
|
33
|
+
try {
|
|
34
|
+
child = spawn(process.execPath, [
|
|
35
|
+
...nodeDiagnosticReportArguments(diagnostics.paths.crashReportDirectory),
|
|
36
|
+
childEntry,
|
|
37
|
+
], {
|
|
38
|
+
cwd: process.cwd(),
|
|
39
|
+
env: { ...process.env, AGENT_BOT_SUPERVISED: "1", AGENT_BOT_RESTART_REASON: restartReason },
|
|
40
|
+
stdio: ["ignore", "ignore", workerStderr],
|
|
41
|
+
windowsHide: true,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
diagnostics.closeWorkerStderr(workerStderr);
|
|
46
|
+
}
|
|
47
|
+
const workerPid = child.pid;
|
|
48
|
+
writeSupervisorLog("started", {
|
|
49
|
+
pid: child.pid,
|
|
50
|
+
restartReason,
|
|
51
|
+
workerStderrPath: diagnostics.paths.workerStderrPath,
|
|
52
|
+
crashReportDirectory: diagnostics.paths.crashReportDirectory,
|
|
34
53
|
});
|
|
35
|
-
writeSupervisorLog("started", { pid: child.pid, restartReason });
|
|
36
54
|
child.once("error", (error) => {
|
|
37
|
-
writeSupervisorLog("spawn_error", { error: error.message });
|
|
55
|
+
writeSupervisorLog("spawn_error", { pid: workerPid, error: error.message });
|
|
38
56
|
});
|
|
39
57
|
child.once("exit", (code, signal) => {
|
|
40
|
-
void handleChildExit(code, signal, startedAt);
|
|
58
|
+
void handleChildExit(code, signal, startedAt, workerPid);
|
|
41
59
|
});
|
|
42
60
|
}
|
|
43
|
-
async function handleChildExit(code, signal, startedAt) {
|
|
61
|
+
async function handleChildExit(code, signal, startedAt, workerPid) {
|
|
44
62
|
child = undefined;
|
|
45
63
|
const uptimeMs = Date.now() - startedAt;
|
|
46
|
-
writeSupervisorLog("exited", { code, signal, uptimeMs });
|
|
64
|
+
writeSupervisorLog("exited", { pid: workerPid, code, signal, uptimeMs });
|
|
47
65
|
if (stopping) {
|
|
48
66
|
process.exit(0);
|
|
49
67
|
return;
|
|
@@ -67,7 +85,24 @@ async function handleChildExit(code, signal, startedAt) {
|
|
|
67
85
|
const delayMs = intentional
|
|
68
86
|
? INTENTIONAL_RESTART_DELAY_MS
|
|
69
87
|
: crashRestartDelayMs(consecutiveFailures);
|
|
70
|
-
|
|
88
|
+
if (!intentional) {
|
|
89
|
+
diagnostics.recordCrash({
|
|
90
|
+
workerPid,
|
|
91
|
+
exitCode: code,
|
|
92
|
+
signal,
|
|
93
|
+
startedAt: new Date(startedAt).toISOString(),
|
|
94
|
+
exitedAt: new Date().toISOString(),
|
|
95
|
+
uptimeMs,
|
|
96
|
+
consecutiveFailures,
|
|
97
|
+
restartDelayMs: delayMs,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
writeSupervisorLog("restarting", {
|
|
101
|
+
previousPid: workerPid,
|
|
102
|
+
delayMs,
|
|
103
|
+
consecutiveFailures,
|
|
104
|
+
intentional,
|
|
105
|
+
});
|
|
71
106
|
restartTimer = setTimeout(() => void startChild(), delayMs);
|
|
72
107
|
}
|
|
73
108
|
function stop(signal) {
|
|
@@ -83,7 +118,7 @@ function stop(signal) {
|
|
|
83
118
|
process.exit(0);
|
|
84
119
|
}
|
|
85
120
|
function writeSupervisorLog(event, data) {
|
|
86
|
-
|
|
121
|
+
diagnostics.writeEvent(event, data);
|
|
87
122
|
}
|
|
88
123
|
process.on("SIGINT", () => stop("SIGINT"));
|
|
89
124
|
process.on("SIGTERM", () => stop("SIGTERM"));
|
package/dist/supervisor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,GACf,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,8 @@ Relevant source areas:
|
|
|
33
33
|
|
|
34
34
|
The default user-data root is `~/.agent-bot`. `AGENT_BOT_HOME` replaces that root.
|
|
35
35
|
|
|
36
|
+
The CLI also supports explicit directory-based profiles. Without `--profile`, commands use the main profile and the normal environment-based path rules. `--profile <directory>` pins both `AGENT_BOT_HOME` and `AGENT_BOT_CONFIG` for the command and every spawned supervisor or worker, with the configuration fixed at `<directory>/config.yaml`. It also clears inherited Feishu credential variables before loading the selected profile's `.env`, which prevents a secondary service launched from inside the primary Agent Bot process tree from accidentally reusing the primary bot. It cannot be combined with `--config`. Alternative profiles must be selected explicitly on every command; Agent Bot does not maintain a named-profile registry.
|
|
37
|
+
|
|
36
38
|
| Default path | Contents |
|
|
37
39
|
| ------------------------------------ | ---------------------------------- |
|
|
38
40
|
| `~/.agent-bot/config.yaml` | Main YAML configuration |
|
|
@@ -43,9 +45,10 @@ The default user-data root is `~/.agent-bot`. `AGENT_BOT_HOME` replaces that roo
|
|
|
43
45
|
|
|
44
46
|
Configuration path precedence:
|
|
45
47
|
|
|
46
|
-
1. CLI `--
|
|
47
|
-
2.
|
|
48
|
-
3.
|
|
48
|
+
1. CLI `--profile <directory>` selects `<directory>/config.yaml`
|
|
49
|
+
2. CLI `--config <path>`
|
|
50
|
+
3. `AGENT_BOT_CONFIG`
|
|
51
|
+
4. `<AGENT_BOT_HOME>/config.yaml`, defaulting to `~/.agent-bot/config.yaml`
|
|
49
52
|
|
|
50
53
|
The default `.env` is always loaded from the Agent Bot home. YAML values in the form `${NAME}` are expanded from the process environment after `.env` loading.
|
|
51
54
|
|
|
@@ -59,6 +62,7 @@ Credential behavior:
|
|
|
59
62
|
|
|
60
63
|
- Environment values take precedence over values in `~/.agent-bot/.env`.
|
|
61
64
|
- Both `FEISHU_APP_ID` and `FEISHU_APP_SECRET` are required.
|
|
65
|
+
- One-click registration also stores the authorizing user's `open_id` as `FEISHU_USER_OPEN_ID`.
|
|
62
66
|
- Complete credentials are preserved unless `--reconfigure-feishu` is used.
|
|
63
67
|
- Missing or incomplete credentials cause a new app registration.
|
|
64
68
|
- Newly registered credentials are fsynced, atomically replaced in `.env`, and read back before configuration begins.
|
|
@@ -74,6 +78,8 @@ Missing app configuration is handled in two stages:
|
|
|
74
78
|
|
|
75
79
|
The generated authorization links do not contain the app secret.
|
|
76
80
|
|
|
81
|
+
After Feishu initialization succeeds, the CLI releases the initialization lock and starts the detached supervisor through the same readiness path as `agent-bot server start`. It waits up to 45 seconds for the worker to connect to Feishu and become ready. If the selected profile is already running, no second supervisor is created. `--skip-feishu` skips automatic server startup, and `--json` includes the resulting `server.status` without adding non-JSON output.
|
|
82
|
+
|
|
77
83
|
## Feishu App Requirements
|
|
78
84
|
|
|
79
85
|
Core configuration required for basic messaging:
|
|
@@ -107,6 +113,7 @@ The complete example is [config.example.yaml](../config.example.yaml). The main
|
|
|
107
113
|
feishu:
|
|
108
114
|
appId: "${FEISHU_APP_ID}"
|
|
109
115
|
appSecret: "${FEISHU_APP_SECRET}"
|
|
116
|
+
userOpenId: "${FEISHU_USER_OPEN_ID}"
|
|
110
117
|
|
|
111
118
|
console:
|
|
112
119
|
enabled: true
|
|
@@ -131,7 +138,7 @@ logging:
|
|
|
131
138
|
path: "./logs/agent-bot.log"
|
|
132
139
|
```
|
|
133
140
|
|
|
134
|
-
`agent-bot server start` requires both Feishu credentials. The
|
|
141
|
+
`agent-bot server start` requires both Feishu credentials. The worker starts the SDK's persistent connection without inspecting SDK logs or private connection state, then sends startup status cards as an outbound readiness check. It normally targets known private chats and recently active groups. If the database has no known chat yet, it sends the card to `feishu.userOpenId` using an `open_id` private message. When notification targets exist, at least one card must be delivered before the server reports ready; individual target failures remain isolated. If neither a known chat nor `feishu.userOpenId` is available, startup continues without the outbound check. Missing credentials still fail startup with an initialization hint. `agent-bot console` is the explicit local-only path and does not require Feishu credentials.
|
|
135
142
|
|
|
136
143
|
At least one agent must be configured. `defaults.agent` must name a configured agent.
|
|
137
144
|
|
|
@@ -175,7 +182,7 @@ Starting a Feishu thread from a mapped user message, progress card, or final res
|
|
|
175
182
|
|
|
176
183
|
Each turn owns one progress card. Normal updates are throttled to one every two seconds; critical updates have a 500 ms minimum gap. On completion, Agent Bot updates the progress card to a terminal state before sending a separate final Markdown message.
|
|
177
184
|
|
|
178
|
-
After message
|
|
185
|
+
After the durable message-deduplication claim, Agent Bot awaits the `OnIt` reaction before chat persistence, image downloads, queue waits, command execution, or runtime calls. It replaces that reaction with `DONE`, `ERROR`, or `CrossMark` when the turn succeeds, fails, or is canceled. Reaction failures are logged but do not block task execution.
|
|
179
186
|
|
|
180
187
|
Incoming rich-text images are downloaded into the inbound image cache and passed to Codex as `localImage` inputs. An image-only message uses the default Prompt `请分析这张图片。`. An ACP runtime that cannot accept image input returns an explicit error.
|
|
181
188
|
|
|
@@ -214,6 +221,15 @@ The final-delivery ledger prevents duplicate successful replies. App Server requ
|
|
|
214
221
|
|
|
215
222
|
`agent-bot server start` starts a detached supervisor. The supervisor restarts the worker after unexpected exits and applies exponential backoff from one to 30 seconds after repeated crashes.
|
|
216
223
|
|
|
224
|
+
Supervisor crash diagnostics are isolated to the selected profile:
|
|
225
|
+
|
|
226
|
+
- `logs/supervisor.log` permanently records worker PIDs, exit codes, uptime, restart delays, and diagnostic artifact paths.
|
|
227
|
+
- `logs/worker.stderr.log` captures Node/V8 fatal output that would otherwise be lost by the detached process. Both diagnostic logs rotate at 10 MiB with three backups.
|
|
228
|
+
- `data/last-crash.json` points to the latest unexpected worker exit, while timestamped `data/crash-reports/crash-*.json` files preserve the history.
|
|
229
|
+
- `data/crash-reports/report.*.json` contains Node diagnostic reports when Node can generate one.
|
|
230
|
+
|
|
231
|
+
The supervisor, worker, replacement supervisor, and Console worker enable Node reports for fatal runtime errors and uncaught exceptions by default. Supported Node versions also exclude environment variables and network interfaces so credentials are not copied into reports. Intentional restart exit code `75` and stop exit code `76` do not create crash manifests.
|
|
232
|
+
|
|
217
233
|
A safe restart waits for:
|
|
218
234
|
|
|
219
235
|
1. Active tasks to finish
|
|
@@ -224,6 +240,8 @@ New messages reset the quiet timer. `--immediate` and `--force` skip these check
|
|
|
224
240
|
|
|
225
241
|
The first safe-restart status card is delayed by three seconds so a task's final response can usually arrive first. Status changes during that window are coalesced into the initial card. The delay does not block scheduler polling, and shutdown flushes any pending card immediately.
|
|
226
242
|
|
|
243
|
+
Pending safe-restart cards include a bottom `Cancel` action. The action carries the scheduler's monotonic schedule ID, so an old card cannot cancel a newer restart. A successful cancellation updates every existing status card in place and removes the action; the action is also absent once the scheduler enters the irreversible restarting phase.
|
|
244
|
+
|
|
227
245
|
The local control server implements task mutations and service restart requests. Read-only task queries access SQLite directly.
|
|
228
246
|
|
|
229
247
|
## Permission Modes
|