@keyou007/agent-bot 0.1.0

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.
Files changed (212) hide show
  1. package/.env.example +8 -0
  2. package/CHANGELOG.md +11 -0
  3. package/LICENSE +675 -0
  4. package/README.md +187 -0
  5. package/README.zh.md +187 -0
  6. package/SECURITY.md +13 -0
  7. package/config.example.yaml +56 -0
  8. package/dist/acp/AcpJsonRpcConnection.js +155 -0
  9. package/dist/acp/AcpJsonRpcConnection.js.map +1 -0
  10. package/dist/acp/AcpProcessManager.js +65 -0
  11. package/dist/acp/AcpProcessManager.js.map +1 -0
  12. package/dist/acp/AcpSessionManager.js +164 -0
  13. package/dist/acp/AcpSessionManager.js.map +1 -0
  14. package/dist/acp/acpTypes.js +10 -0
  15. package/dist/acp/acpTypes.js.map +1 -0
  16. package/dist/cli/FeishuAppConfiguration.js +349 -0
  17. package/dist/cli/FeishuAppConfiguration.js.map +1 -0
  18. package/dist/cli/FeishuAppRegistration.js +160 -0
  19. package/dist/cli/FeishuAppRegistration.js.map +1 -0
  20. package/dist/cli/Initializer.js +112 -0
  21. package/dist/cli/Initializer.js.map +1 -0
  22. package/dist/cli/LocalControlClient.js +47 -0
  23. package/dist/cli/LocalControlClient.js.map +1 -0
  24. package/dist/cli/LocalControlServer.js +66 -0
  25. package/dist/cli/LocalControlServer.js.map +1 -0
  26. package/dist/cli/SkillRegistry.js +126 -0
  27. package/dist/cli/SkillRegistry.js.map +1 -0
  28. package/dist/cli/controlProtocol.js +10 -0
  29. package/dist/cli/controlProtocol.js.map +1 -0
  30. package/dist/cli/taskChatRoute.js +23 -0
  31. package/dist/cli/taskChatRoute.js.map +1 -0
  32. package/dist/cli.js +616 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/codex/AppServerConnection.js +131 -0
  35. package/dist/codex/AppServerConnection.js.map +1 -0
  36. package/dist/codex/CodexEventMapper.js +296 -0
  37. package/dist/codex/CodexEventMapper.js.map +1 -0
  38. package/dist/codex/CodexLocalActivityDetector.js +124 -0
  39. package/dist/codex/CodexLocalActivityDetector.js.map +1 -0
  40. package/dist/codex/CodexProcessManager.js +64 -0
  41. package/dist/codex/CodexProcessManager.js.map +1 -0
  42. package/dist/codex/CodexRuntime.js +825 -0
  43. package/dist/codex/CodexRuntime.js.map +1 -0
  44. package/dist/codex/ProjectlessWorkspace.js +74 -0
  45. package/dist/codex/ProjectlessWorkspace.js.map +1 -0
  46. package/dist/codex/protocol.js +10 -0
  47. package/dist/codex/protocol.js.map +1 -0
  48. package/dist/commands/CommandRouter.js +176 -0
  49. package/dist/commands/CommandRouter.js.map +1 -0
  50. package/dist/commands/commandTypes.js +2 -0
  51. package/dist/commands/commandTypes.js.map +1 -0
  52. package/dist/config/loadConfig.js +107 -0
  53. package/dist/config/loadConfig.js.map +1 -0
  54. package/dist/config/paths.js +32 -0
  55. package/dist/config/paths.js.map +1 -0
  56. package/dist/config/schema.js +38 -0
  57. package/dist/config/schema.js.map +1 -0
  58. package/dist/console/ConsoleConnector.js +39 -0
  59. package/dist/console/ConsoleConnector.js.map +1 -0
  60. package/dist/console/ConsoleTurnPresenter.js +60 -0
  61. package/dist/console/ConsoleTurnPresenter.js.map +1 -0
  62. package/dist/feishu/CardRenderer.js +972 -0
  63. package/dist/feishu/CardRenderer.js.map +1 -0
  64. package/dist/feishu/CardUpdateScheduler.js +148 -0
  65. package/dist/feishu/CardUpdateScheduler.js.map +1 -0
  66. package/dist/feishu/ConsoleFeishuClient.js +18 -0
  67. package/dist/feishu/ConsoleFeishuClient.js.map +1 -0
  68. package/dist/feishu/FeishuConnector.js +257 -0
  69. package/dist/feishu/FeishuConnector.js.map +1 -0
  70. package/dist/feishu/FeishuMarkdown.js +37 -0
  71. package/dist/feishu/FeishuMarkdown.js.map +1 -0
  72. package/dist/feishu/FeishuMessageClient.js +459 -0
  73. package/dist/feishu/FeishuMessageClient.js.map +1 -0
  74. package/dist/feishu/FeishuTurnPresenter.js +425 -0
  75. package/dist/feishu/FeishuTurnPresenter.js.map +1 -0
  76. package/dist/feishu/GroupAvatarGenerator.js +86 -0
  77. package/dist/feishu/GroupAvatarGenerator.js.map +1 -0
  78. package/dist/feishu/LocalCardImage.js +13 -0
  79. package/dist/feishu/LocalCardImage.js.map +1 -0
  80. package/dist/feishu/LocalImageMarkdown.js +89 -0
  81. package/dist/feishu/LocalImageMarkdown.js.map +1 -0
  82. package/dist/feishu/contextKey.js +12 -0
  83. package/dist/feishu/contextKey.js.map +1 -0
  84. package/dist/feishu/transport.js +14 -0
  85. package/dist/feishu/transport.js.map +1 -0
  86. package/dist/feishu/types.js +2 -0
  87. package/dist/feishu/types.js.map +1 -0
  88. package/dist/index.js +213 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/logging/logger.js +22 -0
  91. package/dist/logging/logger.js.map +1 -0
  92. package/dist/presentation/OutboundRouter.js +127 -0
  93. package/dist/presentation/OutboundRouter.js.map +1 -0
  94. package/dist/presentation/TurnStateReducer.js +307 -0
  95. package/dist/presentation/TurnStateReducer.js.map +1 -0
  96. package/dist/presentation/splitMarkdown.js +341 -0
  97. package/dist/presentation/splitMarkdown.js.map +1 -0
  98. package/dist/presentation/turnViewTypes.js +2 -0
  99. package/dist/presentation/turnViewTypes.js.map +1 -0
  100. package/dist/proxy/ProxySessionController.js +2819 -0
  101. package/dist/proxy/ProxySessionController.js.map +1 -0
  102. package/dist/runtime/AcpRuntimeAdapter.js +271 -0
  103. package/dist/runtime/AcpRuntimeAdapter.js.map +1 -0
  104. package/dist/runtime/AgentRuntimeRegistry.js +18 -0
  105. package/dist/runtime/AgentRuntimeRegistry.js.map +1 -0
  106. package/dist/runtime/agentEnvironment.js +11 -0
  107. package/dist/runtime/agentEnvironment.js.map +1 -0
  108. package/dist/runtime/types.js +2 -0
  109. package/dist/runtime/types.js.map +1 -0
  110. package/dist/startup/SessionMetadataHydrator.js +46 -0
  111. package/dist/startup/SessionMetadataHydrator.js.map +1 -0
  112. package/dist/startup/StartupNotifier.js +78 -0
  113. package/dist/startup/StartupNotifier.js.map +1 -0
  114. package/dist/startup/startFeishu.js +6 -0
  115. package/dist/startup/startFeishu.js.map +1 -0
  116. package/dist/state/StateStore.js +893 -0
  117. package/dist/state/StateStore.js.map +1 -0
  118. package/dist/state/migrations.js +129 -0
  119. package/dist/state/migrations.js.map +1 -0
  120. package/dist/supervision/SafeRestartNotifier.js +116 -0
  121. package/dist/supervision/SafeRestartNotifier.js.map +1 -0
  122. package/dist/supervision/SafeRestartScheduler.js +123 -0
  123. package/dist/supervision/SafeRestartScheduler.js.map +1 -0
  124. package/dist/supervision/replacementSupervisor.js +8 -0
  125. package/dist/supervision/replacementSupervisor.js.map +1 -0
  126. package/dist/supervision/restartPolicy.js +16 -0
  127. package/dist/supervision/restartPolicy.js.map +1 -0
  128. package/dist/supervisor.js +94 -0
  129. package/dist/supervisor.js.map +1 -0
  130. package/dist/utils/executeShellCommand.js +76 -0
  131. package/dist/utils/executeShellCommand.js.map +1 -0
  132. package/dist/utils/id.js +5 -0
  133. package/dist/utils/id.js.map +1 -0
  134. package/dist/utils/markdown.js +29 -0
  135. package/dist/utils/markdown.js.map +1 -0
  136. package/dist/utils/spawnCommand.js +21 -0
  137. package/dist/utils/spawnCommand.js.map +1 -0
  138. package/dist/utils/taskTitle.js +10 -0
  139. package/dist/utils/taskTitle.js.map +1 -0
  140. package/docs/technical-reference.md +294 -0
  141. package/docs/technical-reference.zh.md +294 -0
  142. package/npm-shrinkwrap.json +4525 -0
  143. package/package.json +87 -0
  144. package/skills/agent-bot/SKILL.md +141 -0
  145. package/skills/agent-bot/agents/openai.yaml +4 -0
  146. package/src/acp/AcpJsonRpcConnection.ts +212 -0
  147. package/src/acp/AcpProcessManager.ts +87 -0
  148. package/src/acp/AcpSessionManager.ts +227 -0
  149. package/src/acp/acpTypes.ts +99 -0
  150. package/src/cli/FeishuAppConfiguration.ts +473 -0
  151. package/src/cli/FeishuAppRegistration.ts +207 -0
  152. package/src/cli/Initializer.ts +159 -0
  153. package/src/cli/LocalControlClient.ts +48 -0
  154. package/src/cli/LocalControlServer.ts +67 -0
  155. package/src/cli/SkillRegistry.ts +151 -0
  156. package/src/cli/controlProtocol.ts +34 -0
  157. package/src/cli/taskChatRoute.ts +31 -0
  158. package/src/cli.ts +630 -0
  159. package/src/codex/AppServerConnection.ts +159 -0
  160. package/src/codex/CodexEventMapper.ts +351 -0
  161. package/src/codex/CodexLocalActivityDetector.ts +148 -0
  162. package/src/codex/CodexProcessManager.ts +63 -0
  163. package/src/codex/CodexRuntime.ts +1025 -0
  164. package/src/codex/ProjectlessWorkspace.ts +90 -0
  165. package/src/codex/protocol.ts +37 -0
  166. package/src/commands/CommandRouter.ts +179 -0
  167. package/src/commands/commandTypes.ts +28 -0
  168. package/src/config/loadConfig.ts +115 -0
  169. package/src/config/paths.ts +37 -0
  170. package/src/config/schema.ts +46 -0
  171. package/src/console/ConsoleConnector.ts +40 -0
  172. package/src/console/ConsoleTurnPresenter.ts +64 -0
  173. package/src/feishu/CardRenderer.ts +1157 -0
  174. package/src/feishu/CardUpdateScheduler.ts +165 -0
  175. package/src/feishu/ConsoleFeishuClient.ts +22 -0
  176. package/src/feishu/FeishuConnector.ts +277 -0
  177. package/src/feishu/FeishuMarkdown.ts +47 -0
  178. package/src/feishu/FeishuMessageClient.ts +649 -0
  179. package/src/feishu/FeishuTurnPresenter.ts +539 -0
  180. package/src/feishu/GroupAvatarGenerator.ts +102 -0
  181. package/src/feishu/LocalCardImage.ts +13 -0
  182. package/src/feishu/LocalImageMarkdown.ts +92 -0
  183. package/src/feishu/contextKey.ts +14 -0
  184. package/src/feishu/transport.ts +24 -0
  185. package/src/feishu/types.ts +83 -0
  186. package/src/index.ts +228 -0
  187. package/src/logging/logger.ts +28 -0
  188. package/src/presentation/OutboundRouter.ts +205 -0
  189. package/src/presentation/TurnStateReducer.ts +341 -0
  190. package/src/presentation/splitMarkdown.ts +358 -0
  191. package/src/presentation/turnViewTypes.ts +54 -0
  192. package/src/proxy/ProxySessionController.ts +3311 -0
  193. package/src/runtime/AcpRuntimeAdapter.ts +324 -0
  194. package/src/runtime/AgentRuntimeRegistry.ts +20 -0
  195. package/src/runtime/agentEnvironment.ts +14 -0
  196. package/src/runtime/types.ts +215 -0
  197. package/src/startup/SessionMetadataHydrator.ts +46 -0
  198. package/src/startup/StartupNotifier.ts +92 -0
  199. package/src/startup/startFeishu.ts +19 -0
  200. package/src/state/StateStore.ts +1249 -0
  201. package/src/state/migrations.ts +128 -0
  202. package/src/supervision/SafeRestartNotifier.ts +122 -0
  203. package/src/supervision/SafeRestartScheduler.ts +149 -0
  204. package/src/supervision/replacementSupervisor.ts +10 -0
  205. package/src/supervision/restartPolicy.ts +19 -0
  206. package/src/supervisor.ts +106 -0
  207. package/src/utils/executeShellCommand.ts +97 -0
  208. package/src/utils/id.ts +5 -0
  209. package/src/utils/markdown.ts +25 -0
  210. package/src/utils/spawnCommand.ts +35 -0
  211. package/src/utils/taskTitle.ts +9 -0
  212. package/tsconfig.json +19 -0
