@keyou007/agent-bot 0.1.1 → 0.1.2

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/CHANGELOG.md CHANGED
@@ -6,6 +6,12 @@ The project follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.1.2] - 2026-07-29
10
+
11
+ - Make npm release retries recover a missing GitHub Release from the version tag.
12
+ - Wait for the Feishu WebSocket connection before reporting the server as ready, and reject server startup when bot credentials are missing.
13
+ - Make Feishu initialization recover safely from interruption with exclusive initialization locking, durable credential writes, and new app registration whenever a complete credential pair was not saved.
14
+
9
15
  ## [0.1.1] - 2026-07-29
10
16
 
11
17
  - Add `npm run release` to prepare the next stable version and changelog.
package/README.md CHANGED
@@ -47,6 +47,8 @@ agent-bot init
47
47
 
48
48
  Follow the displayed link or scan the QR code to create and authorize the Feishu bot. Initialization prepares `~/.agent-bot`, saves the bot credentials, and checks the required permissions.
49
49
 
50
+ Only a complete app ID and secret saved locally count as a successful bot creation. If initialization is interrupted before both credentials are saved, rerunning `agent-bot init` creates a new bot. If credentials were saved, initialization resumes by auditing that bot's remote permissions and subscriptions.
51
+
50
52
  Missing optional permissions do not block initialization. Agent Bot reports which features may be unavailable.
51
53
 
52
54
  | Option | Purpose |
@@ -65,6 +67,8 @@ agent-bot server start
65
67
  agent-bot server status
66
68
  ```
67
69
 
70
+ `server start` requires configured Feishu credentials and waits until the bot's persistent connection is ready. Run `agent-bot init` first if the credentials are missing. For local-only use, run `agent-bot console` instead.
71
+
68
72
  Open Feishu, find the bot, and send a message. Agent Bot automatically creates a task for a chat that does not have one yet.
69
73
 
70
74
  Stop the service with:
package/README.zh.md CHANGED
@@ -47,6 +47,8 @@ agent-bot init
47
47
 
48
48
  打开命令显示的链接或扫描二维码,完成飞书机器人创建和授权。初始化会准备 `~/.agent-bot`、保存机器人凭据并检查所需权限。
49
49
 
50
+ 只有 App ID 和 App Secret 都已保存到本地才视为机器人创建成功。如果初始化在完整凭据保存前中断,再次运行 `agent-bot init` 会创建新机器人;如果凭据已经保存,则会继续检查该机器人的远端权限和订阅。
51
+
50
52
  非核心权限缺失不会阻塞初始化,Agent Bot 会提示可能无法使用的功能。
51
53
 
52
54
  | 参数 | 作用 |
@@ -65,6 +67,8 @@ agent-bot server start
65
67
  agent-bot server status
66
68
  ```
67
69
 
70
+ `server start` 要求已经配置飞书机器人,并会等待机器人的长连接就绪。缺少凭据时请先运行 `agent-bot init`;仅在本地使用时请改用 `agent-bot console`。
71
+
68
72
  打开飞书,找到机器人并发送消息。当前会话没有任务时,Agent Bot 会自动创建。
69
73
 
70
74
  停止服务:
@@ -1,8 +1,6 @@
1
1
  feishu:
2
- transport: "auto"
3
2
  appId: "${FEISHU_APP_ID}"
4
3
  appSecret: "${FEISHU_APP_SECRET}"
5
- useConsoleWhenMissingCredentials: true
6
4
 
7
5
  console:
8
6
  enabled: true
@@ -1,10 +1,14 @@
1
+ import { randomUUID } from "node:crypto";
1
2
  import fs from "node:fs";
3
+ import os from "node:os";
2
4
  import path from "node:path";
3
5
  import { fileURLToPath } from "node:url";
4
6
  import { parse as parseDotEnv } from "dotenv";
5
7
  import { agentBotHome, defaultConfigPath, defaultDotEnvPath, resolveUserPath, } from "../config/paths.js";
6
8
  const DEFAULT_CONFIG_TEMPLATE = fileURLToPath(new URL("../../config.example.yaml", import.meta.url));
