agent-tower 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 (341) hide show
  1. package/dist/app.d.ts +2 -0
  2. package/dist/app.d.ts.map +1 -0
  3. package/dist/app.js +62 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +131 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/core/container.d.ts +11 -0
  10. package/dist/core/container.d.ts.map +1 -0
  11. package/dist/core/container.js +66 -0
  12. package/dist/core/container.js.map +1 -0
  13. package/dist/core/event-bus.d.ts +58 -0
  14. package/dist/core/event-bus.d.ts.map +1 -0
  15. package/dist/core/event-bus.js +29 -0
  16. package/dist/core/event-bus.js.map +1 -0
  17. package/dist/errors.d.ts +22 -0
  18. package/dist/errors.d.ts.map +1 -0
  19. package/dist/errors.js +36 -0
  20. package/dist/errors.js.map +1 -0
  21. package/dist/executors/base.executor.d.ts +160 -0
  22. package/dist/executors/base.executor.d.ts.map +1 -0
  23. package/dist/executors/base.executor.js +122 -0
  24. package/dist/executors/base.executor.js.map +1 -0
  25. package/dist/executors/claude-code.executor.d.ts +78 -0
  26. package/dist/executors/claude-code.executor.d.ts.map +1 -0
  27. package/dist/executors/claude-code.executor.js +160 -0
  28. package/dist/executors/claude-code.executor.js.map +1 -0
  29. package/dist/executors/command-builder.d.ts +64 -0
  30. package/dist/executors/command-builder.d.ts.map +1 -0
  31. package/dist/executors/command-builder.js +144 -0
  32. package/dist/executors/command-builder.js.map +1 -0
  33. package/dist/executors/cursor-agent.executor.d.ts +57 -0
  34. package/dist/executors/cursor-agent.executor.d.ts.map +1 -0
  35. package/dist/executors/cursor-agent.executor.js +109 -0
  36. package/dist/executors/cursor-agent.executor.js.map +1 -0
  37. package/dist/executors/default-profiles.json +29 -0
  38. package/dist/executors/execution-env.d.ts +64 -0
  39. package/dist/executors/execution-env.d.ts.map +1 -0
  40. package/dist/executors/execution-env.js +97 -0
  41. package/dist/executors/execution-env.js.map +1 -0
  42. package/dist/executors/gemini-cli.executor.d.ts +55 -0
  43. package/dist/executors/gemini-cli.executor.d.ts.map +1 -0
  44. package/dist/executors/gemini-cli.executor.js +117 -0
  45. package/dist/executors/gemini-cli.executor.js.map +1 -0
  46. package/dist/executors/index.d.ts +49 -0
  47. package/dist/executors/index.d.ts.map +1 -0
  48. package/dist/executors/index.js +95 -0
  49. package/dist/executors/index.js.map +1 -0
  50. package/dist/executors/profiles.d.ts +61 -0
  51. package/dist/executors/profiles.d.ts.map +1 -0
  52. package/dist/executors/profiles.js +192 -0
  53. package/dist/executors/profiles.js.map +1 -0
  54. package/dist/git/git-cli.d.ts +59 -0
  55. package/dist/git/git-cli.d.ts.map +1 -0
  56. package/dist/git/git-cli.js +156 -0
  57. package/dist/git/git-cli.js.map +1 -0
  58. package/dist/git/worktree.manager.d.ts +166 -0
  59. package/dist/git/worktree.manager.d.ts.map +1 -0
  60. package/dist/git/worktree.manager.js +481 -0
  61. package/dist/git/worktree.manager.js.map +1 -0
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +37 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/mcp/context.d.ts +15 -0
  67. package/dist/mcp/context.d.ts.map +1 -0
  68. package/dist/mcp/context.js +19 -0
  69. package/dist/mcp/context.js.map +1 -0
  70. package/dist/mcp/http-client.d.ts +46 -0
  71. package/dist/mcp/http-client.d.ts.map +1 -0
  72. package/dist/mcp/http-client.js +100 -0
  73. package/dist/mcp/http-client.js.map +1 -0
  74. package/dist/mcp/index.d.ts +3 -0
  75. package/dist/mcp/index.d.ts.map +1 -0
  76. package/dist/mcp/index.js +36 -0
  77. package/dist/mcp/index.js.map +1 -0
  78. package/dist/mcp/server.d.ts +6 -0
  79. package/dist/mcp/server.d.ts.map +1 -0
  80. package/dist/mcp/server.js +32 -0
  81. package/dist/mcp/server.js.map +1 -0
  82. package/dist/mcp/tools/projects.d.ts +7 -0
  83. package/dist/mcp/tools/projects.d.ts.map +1 -0
  84. package/dist/mcp/tools/projects.js +12 -0
  85. package/dist/mcp/tools/projects.js.map +1 -0
  86. package/dist/mcp/tools/sessions.d.ts +7 -0
  87. package/dist/mcp/tools/sessions.d.ts.map +1 -0
  88. package/dist/mcp/tools/sessions.js +22 -0
  89. package/dist/mcp/tools/sessions.js.map +1 -0
  90. package/dist/mcp/tools/tasks.d.ts +7 -0
  91. package/dist/mcp/tools/tasks.d.ts.map +1 -0
  92. package/dist/mcp/tools/tasks.js +68 -0
  93. package/dist/mcp/tools/tasks.js.map +1 -0
  94. package/dist/mcp/tools/workspaces.d.ts +7 -0
  95. package/dist/mcp/tools/workspaces.d.ts.map +1 -0
  96. package/dist/mcp/tools/workspaces.js +45 -0
  97. package/dist/mcp/tools/workspaces.js.map +1 -0
  98. package/dist/mcp/types.d.ts +109 -0
  99. package/dist/mcp/types.d.ts.map +1 -0
  100. package/dist/mcp/types.js +55 -0
  101. package/dist/mcp/types.js.map +1 -0
  102. package/dist/middleware/tunnel-auth.d.ts +13 -0
  103. package/dist/middleware/tunnel-auth.d.ts.map +1 -0
  104. package/dist/middleware/tunnel-auth.js +39 -0
  105. package/dist/middleware/tunnel-auth.js.map +1 -0
  106. package/dist/output/__tests__/claude-code-parser-token.test.d.ts +2 -0
  107. package/dist/output/__tests__/claude-code-parser-token.test.d.ts.map +1 -0
  108. package/dist/output/__tests__/claude-code-parser-token.test.js +233 -0
  109. package/dist/output/__tests__/claude-code-parser-token.test.js.map +1 -0
  110. package/dist/output/__tests__/cursor-agent-parser-token.test.d.ts +2 -0
  111. package/dist/output/__tests__/cursor-agent-parser-token.test.d.ts.map +1 -0
  112. package/dist/output/__tests__/cursor-agent-parser-token.test.js +95 -0
  113. package/dist/output/__tests__/cursor-agent-parser-token.test.js.map +1 -0
  114. package/dist/output/__tests__/msg-store-token.test.d.ts +2 -0
  115. package/dist/output/__tests__/msg-store-token.test.d.ts.map +1 -0
  116. package/dist/output/__tests__/msg-store-token.test.js +38 -0
  117. package/dist/output/__tests__/msg-store-token.test.js.map +1 -0
  118. package/dist/output/claude-code-parser.d.ts +96 -0
  119. package/dist/output/claude-code-parser.d.ts.map +1 -0
  120. package/dist/output/claude-code-parser.js +498 -0
  121. package/dist/output/claude-code-parser.js.map +1 -0
  122. package/dist/output/cursor-agent-parser.d.ts +87 -0
  123. package/dist/output/cursor-agent-parser.d.ts.map +1 -0
  124. package/dist/output/cursor-agent-parser.js +476 -0
  125. package/dist/output/cursor-agent-parser.js.map +1 -0
  126. package/dist/output/index.d.ts +9 -0
  127. package/dist/output/index.d.ts.map +1 -0
  128. package/dist/output/index.js +13 -0
  129. package/dist/output/index.js.map +1 -0
  130. package/dist/output/msg-store.d.ts +110 -0
  131. package/dist/output/msg-store.d.ts.map +1 -0
  132. package/dist/output/msg-store.js +274 -0
  133. package/dist/output/msg-store.js.map +1 -0
  134. package/dist/output/types.d.ts +90 -0
  135. package/dist/output/types.d.ts.map +1 -0
  136. package/dist/output/types.js +93 -0
  137. package/dist/output/types.js.map +1 -0
  138. package/dist/output/utils/ansi.d.ts +8 -0
  139. package/dist/output/utils/ansi.d.ts.map +1 -0
  140. package/dist/output/utils/ansi.js +17 -0
  141. package/dist/output/utils/ansi.js.map +1 -0
  142. package/dist/output/utils/patch.d.ts +57 -0
  143. package/dist/output/utils/patch.d.ts.map +1 -0
  144. package/dist/output/utils/patch.js +113 -0
  145. package/dist/output/utils/patch.js.map +1 -0
  146. package/dist/pipeline/agent-pipeline.d.ts +28 -0
  147. package/dist/pipeline/agent-pipeline.d.ts.map +1 -0
  148. package/dist/pipeline/agent-pipeline.js +76 -0
  149. package/dist/pipeline/agent-pipeline.js.map +1 -0
  150. package/dist/routes/attachments.d.ts +3 -0
  151. package/dist/routes/attachments.d.ts.map +1 -0
  152. package/dist/routes/attachments.js +141 -0
  153. package/dist/routes/attachments.js.map +1 -0
  154. package/dist/routes/demo.d.ts +3 -0
  155. package/dist/routes/demo.d.ts.map +1 -0
  156. package/dist/routes/demo.js +152 -0
  157. package/dist/routes/demo.js.map +1 -0
  158. package/dist/routes/files.d.ts +3 -0
  159. package/dist/routes/files.d.ts.map +1 -0
  160. package/dist/routes/files.js +313 -0
  161. package/dist/routes/files.js.map +1 -0
  162. package/dist/routes/filesystem.d.ts +3 -0
  163. package/dist/routes/filesystem.d.ts.map +1 -0
  164. package/dist/routes/filesystem.js +126 -0
  165. package/dist/routes/filesystem.js.map +1 -0
  166. package/dist/routes/git.d.ts +3 -0
  167. package/dist/routes/git.d.ts.map +1 -0
  168. package/dist/routes/git.js +170 -0
  169. package/dist/routes/git.js.map +1 -0
  170. package/dist/routes/index.d.ts +3 -0
  171. package/dist/routes/index.d.ts.map +1 -0
  172. package/dist/routes/index.js +45 -0
  173. package/dist/routes/index.js.map +1 -0
  174. package/dist/routes/notifications.d.ts +10 -0
  175. package/dist/routes/notifications.d.ts.map +1 -0
  176. package/dist/routes/notifications.js +54 -0
  177. package/dist/routes/notifications.js.map +1 -0
  178. package/dist/routes/profiles.d.ts +12 -0
  179. package/dist/routes/profiles.d.ts.map +1 -0
  180. package/dist/routes/profiles.js +76 -0
  181. package/dist/routes/profiles.js.map +1 -0
  182. package/dist/routes/projects.d.ts +3 -0
  183. package/dist/routes/projects.d.ts.map +1 -0
  184. package/dist/routes/projects.js +94 -0
  185. package/dist/routes/projects.js.map +1 -0
  186. package/dist/routes/sessions.d.ts +12 -0
  187. package/dist/routes/sessions.d.ts.map +1 -0
  188. package/dist/routes/sessions.js +109 -0
  189. package/dist/routes/sessions.js.map +1 -0
  190. package/dist/routes/system.d.ts +3 -0
  191. package/dist/routes/system.d.ts.map +1 -0
  192. package/dist/routes/system.js +42 -0
  193. package/dist/routes/system.js.map +1 -0
  194. package/dist/routes/tasks.d.ts +3 -0
  195. package/dist/routes/tasks.d.ts.map +1 -0
  196. package/dist/routes/tasks.js +136 -0
  197. package/dist/routes/tasks.js.map +1 -0
  198. package/dist/routes/terminals.d.ts +3 -0
  199. package/dist/routes/terminals.d.ts.map +1 -0
  200. package/dist/routes/terminals.js +54 -0
  201. package/dist/routes/terminals.js.map +1 -0
  202. package/dist/routes/tunnel.d.ts +3 -0
  203. package/dist/routes/tunnel.d.ts.map +1 -0
  204. package/dist/routes/tunnel.js +36 -0
  205. package/dist/routes/tunnel.js.map +1 -0
  206. package/dist/routes/workspaces.d.ts +3 -0
  207. package/dist/routes/workspaces.d.ts.map +1 -0
  208. package/dist/routes/workspaces.js +171 -0
  209. package/dist/routes/workspaces.js.map +1 -0
  210. package/dist/services/commit-message.service.d.ts +32 -0
  211. package/dist/services/commit-message.service.d.ts.map +1 -0
  212. package/dist/services/commit-message.service.js +202 -0
  213. package/dist/services/commit-message.service.js.map +1 -0
  214. package/dist/services/notifications/feishu-channel.d.ts +9 -0
  215. package/dist/services/notifications/feishu-channel.d.ts.map +1 -0
  216. package/dist/services/notifications/feishu-channel.js +51 -0
  217. package/dist/services/notifications/feishu-channel.js.map +1 -0
  218. package/dist/services/notifications/index.d.ts +3 -0
  219. package/dist/services/notifications/index.d.ts.map +1 -0
  220. package/dist/services/notifications/index.js +2 -0
  221. package/dist/services/notifications/index.js.map +1 -0
  222. package/dist/services/notifications/notification.service.d.ts +10 -0
  223. package/dist/services/notifications/notification.service.d.ts.map +1 -0
  224. package/dist/services/notifications/notification.service.js +85 -0
  225. package/dist/services/notifications/notification.service.js.map +1 -0
  226. package/dist/services/notifications/os-channel.d.ts +8 -0
  227. package/dist/services/notifications/os-channel.d.ts.map +1 -0
  228. package/dist/services/notifications/os-channel.js +38 -0
  229. package/dist/services/notifications/os-channel.js.map +1 -0
  230. package/dist/services/notifications/types.d.ts +11 -0
  231. package/dist/services/notifications/types.d.ts.map +1 -0
  232. package/dist/services/notifications/types.js +2 -0
  233. package/dist/services/notifications/types.js.map +1 -0
  234. package/dist/services/project.service.d.ts +91 -0
  235. package/dist/services/project.service.d.ts.map +1 -0
  236. package/dist/services/project.service.js +138 -0
  237. package/dist/services/project.service.js.map +1 -0
  238. package/dist/services/session-manager.d.ts +164 -0
  239. package/dist/services/session-manager.d.ts.map +1 -0
  240. package/dist/services/session-manager.js +569 -0
  241. package/dist/services/session-manager.js.map +1 -0
  242. package/dist/services/task.service.d.ts +179 -0
  243. package/dist/services/task.service.d.ts.map +1 -0
  244. package/dist/services/task.service.js +281 -0
  245. package/dist/services/task.service.js.map +1 -0
  246. package/dist/services/terminal-manager.d.ts +64 -0
  247. package/dist/services/terminal-manager.d.ts.map +1 -0
  248. package/dist/services/terminal-manager.js +217 -0
  249. package/dist/services/terminal-manager.js.map +1 -0
  250. package/dist/services/tunnel.service.d.ts +16 -0
  251. package/dist/services/tunnel.service.d.ts.map +1 -0
  252. package/dist/services/tunnel.service.js +77 -0
  253. package/dist/services/tunnel.service.js.map +1 -0
  254. package/dist/services/workspace.service.d.ts +219 -0
  255. package/dist/services/workspace.service.d.ts.map +1 -0
  256. package/dist/services/workspace.service.js +351 -0
  257. package/dist/services/workspace.service.js.map +1 -0
  258. package/dist/socket/events.d.ts +2 -0
  259. package/dist/socket/events.d.ts.map +1 -0
  260. package/dist/socket/events.js +3 -0
  261. package/dist/socket/events.js.map +1 -0
  262. package/dist/socket/index.d.ts +20 -0
  263. package/dist/socket/index.d.ts.map +1 -0
  264. package/dist/socket/index.js +77 -0
  265. package/dist/socket/index.js.map +1 -0
  266. package/dist/socket/middleware/auth.d.ts +13 -0
  267. package/dist/socket/middleware/auth.d.ts.map +1 -0
  268. package/dist/socket/middleware/auth.js +29 -0
  269. package/dist/socket/middleware/auth.js.map +1 -0
  270. package/dist/socket/middleware/error-handler.d.ts +11 -0
  271. package/dist/socket/middleware/error-handler.d.ts.map +1 -0
  272. package/dist/socket/middleware/error-handler.js +39 -0
  273. package/dist/socket/middleware/error-handler.js.map +1 -0
  274. package/dist/socket/middleware/index.d.ts +3 -0
  275. package/dist/socket/middleware/index.d.ts.map +1 -0
  276. package/dist/socket/middleware/index.js +3 -0
  277. package/dist/socket/middleware/index.js.map +1 -0
  278. package/dist/socket/rooms.d.ts +30 -0
  279. package/dist/socket/rooms.d.ts.map +1 -0
  280. package/dist/socket/rooms.js +39 -0
  281. package/dist/socket/rooms.js.map +1 -0
  282. package/dist/socket/socket-gateway.d.ts +21 -0
  283. package/dist/socket/socket-gateway.d.ts.map +1 -0
  284. package/dist/socket/socket-gateway.js +173 -0
  285. package/dist/socket/socket-gateway.js.map +1 -0
  286. package/dist/types/index.d.ts +41 -0
  287. package/dist/types/index.d.ts.map +1 -0
  288. package/dist/types/index.js +41 -0
  289. package/dist/types/index.js.map +1 -0
  290. package/dist/utils/index.d.ts +12 -0
  291. package/dist/utils/index.d.ts.map +1 -0
  292. package/dist/utils/index.js +25 -0
  293. package/dist/utils/index.js.map +1 -0
  294. package/dist/web/assets/AgentDemoPage-WdWEQtyU.js +1 -0
  295. package/dist/web/assets/DemoPage-C4Z_ftHI.js +4 -0
  296. package/dist/web/assets/NotificationSettingsPage-FrLfgt9y.js +1 -0
  297. package/dist/web/assets/ProfileSettingsPage-Cs93rTRr.js +3 -0
  298. package/dist/web/assets/ProjectKanbanPage-BmlRVfzo.js +75 -0
  299. package/dist/web/assets/ProjectKanbanPage-G5OQeJvU.css +1 -0
  300. package/dist/web/assets/api-client-CEBkg5lt.js +1 -0
  301. package/dist/web/assets/circle-alert-BEozlsMd.js +1 -0
  302. package/dist/web/assets/code-block-OCS4YCEC-CGgYYS4A.js +2 -0
  303. package/dist/web/assets/folder-picker-BP3x3phB.js +1 -0
  304. package/dist/web/assets/index-BuAijQvi.js +13 -0
  305. package/dist/web/assets/index-CxV866Yg.css +1 -0
  306. package/dist/web/assets/loader-circle-yEIqsdJ1.js +1 -0
  307. package/dist/web/assets/mermaid-NOHMQCX5-CIqtI2jF.js +123 -0
  308. package/dist/web/assets/mermaid-NOHMQCX5-lI9o3AWT.css +1 -0
  309. package/dist/web/assets/modal-BoX2RXaV.js +1 -0
  310. package/dist/web/assets/query-keys-BD_s_Etj.js +1 -0
  311. package/dist/web/assets/use-profiles-Rh8rBsAt.js +1 -0
  312. package/dist/web/index.html +14 -0
  313. package/dist/web/vite.svg +1 -0
  314. package/node_modules/@agent-tower/shared/dist/dev-port.d.ts +12 -0
  315. package/node_modules/@agent-tower/shared/dist/dev-port.d.ts.map +1 -0
  316. package/node_modules/@agent-tower/shared/dist/dev-port.js +31 -0
  317. package/node_modules/@agent-tower/shared/dist/dev-port.js.map +1 -0
  318. package/node_modules/@agent-tower/shared/dist/index.d.ts +5 -0
  319. package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -0
  320. package/node_modules/@agent-tower/shared/dist/index.js +5 -0
  321. package/node_modules/@agent-tower/shared/dist/index.js.map +1 -0
  322. package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts +72 -0
  323. package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts.map +1 -0
  324. package/node_modules/@agent-tower/shared/dist/log-adapter.js +144 -0
  325. package/node_modules/@agent-tower/shared/dist/log-adapter.js.map +1 -0
  326. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts +133 -0
  327. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts.map +1 -0
  328. package/node_modules/@agent-tower/shared/dist/socket/events.js +32 -0
  329. package/node_modules/@agent-tower/shared/dist/socket/events.js.map +1 -0
  330. package/node_modules/@agent-tower/shared/dist/socket/index.d.ts +2 -0
  331. package/node_modules/@agent-tower/shared/dist/socket/index.d.ts.map +1 -0
  332. package/node_modules/@agent-tower/shared/dist/socket/index.js +2 -0
  333. package/node_modules/@agent-tower/shared/dist/socket/index.js.map +1 -0
  334. package/node_modules/@agent-tower/shared/dist/types.d.ts +168 -0
  335. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -0
  336. package/node_modules/@agent-tower/shared/dist/types.js +53 -0
  337. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -0
  338. package/node_modules/@agent-tower/shared/package.json +38 -0
  339. package/package.json +46 -0
  340. package/prisma/schema.prisma +130 -0
  341. package/scripts/postinstall.js +120 -0
