@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
package/README.md ADDED
@@ -0,0 +1,187 @@
1
+ # Agent Bot
2
+
3
+ Use local Codex and ACP agents directly from Feishu.
4
+
5
+ English | [简体中文](README.zh.md)
6
+
7
+ Agent Bot runs on your computer and connects a Feishu bot to your local Codex environment. Send a message to start working; the bot updates a progress card while the agent runs and sends the final answer as Markdown.
8
+
9
+ ## What You Can Do
10
+
11
+ - Use your existing local Codex login from Feishu
12
+ - Create, continue, switch, fork, and stop tasks
13
+ - Work with text, images, groups, and threads
14
+ - Queue follow-up Prompts or add instructions while a task is running
15
+ - Resume work after Agent Bot restarts
16
+ - Use a local Console UI without Feishu
17
+
18
+ ## Quick Start
19
+
20
+ ### Requirements
21
+
22
+ - Node.js 22 or later
23
+ - Codex CLI installed and available as `codex`
24
+ - A completed local Codex login
25
+
26
+ Check the login:
27
+
28
+ ```powershell
29
+ codex login status
30
+ ```
31
+
32
+ ### Install
33
+
34
+ ```powershell
35
+ npm install --global @keyou007/agent-bot
36
+ ```
37
+
38
+ This installs the `agent-bot` command globally. See the [technical reference](docs/technical-reference.md#development-and-source-installation) to install from source.
39
+
40
+ ### Initialize
41
+
42
+ ```powershell
43
+ agent-bot init
44
+ ```
45
+
46
+ 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.
47
+
48
+ Missing optional permissions do not block initialization. Agent Bot reports which features may be unavailable.
49
+
50
+ | Option | Purpose |
51
+ | ---------------------- | ----------------------------------- |
52
+ | `--skip-feishu` | Initialize for Console-only use |
53
+ | `--reconfigure-feishu` | Replace existing Feishu credentials |
54
+ | `--json` | Print a machine-readable result |
55
+ | `--config <path>` | Use a specific configuration file |
56
+
57
+ You can rerun `agent-bot init` later to check or complete the bot configuration.
58
+
59
+ ### Start
60
+
61
+ ```powershell
62
+ agent-bot server start
63
+ agent-bot server status
64
+ ```
65
+
66
+ Open Feishu, find the bot, and send a message. Agent Bot automatically creates a task for a chat that does not have one yet.
67
+
68
+ Stop the service with:
69
+
70
+ ```powershell
71
+ agent-bot server stop
72
+ ```
73
+
74
+ ### Update Or Uninstall
75
+
76
+ Stop the running service before replacing or removing the global package:
77
+
78
+ ```powershell
79
+ agent-bot server stop
80
+ npm install --global @keyou007/agent-bot@latest
81
+ agent-bot server start
82
+ ```
83
+
84
+ To uninstall:
85
+
86
+ ```powershell
87
+ agent-bot server stop
88
+ npm uninstall --global @keyou007/agent-bot
89
+ ```
90
+
91
+ Uninstalling the npm package does not delete your data under `~/.agent-bot`.
92
+
93
+ ## Daily Commands
94
+
95
+ ### Service
96
+
97
+ ```powershell
98
+ agent-bot server status
99
+ agent-bot server start
100
+ agent-bot server stop
101
+ agent-bot server restart
102
+ ```
103
+
104
+ `server restart` waits for current work to finish by default. Use `--immediate` only when interruption is acceptable.
105
+
106
+ ### Console
107
+
108
+ ```powershell
109
+ agent-bot console
110
+ ```
111
+
112
+ The Console UI works without Feishu credentials. It will not share task state with a running server unless `--force` is supplied.
113
+
114
+ ### Tasks
115
+
116
+ ```powershell
117
+ agent-bot task list
118
+ agent-bot task status <task>
119
+ agent-bot task prompt <task> "<prompt>"
120
+ agent-bot task title <task> "<title>"
121
+ agent-bot task stop <task>
122
+ ```
123
+
124
+ `<task>` can be a number from `task list`, a task ID, or an unambiguous task-ID prefix. Run `agent-bot --help` for all CLI options.
125
+
126
+ ## Feishu Commands
127
+
128
+ Plain text continues the current task. Messages beginning with `/` are commands.
129
+
130
+ | Command | Purpose |
131
+ | ---------------------------------------- | ------------------------------------------- |
132
+ | `/new [title] [--dir <path> \| --nodir]` | Create a task |
133
+ | `/sessions [keyword]` | Browse available Codex tasks |
134
+ | `/switch [task]` | Switch tasks or return to the previous task |
135
+ | `/fork [task]` | Create and open a task branch |
136
+ | `/status [task]` | View task progress and results |
137
+ | `/title <title>` | Rename the current task |
138
+ | `/stop` | Stop the current execution |
139
+ | `/queue <prompt>` | Queue a separate follow-up Prompt |
140
+ | `/nosteer <prompt>` | Same as `/queue` |
141
+ | `/goal [objective]` | View or manage a persistent Goal |
142
+ | `/model [name]` | View or change the model |
143
+ | `/thinking [level]` | View or change reasoning effort |
144
+ | `/permissions auto\|confirm` | Change tool approval behavior |
145
+ | `/newgroup [title]` | Create a private group for a new task |
146
+ | `/forkgroup [title]` | Fork the current position into a private group |
147
+ | `/agent [name]` | View or change the default agent |
148
+ | `/use <agent> [cwd]` | Select an agent and create a task |
149
+ | `! <command>` | Run a local command in the task directory |
150
+ | `/restart` | Gracefully restart Agent Bot |
151
+ | `/help` | Show in-chat help |
152
+
153
+ Private chats, group timelines, and threads keep separate current tasks. You can send an image by itself or together with text. While a task is running, plain text adds instructions to the current work; use `/queue` (or `/nosteer`) to always create a later turn.
154
+
155
+ Inside a thread, `/forkgroup` forks from the thread's original turn until the thread task completes its own turn. After that, it forks from the thread task's latest completed turn. A currently running turn is never used as a fork point.
156
+
157
+ `/newgroup` immediately creates a new task in the new group. It inherits the current task's project directory, model, reasoning effort, and permission mode without affecting the source task. If there is no current task, Agent Bot uses the selected agent and its runtime defaults. An explicit title becomes both the group suffix and the task title.
158
+
159
+ When `/newgroup` omits the title, the task title is `新任务` and the default group name is `[agent] [project dir] 新任务 (mm-dd)`. When `/forkgroup` omits the title, its task and group name use the same persistent `source title(分支 N)` sequence as `/fork`, without a date suffix. Feishu group names created by `/newgroup` and `/forkgroup` are capped at 60 displayed characters. When a generated name is too long, Agent Bot truncates only the title portion in the group name; the task title itself stays unchanged.
160
+
161
+ ## Configuration And Data
162
+
163
+ Agent Bot keeps user-owned files outside the repository:
164
+
165
+ | Path | Purpose |
166
+ | -------------------------- | --------------------------- |
167
+ | `~/.agent-bot/config.yaml` | Agent Bot configuration |
168
+ | `~/.agent-bot/.env` | Feishu credentials |
169
+ | `~/.agent-bot/data/` | Task data and cached inputs |
170
+ | `~/.agent-bot/logs/` | Runtime logs |
171
+
172
+ Set `AGENT_BOT_HOME` to use another user-data directory. See [config.example.yaml](config.example.yaml) for configuration examples.
173
+
174
+ ## Troubleshooting
175
+
176
+ - **The bot does not respond:** run `agent-bot server status` and check `~/.agent-bot/logs/agent-bot.log`.
177
+ - **Feishu permissions are incomplete:** rerun `agent-bot init` and follow the displayed authorization steps.
178
+ - **Codex cannot start:** run `codex login status` as the same operating-system user that runs Agent Bot.
179
+ - **You only need local testing:** run `agent-bot init --skip-feishu`, then `agent-bot console`.
180
+ - **A safe restart keeps waiting:** inspect active tasks with `agent-bot task list --status running`.
181
+
182
+ ## More Documentation
183
+
184
+ - [Technical Reference](docs/technical-reference.md): configuration, permissions, routing, persistence, recovery, and runtime behavior
185
+ - [Example Configuration](config.example.yaml)
186
+ - [Changelog](CHANGELOG.md)
187
+ - [Agent Development Guide](https://github.com/keyou/agent-bot/blob/master/AGENTS.md)
package/README.zh.md ADDED
@@ -0,0 +1,187 @@
1
+ # Agent Bot
2
+
3
+ 通过飞书使用本机上的 Codex 和 ACP Agent。
4
+
5
+ [English](README.md) | 简体中文
6
+
7
+ Agent Bot 运行在你的电脑上,把飞书机器人连接到本机 Codex 环境。发送消息即可开始工作;执行过程中机器人会更新进度卡,完成后发送 Markdown 最终回答。
8
+
9
+ ## 可以做什么
10
+
11
+ - 在飞书中使用本机已有的 Codex 登录
12
+ - 创建、继续、切换、分支和停止任务
13
+ - 使用文字、图片、群聊和话题协作
14
+ - 排队后续 Prompt,或在任务运行中追加指令
15
+ - Agent Bot 重启后继续已有工作
16
+ - 不使用飞书时通过本地 Console UI 运行
17
+
18
+ ## 快速开始
19
+
20
+ ### 使用前提
21
+
22
+ - Node.js 22 或更高版本
23
+ - 已安装 Codex CLI,并可直接执行 `codex`
24
+ - 已完成本机 Codex 登录
25
+
26
+ 确认登录状态:
27
+
28
+ ```powershell
29
+ codex login status
30
+ ```
31
+
32
+ ### 安装
33
+
34
+ ```powershell
35
+ npm install --global @keyou007/agent-bot
36
+ ```
37
+
38
+ 该命令会全局安装 `agent-bot`。从源码安装的方法见[技术参考](docs/technical-reference.zh.md#开发与源码安装)。
39
+
40
+ ### 初始化
41
+
42
+ ```powershell
43
+ agent-bot init
44
+ ```
45
+
46
+ 打开命令显示的链接或扫描二维码,完成飞书机器人创建和授权。初始化会准备 `~/.agent-bot`、保存机器人凭据并检查所需权限。
47
+
48
+ 非核心权限缺失不会阻塞初始化,Agent Bot 会提示可能无法使用的功能。
49
+
50
+ | 参数 | 作用 |
51
+ | ---------------------- | ------------------------- |
52
+ | `--skip-feishu` | 仅初始化 Console 使用环境 |
53
+ | `--reconfigure-feishu` | 替换已有飞书凭据 |
54
+ | `--json` | 输出便于程序读取的结果 |
55
+ | `--config <路径>` | 使用指定配置文件 |
56
+
57
+ 之后可以重新运行 `agent-bot init` 检查或补齐机器人配置。
58
+
59
+ ### 启动
60
+
61
+ ```powershell
62
+ agent-bot server start
63
+ agent-bot server status
64
+ ```
65
+
66
+ 打开飞书,找到机器人并发送消息。当前会话没有任务时,Agent Bot 会自动创建。
67
+
68
+ 停止服务:
69
+
70
+ ```powershell
71
+ agent-bot server stop
72
+ ```
73
+
74
+ ### 更新或卸载
75
+
76
+ 替换或移除全局包前,先停止正在运行的服务:
77
+
78
+ ```powershell
79
+ agent-bot server stop
80
+ npm install --global @keyou007/agent-bot@latest
81
+ agent-bot server start
82
+ ```
83
+
84
+ 卸载:
85
+
86
+ ```powershell
87
+ agent-bot server stop
88
+ npm uninstall --global @keyou007/agent-bot
89
+ ```
90
+
91
+ 卸载 npm 包不会删除 `~/.agent-bot` 中的用户数据。
92
+
93
+ ## 日常命令
94
+
95
+ ### 服务管理
96
+
97
+ ```powershell
98
+ agent-bot server status
99
+ agent-bot server start
100
+ agent-bot server stop
101
+ agent-bot server restart
102
+ ```
103
+
104
+ `server restart` 默认等待当前工作完成后再重启。只有可接受中断时才使用 `--immediate`。
105
+
106
+ ### Console
107
+
108
+ ```powershell
109
+ agent-bot console
110
+ ```
111
+
112
+ Console UI 不需要飞书凭据。除非传入 `--force`,否则不会与正在运行的 Server 共享任务状态。
113
+
114
+ ### 任务管理
115
+
116
+ ```powershell
117
+ agent-bot task list
118
+ agent-bot task status <任务>
119
+ agent-bot task prompt <任务> "<prompt>"
120
+ agent-bot task title <任务> "<标题>"
121
+ agent-bot task stop <任务>
122
+ ```
123
+
124
+ `<任务>` 可以是 `task list` 中的序号、任务 ID 或唯一的任务 ID 前缀。运行 `agent-bot --help` 可查看完整 CLI 参数。
125
+
126
+ ## 飞书命令
127
+
128
+ 普通文本会继续当前任务,以 `/` 开头的消息会作为命令处理。
129
+
130
+ | 命令 | 作用 |
131
+ | --------------------------------------- | -------------------------- |
132
+ | `/new [标题] [--dir <路径> \| --nodir]` | 创建任务 |
133
+ | `/sessions [关键词]` | 浏览可用的 Codex 任务 |
134
+ | `/switch [任务]` | 切换任务,或返回上一个任务 |
135
+ | `/fork [任务]` | 创建并打开任务分支 |
136
+ | `/status [任务]` | 查看任务进度和结果 |
137
+ | `/title <标题>` | 修改当前任务标题 |
138
+ | `/stop` | 停止当前执行 |
139
+ | `/queue <prompt>` | 排队一个独立的后续 Prompt |
140
+ | `/nosteer <prompt>` | 与 `/queue` 相同 |
141
+ | `/goal [目标]` | 查看或管理持久 Goal |
142
+ | `/model [名称]` | 查看或切换模型 |
143
+ | `/thinking [级别]` | 查看或切换思考强度 |
144
+ | `/permissions auto\|confirm` | 修改工具授权方式 |
145
+ | `/newgroup [标题]` | 为新任务创建私有群 |
146
+ | `/forkgroup [标题]` | 将当前位置分支到私有群 |
147
+ | `/agent [名称]` | 查看或切换默认 Agent |
148
+ | `/use <agent> [cwd]` | 选择 Agent 并创建任务 |
149
+ | `! <命令>` | 在任务目录执行本地命令 |
150
+ | `/restart` | 优雅重启 Agent Bot |
151
+ | `/help` | 显示聊天内帮助 |
152
+
153
+ 私聊、群正文和话题分别维护当前任务。可以单独发送图片,也可以同时发送文字和图片。任务运行中发送普通文字会追加指令;需要确保形成后续 turn 时使用 `/queue`(或 `/nosteer`)。
154
+
155
+ 在话题中使用 `/forkgroup` 时,如果话题任务还没有完成过自己的 turn,则从话题原始 turn fork;完成过后则从话题任务最近完成的 turn fork。正在执行的 turn 不会作为 fork 点。
156
+
157
+ `/newgroup` 会立即在新群中创建并绑定一个新任务。新任务继承当前任务的项目目录、模型、思考强度和权限模式,不影响来源任务;来源聊天没有当前任务时,则使用选定 Agent 及其运行时默认设置。显式标题会同时作为群名后缀和任务标题。
158
+
159
+ `/newgroup` 省略标题时,任务标题为 `新任务`,默认群名为 `[agent] [project dir] 新任务 (mm-dd)`。`/forkgroup` 省略标题时,任务标题和群名都与 `/fork` 一样使用持久递增的 `源标题(分支 N)`,不追加日期。`/newgroup` 和 `/forkgroup` 创建的飞书群名最多显示 60 个字符。生成后的群名过长时,Agent Bot 只截断群名中的标题部分,任务标题本身保持不变。
160
+
161
+ ## 配置与数据
162
+
163
+ Agent Bot 将用户相关文件保存在仓库之外:
164
+
165
+ | 路径 | 用途 |
166
+ | -------------------------- | ------------------ |
167
+ | `~/.agent-bot/config.yaml` | Agent Bot 配置 |
168
+ | `~/.agent-bot/.env` | 飞书凭据 |
169
+ | `~/.agent-bot/data/` | 任务数据和输入缓存 |
170
+ | `~/.agent-bot/logs/` | 运行日志 |
171
+
172
+ 可通过 `AGENT_BOT_HOME` 修改用户数据目录。配置示例见 [config.example.yaml](config.example.yaml)。
173
+
174
+ ## 常见问题
175
+
176
+ - **机器人没有响应:** 运行 `agent-bot server status`,并查看 `~/.agent-bot/logs/agent-bot.log`
177
+ - **飞书权限不完整:** 重新运行 `agent-bot init`,完成显示的授权步骤
178
+ - **Codex 无法启动:** 使用运行 Agent Bot 的同一操作系统用户执行 `codex login status`
179
+ - **只需要本地测试:** 运行 `agent-bot init --skip-feishu`,然后执行 `agent-bot console`
180
+ - **安全重启一直等待:** 使用 `agent-bot task list --status running` 检查活动任务
181
+
182
+ ## 更多文档
183
+
184
+ - [技术参考](docs/technical-reference.zh.md):配置、权限、路由、持久化、恢复和运行机制
185
+ - [配置示例](config.example.yaml)
186
+ - [更新日志](CHANGELOG.md)
187
+ - [Agent 开发指南](https://github.com/keyou/agent-bot/blob/master/AGENTS.md)
package/SECURITY.md ADDED
@@ -0,0 +1,13 @@
1
+ # Security Policy
2
+
3
+ ## Supported Versions
4
+
5
+ Security fixes are released for the latest published version of Agent Bot.
6
+
7
+ ## Reporting A Vulnerability
8
+
9
+ Do not open a public issue for a suspected vulnerability.
10
+
11
+ Report it through [GitHub private vulnerability reporting](https://github.com/keyou/agent-bot/security/advisories/new). Include the affected version, reproduction steps, impact, and any suggested mitigation.
12
+
13
+ The project will acknowledge the report, investigate it, and coordinate disclosure and a fixed release when appropriate.
@@ -0,0 +1,56 @@
1
+ feishu:
2
+ transport: "auto"
3
+ appId: "${FEISHU_APP_ID}"
4
+ appSecret: "${FEISHU_APP_SECRET}"
5
+ useConsoleWhenMissingCredentials: true
6
+
7
+ console:
8
+ enabled: true
9
+
10
+ agents:
11
+ codex:
12
+ kind: "codex"
13
+ title: "Codex"
14
+ command: "codex"
15
+ args:
16
+ - "app-server"
17
+ - "--enable"
18
+ - "goals"
19
+ - "--listen"
20
+ - "stdio://"
21
+ env: {}
22
+
23
+ coco:
24
+ title: "Coco"
25
+ command: "coco"
26
+ args:
27
+ - "acp"
28
+ - "serve"
29
+ env: {}
30
+
31
+ coco-yolo:
32
+ title: "Coco YOLO"
33
+ command: "coco"
34
+ args:
35
+ - "acp"
36
+ - "serve"
37
+ - "--yolo"
38
+ env: {}
39
+
40
+ example:
41
+ title: "Example ACP Agent"
42
+ command: "node"
43
+ args:
44
+ - "./examples/example-acp-agent.js"
45
+ env: {}
46
+
47
+ defaults:
48
+ agent: "codex"
49
+ cwd: "."
50
+
51
+ storage:
52
+ sqlitePath: "./data/agent-bot.sqlite"
53
+
54
+ logging:
55
+ level: "info"
56
+ path: "./logs/agent-bot.log"
@@ -0,0 +1,155 @@
1
+ import { EventEmitter } from "node:events";
2
+ import readline from "node:readline";
3
+ import { isJsonRpcNotification, isJsonRpcRequest, isJsonRpcResponse, } from "./acpTypes.js";
4
+ export class AcpJsonRpcConnection extends EventEmitter {
5
+ process;
6
+ logger;
7
+ nextId = 1;
8
+ pending = new Map();
9
+ handlers = new Map();
10
+ closed = false;
11
+ constructor(process, logger) {
12
+ super();
13
+ this.process = process;
14
+ this.logger = logger;
15
+ this.bindOutput();
16
+ }
17
+ on(eventName, listener) {
18
+ return super.on(eventName, listener);
19
+ }
20
+ registerHandler(method, handler) {
21
+ this.handlers.set(method, handler);
22
+ }
23
+ async request(method, params, timeoutMs = 0) {
24
+ if (this.closed) {
25
+ throw new Error(`Cannot send ACP request after connection closed: ${method}`);
26
+ }
27
+ const id = this.nextId++;
28
+ const responsePromise = new Promise((resolve, reject) => {
29
+ this.pending.set(id, { resolve, reject, method });
30
+ });
31
+ this.write({
32
+ jsonrpc: "2.0",
33
+ id,
34
+ method,
35
+ params,
36
+ });
37
+ if (timeoutMs <= 0) {
38
+ return (await responsePromise);
39
+ }
40
+ return (await Promise.race([
41
+ responsePromise,
42
+ new Promise((_resolve, reject) => {
43
+ setTimeout(() => {
44
+ this.pending.delete(id);
45
+ reject(new Error(`ACP request timed out: ${method}`));
46
+ }, timeoutMs);
47
+ }),
48
+ ]));
49
+ }
50
+ notify(method, params) {
51
+ if (this.closed) {
52
+ return;
53
+ }
54
+ this.write({
55
+ jsonrpc: "2.0",
56
+ method,
57
+ params,
58
+ });
59
+ }
60
+ close() {
61
+ this.closed = true;
62
+ for (const pending of this.pending.values()) {
63
+ pending.reject(new Error("ACP connection closed."));
64
+ }
65
+ this.pending.clear();
66
+ this.emit("close");
67
+ }
68
+ bindOutput() {
69
+ const reader = readline.createInterface({
70
+ input: this.process.stdout,
71
+ crlfDelay: Infinity,
72
+ });
73
+ reader.on("line", (line) => {
74
+ if (!line.trim()) {
75
+ return;
76
+ }
77
+ this.handleLine(line);
78
+ });
79
+ this.process.once("close", () => this.close());
80
+ }
81
+ handleLine(line) {
82
+ let message;
83
+ try {
84
+ message = JSON.parse(line);
85
+ }
86
+ catch (error) {
87
+ this.logger.warn({ line, error }, "Ignoring non-JSON ACP stdout line.");
88
+ return;
89
+ }
90
+ if (isJsonRpcResponse(message)) {
91
+ this.handleResponse(message);
92
+ return;
93
+ }
94
+ if (isJsonRpcRequest(message)) {
95
+ void this.handleRequest(message.id, message.method, message.params);
96
+ return;
97
+ }
98
+ if (isJsonRpcNotification(message)) {
99
+ this.emit("notification", message.method, message.params);
100
+ return;
101
+ }
102
+ this.logger.warn({ message }, "Ignoring unknown ACP message shape.");
103
+ }
104
+ handleResponse(message) {
105
+ const pending = this.pending.get(message.id);
106
+ if (!pending) {
107
+ this.logger.warn({ message }, "Received ACP response for unknown request.");
108
+ return;
109
+ }
110
+ this.pending.delete(message.id);
111
+ if ("error" in message) {
112
+ pending.reject(new Error(`${pending.method} failed: ${message.error.message}`));
113
+ return;
114
+ }
115
+ pending.resolve(message.result);
116
+ }
117
+ async handleRequest(id, method, params) {
118
+ this.emit("request", method, params);
119
+ const handler = this.handlers.get(method);
120
+ if (!handler) {
121
+ this.write({
122
+ jsonrpc: "2.0",
123
+ id,
124
+ error: {
125
+ code: -32601,
126
+ message: `Client method is not implemented by Agent Bot: ${method}`,
127
+ },
128
+ });
129
+ return;
130
+ }
131
+ try {
132
+ const result = await handler(params);
133
+ this.write({
134
+ jsonrpc: "2.0",
135
+ id,
136
+ result,
137
+ });
138
+ }
139
+ catch (error) {
140
+ this.write({
141
+ jsonrpc: "2.0",
142
+ id,
143
+ error: {
144
+ code: -32000,
145
+ message: error instanceof Error ? error.message : String(error),
146
+ },
147
+ });
148
+ }
149
+ }
150
+ write(message) {
151
+ const serialized = JSON.stringify(message);
152
+ this.process.stdin.write(`${serialized}\n`, "utf8");
153
+ }
154
+ }
155
+ //# sourceMappingURL=AcpJsonRpcConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AcpJsonRpcConnection.js","sourceRoot":"","sources":["../../src/acp/AcpJsonRpcConnection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import readline from "node:readline";
2
+ import { AcpJsonRpcConnection } from "./AcpJsonRpcConnection.js";
3
+ import { agentBotEnvironment } from "../runtime/agentEnvironment.js";
4
+ import { spawnStdioCommand } from "../utils/spawnCommand.js";
5
+ export class AcpProcessManager {
6
+ logger;
7
+ processes = new Map();
8
+ constructor(logger) {
9
+ this.logger = logger;
10
+ }
11
+ start(processKey, agentName, agent) {
12
+ if (this.processes.has(processKey)) {
13
+ throw new Error(`ACP process already exists: ${processKey}`);
14
+ }
15
+ const child = spawnStdioCommand(agent.command, agent.args, agentBotEnvironment(process.env, agent.env));
16
+ const childLogger = this.logger.child({ processKey, agentName });
17
+ const connection = new AcpJsonRpcConnection(child, childLogger);
18
+ const managed = {
19
+ processKey,
20
+ child,
21
+ connection,
22
+ stop: () => this.stop(processKey),
23
+ };
24
+ this.processes.set(processKey, managed);
25
+ this.bindLifecycle(managed, childLogger);
26
+ childLogger.info({ command: agent.command, args: agent.args }, "Started ACP agent process.");
27
+ return managed;
28
+ }
29
+ get(processKey) {
30
+ return this.processes.get(processKey);
31
+ }
32
+ stop(processKey) {
33
+ const managed = this.processes.get(processKey);
34
+ if (!managed) {
35
+ return;
36
+ }
37
+ this.processes.delete(processKey);
38
+ managed.connection.close();
39
+ if (!managed.child.killed) {
40
+ managed.child.kill();
41
+ }
42
+ }
43
+ stopAll() {
44
+ for (const processKey of this.processes.keys()) {
45
+ this.stop(processKey);
46
+ }
47
+ }
48
+ bindLifecycle(managed, logger) {
49
+ const stderr = readline.createInterface({
50
+ input: managed.child.stderr,
51
+ crlfDelay: Infinity,
52
+ });
53
+ stderr.on("line", (line) => {
54
+ logger.debug({ stderr: line }, "ACP agent stderr.");
55
+ });
56
+ managed.child.once("error", (error) => {
57
+ logger.error({ error }, "ACP agent process error.");
58
+ });
59
+ managed.child.once("exit", (code, signal) => {
60
+ this.processes.delete(managed.processKey);
61
+ logger.info({ code, signal }, "ACP agent process exited.");
62
+ });
63
+ }
64
+ }
65
+ //# sourceMappingURL=AcpProcessManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AcpProcessManager.js","sourceRoot":"","sources":["../../src/acp/AcpProcessManager.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAGrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAS7D,MAAM,OAAO,iBAAiB;IAGC,MAAM;IAFlB,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAC;IAElE,YAA6B,MAAc;sBAAd,MAAM;IAAW,CAAC;IAE/C,KAAK,CAAC,UAAkB,EAAE,SAAiB,EAAE,KAAkB;QAC7D,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAExG,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,oBAAoB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,OAAO,GAAsB;YACjC,UAAU;YACV,KAAK;YACL,UAAU;YACV,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;SAClC,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEzC,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,4BAA4B,CAAC,CAAC;QAC7F,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,UAAkB;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,UAAkB;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAE3B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,OAA0B,EAAE,MAAc;QAC9D,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC;YACtC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;YAC3B,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,mBAAmB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACpC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,0BAA0B,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}