@@ -0,0 +1,294 @@
1
+ # Agent Bot 技术参考
2
+
3
+ [English](technical-reference.md) | 简体中文
4
+
5
+ 本文介绍部署、配置、运行机制、持久化和集成细节。安装与日常命令请先阅读 [README](../README.zh.md)。
6
+
7
+ ## 运行架构
8
+
9
+ Agent Bot 是基于 Node.js 22+、ESM 和 TypeScript 的应用,主要组件如下:
10
+
11
+ - Supervisor 负责常驻服务和 worker 自动重启
12
+ - Worker 启动 Codex/ACP Runtime、飞书传输、Console 传输、本地控制服务和 SQLite
13
+ - 飞书事件和 Console 输入统一进入任务控制器
14
+ - 展示层为每个 turn 维护一张进度卡,并单独发送 Markdown 最终回答
15
+ - Codex Agent 通过 stdio 连接 Codex App Server,其他 Agent 使用 ACP
16
+
17
+ 主要源码目录:
18
+
19
+ | 目录 | 职责 |
20
+ | ------------------- | ------------------------------------------ |
21
+ | `src/config/` | YAML 加载、环境变量展开、校验和路径解析 |
22
+ | `src/cli/` | 初始化、应用创建、配置审计及服务/任务命令 |
23
+ | `src/feishu/` | 飞书长连接事件、API、卡片、图片和上下文键 |
24
+ | `src/runtime/` | 通用 Runtime 抽象 |
25
+ | `src/codex/` | Codex App Server 协议集成 |
26
+ | `src/acp/` | ACP 进程与 JSON-RPC 集成 |
27
+ | `src/proxy/` | 任务、turn、steering、队列、分支和命令执行 |
28
+ | `src/presentation/` | Turn 状态归并和出站路由 |
29
+ | `src/state/` | SQLite schema、迁移、路由和投递状态 |
30
+ | `src/supervision/` | 安全重启和重启通知 |
31
+
32
+ ## 用户数据与路径解析
33
+
34
+ 默认用户数据根目录为 `~/.agent-bot`,可通过 `AGENT_BOT_HOME` 整体替换。
35
+
36
+ | 默认路径 | 内容 |
37
+ | ------------------------------------ | -------------------- |
38
+ | `~/.agent-bot/config.yaml` | YAML 主配置 |
39
+ | `~/.agent-bot/.env` | 飞书凭据 |
40
+ | `~/.agent-bot/data/agent-bot.sqlite` | 任务和投递持久化状态 |
41
+ | `~/.agent-bot/data/inbound-images/` | 接收图片缓存 |
42
+ | `~/.agent-bot/logs/agent-bot.log` | 结构化运行日志 |
43
+
44
+ 配置文件优先级:
45
+
46
+ 1. CLI `--config <路径>`
47
+ 2. `AGENT_BOT_CONFIG`
48
+ 3. `~/.agent-bot/config.yaml`
49
+
50
+ 默认 `.env` 始终从 Agent Bot 用户目录加载。加载 `.env` 后,YAML 中的 `${NAME}` 会使用进程环境变量展开。
51
+
52
+ 相对形式的 `storage.sqlitePath` 和 `logging.path` 按配置文件所在目录解析;`defaults.cwd` 按进程启动目录解析。
53
+
54
+ ## 初始化
55
+
56
+ 目标文件不存在时,`agent-bot init` 会复制随包提供的 `config.example.yaml` 和 `.env.example`,创建数据和日志目录,并在平台支持时把 `.env` 权限限制为 POSIX `0600`。
57
+
58
+ 凭据处理规则:
59
+
60
+ - 进程环境变量优先于 `~/.agent-bot/.env`
61
+ - `FEISHU_APP_ID` 和 `FEISHU_APP_SECRET` 必须同时存在
62
+ - 除非使用 `--reconfigure-feishu`,完整凭据不会被替换
63
+ - 凭据只有一项时会直接报错,不会静默覆盖
64
+ - 新创建的凭据以原子方式写入 `.env`
65
+
66
+ 缺少凭据时,初始化会启动飞书一键创建流程,并以文本和二维码显示验证链接。无论凭据是新创建还是已存在,之后都会检查应用当前已发布版本。
67
+
68
+ 缺失配置分两阶段处理:
69
+
70
+ 1. 请求核心配置并轮询,直到基础能力生效
71
+ 2. 请求其余可选配置,但不阻塞初始化
72
+
73
+ 生成的授权链接不包含 App Secret。
74
+
75
+ ## 飞书应用要求
76
+
77
+ 基础消息能力依赖以下核心配置:
78
+
79
+ - 机器人能力
80
+ - 长连接事件接收
81
+ - `im.message.receive_v1`
82
+ - 接收群聊 @ 消息和私聊消息所需的租户权限
83
+ - `im:message:send_as_bot` 或覆盖它的更大权限
84
+ - `application:application:self_manage`,供初始化检查已发布版本
85
+
86
+ 可选配置:
87
+
88
+ | 配置 | 启用的行为 |
89
+ | --------------------------------- | --------------------------- |
90
+ | `im:chat:create` | `/newgroup` 和 `/forkgroup` |
91
+ | `im:chat:read` | 读取群元数据 |
92
+ | `im.chat.updated_v1` | 同步群标题 |
93
+ | `im:message.reactions:write_only` | 消息处理状态表情 |
94
+ | 消息读取和资源权限 | 接收与发送图片 |
95
+ | 图片和群权限 | 生成并设置群头像 |
96
+ | `card.action.trigger` | 交互卡片操作 |
97
+
98
+ 可选授权失败时,最终初始化结果会列出受影响功能。重新运行 `agent-bot init` 会再次审计。
99
+
100
+ ## 配置模型
101
+
102
+ 完整示例见 [config.example.yaml](../config.example.yaml)。主要配置段:
103
+
104
+ ```yaml
105
+ feishu:
106
+ transport: "auto"
107
+ appId: "${FEISHU_APP_ID}"
108
+ appSecret: "${FEISHU_APP_SECRET}"
109
+ useConsoleWhenMissingCredentials: true
110
+
111
+ console:
112
+ enabled: true
113
+
114
+ agents:
115
+ codex:
116
+ kind: "codex"
117
+ title: "Codex"
118
+ command: "codex"
119
+ args: ["app-server", "--enable", "goals", "--listen", "stdio://"]
120
+ env: {}
121
+
122
+ defaults:
123
+ agent: "codex"
124
+ cwd: "."
125
+
126
+ storage:
127
+ sqlitePath: "./data/agent-bot.sqlite"
128
+
129
+ logging:
130
+ level: "info"
131
+ path: "./logs/agent-bot.log"
132
+ ```
133
+
134
+ `feishu.transport` 支持:
135
+
136
+ - `auto`:存在凭据时使用 SDK,否则按 `useConsoleWhenMissingCredentials` 决定是否回退 Console
137
+ - `sdk`:要求飞书凭据并启动长连接客户端
138
+ - `console`:禁用飞书传输
139
+
140
+ 必须至少配置一个 Agent,`defaults.agent` 必须指向已配置的 Agent。
141
+
142
+ ## Agent Runtime
143
+
144
+ `kind: "codex"` 使用 Codex App Server。Agent Bot 通过 App Server 协议传递项目目录、模型、思考强度、权限模式、文字输入和本地图片。
145
+
146
+ `kind: "acp"` 或未填写 `kind` 的 Agent 作为 ACP 进程启动。Agent 配置中的 `env` 会加入其环境变量。
147
+
148
+ 所有 Agent 子进程都会收到:
149
+
150
+ ```text
151
+ AGENT_BOT=1
152
+ ```
153
+
154
+ 内置 Skill 使用该环境变量判断自己是否运行在 Agent Bot 中。
155
+
156
+ ## 聊天路由
157
+
158
+ 消息路由决定当前任务:
159
+
160
+ - 私聊正文按飞书 chat ID 隔离
161
+ - 群正文按飞书 chat ID 隔离
162
+ - 带 thread ID 的消息按独立话题上下文隔离
163
+ - Console 使用独立的本地上下文
164
+
165
+ 命令、卡片回调、进度卡和最终回答都保留在来源路由。
166
+
167
+ 从已映射的用户消息、进度卡或最终回答创建飞书话题时,会从其关联的已完成 Codex turn 创建分支。无法可靠确定已完成来源 turn 时会直接失败,不会选择任意分支点。
168
+
169
+ `/forkgroup` 会根据话题状态选择来源。话题尚未绑定任务,或者已绑定任务但尚未完成过自己的 turn 时,直接从话题原始锚点 turn fork,不创建中间话题任务。话题任务完成过 turn 后,使用本地持久化的最近完成 turn;更晚的执行中 turn 不会阻塞命令,也不会成为 fork 点。
170
+
171
+ ## Turn 与消息行为
172
+
173
+ - 路由没有当前任务时,普通文本会自动创建任务
174
+ - Codex turn 活跃时收到的文字通过 steering 追加
175
+ - Steering 与 turn 完成发生竞态时,文字变为下一条排队请求
176
+ - `/nosteer` 始终创建持久化 FIFO 队列项
177
+ - 队列卡操作可以取消单个待执行项
178
+ - 未知斜杠命令会被拒绝,不会作为 Prompt 转发
179
+
180
+ 每个 turn 只有一张进度卡。普通更新最多每两秒一次,关键更新最短间隔 500 毫秒。完成时先把进度卡更新为终态,再单独发送 Markdown 最终回答。
181
+
182
+ 消息去重后,Agent Bot 会尝试添加 `OnIt` 表情。Turn 成功、失败或取消时分别替换为 `DONE`、`ERROR` 或 `CrossMark`。表情操作失败不会阻塞任务。
183
+
184
+ 富文本图片会下载到输入图片缓存,并以 `localImage` 传给 Codex。纯图片消息使用默认 Prompt `请分析这张图片。`。ACP Runtime 不支持图片输入时会明确报错。
185
+
186
+ ## 任务、项目与外部 Codex 工作
187
+
188
+ `/sessions` 通过 `thread/list` 读取 Codex 任务,可发现同一 `CODEX_HOME` 下由 Codex Desktop、CLI、Agent Bot 或其他 App Server 客户端创建的任务。
189
+
190
+ Agent Bot 内部保留本地路由键以关联飞书卡片和投递状态,但对用户展示 Codex 任务 ID。没有明确用户操作时,不会续写、steer、停止或分支其他客户端正在运行的 Codex 工作。
191
+
192
+ 项目规则:
193
+
194
+ - `/new --dir <路径>` 创建项目任务
195
+ - `/new --nodir` 创建 Projectless 任务
196
+ - `/new` 继承当前任务的项目或 Projectless 形态
197
+ - 首个 Projectless 任务创建在 `~/Documents/Codex/<日期>/<任务名>`
198
+ - 已有任务的工作目录不可变
199
+
200
+ 分支使用最新可用的已完成 turn,不会中断来源任务的活动 turn。
201
+
202
+ ## 持久化与恢复
203
+
204
+ SQLite 保存:
205
+
206
+ - 每条路由的当前任务和上一个任务
207
+ - 本地任务标识与 Codex task/thread 标识
208
+ - 模型、思考强度和权限模式
209
+ - 排队 Prompt
210
+ - 进度快照和消息绑定
211
+ - 最终消息投递记录
212
+
213
+ 启动时,Agent Bot 通过 `thread/read` 将持久化的活动工作与 Codex 状态校准。Turn 标识变化、收到终态通知或控制请求失败时也会重新校准。
214
+
215
+ 最终消息投递账本用于避免重复发送成功回答。App Server 请求使用有限超时,避免阻塞的请求永久占用消息路由。
216
+
217
+ ## Supervisor 与重启
218
+
219
+ `agent-bot server start` 启动后台 supervisor。Worker 意外退出后会自动拉起;连续崩溃时使用 1 到 30 秒的指数退避。
220
+
221
+ 安全重启会等待:
222
+
223
+ 1. 活动任务完成
224
+ 2. 最终回答完成投递
225
+ 3. 连续 15 秒没有新消息
226
+
227
+ 新消息会重置静默计时。`--immediate` 和 `--force` 跳过这些检查。退出码 `75` 表示主动 worker 重启。
228
+
229
+ 首次安全重启状态卡会延迟 3 秒发送,让任务最终回答尽可能先到达;延迟期间的状态变化会合并到首张卡片。该延迟不阻塞调度器轮询,真正关闭前会立即 flush 尚未发送的卡片。
230
+
231
+ 本地控制服务负责修改任务和请求服务重启;只读任务查询直接访问 SQLite。
232
+
233
+ ## 权限模式
234
+
235
+ - `auto`:Codex 使用 `approvalPolicy=never` 和 `danger-full-access`
236
+ - `confirm`:通过卡片提供单次允许、会话允许、拒绝和取消任务操作
237
+
238
+ 创建或分支任务时,会按适用场景继承模型、思考强度、权限模式和项目形态。
239
+
240
+ ## 受管系统 Skill
241
+
242
+ 随包提供的 Agent Bot Skill 可安装到共享 Agent Skill 目录:
243
+
244
+ ```powershell
245
+ agent-bot skills install
246
+ agent-bot skills status
247
+ agent-bot skills uninstall
248
+ ```
249
+
250
+ 默认目标为 `~/.agents/skills`,可通过 `AGENT_BOT_SKILLS_DIR` 或 `--target` 修改。安装使用受管复制;卸载不会删除无关的同名目录。
251
+
252
+ ## npm 包与发布
253
+
254
+ 公开包名为 `@keyou007/agent-bot`,安装后的可执行命令仍为 `agent-bot`。包使用 `files` 白名单,只发布运行代码、模板、受管 Skill、源码和用户文档,不包含测试及内部设计计划。
255
+
256
+ CLI 随包发布 `npm-shrinkwrap.json`,以固定传递运行依赖;直接运行依赖和开发依赖也使用精确版本。
257
+
258
+ 包生命周期:
259
+
260
+ - `prepublishOnly` 执行类型检查和完整测试
261
+ - `prepack` 清理并构建 `dist/`,然后检查 tarball 清单
262
+ - `npm run package:smoke` 打包项目、在临时目录安装 tarball、运行 CLI,并执行仅 Console 的初始化
263
+
264
+ 首次公开发布需要拥有 `@keyou007` scope 的 npm 账号:
265
+
266
+ ```powershell
267
+ npm login
268
+ npm ci
269
+ npm run verify
270
+ npm run package:smoke
271
+ npm publish --access public
272
+ ```
273
+
274
+ 首次发布后,为 npm 包配置以下 Trusted Publisher:
275
+
276
+ - GitHub 所有者:`keyou`
277
+ - 仓库:`agent-bot`
278
+ - Workflow:`publish.yml`
279
+ - 允许操作:`npm publish`
280
+
281
+ 发布工作流由 GitHub Release 触发,Release tag 必须严格匹配 `v<包版本>`。工作流使用 GitHub OIDC,不保存长期 npm token,并从 GitHub 托管的 Node.js 24 runner 发布。
282
+
283
+ ## 开发与源码安装
284
+
285
+ ```powershell
286
+ npm ci
287
+ npm run dev
288
+ npm run typecheck
289
+ npm test
290
+ npm run build
291
+ npm link
292
+ ```
293
+
294
+ `npm link` 会把当前 checkout 的 `agent-bot` 命令注册到全局。未执行时,可通过 `npm run cli --` 调用构建后的 CLI。`npm run dev` 运行单个前台 worker,`npm start` 在当前终端运行 supervisor。