7
9
  const DEFAULT_ENV_TEMPLATE = fileURLToPath(new URL("../../.env.example", import.meta.url));
10
+ const INITIALIZATION_LOCK_NAME = "init.lock";
11
+ const MAX_INITIALIZATION_LOCK_AGE_MS = 30 * 60_000;
8
12
  export function initializeAgentBot(options = {}) {
9
13
  const env = options.env ?? process.env;
10
14
  const configTemplatePath = path.resolve(options.configTemplatePath ?? DEFAULT_CONFIG_TEMPLATE);
@@ -18,14 +22,7 @@ export function initializeAgentBot(options = {}) {
18
22
  const configDirectory = path.dirname(configPath);
19
23
  const home = ensureDirectory(homePath);
20
24
  fs.mkdirSync(configDirectory, { recursive: true });
21
- let config;
22
- if (fs.existsSync(configPath)) {
23
- config = { path: configPath, status: "existing" };
24
- }
25
- else {
26
- fs.copyFileSync(configTemplatePath, configPath, fs.constants.COPYFILE_EXCL);
27
- config = { path: configPath, status: "created" };
28
- }
25
+ const config = copyIfMissing(configTemplatePath, configPath);
29
26
  const envFile = copyIfMissing(envTemplatePath, envPath);
30
27
  restrictFilePermissions(envFile.path);
31
28
  const data = ensureDirectory(path.join(configDirectory, "data"));
@@ -50,15 +47,92 @@ export function writeFeishuCredentials(envPath, credentials) {
50
47
  updated = upsertDotEnvValue(updated, "FEISHU_APP_SECRET", credentials.appSecret);
51
48
  fs.mkdirSync(path.dirname(envPath), { recursive: true });
52
49
  const temporaryPath = `${envPath}.${process.pid}.${Date.now()}.tmp`;
50
+ let temporaryFile;
53
51
  try {
54
- fs.writeFileSync(temporaryPath, updated, { encoding: "utf8", mode: 0o600 });
52
+ temporaryFile = fs.openSync(temporaryPath, "wx", 0o600);
53
+ fs.writeFileSync(temporaryFile, updated, "utf8");
54
+ fs.fsyncSync(temporaryFile);
55
+ fs.closeSync(temporaryFile);
56
+ temporaryFile = undefined;
55
57
  fs.renameSync(temporaryPath, envPath);
58
+ syncDirectory(path.dirname(envPath));
56
59
  restrictFilePermissions(envPath);
60
+ const persisted = readFeishuCredentials(envPath, {});
61
+ if (persisted.status !== "configured"
62
+ || persisted.appId !== credentials.appId
63
+ || persisted.appSecret !== credentials.appSecret) {
64
+ throw new Error("飞书凭据写入后校验失败。");
65
+ }
57
66
  }
58
67
  finally {
68
+ if (temporaryFile !== undefined)
69
+ fs.closeSync(temporaryFile);
59
70
  fs.rmSync(temporaryPath, { force: true });
60
71
  }
61
72
  }
73
+ export function shouldCreateFeishuApp(credentials, reconfigureFeishu) {
74
+ return reconfigureFeishu || credentials.status !== "configured";
75
+ }
76
+ export function acquireInitializationLock(lockDirectory) {
77
+ fs.mkdirSync(lockDirectory, { recursive: true });
78
+ const lockPath = path.join(lockDirectory, INITIALIZATION_LOCK_NAME);
79
+ const owner = {
80
+ token: randomUUID(),
81
+ pid: process.pid,
82
+ hostname: os.hostname(),
83
+ startedAt: new Date().toISOString(),
84
+ };
85
+ for (let attempt = 0; attempt < 3; attempt += 1) {
86
+ let lockFile;
87
+ let created = false;
88
+ try {
89
+ lockFile = fs.openSync(lockPath, "wx", 0o600);
90
+ created = true;
91
+ fs.writeFileSync(lockFile, `${JSON.stringify(owner)}\n`, "utf8");
92
+ fs.fsyncSync(lockFile);
93
+ fs.closeSync(lockFile);
94
+ lockFile = undefined;
95
+ return {
96
+ path: lockPath,
97
+ release: () => {
98
+ const current = readInitializationLock(lockPath);
99
+ if (current?.token === owner.token)
100
+ fs.rmSync(lockPath, { force: true });
101
+ },
102
+ };
103
+ }
104
+ catch (error) {
105
+ if (lockFile !== undefined)
106
+ fs.closeSync(lockFile);
107
+ if (created)
108
+ fs.rmSync(lockPath, { force: true });
109
+ if (!isFileExistsError(error))
110
+ throw error;
111
+ if (!isStaleInitializationLock(lockPath)) {
112
+ throw new Error(`另一个 agent-bot init 正在运行(锁文件:${lockPath})。`);
113
+ }
114
+ fs.rmSync(lockPath, { force: true });
115
+ }
116
+ }
117
+ throw new Error(`无法获取初始化锁:${lockPath}`);
118
+ }
119
+ export function cleanupFeishuCredentialTemporaryFiles(envPath) {
120
+ const directory = path.dirname(envPath);
121
+ if (!fs.existsSync(directory))
122
+ return 0;
123
+ const prefix = `${path.basename(envPath)}.`;
124
+ let removed = 0;
125
+ for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
126
+ if (!entry.isFile() || !entry.name.startsWith(prefix) || !entry.name.endsWith(".tmp"))
127
+ continue;
128
+ const middle = entry.name.slice(prefix.length, -".tmp".length);
129
+ if (!/^\d+\.\d+$/.test(middle))
130
+ continue;
131
+ fs.rmSync(path.join(directory, entry.name), { force: true });
132
+ removed += 1;
133
+ }
134
+ return removed;
135
+ }
62
136
  function assertTemplate(templatePath) {
63
137
  if (!fs.statSync(templatePath, { throwIfNoEntry: false })?.isFile()) {
64
138
  throw new Error(`Initialization template does not exist: ${templatePath}`);
@@ -73,8 +147,15 @@ function copyIfMissing(sourcePath, targetPath) {
73
147
  if (fs.existsSync(targetPath))
74
148
  return { path: targetPath, status: "existing" };
75
149
  fs.mkdirSync(path.dirname(targetPath), { recursive: true });
76
- fs.copyFileSync(sourcePath, targetPath, fs.constants.COPYFILE_EXCL);
77
- return { path: targetPath, status: "created" };
150
+ try {
151
+ fs.copyFileSync(sourcePath, targetPath, fs.constants.COPYFILE_EXCL);
152
+ return { path: targetPath, status: "created" };
153
+ }
154
+ catch (error) {
155
+ if (isFileExistsError(error))
156
+ return { path: targetPath, status: "existing" };
157
+ throw error;
158
+ }
78
159
  }
79
160
  function upsertDotEnvValue(contents, key, value) {
80
161
  const newline = contents.includes("\r\n") ? "\r\n" : "\n";
@@ -106,6 +187,69 @@ function restrictFilePermissions(filePath) {
106
187
  // Windows and some mounted filesystems do not implement POSIX modes.
107
188
  }
108
189
  }
190
+ function syncDirectory(directoryPath) {
191
+ let directory;
192
+ try {
193
+ directory = fs.openSync(directoryPath, "r");
194
+ fs.fsyncSync(directory);
195
+ }
196
+ catch {
197
+ // Directory fsync is not supported on every Windows or mounted filesystem.
198
+ }
199
+ finally {
200
+ if (directory !== undefined)
201
+ fs.closeSync(directory);
202
+ }
203
+ }
204
+ function readInitializationLock(lockPath) {
205
+ try {
206
+ const parsed = JSON.parse(fs.readFileSync(lockPath, "utf8"));
207
+ if (!parsed || typeof parsed !== "object")
208
+ return undefined;
209
+ const value = parsed;
210
+ if (typeof value.token !== "string"
211
+ || typeof value.pid !== "number"
212
+ || typeof value.hostname !== "string"
213
+ || typeof value.startedAt !== "string") {
214
+ return undefined;
215
+ }
216
+ return {
217
+ token: value.token,
218
+ pid: value.pid,
219
+ hostname: value.hostname,
220
+ startedAt: value.startedAt,
221
+ };
222
+ }
223
+ catch {
224
+ return undefined;
225
+ }
226
+ }
227
+ function isStaleInitializationLock(lockPath) {
228
+ const owner = readInitializationLock(lockPath);
229
+ const modifiedAt = fs.statSync(lockPath, { throwIfNoEntry: false })?.mtimeMs ?? Date.now();
230
+ const ageMs = Date.now() - modifiedAt;
231
+ if (!owner)
232
+ return ageMs >= 5_000;
233
+ if (owner.hostname === os.hostname())
234
+ return !isProcessRunning(owner.pid);
235
+ const startedAt = Date.parse(owner.startedAt);
236
+ const ownerAgeMs = Number.isFinite(startedAt) ? Date.now() - startedAt : ageMs;
237
+ return ownerAgeMs >= MAX_INITIALIZATION_LOCK_AGE_MS;
238
+ }
239
+ function isProcessRunning(pid) {
240
+ if (!Number.isInteger(pid) || pid <= 0)
241
+ return false;
242
+ try {
243
+ process.kill(pid, 0);
244
+ return true;
245
+ }
246
+ catch (error) {
247
+ return error.code === "EPERM";
248
+ }
249
+ }
250
+ function isFileExistsError(error) {
251
+ return error?.code === "EEXIST";
252
+ }
109
253
  function firstNonBlank(...values) {
110
254
  return values.find((value) => value !== undefined && value.trim().length > 0);
111
255
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Initializer.js","sourceRoot":"","sources":["../../src/cli/Initializer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Initializer.js","sourceRoot":"","sources":["../../src/cli/Initializer.ts"],"names":[],"mappings":"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"}
@@ -38,7 +38,20 @@ export async function sendControlRequest(endpoint, request, timeoutMs = 5_000) {
38
38
  export async function isServerRunning(endpoint) {
39
39
  try {
40
40
  const response = await sendControlRequest(endpoint, { action: "health" }, 1_000);
41
- return response.ok;
41
+ if (!response.ok)
42
+ return false;
43
+ if (!response.data || typeof response.data !== "object")
44
+ return true;
45
+ return response.data.ready !== false;
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ export async function isServerReachable(endpoint) {
52
+ try {
53
+ await sendControlRequest(endpoint, { action: "health" }, 1_000);
54
+ return true;
42
55
  }
43
56
  catch {
44
57
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"LocalControlClient.js","sourceRoot":"","sources":["../../src/cli/LocalControlClient.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAG3B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,OAAuB,EACvB,SAAS,GAAG,KAAK;IAEjB,OAAO,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,CAAC,SAAqB,EAAQ,EAAE;YAC7C,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,SAAS,EAAE,CAAC;QACd,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACnG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAClC,KAAK,IAAI,KAAK,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,OAAO,GAAG,CAAC;gBAAE,OAAO;YACxB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAoB,CAAC;gBACxE,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC,OAAO;gBAAE,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QACjF,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"LocalControlClient.js","sourceRoot":"","sources":["../../src/cli/LocalControlClient.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -3,12 +3,13 @@ import { spawn, spawnSync } from "node:child_process";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import qrcode from "qrcode-terminal";
5
5
  import { loadConfig } from "./config/loadConfig.js";
6
- import { sendControlRequest, isServerRunning } from "./cli/LocalControlClient.js";
6
+ import { sendControlRequest, isServerReachable, isServerRunning } from "./cli/LocalControlClient.js";
7
7
  import { controlEndpoint, } from "./cli/controlProtocol.js";
8
- import { initializeAgentBot, readFeishuCredentials, writeFeishuCredentials, } from "./cli/Initializer.js";
8
+ import { acquireInitializationLock, cleanupFeishuCredentialTemporaryFiles, initializeAgentBot, readFeishuCredentials, shouldCreateFeishuApp, writeFeishuCredentials, } from "./cli/Initializer.js";
9
9
  import { registerFeishuApp, } from "./cli/FeishuAppRegistration.js";
10
10
  import { ensureFeishuAppConfiguration, } from "./cli/FeishuAppConfiguration.js";
11
11
  import { renderCliHelp } from "./cli/help.js";
12
+ import { requireServerFeishuTransport } from "./feishu/transport.js";
12
13
  import { resolveSystemSkillsRoot, SkillRegistry } from "./cli/SkillRegistry.js";
13
14
  import { readPackageVersion } from "./cli/packageVersion.js";
14
15
  import { taskChatRoute } from "./cli/taskChatRoute.js";
@@ -67,60 +68,69 @@ async function initCommand(input, configPath) {
67
68
  const paths = initializeAgentBot({ configPath });
68
69
  if (!json)
69
70
  printInitializationPaths(paths);
71
+ const initializationLock = acquireInitializationLock(paths.home.path);
72
+ try {
73
+ cleanupFeishuCredentialTemporaryFiles(paths.env.path);
74
+ const feishu = await initializeFeishu(paths, { json, skipFeishu, reconfigureFeishu });
75
+ const result = { ...paths, feishu };
76
+ if (json)
77
+ printJson(result);
78
+ else
79
+ printInitializationResult(result);
80
+ }
81
+ finally {
82
+ initializationLock.release();
83
+ }
84
+ }
85
+ async function initializeFeishu(paths, options) {
70
86
  const existing = readFeishuCredentials(paths.env.path);
71
- let feishu;
72
- if (skipFeishu) {
73
- feishu = {
87
+ if (options.skipFeishu) {
88
+ return {
74
89
  status: "skipped",
75
90
  ...(existing.appId ? { appId: existing.appId } : {}),
76
91
  };
77
92
  }
78
- else {
79
- const controller = new AbortController();
80
- const onInterrupt = () => controller.abort(new Error("已取消初始化。"));
81
- process.once("SIGINT", onInterrupt);
82
- try {
83
- let credentials;
84
- let status;
85
- if (existing.status === "configured" && !reconfigureFeishu) {
86
- credentials = {
87
- appId: existing.appId,
88
- appSecret: existing.appSecret,
89
- };
90
- status = "existing";
91
- }
92
- else {
93
- if (existing.status === "incomplete" && !reconfigureFeishu) {
94
- throw new Error(`检测到不完整的飞书凭证:请补全 ${paths.env.path},或使用 --reconfigure-feishu 重新创建应用。`);
95
- }
96
- credentials = await registerFeishuApp({
97
- signal: controller.signal,
98
- onVerification: (challenge) => printFeishuVerification(challenge, json),
99
- });
100
- writeFeishuCredentials(paths.env.path, credentials);
101
- status = "created";
93
+ const controller = new AbortController();
94
+ const onInterrupt = () => controller.abort(new Error("已取消初始化。"));
95
+ process.once("SIGINT", onInterrupt);
96
+ process.once("SIGTERM", onInterrupt);
97
+ try {
98
+ let credentials;
99
+ let status;
100
+ if (!shouldCreateFeishuApp(existing, options.reconfigureFeishu)) {
101
+ credentials = {
102
+ appId: existing.appId,
103
+ appSecret: existing.appSecret,
104
+ };
105
+ status = "existing";
106
+ }
107
+ else {
108
+ if (existing.status === "incomplete" && !options.json) {
109
+ process.stdout.write("\n检测到未完整保存的飞书凭据,将重新创建机器人。\n");
102
110
  }
103
- if (!json)
104
- process.stdout.write("\n正在检查飞书应用权限、事件和回调配置...\n");
105
- const configuration = await ensureFeishuAppConfiguration(credentials, {
111
+ credentials = await registerFeishuApp({
106
112
  signal: controller.signal,
107
- onVerification: (challenge) => printFeishuConfigurationVerification(challenge, json),
113
+ onVerification: (challenge) => printFeishuVerification(challenge, options.json),
108
114
  });
109
- feishu = {
110
- status,
111
- appId: credentials.appId,
112
- configuration,
113
- };
114
- }
115
- finally {
116
- process.removeListener("SIGINT", onInterrupt);
115
+ writeFeishuCredentials(paths.env.path, credentials);
116
+ status = "created";
117
117
  }
118
+ if (!options.json)
119
+ process.stdout.write("\n正在检查飞书应用权限、事件和回调配置...\n");
120
+ const configuration = await ensureFeishuAppConfiguration(credentials, {
121
+ signal: controller.signal,
122
+ onVerification: (challenge) => printFeishuConfigurationVerification(challenge, options.json),
123
+ });
124
+ return {
125
+ status,
126
+ appId: credentials.appId,
127
+ configuration,
128
+ };
129
+ }
130
+ finally {
131
+ process.removeListener("SIGINT", onInterrupt);
132
+ process.removeListener("SIGTERM", onInterrupt);
118
133
  }
119
- const result = { ...paths, feishu };
120
- if (json)
121
- printJson(result);
122
- else
123
- printInitializationResult(result);
124
134
  }
125
135
  function skillsCommand(input) {
126
136
  const [action = "status", ...rest] = input;
@@ -173,7 +183,7 @@ async function consoleCommand(input) {
173
183
  const config = loadConfig();
174
184
  const endpoint = controlEndpoint(config.storage.sqlitePath);
175
185
  const force = input.includes("--force");
176
- if (!force && await isServerRunning(endpoint)) {
186
+ if (!force && await isServerReachable(endpoint)) {
177
187
  throw new Error("agent-bot server 正在运行。为避免争用同一任务状态,请先停止 server,或明确使用 --force。");
178
188
  }
179
189
  const entry = fileURLToPath(new URL("./index.js", import.meta.url));
@@ -210,10 +220,18 @@ async function serverCommand(input) {
210
220
  return;
211
221
  }
212
222
  if (action === "start") {
223
+ requireServerFeishuTransport(config.feishu);
213
224
  if (await isServerRunning(endpoint)) {
214
225
  process.stdout.write("agent-bot server 已在运行。\n");
215
226
  return;
216
227
  }
228
+ if (await isServerReachable(endpoint)) {
229
+ const running = await waitForServer(endpoint, 45_000);
230
+ if (!running)
231
+ throw new Error("agent-bot server 已启动,但未能连接飞书机器人。请检查日志。");
232
+ process.stdout.write("agent-bot server 已启动。\n");
233
+ return;
234
+ }
217
235
  const entry = fileURLToPath(new URL("./supervisor.js", import.meta.url));
218
236
  const child = spawn(process.execPath, [entry], {
219
237
  cwd: process.cwd(),
@@ -223,9 +241,9 @@ async function serverCommand(input) {
223
241
  env: { ...process.env, AGENT_BOT_RESTART_REASON: "通过 agent-bot CLI 启动" },
224
242
  });
225
243
  child.unref();
226
- const running = await waitForServer(endpoint, 30_000);
244
+ const running = await waitForServer(endpoint, 45_000);
227
245
  if (!running)
228
- throw new Error("已启动 Supervisor,但 server 未在 30 秒内就绪。请检查日志。");
246
+ throw new Error("已启动 Supervisor,但 server 未在 45 秒内连接飞书机器人。请检查日志。");
229
247
  process.stdout.write("agent-bot server 已启动。\n");
230
248
  return;
231
249
  }
@@ -420,7 +438,9 @@ function printServerStatus(data) {
420
438
  const activity = value.activity && typeof value.activity === "object"
421
439
  ? value.activity
422
440
  : {};
423
- process.stdout.write("agent-bot server:运行中\n");
441
+ process.stdout.write(value.ready === false
442
+ ? "agent-bot server:启动中(正在连接飞书机器人)\n"
443
+ : "agent-bot server:运行中\n");
424
444
  process.stdout.write(`PID:${value.pid ?? "-"}\n`);
425
445
  process.stdout.write(`启动时间:${value.startedAt ?? "-"}\n`);
426
446
  process.stdout.write(`Supervisor:${value.supervised ? "已启用" : "未启用"}\n`);