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,569 @@
1
+ import { prisma } from '../utils/index.js';
2
+ import { AgentType, SessionStatus, SessionPurpose, TaskStatus } from '../types/index.js';
3
+ import { getExecutor, ExecutionEnv } from '../executors/index.js';
4
+ import { sessionMsgStoreManager, createClaudeCodeParser, createCursorAgentParser, createUserMessage, addNormalizedEntry, } from '../output/index.js';
5
+ import { AgentPipeline } from '../pipeline/agent-pipeline.js';
6
+ import { execGit } from '../git/git-cli.js';
7
+ import { getCommitMessageService } from '../core/container.js';
8
+ const DEBUG_SNAPSHOT = process.env.DEBUG_SNAPSHOT === 'true';
9
+ export class SessionManager {
10
+ eventBus;
11
+ pipelines = new Map();
12
+ cancelTokens = new Map();
13
+ snapshotFlushTimers = new Map();
14
+ snapshotFlushChains = new Map();
15
+ pendingSnapshotStatus = new Map();
16
+ static SNAPSHOT_DEBOUNCE_MS = 1200;
17
+ constructor(eventBus) {
18
+ this.eventBus = eventBus;
19
+ // Debounced snapshot persistence: keep DB up-to-date without per-patch writes.
20
+ this.eventBus.on('session:patch', ({ sessionId, patch }) => {
21
+ if (DEBUG_SNAPSHOT) {
22
+ const ops = patch.slice(0, 3)
23
+ .map((p) => `${p.op ?? '?'}:${p.path ?? '?'}`)
24
+ .join(', ');
25
+ console.log(`[SessionManager:snapshot] patch sessionId=${sessionId} ops=${patch.length} [${ops}]`);
26
+ }
27
+ this.scheduleSnapshotPersist(sessionId);
28
+ });
29
+ this.eventBus.on('session:exit', ({ sessionId }) => {
30
+ const pipeline = this.pipelines.get(sessionId);
31
+ if (DEBUG_SNAPSHOT) {
32
+ console.log(`[SessionManager:snapshot] session:exit sessionId=${sessionId} hasPipeline=${Boolean(pipeline)}`);
33
+ }
34
+ if (pipeline) {
35
+ // Must call destroy() to remove MsgStore onPatch/onSessionId listeners.
36
+ // Without this, stale listeners accumulate across send/exit cycles and
37
+ // each subsequent pushPatch() forwards the same patch N times.
38
+ pipeline.destroy();
39
+ this.pipelines.delete(sessionId);
40
+ }
41
+ this.cancelTokens.delete(sessionId);
42
+ this.handleSessionExit(sessionId).catch((error) => {
43
+ console.error(`[SessionManager] post-exit handling failed for ${sessionId}:`, error);
44
+ });
45
+ });
46
+ this.eventBus.on('session:started', ({ sessionId }) => {
47
+ this.checkTaskAutoRevert(sessionId).catch((error) => {
48
+ console.error(`[SessionManager] checkTaskAutoRevert failed for session ${sessionId}:`, error);
49
+ });
50
+ });
51
+ }
52
+ async findById(id) {
53
+ return prisma.session.findUnique({
54
+ where: { id },
55
+ include: { processes: true, workspace: true },
56
+ });
57
+ }
58
+ async create(workspaceId, agentType, prompt, variant = 'DEFAULT') {
59
+ return prisma.session.create({
60
+ data: {
61
+ workspaceId,
62
+ agentType,
63
+ variant,
64
+ prompt,
65
+ status: SessionStatus.PENDING,
66
+ },
67
+ });
68
+ }
69
+ async start(id) {
70
+ const session = await prisma.session.findUnique({
71
+ where: { id },
72
+ include: { workspace: true },
73
+ });
74
+ if (!session)
75
+ return null;
76
+ const agentType = session.agentType;
77
+ const executor = getExecutor(agentType, session.variant ?? 'DEFAULT');
78
+ if (!executor) {
79
+ throw new Error(`Executor not found for agent type: ${session.agentType}`);
80
+ }
81
+ const workingDir = session.workspace.worktreePath;
82
+ const spawnResult = await executor.spawn({
83
+ workingDir,
84
+ prompt: session.prompt,
85
+ env: ExecutionEnv.default(workingDir),
86
+ });
87
+ await prisma.executionProcess.create({
88
+ data: {
89
+ sessionId: id,
90
+ pid: spawnResult.pid,
91
+ },
92
+ });
93
+ await prisma.session.update({
94
+ where: { id },
95
+ data: { status: SessionStatus.RUNNING },
96
+ });
97
+ this.attachPipeline(id, agentType, workingDir, spawnResult);
98
+ this.eventBus.emit('session:started', { sessionId: id });
99
+ return session;
100
+ }
101
+ async sendMessage(id, message) {
102
+ const session = await prisma.session.findUnique({
103
+ where: { id },
104
+ include: { workspace: true },
105
+ });
106
+ if (!session)
107
+ return null;
108
+ const existing = this.pipelines.get(id);
109
+ if (existing) {
110
+ // Checkpoint snapshot before replacing PTY pipeline.
111
+ if (DEBUG_SNAPSHOT) {
112
+ console.log(`[SessionManager:snapshot] sendMessage checkpoint before pipeline replace sessionId=${id}`);
113
+ }
114
+ await this.flushSnapshotPersist(id);
115
+ existing.destroy();
116
+ this.pipelines.delete(id);
117
+ this.cancelTokens.delete(id);
118
+ }
119
+ const isNewStore = !sessionMsgStoreManager.has(id);
120
+ const msgStore = sessionMsgStoreManager.getOrCreate(id);
121
+ if (isNewStore && session.logSnapshot) {
122
+ try {
123
+ const snapshot = JSON.parse(session.logSnapshot);
124
+ msgStore.restoreFromSnapshot(snapshot);
125
+ }
126
+ catch (error) {
127
+ console.error(`[SessionManager] Failed to restore snapshot for session ${id}:`, error);
128
+ }
129
+ }
130
+ // Heal index drift caused by previously failed patches (e.g. invalid value).
131
+ // If entryIndex is ahead of snapshot length, subsequent add/replace paths
132
+ // become out-of-bounds and all later patches fail.
133
+ const preflightSnapshot = msgStore.getSnapshot();
134
+ const expectedIndex = preflightSnapshot.entries.length;
135
+ const currentIndex = msgStore.entryIndex.current();
136
+ if (currentIndex !== expectedIndex) {
137
+ if (DEBUG_SNAPSHOT) {
138
+ console.warn(`[SessionManager:snapshot] rebase entryIndex sessionId=${id} currentIndex=${currentIndex} expectedIndex=${expectedIndex}`);
139
+ }
140
+ msgStore.entryIndex.startFrom(expectedIndex);
141
+ }
142
+ const userEntry = createUserMessage(message);
143
+ const userIndex = msgStore.entryIndex.next();
144
+ const userPatch = addNormalizedEntry(userIndex, userEntry);
145
+ if (DEBUG_SNAPSHOT) {
146
+ console.log(`[SessionManager:snapshot] sendMessage userPatch sessionId=${id} index=${userIndex} currentIndex=${msgStore.entryIndex.current()}`);
147
+ }
148
+ msgStore.pushPatch(userPatch);
149
+ // Emit directly to EventBus — the old pipeline was already destroyed so
150
+ // MsgStore's patchListeners are empty at this point. Without this line
151
+ // the user-message patch would never reach WebSocket subscribers.
152
+ this.eventBus.emit('session:patch', { sessionId: id, patch: userPatch });
153
+ const agentSessionId = this.resolveAgentSessionId(id, session.logSnapshot);
154
+ const agentType = session.agentType;
155
+ const executor = getExecutor(agentType, session.variant ?? 'DEFAULT');
156
+ if (!executor) {
157
+ throw new Error(`Executor not found for agent type: ${session.agentType}`);
158
+ }
159
+ const workingDir = session.workspace.worktreePath;
160
+ const spawnConfig = {
161
+ workingDir,
162
+ prompt: message,
163
+ env: ExecutionEnv.default(workingDir),
164
+ };
165
+ let spawnResult;
166
+ if (agentSessionId && executor.spawnFollowUp) {
167
+ try {
168
+ spawnResult = await executor.spawnFollowUp(spawnConfig, agentSessionId);
169
+ }
170
+ catch {
171
+ spawnResult = await executor.spawn(spawnConfig);
172
+ }
173
+ }
174
+ else {
175
+ spawnResult = await executor.spawn(spawnConfig);
176
+ }
177
+ await prisma.executionProcess.create({
178
+ data: {
179
+ sessionId: id,
180
+ pid: spawnResult.pid,
181
+ },
182
+ });
183
+ await prisma.session.update({
184
+ where: { id },
185
+ data: { status: SessionStatus.RUNNING },
186
+ });
187
+ this.attachPipeline(id, agentType, workingDir, spawnResult);
188
+ this.eventBus.emit('session:started', { sessionId: id });
189
+ return session;
190
+ }
191
+ async stop(id) {
192
+ const session = await prisma.session.findUnique({ where: { id } });
193
+ if (!session)
194
+ return null;
195
+ const pipeline = this.pipelines.get(id);
196
+ if (pipeline) {
197
+ // Try graceful shutdown via SIGINT first
198
+ const cancel = this.cancelTokens.get(id);
199
+ if (cancel) {
200
+ cancel.cancel();
201
+ }
202
+ pipeline.destroy();
203
+ this.pipelines.delete(id);
204
+ this.cancelTokens.delete(id);
205
+ }
206
+ const msgStore = sessionMsgStoreManager.get(id);
207
+ if (msgStore) {
208
+ msgStore.pushFinished();
209
+ try {
210
+ await this.flushSnapshotPersist(id, SessionStatus.CANCELLED);
211
+ }
212
+ catch (error) {
213
+ console.error(`[SessionManager] Failed to persist cancelled snapshot for ${id}:`, error);
214
+ await prisma.session.update({
215
+ where: { id },
216
+ data: { status: SessionStatus.CANCELLED },
217
+ });
218
+ }
219
+ }
220
+ else {
221
+ await prisma.session.update({
222
+ where: { id },
223
+ data: { status: SessionStatus.CANCELLED },
224
+ });
225
+ }
226
+ this.eventBus.emit('session:stopped', { sessionId: id });
227
+ return session;
228
+ }
229
+ writeInput(sessionId, data) {
230
+ const pipeline = this.pipelines.get(sessionId);
231
+ if (!pipeline)
232
+ return;
233
+ pipeline.write(data);
234
+ }
235
+ resize(sessionId, cols, rows) {
236
+ const pipeline = this.pipelines.get(sessionId);
237
+ if (!pipeline)
238
+ return;
239
+ pipeline.resize(cols, rows);
240
+ }
241
+ /**
242
+ * Destroy all active pipelines. Called on graceful server shutdown.
243
+ */
244
+ destroyAll() {
245
+ if (this.pipelines.size === 0)
246
+ return;
247
+ console.log(`[SessionManager] Destroying all ${this.pipelines.size} active pipelines`);
248
+ for (const [sessionId, pipeline] of this.pipelines) {
249
+ const cancel = this.cancelTokens.get(sessionId);
250
+ if (cancel) {
251
+ cancel.cancel();
252
+ }
253
+ pipeline.destroy();
254
+ }
255
+ this.pipelines.clear();
256
+ this.cancelTokens.clear();
257
+ }
258
+ resolveAgentSessionId(sessionId, logSnapshot) {
259
+ const msgStore = sessionMsgStoreManager.get(sessionId);
260
+ if (msgStore) {
261
+ const snapshot = msgStore.getSnapshot();
262
+ if (snapshot.sessionId)
263
+ return snapshot.sessionId;
264
+ }
265
+ if (logSnapshot) {
266
+ try {
267
+ const parsed = JSON.parse(logSnapshot);
268
+ if (parsed.sessionId)
269
+ return parsed.sessionId;
270
+ }
271
+ catch {
272
+ // ignore invalid snapshot json
273
+ }
274
+ }
275
+ return null;
276
+ }
277
+ attachPipeline(sessionId, agentType, workingDir, spawnResult) {
278
+ const msgStore = sessionMsgStoreManager.getOrCreate(sessionId);
279
+ const parser = this.createParser(agentType, workingDir, msgStore);
280
+ const pipeline = new AgentPipeline(sessionId, spawnResult.pty, parser, msgStore, this.eventBus);
281
+ this.pipelines.set(sessionId, pipeline);
282
+ if (spawnResult.cancel) {
283
+ this.cancelTokens.set(sessionId, spawnResult.cancel);
284
+ }
285
+ }
286
+ createParser(agentType, workingDir, msgStore) {
287
+ if (agentType === AgentType.CLAUDE_CODE) {
288
+ return createClaudeCodeParser(msgStore);
289
+ }
290
+ if (agentType === AgentType.CURSOR_AGENT) {
291
+ return createCursorAgentParser(msgStore, workingDir);
292
+ }
293
+ return null;
294
+ }
295
+ /**
296
+ * Agent 进程退出后自动提交未保存的变更。
297
+ * 保证 worktree 始终干净的兜底机制,最终会被 squash merge 合并。
298
+ * 参考: vibe-kanban crates/local-deployment/src/container.rs:496-505
299
+ */
300
+ async autoCommitChanges(sessionId) {
301
+ try {
302
+ const session = await prisma.session.findUnique({
303
+ where: { id: sessionId },
304
+ include: { workspace: true },
305
+ });
306
+ if (!session?.workspace?.worktreePath)
307
+ return;
308
+ const worktreePath = session.workspace.worktreePath;
309
+ const status = await execGit(worktreePath, ['status', '--porcelain']);
310
+ if (!status.trim())
311
+ return;
312
+ await execGit(worktreePath, ['add', '-A']);
313
+ await execGit(worktreePath, [
314
+ 'commit', '-m',
315
+ `auto-commit: uncommitted changes from session ${sessionId.slice(0, 8)}`,
316
+ ]);
317
+ console.log(`[SessionManager] Auto-committed changes for session ${sessionId}`);
318
+ }
319
+ catch (error) {
320
+ // auto-commit 失败不应阻断后续流程
321
+ console.warn(`[SessionManager] Auto-commit failed for session ${sessionId}:`, error instanceof Error ? error.message : error);
322
+ }
323
+ }
324
+ async persistCompletedSnapshot(sessionId) {
325
+ await this.flushSnapshotPersist(sessionId, SessionStatus.COMPLETED);
326
+ }
327
+ scheduleSnapshotPersist(sessionId, status) {
328
+ if (status) {
329
+ this.pendingSnapshotStatus.set(sessionId, status);
330
+ }
331
+ const timer = this.snapshotFlushTimers.get(sessionId);
332
+ if (timer) {
333
+ clearTimeout(timer);
334
+ }
335
+ const nextTimer = setTimeout(() => {
336
+ this.snapshotFlushTimers.delete(sessionId);
337
+ if (DEBUG_SNAPSHOT) {
338
+ console.log(`[SessionManager:snapshot] debounce fire sessionId=${sessionId}`);
339
+ }
340
+ this.flushSnapshotPersist(sessionId).catch((error) => {
341
+ console.error(`[SessionManager] Debounced snapshot persist failed for ${sessionId}:`, error);
342
+ });
343
+ }, SessionManager.SNAPSHOT_DEBOUNCE_MS);
344
+ this.snapshotFlushTimers.set(sessionId, nextTimer);
345
+ if (DEBUG_SNAPSHOT) {
346
+ console.log(`[SessionManager:snapshot] debounce scheduled sessionId=${sessionId} ms=${SessionManager.SNAPSHOT_DEBOUNCE_MS} status=${status ?? 'none'}`);
347
+ }
348
+ }
349
+ async flushSnapshotPersist(sessionId, status) {
350
+ if (status) {
351
+ this.pendingSnapshotStatus.set(sessionId, status);
352
+ }
353
+ const timer = this.snapshotFlushTimers.get(sessionId);
354
+ if (timer) {
355
+ clearTimeout(timer);
356
+ this.snapshotFlushTimers.delete(sessionId);
357
+ }
358
+ const previous = this.snapshotFlushChains.get(sessionId) ?? Promise.resolve();
359
+ const current = previous
360
+ .catch(() => {
361
+ // Keep the chain alive even if previous flush failed.
362
+ })
363
+ .then(async () => {
364
+ const pendingStatus = this.pendingSnapshotStatus.get(sessionId);
365
+ this.pendingSnapshotStatus.delete(sessionId);
366
+ if (DEBUG_SNAPSHOT) {
367
+ console.log(`[SessionManager:snapshot] flush start sessionId=${sessionId} pendingStatus=${pendingStatus ?? 'none'}`);
368
+ }
369
+ const msgStore = sessionMsgStoreManager.get(sessionId);
370
+ if (!msgStore) {
371
+ if (DEBUG_SNAPSHOT) {
372
+ console.log(`[SessionManager:snapshot] flush no-msgStore sessionId=${sessionId}`);
373
+ }
374
+ if (pendingStatus) {
375
+ await prisma.session.update({
376
+ where: { id: sessionId },
377
+ data: { status: pendingStatus },
378
+ });
379
+ if (DEBUG_SNAPSHOT) {
380
+ console.log(`[SessionManager:snapshot] flush status-only persisted sessionId=${sessionId} status=${pendingStatus}`);
381
+ }
382
+ }
383
+ return;
384
+ }
385
+ const snapshot = msgStore.getSnapshot();
386
+ const tokenUsage = this.extractTokenUsageFromSnapshot(snapshot);
387
+ if (DEBUG_SNAPSHOT) {
388
+ const msgCount = msgStore.getMessages().length;
389
+ const nextIndex = msgStore.entryIndex.current();
390
+ console.log(`[SessionManager:snapshot] flush snapshot sessionId=${sessionId} entries=${snapshot.entries.length} msgCount=${msgCount} nextIndex=${nextIndex} tokenUsage=${tokenUsage ? 'yes' : 'no'}`);
391
+ }
392
+ if (pendingStatus) {
393
+ await prisma.session.update({
394
+ where: { id: sessionId },
395
+ data: {
396
+ status: pendingStatus,
397
+ logSnapshot: JSON.stringify(snapshot),
398
+ ...(tokenUsage ? { tokenUsage: JSON.stringify(tokenUsage) } : {}),
399
+ },
400
+ });
401
+ if (DEBUG_SNAPSHOT) {
402
+ console.log(`[SessionManager:snapshot] flush persisted sessionId=${sessionId} status=${pendingStatus} entries=${snapshot.entries.length}`);
403
+ }
404
+ return;
405
+ }
406
+ await prisma.session.update({
407
+ where: { id: sessionId },
408
+ data: {
409
+ logSnapshot: JSON.stringify(snapshot),
410
+ ...(tokenUsage ? { tokenUsage: JSON.stringify(tokenUsage) } : {}),
411
+ },
412
+ });
413
+ if (DEBUG_SNAPSHOT) {
414
+ console.log(`[SessionManager:snapshot] flush persisted sessionId=${sessionId} status=unchanged entries=${snapshot.entries.length}`);
415
+ }
416
+ });
417
+ this.snapshotFlushChains.set(sessionId, current);
418
+ try {
419
+ await current;
420
+ }
421
+ finally {
422
+ if (this.snapshotFlushChains.get(sessionId) === current) {
423
+ this.snapshotFlushChains.delete(sessionId);
424
+ }
425
+ }
426
+ }
427
+ extractTokenUsageFromSnapshot(snapshot) {
428
+ for (let i = snapshot.entries.length - 1; i >= 0; i--) {
429
+ const entry = snapshot.entries[i];
430
+ if (entry.entryType === 'token_usage_info' && entry.metadata?.tokenUsage?.totalTokens != null) {
431
+ return entry.metadata.tokenUsage;
432
+ }
433
+ }
434
+ return null;
435
+ }
436
+ /**
437
+ * Session 完成后检查 Task 是否可以自动推进状态。
438
+ *
439
+ * 规则:当一个 Task 下所有 Workspace 的所有 CHAT Session 都处于终态
440
+ * (COMPLETED / CANCELLED / FAILED)时,自动将 IN_PROGRESS 的 Task
441
+ * 推进到 IN_REVIEW,提示用户进行代码审查。
442
+ * 同时触发 commit message 的后台生成。
443
+ */
444
+ async checkTaskAutoAdvance(sessionId) {
445
+ try {
446
+ const session = await prisma.session.findUnique({
447
+ where: { id: sessionId },
448
+ include: { workspace: { include: { task: true } } },
449
+ });
450
+ if (!session?.workspace?.task)
451
+ return;
452
+ const task = session.workspace.task;
453
+ // 只对 IN_PROGRESS 的 Task 做自动推进
454
+ if (task.status !== TaskStatus.IN_PROGRESS)
455
+ return;
456
+ // 查询该 Task 下所有 CHAT Session(排除 COMMIT_MSG)
457
+ const allSessions = await prisma.session.findMany({
458
+ where: {
459
+ workspace: { taskId: task.id },
460
+ purpose: { not: SessionPurpose.COMMIT_MSG },
461
+ },
462
+ select: { status: true },
463
+ });
464
+ const terminalStatuses = [SessionStatus.COMPLETED, SessionStatus.CANCELLED, SessionStatus.FAILED];
465
+ const allDone = allSessions.every((s) => terminalStatuses.includes(s.status));
466
+ if (allDone && allSessions.length > 0) {
467
+ await prisma.task.update({
468
+ where: { id: task.id },
469
+ data: { status: TaskStatus.IN_REVIEW },
470
+ });
471
+ this.eventBus.emit('task:updated', {
472
+ taskId: task.id,
473
+ projectId: task.projectId,
474
+ status: TaskStatus.IN_REVIEW,
475
+ });
476
+ console.log(`[SessionManager] Task ${task.id} auto-advanced to IN_REVIEW (all sessions completed)`);
477
+ }
478
+ }
479
+ catch (error) {
480
+ console.error(`[SessionManager] checkTaskAutoAdvance failed for session ${sessionId}:`, error);
481
+ }
482
+ }
483
+ /**
484
+ * 异步触发 commit message 生成(fire-and-forget)
485
+ */
486
+ triggerCommitMessageGeneration(workspaceId) {
487
+ const commitMessageService = getCommitMessageService();
488
+ commitMessageService.triggerGeneration(workspaceId).catch((error) => {
489
+ console.warn(`[SessionManager] Failed to trigger commit message generation for workspace ${workspaceId}:`, error instanceof Error ? error.message : error);
490
+ });
491
+ }
492
+ /**
493
+ * Session 启动时检查 Task 是否需要自动回退状态。
494
+ *
495
+ * 规则:当某个 Session 重新变为 RUNNING 时,如果所属 Task 处于
496
+ * IN_REVIEW 或 DONE,自动回退到 IN_PROGRESS,表示工作重新进行中。
497
+ * 注意:COMMIT_MSG session 启动不应触发状态回退。
498
+ */
499
+ async checkTaskAutoRevert(sessionId) {
500
+ try {
501
+ const session = await prisma.session.findUnique({
502
+ where: { id: sessionId },
503
+ include: { workspace: { include: { task: true } } },
504
+ });
505
+ if (!session?.workspace?.task)
506
+ return;
507
+ // COMMIT_MSG session 不触发状态回退
508
+ if (session.purpose === SessionPurpose.COMMIT_MSG)
509
+ return;
510
+ const task = session.workspace.task;
511
+ const revertableStatuses = [TaskStatus.IN_REVIEW, TaskStatus.DONE];
512
+ if (!revertableStatuses.includes(task.status))
513
+ return;
514
+ await prisma.task.update({
515
+ where: { id: task.id },
516
+ data: { status: TaskStatus.IN_PROGRESS },
517
+ });
518
+ this.eventBus.emit('task:updated', {
519
+ taskId: task.id,
520
+ projectId: task.projectId,
521
+ status: TaskStatus.IN_PROGRESS,
522
+ });
523
+ console.log(`[SessionManager] Task ${task.id} auto-reverted from ${task.status} to IN_PROGRESS (session ${sessionId} started)`);
524
+ }
525
+ catch (error) {
526
+ console.error(`[SessionManager] checkTaskAutoRevert failed for session ${sessionId}:`, error);
527
+ }
528
+ }
529
+ /**
530
+ * Session 退出后的统一处理入口。
531
+ * 根据 session purpose 走不同的后处理路径。
532
+ */
533
+ async handleSessionExit(sessionId) {
534
+ const session = await prisma.session.findUnique({
535
+ where: { id: sessionId },
536
+ select: { purpose: true },
537
+ });
538
+ if (session?.purpose === SessionPurpose.COMMIT_MSG) {
539
+ // COMMIT_MSG session: 只需持久化快照,然后提取 commit message
540
+ await this.flushSnapshotPersist(sessionId, SessionStatus.COMPLETED);
541
+ try {
542
+ const commitMessageService = getCommitMessageService();
543
+ await commitMessageService.extractAndCache(sessionId);
544
+ }
545
+ catch (error) {
546
+ console.warn(`[SessionManager] Failed to extract commit message from session ${sessionId}:`, error instanceof Error ? error.message : error);
547
+ }
548
+ // 通知前端 session 已完成(DB 状态已更新)
549
+ this.eventBus.emit('session:completed', { sessionId, status: SessionStatus.COMPLETED });
550
+ }
551
+ else {
552
+ // 正常 CHAT session: autoCommit → 持久化 → 检查 Task 推进 → 触发 commit message 生成
553
+ await this.autoCommitChanges(sessionId);
554
+ await this.flushSnapshotPersist(sessionId, SessionStatus.COMPLETED);
555
+ // 通知前端 session 已完成(DB 状态已更新)
556
+ this.eventBus.emit('session:completed', { sessionId, status: SessionStatus.COMPLETED });
557
+ await this.checkTaskAutoAdvance(sessionId);
558
+ // 每次 CHAT session 完成都触发 commit message 重新生成
559
+ const sess = await prisma.session.findUnique({
560
+ where: { id: sessionId },
561
+ select: { workspaceId: true },
562
+ });
563
+ if (sess?.workspaceId) {
564
+ this.triggerCommitMessageGeneration(sess.workspaceId);
565
+ }
566
+ }
567
+ }
568
+ }
569
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/services/session-manager.ts"],"names":[],"mappings":"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"}