@@ -0,0 +1,168 @@
1
+ /**
2
+ * 核心业务类型定义
3
+ * 前后端共享的实体类型、枚举与常量
4
+ */
5
+ /** 任务状态 */
6
+ export declare enum TaskStatus {
7
+ TODO = "TODO",
8
+ IN_PROGRESS = "IN_PROGRESS",
9
+ IN_REVIEW = "IN_REVIEW",
10
+ DONE = "DONE",
11
+ CANCELLED = "CANCELLED"
12
+ }
13
+ /** 工作空间状态 */
14
+ export declare enum WorkspaceStatus {
15
+ ACTIVE = "ACTIVE",
16
+ MERGED = "MERGED",
17
+ ABANDONED = "ABANDONED"
18
+ }
19
+ /** AI 代理类型 */
20
+ export declare enum AgentType {
21
+ CLAUDE_CODE = "CLAUDE_CODE",
22
+ GEMINI_CLI = "GEMINI_CLI",
23
+ CURSOR_AGENT = "CURSOR_AGENT"
24
+ }
25
+ /** 会话状态 */
26
+ export declare enum SessionStatus {
27
+ PENDING = "PENDING",
28
+ RUNNING = "RUNNING",
29
+ COMPLETED = "COMPLETED",
30
+ FAILED = "FAILED",
31
+ CANCELLED = "CANCELLED"
32
+ }
33
+ /** 会话用途 */
34
+ export declare enum SessionPurpose {
35
+ /** 正常用户交互会话 */
36
+ CHAT = "CHAT",
37
+ /** 内部:生成 commit message */
38
+ COMMIT_MSG = "COMMIT_MSG"
39
+ }
40
+ /** 项目 */
41
+ export interface Project {
42
+ id: string;
43
+ name: string;
44
+ color: string;
45
+ description?: string;
46
+ /** 仓库路径 (对应 Prisma repoPath) */
47
+ repoPath: string;
48
+ /** 主分支名称,默认 "main" */
49
+ mainBranch: string;
50
+ createdAt?: string;
51
+ updatedAt?: string;
52
+ }
53
+ /** 任务 */
54
+ export interface Task {
55
+ id: string;
56
+ projectId: string;
57
+ title: string;
58
+ description?: string;
59
+ status: TaskStatus;
60
+ /** 优先级 (对应 Prisma priority) */
61
+ priority?: number;
62
+ /** 排序位置 (对应 Prisma position) */
63
+ position?: number;
64
+ /** 关联的工作空间列表(API include 时返回) */
65
+ workspaces?: Workspace[];
66
+ createdAt?: string;
67
+ updatedAt?: string;
68
+ }
69
+ /** 工作空间 */
70
+ export interface Workspace {
71
+ id: string;
72
+ taskId: string;
73
+ /** 分支名称 (对应 Prisma branchName) */
74
+ branchName: string;
75
+ /** worktree 路径 (对应 Prisma worktreePath) */
76
+ worktreePath: string;
77
+ status: WorkspaceStatus;
78
+ /** AI 生成的 commit message(合并时使用) */
79
+ commitMessage?: string | null;
80
+ /** 关联的会话列表(API include 时返回) */
81
+ sessions?: Session[];
82
+ createdAt?: string;
83
+ updatedAt?: string;
84
+ }
85
+ /** 会话 */
86
+ export interface Session {
87
+ id: string;
88
+ workspaceId: string;
89
+ agentType: AgentType;
90
+ status: SessionStatus;
91
+ /** 会话用途 */
92
+ purpose?: SessionPurpose;
93
+ tokenUsage?: {
94
+ totalTokens: number;
95
+ modelContextWindow?: number;
96
+ } | null;
97
+ startedAt?: string;
98
+ endedAt?: string;
99
+ }
100
+ /** Agent 生成的 Todo 项 */
101
+ export interface TodoItem {
102
+ content: string;
103
+ status: string;
104
+ priority?: string | null;
105
+ }
106
+ /** 冲突操作类型 */
107
+ export declare enum ConflictOp {
108
+ REBASE = "REBASE",
109
+ MERGE = "MERGE"
110
+ }
111
+ /** Git 操作状态 */
112
+ export interface GitOperationStatus {
113
+ /** 当前操作类型 */
114
+ operation: 'idle' | 'rebase' | 'merge';
115
+ /** 冲突文件列表 */
116
+ conflictedFiles: string[];
117
+ /** 冲突操作类型(仅在有冲突时有值) */
118
+ conflictOp: ConflictOp | null;
119
+ /** 领先基础分支的提交数 */
120
+ ahead: number;
121
+ /** 落后基础分支的提交数 */
122
+ behind: number;
123
+ /** 是否有未提交的变更(tracked 文件) */
124
+ hasUncommittedChanges: boolean;
125
+ /** 未提交变更的文件数 */
126
+ uncommittedCount: number;
127
+ /** 未跟踪文件数 */
128
+ untrackedCount: number;
129
+ }
130
+ /** 代理可用性检查结果 */
131
+ export interface AgentAvailability {
132
+ available: boolean;
133
+ version?: string;
134
+ error?: string;
135
+ }
136
+ /** 执行器配置 */
137
+ export interface ExecutorConfig {
138
+ workingDir: string;
139
+ prompt: string;
140
+ env?: Record<string, string>;
141
+ }
142
+ /** 附件 */
143
+ export interface Attachment {
144
+ id: string;
145
+ originalName: string;
146
+ mimeType: string;
147
+ sizeBytes: number;
148
+ /** HTTP 访问路径: /attachments/:id/file */
149
+ url: string;
150
+ /** 磁盘绝对路径,用于传给 agent */
151
+ storagePath: string;
152
+ createdAt?: string;
153
+ }
154
+ /** 第三方通知渠道 */
155
+ export type ThirdPartyChannel = 'none' | 'feishu';
156
+ /** 通知事件类型 */
157
+ export type NotificationEventType = 'task_in_review' | 'task_failed';
158
+ /** 通知配置 */
159
+ export interface NotificationSettings {
160
+ id: string;
161
+ osNotificationEnabled: boolean;
162
+ thirdPartyChannel: ThirdPartyChannel;
163
+ feishuWebhookUrl: string | null;
164
+ thirdPartyBaseUrl: string | null;
165
+ taskInReviewTitleTemplate: string;
166
+ taskInReviewBodyTemplate: string;
167
+ }
168
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,WAAW;AACX,oBAAY,UAAU;IACpB,IAAI,SAAS;IACb,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,IAAI,SAAS;IACb,SAAS,cAAc;CACxB;AAED,aAAa;AACb,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,SAAS,cAAc;CACxB;AAED,cAAc;AACd,oBAAY,SAAS;IACnB,WAAW,gBAAgB;IAC3B,UAAU,eAAe;IACzB,YAAY,iBAAiB;CAC9B;AAED,WAAW;AACX,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,SAAS,cAAc;CACxB;AAED,WAAW;AACX,oBAAY,cAAc;IACxB,eAAe;IACf,IAAI,SAAS;IACb,2BAA2B;IAC3B,UAAU,eAAe;CAC1B;AAID,SAAS;AACT,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,SAAS;AACT,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,UAAU,CAAA;IAClB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iCAAiC;IACjC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,WAAW;AACX,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,eAAe,CAAA;IACvB,mCAAmC;IACnC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,SAAS;AACT,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,aAAa,CAAA;IACrB,WAAW;IACX,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,UAAU,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAID,uBAAuB;AACvB,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAID,aAAa;AACb,oBAAY,UAAU;IACpB,MAAM,WAAW;IACjB,KAAK,UAAU;CAChB;AAED,eAAe;AACf,MAAM,WAAW,kBAAkB;IACjC,aAAa;IACb,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IACtC,aAAa;IACb,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,uBAAuB;IACvB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAA;IAC7B,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B;IAC5B,qBAAqB,EAAE,OAAO,CAAA;IAC9B,gBAAgB;IAChB,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa;IACb,cAAc,EAAE,MAAM,CAAA;CACvB;AAID,gBAAgB;AAChB,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,YAAY;AACZ,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;AAID,SAAS;AACT,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID,cAAc;AACd,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEjD,aAAa;AACb,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG,aAAa,CAAA;AAEpE,WAAW;AACX,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,qBAAqB,EAAE,OAAO,CAAA;IAC9B,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,yBAAyB,EAAE,MAAM,CAAA;IACjC,wBAAwB,EAAE,MAAM,CAAA;CACjC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * 核心业务类型定义
3
+ * 前后端共享的实体类型、枚举与常量
4
+ */
5
+ // ============ 枚举 / 常量 ============
6
+ /** 任务状态 */
7
+ export var TaskStatus;
8
+ (function (TaskStatus) {
9
+ TaskStatus["TODO"] = "TODO";
10
+ TaskStatus["IN_PROGRESS"] = "IN_PROGRESS";
11
+ TaskStatus["IN_REVIEW"] = "IN_REVIEW";
12
+ TaskStatus["DONE"] = "DONE";
13
+ TaskStatus["CANCELLED"] = "CANCELLED";
14
+ })(TaskStatus || (TaskStatus = {}));
15
+ /** 工作空间状态 */
16
+ export var WorkspaceStatus;
17
+ (function (WorkspaceStatus) {
18
+ WorkspaceStatus["ACTIVE"] = "ACTIVE";
19
+ WorkspaceStatus["MERGED"] = "MERGED";
20
+ WorkspaceStatus["ABANDONED"] = "ABANDONED";
21
+ })(WorkspaceStatus || (WorkspaceStatus = {}));
22
+ /** AI 代理类型 */
23
+ export var AgentType;
24
+ (function (AgentType) {
25
+ AgentType["CLAUDE_CODE"] = "CLAUDE_CODE";
26
+ AgentType["GEMINI_CLI"] = "GEMINI_CLI";
27
+ AgentType["CURSOR_AGENT"] = "CURSOR_AGENT";
28
+ })(AgentType || (AgentType = {}));
29
+ /** 会话状态 */
30
+ export var SessionStatus;
31
+ (function (SessionStatus) {
32
+ SessionStatus["PENDING"] = "PENDING";
33
+ SessionStatus["RUNNING"] = "RUNNING";
34
+ SessionStatus["COMPLETED"] = "COMPLETED";
35
+ SessionStatus["FAILED"] = "FAILED";
36
+ SessionStatus["CANCELLED"] = "CANCELLED";
37
+ })(SessionStatus || (SessionStatus = {}));
38
+ /** 会话用途 */
39
+ export var SessionPurpose;
40
+ (function (SessionPurpose) {
41
+ /** 正常用户交互会话 */
42
+ SessionPurpose["CHAT"] = "CHAT";
43
+ /** 内部:生成 commit message */
44
+ SessionPurpose["COMMIT_MSG"] = "COMMIT_MSG";
45
+ })(SessionPurpose || (SessionPurpose = {}));
46
+ // ============ Git 操作类型 ============
47
+ /** 冲突操作类型 */
48
+ export var ConflictOp;
49
+ (function (ConflictOp) {
50
+ ConflictOp["REBASE"] = "REBASE";
51
+ ConflictOp["MERGE"] = "MERGE";
52
+ })(ConflictOp || (ConflictOp = {}));
53
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oCAAoC;AAEpC,WAAW;AACX,MAAM,CAAN,IAAY,UAMX;AAND,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,yCAA2B,CAAA;IAC3B,qCAAuB,CAAA;IACvB,2BAAa,CAAA;IACb,qCAAuB,CAAA;AACzB,CAAC,EANW,UAAU,KAAV,UAAU,QAMrB;AAED,aAAa;AACb,MAAM,CAAN,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,oCAAiB,CAAA;IACjB,0CAAuB,CAAA;AACzB,CAAC,EAJW,eAAe,KAAf,eAAe,QAI1B;AAED,cAAc;AACd,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,wCAA2B,CAAA;IAC3B,sCAAyB,CAAA;IACzB,0CAA6B,CAAA;AAC/B,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED,WAAW;AACX,MAAM,CAAN,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;IACnB,wCAAuB,CAAA;IACvB,kCAAiB,CAAA;IACjB,wCAAuB,CAAA;AACzB,CAAC,EANW,aAAa,KAAb,aAAa,QAMxB;AAED,WAAW;AACX,MAAM,CAAN,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,eAAe;IACf,+BAAa,CAAA;IACb,2BAA2B;IAC3B,2CAAyB,CAAA;AAC3B,CAAC,EALW,cAAc,KAAd,cAAc,QAKzB;AA0ED,qCAAqC;AAErC,aAAa;AACb,MAAM,CAAN,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,+BAAiB,CAAA;IACjB,6BAAe,CAAA;AACjB,CAAC,EAHW,UAAU,KAAV,UAAU,QAGrB"}
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@agent-tower/shared",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./socket": {
14
+ "types": "./dist/socket/index.d.ts",
15
+ "import": "./dist/socket/index.js"
16
+ },
17
+ "./types": {
18
+ "types": "./dist/types.d.ts",
19
+ "import": "./dist/types.js"
20
+ },
21
+ "./log-adapter": {
22
+ "types": "./dist/log-adapter.d.ts",
23
+ "import": "./dist/log-adapter.js"
24
+ },
25
+ "./dev-port": {
26
+ "types": "./dist/dev-port.d.ts",
27
+ "import": "./dist/dev-port.js"
28
+ }
29
+ },
30
+ "scripts": {
31
+ "dev": "tsc --watch",
32
+ "build": "tsc",
33
+ "clean": "rm -rf dist"
34
+ },
35
+ "devDependencies": {
36
+ "typescript": "^5.3.3"
37
+ }
38
+ }
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "agent-tower",
3
+ "version": "0.1.0",
4
+ "description": "AI Agent Task Management Dashboard",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "agent-tower": "./dist/cli.js",
9
+ "agent-tower-mcp": "./dist/mcp/index.js"
10
+ },
11
+ "main": "./dist/index.js",
12
+ "files": [
13
+ "dist/",
14
+ "prisma/",
15
+ "scripts/",
16
+ "node_modules/@agent-tower/"
17
+ ],
18
+ "scripts": {
19
+ "postinstall": "prisma generate && node scripts/postinstall.js"
20
+ },
21
+ "dependencies": {
22
+ "@agent-tower/shared": "0.1.0",
23
+ "@fastify/cors": "^9.0.1",
24
+ "@fastify/multipart": "^8.3.1",
25
+ "@fastify/static": "^7.0.4",
26
+ "@modelcontextprotocol/sdk": "^1.26.0",
27
+ "@prisma/client": "^5.9.1",
28
+ "cloudflared": "^0.7.1",
29
+ "fast-json-patch": "^3.1.1",
30
+ "fastify": "^4.26.0",
31
+ "node-pty": "^1.0.0",
32
+ "simple-git": "^3.22.0",
33
+ "socket.io": "^4.8.3",
34
+ "zod": "^3.22.4",
35
+ "prisma": "^5.9.1"
36
+ },
37
+ "optionalDependencies": {
38
+ "fsevents": "~2.3.3"
39
+ },
40
+ "bundledDependencies": [
41
+ "@agent-tower/shared"
42
+ ],
43
+ "engines": {
44
+ "node": ">=18.0.0"
45
+ }
46
+ }
@@ -0,0 +1,130 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "sqlite"
7
+ url = env("DATABASE_URL")
8
+ }
9
+
10
+ // 项目
11
+ model Project {
12
+ id String @id @default(uuid())
13
+ name String
14
+ description String?
15
+ repoPath String
16
+ mainBranch String @default("main")
17
+ createdAt DateTime @default(now())
18
+ updatedAt DateTime @updatedAt
19
+ tasks Task[]
20
+ }
21
+
22
+ // 任务
23
+ // TaskStatus: TODO, IN_PROGRESS, IN_REVIEW, DONE, CANCELLED
24
+ model Task {
25
+ id String @id @default(uuid())
26
+ title String
27
+ description String?
28
+ status String @default("TODO")
29
+ priority Int @default(0)
30
+ position Int @default(0)
31
+ projectId String
32
+ project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
33
+ workspaces Workspace[]
34
+ createdAt DateTime @default(now())
35
+ updatedAt DateTime @updatedAt
36
+
37
+ @@index([projectId])
38
+ @@index([status])
39
+ }
40
+
41
+ // 工作空间 (对应一个 git worktree)
42
+ // WorkspaceStatus: ACTIVE, MERGED, ABANDONED
43
+ model Workspace {
44
+ id String @id @default(uuid())
45
+ taskId String
46
+ task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
47
+ branchName String
48
+ worktreePath String
49
+ status String @default("ACTIVE")
50
+ commitMessage String? // AI 生成的 commit message(合并时使用)
51
+ sessions Session[]
52
+ createdAt DateTime @default(now())
53
+ updatedAt DateTime @updatedAt
54
+
55
+ @@index([taskId])
56
+ }
57
+
58
+ // 会话 (一次 AI 代理执行)
59
+ // AgentType: CLAUDE_CODE, GEMINI_CLI, CURSOR_AGENT
60
+ // SessionStatus: PENDING, RUNNING, COMPLETED, FAILED, CANCELLED
61
+ // SessionPurpose: CHAT, COMMIT_MSG
62
+ model Session {
63
+ id String @id @default(uuid())
64
+ workspaceId String
65
+ workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
66
+ agentType String
67
+ variant String @default("DEFAULT")
68
+ prompt String
69
+ status String @default("PENDING")
70
+ purpose String @default("CHAT") // CHAT: 正常会话, COMMIT_MSG: 生成提交消息
71
+ logSnapshot String? // 序列化的 NormalizedConversation JSON,session 结束时持久化
72
+ tokenUsage String? // JSON: { totalTokens, modelContextWindow? }
73
+ processes ExecutionProcess[]
74
+ createdAt DateTime @default(now())
75
+ updatedAt DateTime @updatedAt
76
+
77
+ @@index([workspaceId])
78
+ }
79
+
80
+ // 执行进程
81
+ model ExecutionProcess {
82
+ id String @id @default(uuid())
83
+ sessionId String
84
+ session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade)
85
+ pid Int?
86
+ exitCode Int?
87
+ createdAt DateTime @default(now())
88
+ updatedAt DateTime @updatedAt
89
+
90
+ @@index([sessionId])
91
+ }
92
+
93
+ // 执行日志
94
+ model ExecutionLog {
95
+ id String @id @default(uuid())
96
+ processId String
97
+ content String
98
+ timestamp DateTime @default(now())
99
+
100
+ @@index([processId])
101
+ }
102
+
103
+ // 附件
104
+ model Attachment {
105
+ id String @id @default(uuid())
106
+ originalName String
107
+ mimeType String
108
+ sizeBytes Int
109
+ storagePath String
110
+ hash String
111
+ createdAt DateTime @default(now())
112
+
113
+ @@index([hash])
114
+ }
115
+
116
+ // 通知配置 (单例,只有一行)
117
+ // thirdPartyChannel: none, feishu
118
+ model NotificationSettings {
119
+ id String @id @default("singleton")
120
+ osNotificationEnabled Boolean @default(true)
121
+ thirdPartyChannel String @default("none")
122
+ feishuWebhookUrl String?
123
+
124
+ // 第三方通知跳转地址
125
+ thirdPartyBaseUrl String?
126
+
127
+ // 通知模板
128
+ taskInReviewTitleTemplate String @default("Agent Tower")
129
+ taskInReviewBodyTemplate String @default("✅ \"{taskTitle}\" 已完成,等待审查")
130
+ }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * postinstall 脚本 - 修复 node-pty 原生模块权限问题
3
+ *
4
+ * 问题背景:
5
+ * node-pty 是一个用于创建伪终端 (PTY) 的 Node.js 库,用于与 Claude Code、Gemini CLI 等 Agent 进行交互。
6
+ * 在 macOS 上,pnpm 安装 node-pty 时,预编译的 spawn-helper 二进制文件可能会丢失执行权限,
7
+ * 导致 "posix_spawnp failed" 错误。
8
+ *
9
+ * 解决方案:
10
+ * 在 postinstall 阶段自动为 spawn-helper 添加执行权限。
11
+ */
12
+
13
+ import { readdirSync, chmodSync, statSync, existsSync } from 'fs';
14
+ import { join, dirname } from 'path';
15
+ import { fileURLToPath } from 'url';
16
+
17
+ const __dirname = dirname(fileURLToPath(import.meta.url));
18
+
19
+ /**
20
+ * 向上查找 monorepo 根目录(包含 pnpm-workspace.yaml 或根 node_modules)
21
+ */
22
+ function findMonorepoRoot(startDir) {
23
+ let dir = startDir;
24
+ while (dir !== dirname(dir)) {
25
+ // 检查是否存在 pnpm-workspace.yaml(pnpm monorepo 标志)
26
+ if (existsSync(join(dir, 'pnpm-workspace.yaml'))) {
27
+ return dir;
28
+ }
29
+ // 检查是否存在 node_modules/.pnpm(pnpm 的依赖目录)
30
+ if (existsSync(join(dir, 'node_modules', '.pnpm'))) {
31
+ return dir;
32
+ }
33
+ dir = dirname(dir);
34
+ }
35
+ return null;
36
+ }
37
+
38
+ /**
39
+ * 递归查找匹配的文件
40
+ */
41
+ function findFiles(dir, pattern, results = [], depth = 0, maxDepth = 10) {
42
+ if (depth > maxDepth) return results;
43
+
44
+ try {
45
+ const entries = readdirSync(dir, { withFileTypes: true });
46
+ for (const entry of entries) {
47
+ const fullPath = join(dir, entry.name);
48
+ if (entry.isDirectory()) {
49
+ // 跳过隐藏目录(除了 .pnpm)
50
+ if (entry.name.startsWith('.') && entry.name !== '.pnpm') {
51
+ continue;
52
+ }
53
+ findFiles(fullPath, pattern, results, depth + 1, maxDepth);
54
+ } else if (pattern.test(entry.name)) {
55
+ results.push(fullPath);
56
+ }
57
+ }
58
+ } catch {
59
+ // 忽略无法访问的目录
60
+ }
61
+ return results;
62
+ }
63
+
64
+ /**
65
+ * 修复 spawn-helper 权限
66
+ */
67
+ function fixSpawnHelperPermissions() {
68
+ // 1. 优先查找包自身的 node_modules(npm 全局安装场景)
69
+ const packageRoot = join(__dirname, '..');
70
+ const localNodeModules = join(packageRoot, 'node_modules');
71
+
72
+ // 2. 尝试查找 monorepo 根目录(pnpm monorepo 场景)
73
+ const monorepoRoot = findMonorepoRoot(__dirname);
74
+ const monorepoNodeModules = monorepoRoot ? join(monorepoRoot, 'node_modules') : null;
75
+
76
+ // 收集所有需要搜索的 node_modules 目录(去重)
77
+ const searchDirs = [];
78
+ if (existsSync(localNodeModules)) {
79
+ searchDirs.push(localNodeModules);
80
+ }
81
+ if (monorepoNodeModules && monorepoNodeModules !== localNodeModules && existsSync(monorepoNodeModules)) {
82
+ searchDirs.push(monorepoNodeModules);
83
+ }
84
+
85
+ if (searchDirs.length === 0) {
86
+ console.log('[postinstall] 未找到 node_modules 目录,跳过 spawn-helper 权限修复');
87
+ return;
88
+ }
89
+
90
+ let fixed = 0;
91
+ for (const nodeModulesDir of searchDirs) {
92
+ console.log(`[postinstall] 在 ${nodeModulesDir} 中查找 spawn-helper...`);
93
+ const spawnHelpers = findFiles(nodeModulesDir, /^spawn-helper$/);
94
+
95
+ for (const file of spawnHelpers) {
96
+ if (!file.includes('node-pty')) continue;
97
+
98
+ try {
99
+ const stats = statSync(file);
100
+ const isExecutable = (stats.mode & 0o111) !== 0;
101
+
102
+ if (!isExecutable) {
103
+ chmodSync(file, 0o755);
104
+ console.log(`[postinstall] 已修复 spawn-helper 权限: ${file}`);
105
+ fixed++;
106
+ }
107
+ } catch (err) {
108
+ console.warn(`[postinstall] 无法修复权限: ${file}`, err.message);
109
+ }
110
+ }
111
+ }
112
+
113
+ if (fixed > 0) {
114
+ console.log(`[postinstall] 共修复 ${fixed} 个 spawn-helper 文件`);
115
+ } else {
116
+ console.log('[postinstall] 所有 spawn-helper 权限正常,无需修复');
117
+ }
118
+ }
119
+
120
+ fixSpawnHelperPermissions();