baxian 0.0.1 → 0.2.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 (291) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +19 -1
  3. package/dist/agent/bootstrap-poller.d.ts +34 -0
  4. package/dist/agent/bootstrap-poller.d.ts.map +1 -0
  5. package/dist/agent/bootstrap-poller.js +93 -0
  6. package/dist/agent/bootstrap-poller.js.map +1 -0
  7. package/dist/agent/bootstrap.d.ts +39 -0
  8. package/dist/agent/bootstrap.d.ts.map +1 -0
  9. package/dist/agent/bootstrap.js +214 -0
  10. package/dist/agent/bootstrap.js.map +1 -0
  11. package/dist/agent/index.d.ts +8 -0
  12. package/dist/agent/index.d.ts.map +1 -0
  13. package/dist/agent/index.js +8 -0
  14. package/dist/agent/index.js.map +1 -0
  15. package/dist/agent/manager.d.ts +280 -0
  16. package/dist/agent/manager.d.ts.map +1 -0
  17. package/dist/agent/manager.js +3666 -0
  18. package/dist/agent/manager.js.map +1 -0
  19. package/dist/agent/marker-protocol.d.ts +12 -0
  20. package/dist/agent/marker-protocol.d.ts.map +1 -0
  21. package/dist/agent/marker-protocol.js +52 -0
  22. package/dist/agent/marker-protocol.js.map +1 -0
  23. package/dist/agent/pane-streamer-manager.d.ts +24 -0
  24. package/dist/agent/pane-streamer-manager.d.ts.map +1 -0
  25. package/dist/agent/pane-streamer-manager.js +107 -0
  26. package/dist/agent/pane-streamer-manager.js.map +1 -0
  27. package/dist/agent/pane-streamer.d.ts +97 -0
  28. package/dist/agent/pane-streamer.d.ts.map +1 -0
  29. package/dist/agent/pane-streamer.js +382 -0
  30. package/dist/agent/pane-streamer.js.map +1 -0
  31. package/dist/agent/post-approve-marker-watcher.d.ts +29 -0
  32. package/dist/agent/post-approve-marker-watcher.d.ts.map +1 -0
  33. package/dist/agent/post-approve-marker-watcher.js +160 -0
  34. package/dist/agent/post-approve-marker-watcher.js.map +1 -0
  35. package/dist/agent/preflight.d.ts +9 -0
  36. package/dist/agent/preflight.d.ts.map +1 -0
  37. package/dist/agent/preflight.js +164 -0
  38. package/dist/agent/preflight.js.map +1 -0
  39. package/dist/agent/prompt.d.ts +44 -0
  40. package/dist/agent/prompt.d.ts.map +1 -0
  41. package/dist/agent/prompt.js +252 -0
  42. package/dist/agent/prompt.js.map +1 -0
  43. package/dist/agent/repo-store.d.ts +27 -0
  44. package/dist/agent/repo-store.d.ts.map +1 -0
  45. package/dist/agent/repo-store.js +152 -0
  46. package/dist/agent/repo-store.js.map +1 -0
  47. package/dist/agent/runner.d.ts +46 -0
  48. package/dist/agent/runner.d.ts.map +1 -0
  49. package/dist/agent/runner.js +241 -0
  50. package/dist/agent/runner.js.map +1 -0
  51. package/dist/agent/spec-review-marker-watcher.d.ts +33 -0
  52. package/dist/agent/spec-review-marker-watcher.d.ts.map +1 -0
  53. package/dist/agent/spec-review-marker-watcher.js +180 -0
  54. package/dist/agent/spec-review-marker-watcher.js.map +1 -0
  55. package/dist/agent/tmux-probe-poller.d.ts +78 -0
  56. package/dist/agent/tmux-probe-poller.d.ts.map +1 -0
  57. package/dist/agent/tmux-probe-poller.js +418 -0
  58. package/dist/agent/tmux-probe-poller.js.map +1 -0
  59. package/dist/agent/tmux.d.ts +78 -0
  60. package/dist/agent/tmux.d.ts.map +1 -0
  61. package/dist/agent/tmux.js +395 -0
  62. package/dist/agent/tmux.js.map +1 -0
  63. package/dist/agent/worktree.d.ts +10 -0
  64. package/dist/agent/worktree.d.ts.map +1 -0
  65. package/dist/agent/worktree.js +41 -0
  66. package/dist/agent/worktree.js.map +1 -0
  67. package/dist/api/agents.d.ts +3 -0
  68. package/dist/api/agents.d.ts.map +1 -0
  69. package/dist/api/agents.js +29 -0
  70. package/dist/api/agents.js.map +1 -0
  71. package/dist/api/config.d.ts +5 -0
  72. package/dist/api/config.d.ts.map +1 -0
  73. package/dist/api/config.js +114 -0
  74. package/dist/api/config.js.map +1 -0
  75. package/dist/api/events.d.ts +3 -0
  76. package/dist/api/events.d.ts.map +1 -0
  77. package/dist/api/events.js +11 -0
  78. package/dist/api/events.js.map +1 -0
  79. package/dist/api/pollers.d.ts +3 -0
  80. package/dist/api/pollers.d.ts.map +1 -0
  81. package/dist/api/pollers.js +4 -0
  82. package/dist/api/pollers.js.map +1 -0
  83. package/dist/api/probe.d.ts +9 -0
  84. package/dist/api/probe.d.ts.map +1 -0
  85. package/dist/api/probe.js +87 -0
  86. package/dist/api/probe.js.map +1 -0
  87. package/dist/api/projects.d.ts +3 -0
  88. package/dist/api/projects.d.ts.map +1 -0
  89. package/dist/api/projects.js +602 -0
  90. package/dist/api/projects.js.map +1 -0
  91. package/dist/api/restart.d.ts +3 -0
  92. package/dist/api/restart.d.ts.map +1 -0
  93. package/dist/api/restart.js +20 -0
  94. package/dist/api/restart.js.map +1 -0
  95. package/dist/api/tasks.d.ts +3 -0
  96. package/dist/api/tasks.d.ts.map +1 -0
  97. package/dist/api/tasks.js +136 -0
  98. package/dist/api/tasks.js.map +1 -0
  99. package/dist/app.d.ts +51 -0
  100. package/dist/app.d.ts.map +1 -0
  101. package/dist/app.js +169 -0
  102. package/dist/app.js.map +1 -0
  103. package/dist/cli.d.ts +20 -0
  104. package/dist/cli.d.ts.map +1 -0
  105. package/dist/cli.js +319 -0
  106. package/dist/cli.js.map +1 -0
  107. package/dist/config/backup.d.ts +3 -0
  108. package/dist/config/backup.d.ts.map +1 -0
  109. package/dist/config/backup.js +44 -0
  110. package/dist/config/backup.js.map +1 -0
  111. package/dist/config/index.d.ts +5 -0
  112. package/dist/config/index.d.ts.map +1 -0
  113. package/dist/config/index.js +5 -0
  114. package/dist/config/index.js.map +1 -0
  115. package/dist/config/loader.d.ts +42 -0
  116. package/dist/config/loader.d.ts.map +1 -0
  117. package/dist/config/loader.js +197 -0
  118. package/dist/config/loader.js.map +1 -0
  119. package/dist/config/mutex.d.ts +2 -0
  120. package/dist/config/mutex.d.ts.map +1 -0
  121. package/dist/config/mutex.js +7 -0
  122. package/dist/config/mutex.js.map +1 -0
  123. package/dist/config/normalizer.d.ts +2 -0
  124. package/dist/config/normalizer.d.ts.map +1 -0
  125. package/dist/config/normalizer.js +42 -0
  126. package/dist/config/normalizer.js.map +1 -0
  127. package/dist/config/validator.d.ts +7 -0
  128. package/dist/config/validator.d.ts.map +1 -0
  129. package/dist/config/validator.js +278 -0
  130. package/dist/config/validator.js.map +1 -0
  131. package/dist/errors.d.ts +5 -0
  132. package/dist/errors.d.ts.map +1 -0
  133. package/dist/errors.js +9 -0
  134. package/dist/errors.js.map +1 -0
  135. package/dist/event/broker.d.ts +11 -0
  136. package/dist/event/broker.d.ts.map +1 -0
  137. package/dist/event/broker.js +47 -0
  138. package/dist/event/broker.js.map +1 -0
  139. package/dist/event/bus.d.ts +12 -0
  140. package/dist/event/bus.d.ts.map +1 -0
  141. package/dist/event/bus.js +35 -0
  142. package/dist/event/bus.js.map +1 -0
  143. package/dist/event/handlers.d.ts +6 -0
  144. package/dist/event/handlers.d.ts.map +1 -0
  145. package/dist/event/handlers.js +1121 -0
  146. package/dist/event/handlers.js.map +1 -0
  147. package/dist/event/index.d.ts +4 -0
  148. package/dist/event/index.d.ts.map +1 -0
  149. package/dist/event/index.js +4 -0
  150. package/dist/event/index.js.map +1 -0
  151. package/dist/event/log.d.ts +9 -0
  152. package/dist/event/log.d.ts.map +1 -0
  153. package/dist/event/log.js +43 -0
  154. package/dist/event/log.js.map +1 -0
  155. package/dist/event/publish.d.ts +37 -0
  156. package/dist/event/publish.d.ts.map +1 -0
  157. package/dist/event/publish.js +197 -0
  158. package/dist/event/publish.js.map +1 -0
  159. package/dist/event/ws.d.ts +3 -0
  160. package/dist/event/ws.d.ts.map +1 -0
  161. package/dist/event/ws.js +169 -0
  162. package/dist/event/ws.js.map +1 -0
  163. package/dist/github/index.d.ts +4 -0
  164. package/dist/github/index.d.ts.map +1 -0
  165. package/dist/github/index.js +3 -0
  166. package/dist/github/index.js.map +1 -0
  167. package/dist/github/mapper.d.ts +51 -0
  168. package/dist/github/mapper.d.ts.map +1 -0
  169. package/dist/github/mapper.js +191 -0
  170. package/dist/github/mapper.js.map +1 -0
  171. package/dist/github/poller.d.ts +64 -0
  172. package/dist/github/poller.d.ts.map +1 -0
  173. package/dist/github/poller.js +513 -0
  174. package/dist/github/poller.js.map +1 -0
  175. package/dist/github/resolver.d.ts +8 -0
  176. package/dist/github/resolver.d.ts.map +1 -0
  177. package/dist/github/resolver.js +24 -0
  178. package/dist/github/resolver.js.map +1 -0
  179. package/dist/index.d.ts +11 -0
  180. package/dist/index.d.ts.map +1 -0
  181. package/dist/index.js +310 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/lifecycle/restart-sentinel.d.ts +18 -0
  184. package/dist/lifecycle/restart-sentinel.d.ts.map +1 -0
  185. package/dist/lifecycle/restart-sentinel.js +61 -0
  186. package/dist/lifecycle/restart-sentinel.js.map +1 -0
  187. package/dist/lifecycle/restart.d.ts +21 -0
  188. package/dist/lifecycle/restart.d.ts.map +1 -0
  189. package/dist/lifecycle/restart.js +57 -0
  190. package/dist/lifecycle/restart.js.map +1 -0
  191. package/dist/shared/constants.d.ts +18 -0
  192. package/dist/shared/constants.d.ts.map +1 -0
  193. package/dist/shared/constants.js +60 -0
  194. package/dist/shared/constants.js.map +1 -0
  195. package/dist/shared/index.d.ts +3 -0
  196. package/dist/shared/index.d.ts.map +1 -0
  197. package/dist/shared/index.js +3 -0
  198. package/dist/shared/index.js.map +1 -0
  199. package/dist/shared/types.d.ts +263 -0
  200. package/dist/shared/types.d.ts.map +1 -0
  201. package/dist/shared/types.js +2 -0
  202. package/dist/shared/types.js.map +1 -0
  203. package/dist/skill/index.d.ts +2 -0
  204. package/dist/skill/index.d.ts.map +1 -0
  205. package/dist/skill/index.js +2 -0
  206. package/dist/skill/index.js.map +1 -0
  207. package/dist/skill/registry.d.ts +30 -0
  208. package/dist/skill/registry.d.ts.map +1 -0
  209. package/dist/skill/registry.js +174 -0
  210. package/dist/skill/registry.js.map +1 -0
  211. package/dist/skills/UPSTREAM.md +38 -0
  212. package/dist/skills/baxian-rules/SKILL.md +68 -0
  213. package/dist/skills/merge-sync/SKILL.md +42 -0
  214. package/dist/skills/pr-feedback/SKILL.md +117 -0
  215. package/dist/skills/pr-recheck/SKILL.md +52 -0
  216. package/dist/skills/pr-review/SKILL.md +60 -0
  217. package/dist/skills/spells/SKILL.md +41 -0
  218. package/dist/skills/task-check/SKILL.md +26 -0
  219. package/dist/state/agent-store.d.ts +21 -0
  220. package/dist/state/agent-store.d.ts.map +1 -0
  221. package/dist/state/agent-store.js +145 -0
  222. package/dist/state/agent-store.js.map +1 -0
  223. package/dist/state/error-record-store.d.ts +40 -0
  224. package/dist/state/error-record-store.d.ts.map +1 -0
  225. package/dist/state/error-record-store.js +203 -0
  226. package/dist/state/error-record-store.js.map +1 -0
  227. package/dist/state/index.d.ts +5 -0
  228. package/dist/state/index.d.ts.map +1 -0
  229. package/dist/state/index.js +5 -0
  230. package/dist/state/index.js.map +1 -0
  231. package/dist/state/init.d.ts +2 -0
  232. package/dist/state/init.d.ts.map +1 -0
  233. package/dist/state/init.js +13 -0
  234. package/dist/state/init.js.map +1 -0
  235. package/dist/state/lock.d.ts +9 -0
  236. package/dist/state/lock.d.ts.map +1 -0
  237. package/dist/state/lock.js +36 -0
  238. package/dist/state/lock.js.map +1 -0
  239. package/dist/state/post-approve-store.d.ts +23 -0
  240. package/dist/state/post-approve-store.d.ts.map +1 -0
  241. package/dist/state/post-approve-store.js +79 -0
  242. package/dist/state/post-approve-store.js.map +1 -0
  243. package/dist/state/process-lock.d.ts +24 -0
  244. package/dist/state/process-lock.d.ts.map +1 -0
  245. package/dist/state/process-lock.js +175 -0
  246. package/dist/state/process-lock.js.map +1 -0
  247. package/dist/state/snapshot.d.ts +38 -0
  248. package/dist/state/snapshot.d.ts.map +1 -0
  249. package/dist/state/snapshot.js +134 -0
  250. package/dist/state/snapshot.js.map +1 -0
  251. package/dist/state/task-store.d.ts +25 -0
  252. package/dist/state/task-store.d.ts.map +1 -0
  253. package/dist/state/task-store.js +167 -0
  254. package/dist/state/task-store.js.map +1 -0
  255. package/dist/terminal/attach.d.ts +7 -0
  256. package/dist/terminal/attach.d.ts.map +1 -0
  257. package/dist/terminal/attach.js +26 -0
  258. package/dist/terminal/attach.js.map +1 -0
  259. package/dist/terminal/index.d.ts +3 -0
  260. package/dist/terminal/index.d.ts.map +1 -0
  261. package/dist/terminal/index.js +3 -0
  262. package/dist/terminal/index.js.map +1 -0
  263. package/dist/terminal/key-sanitizer.d.ts +2 -0
  264. package/dist/terminal/key-sanitizer.d.ts.map +1 -0
  265. package/dist/terminal/key-sanitizer.js +9 -0
  266. package/dist/terminal/key-sanitizer.js.map +1 -0
  267. package/dist/terminal/stream-ws.d.ts +3 -0
  268. package/dist/terminal/stream-ws.d.ts.map +1 -0
  269. package/dist/terminal/stream-ws.js +426 -0
  270. package/dist/terminal/stream-ws.js.map +1 -0
  271. package/dist/terminal/ws-auth.d.ts +5 -0
  272. package/dist/terminal/ws-auth.d.ts.map +1 -0
  273. package/dist/terminal/ws-auth.js +45 -0
  274. package/dist/terminal/ws-auth.js.map +1 -0
  275. package/dist/timing/debounced-task.d.ts +9 -0
  276. package/dist/timing/debounced-task.d.ts.map +1 -0
  277. package/dist/timing/debounced-task.js +23 -0
  278. package/dist/timing/debounced-task.js.map +1 -0
  279. package/dist/timing/periodic-task-runner.d.ts +21 -0
  280. package/dist/timing/periodic-task-runner.d.ts.map +1 -0
  281. package/dist/timing/periodic-task-runner.js +61 -0
  282. package/dist/timing/periodic-task-runner.js.map +1 -0
  283. package/dist/web/assets/index-53CBbz4w.js +4 -0
  284. package/dist/web/assets/index-B9D6BV08.css +1 -0
  285. package/dist/web/assets/react-BG4Iuztk.js +40 -0
  286. package/dist/web/assets/router-B_Nv0oRz.js +12 -0
  287. package/dist/web/assets/xterm-CFbL2ovg.css +32 -0
  288. package/dist/web/assets/xterm-D5X2JljJ.js +9 -0
  289. package/dist/web/index.html +17 -0
  290. package/package.json +44 -5
  291. package/index.js +0 -1
@@ -0,0 +1,602 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { runPreflight } from '../agent/preflight.js';
3
+ import { createRunner } from '../agent/runner.js';
4
+ import { saveConfig, prepareConfig, ConfigValidationError } from '../config/loader.js';
5
+ import { withConfigLock } from '../config/mutex.js';
6
+ import { CleanupFailedError, EnsureSessionError } from '../agent/manager.js';
7
+ import { TmuxManager } from '../agent/tmux.js';
8
+ const ACTIVE_TASK_STATUSES = new Set(['in_progress', 'review', 'fixing', 'approved']);
9
+ function configHash(config) {
10
+ return createHash('sha256').update(JSON.stringify(config)).digest('hex');
11
+ }
12
+ function omitAgentsFromProject(config, projectId, removed) {
13
+ const removedSet = new Set(removed);
14
+ return {
15
+ ...config,
16
+ project: config.project.map(p => {
17
+ if (p.id !== projectId)
18
+ return p;
19
+ return {
20
+ ...p,
21
+ agent: p.agent
22
+ .map(pair => pair.filter(a => !removedSet.has(a.id)))
23
+ .filter(pair => pair.length > 0),
24
+ };
25
+ }),
26
+ };
27
+ }
28
+ export async function projectRoutes(app) {
29
+ app.get('/projects', async () => {
30
+ return app.ctx.config.project;
31
+ });
32
+ app.get('/projects/:id', async (request, reply) => {
33
+ const project = app.ctx.config.project.find(p => p.id === request.params.id);
34
+ if (!project) {
35
+ return reply.status(404).send({ error: 'Project not found' });
36
+ }
37
+ return project;
38
+ });
39
+ app.post('/projects/:id/bootstrap', async (request, reply) => {
40
+ if (!app.ctx.bootstrapPoller) {
41
+ return reply.status(503).send({ error: 'bootstrap poller not initialised' });
42
+ }
43
+ // Use the poller's view of config (not app.ctx.config) as the source of truth — PATCH /config
44
+ // updates ctx.config but only DELETE /agents currently hot-replaces the poller, so during the
45
+ // PATCH-then-restart window ctx.config can list projects the poller doesn't know yet.
46
+ const result = await app.ctx.bootstrapPoller.pollProject(request.params.id);
47
+ if (!result.knownProject) {
48
+ return reply.status(404).send({
49
+ error: `Project "${request.params.id}" not found in active bootstrap config (a recent PATCH /config may need a server restart to take effect)`,
50
+ });
51
+ }
52
+ if (result.ran === 0) {
53
+ // Project exists but has no auto-mode agents (all have explicit workdir) → success no-op.
54
+ return reply.send({ ok: true, ran: 0, message: 'no bootstrap targets for this project' });
55
+ }
56
+ return reply.send({ ok: result.ok, ran: result.ran });
57
+ });
58
+ app.post('/projects/:id/checks', async (request, reply) => {
59
+ const project = app.ctx.config.project.find(p => p.id === request.params.id);
60
+ if (!project) {
61
+ return reply.status(404).send({ error: 'Project not found' });
62
+ }
63
+ const checks = [];
64
+ for (const pair of project.agent) {
65
+ for (const agent of pair) {
66
+ const runner = createRunner(agent.mode, agent.host);
67
+ checks.push(runPreflight(runner, agent, project.repo).then(results => ({
68
+ agentId: agent.id,
69
+ mode: agent.mode,
70
+ results,
71
+ })));
72
+ }
73
+ }
74
+ const agents = await Promise.all(checks);
75
+ return reply.status(201).send({ projectId: project.id, agents });
76
+ });
77
+ app.post('/projects', async (request, reply) => {
78
+ if (!app.ctx.configPath) {
79
+ return reply.status(500).send({ error: 'No config path configured' });
80
+ }
81
+ return withConfigLock(async () => {
82
+ const { id, repo, merge } = request.body ?? {};
83
+ if (!id || typeof id !== 'string') {
84
+ return reply.status(400).send({ error: 'id must be a non-empty string' });
85
+ }
86
+ if (!repo || typeof repo !== 'string') {
87
+ return reply.status(400).send({ error: 'repo must be a non-empty string' });
88
+ }
89
+ if (app.ctx.config.project.some(p => p.id === id)) {
90
+ return reply.status(409).send({ error: `Project id "${id}" already exists` });
91
+ }
92
+ const newProject = {
93
+ id,
94
+ repo,
95
+ merge: merge ?? null,
96
+ agent: [],
97
+ };
98
+ const merged = {
99
+ ...app.ctx.config,
100
+ project: [...app.ctx.config.project, newProject],
101
+ };
102
+ let validated;
103
+ try {
104
+ validated = prepareConfig(merged);
105
+ }
106
+ catch (err) {
107
+ if (err instanceof ConfigValidationError) {
108
+ return reply.status(400).send({ error: 'Invalid config', details: err.errors });
109
+ }
110
+ throw err;
111
+ }
112
+ await saveConfig(app.ctx.configPath, validated);
113
+ app.ctx.config = validated;
114
+ const stored = validated.project.find(p => p.id === id);
115
+ return reply.status(201).send({ project: stored, restartRequired: true });
116
+ });
117
+ });
118
+ // Config commit precedes bootstrap; failures emit events instead of rolling back config.
119
+ app.post('/projects/:projectId/agents', async (request, reply) => {
120
+ if (!app.ctx.configPath) {
121
+ return reply.status(500).send({ error: 'No config path configured' });
122
+ }
123
+ const { projectId } = request.params;
124
+ const body = request.body ?? {};
125
+ const { pairWith, ...agentInput } = body;
126
+ if (agentInput.role !== 'dev' && agentInput.role !== 'qa') {
127
+ return reply.status(400).send({ error: 'role must be "dev" or "qa"' });
128
+ }
129
+ if (typeof agentInput.id !== 'string' || agentInput.id.trim().length === 0) {
130
+ return reply.status(400).send({ error: 'agent id is required' });
131
+ }
132
+ let creationToken = '';
133
+ const phase1Result = await withConfigLock(async () => {
134
+ const project = app.ctx.config.project.find(p => p.id === projectId);
135
+ if (!project) {
136
+ return reply.status(404).send({ error: `Project "${projectId}" not found` });
137
+ }
138
+ const existsGlobally = app.ctx.config.project.some(p => p.agent.some(pair => pair.some(a => a.id === agentInput.id)));
139
+ if (existsGlobally) {
140
+ return reply.status(409).send({ error: `Agent id "${agentInput.id}" already exists` });
141
+ }
142
+ if (agentInput.role === 'qa') {
143
+ if (!pairWith) {
144
+ return reply.status(400).send({ error: 'pairWith required when role=qa' });
145
+ }
146
+ const targetPair = project.agent.find(pair => pair.length === 1 && pair[0].id === pairWith && pair[0].role === 'dev');
147
+ if (!targetPair) {
148
+ return reply.status(400).send({
149
+ error: `pairWith "${pairWith}" must reference a dev agent in this project that has no qa yet`,
150
+ });
151
+ }
152
+ const devState = await app.ctx.agentStore.get(pairWith);
153
+ if (devState?.creationToken) {
154
+ return reply.status(409).send({
155
+ error: `dev agent "${pairWith}" is being created; please retry later`,
156
+ });
157
+ }
158
+ }
159
+ if (agentInput.role === 'dev' && pairWith) {
160
+ return reply.status(400).send({ error: 'pairWith only valid for role=qa' });
161
+ }
162
+ const newProjects = app.ctx.config.project.map((p) => {
163
+ if (p.id !== projectId)
164
+ return p;
165
+ if (agentInput.role === 'dev') {
166
+ return { ...p, agent: [...p.agent, [agentInput]] };
167
+ }
168
+ const newAgent = p.agent.map(pair => {
169
+ if (pair.length === 1 && pair[0].id === pairWith) {
170
+ return [...pair, agentInput];
171
+ }
172
+ return pair;
173
+ });
174
+ return { ...p, agent: newAgent };
175
+ });
176
+ const merged = { ...app.ctx.config, project: newProjects };
177
+ let validated;
178
+ try {
179
+ validated = prepareConfig(merged);
180
+ }
181
+ catch (err) {
182
+ if (err instanceof ConfigValidationError) {
183
+ return reply.status(400).send({ error: 'Invalid config', details: err.errors });
184
+ }
185
+ throw err;
186
+ }
187
+ await saveConfig(app.ctx.configPath, validated);
188
+ app.ctx.config = validated;
189
+ app.ctx.agentManager.replaceConfig(validated);
190
+ app.ctx.tmuxProbePoller?.replaceConfig(validated);
191
+ app.ctx.bootstrapPoller?.replaceConfig(validated);
192
+ creationToken = randomUUID();
193
+ const now = new Date().toISOString();
194
+ await app.ctx.agentStore.set({
195
+ id: agentInput.id,
196
+ projectId,
197
+ creationToken,
198
+ updatedAt: now,
199
+ });
200
+ return null;
201
+ });
202
+ if (phase1Result)
203
+ return phase1Result;
204
+ if (reply.sent)
205
+ return reply;
206
+ void app.ctx.agentManager
207
+ .startBootstrapAsync(agentInput.id, creationToken)
208
+ .catch((err) => {
209
+ app.log.error({ err, agentId: agentInput.id }, 'POST /agents startBootstrapAsync threw — should be impossible (it never throws)');
210
+ });
211
+ const storedProject = app.ctx.config.project.find(p => p.id === projectId);
212
+ const storedAgent = storedProject.agent.flat().find(a => a.id === agentInput.id);
213
+ return reply.status(201).send({
214
+ agent: storedAgent,
215
+ runtimeStatus: 'pending',
216
+ restartRequired: false,
217
+ });
218
+ });
219
+ app.delete('/projects/:projectId/agents/:agentId', async (request, reply) => {
220
+ if (!app.ctx.configPath) {
221
+ return reply.status(500).send({ error: 'No config path configured' });
222
+ }
223
+ const { projectId, agentId } = request.params;
224
+ let targets = [];
225
+ const originalStates = new Map();
226
+ let originalConfigHash = '';
227
+ let validatedAfterRemove = null;
228
+ const acquiredLocks = [];
229
+ let claimedTargets = [];
230
+ try {
231
+ const phase1Result = await withConfigLock(async () => {
232
+ const project = app.ctx.config.project.find(p => p.id === projectId);
233
+ if (!project) {
234
+ return reply.status(404).send({ error: `Project "${projectId}" not found` });
235
+ }
236
+ const found = project.agent.flat().find(a => a.id === agentId);
237
+ if (!found) {
238
+ return reply.status(404).send({ error: `Agent "${agentId}" not found in project "${projectId}"` });
239
+ }
240
+ targets = app.ctx.agentManager.prepareRemoveTargets(agentId).targets.slice().sort();
241
+ for (const id of targets) {
242
+ const state = await app.ctx.agentStore.get(id);
243
+ const task = state?.taskId ? await app.ctx.taskStore.get(state.taskId) : null;
244
+ // active task 始终拒——即使 awaiting_human 也不行,否则会留 orphan task 指向已删 agent。
245
+ // operator 必须先 cancelTask 让 task 进 cancelled,再 DELETE。
246
+ if (task && ACTIVE_TASK_STATUSES.has(task.status)) {
247
+ return reply.status(409).send({
248
+ error: `Agent "${id}" is still active on task ${task.id}; cancel the task before deleting ` +
249
+ `(prevents orphan task / tmux session / lock / worktree).`,
250
+ });
251
+ }
252
+ // awaiting_human + 无活跃 task = 合法回收出口。
253
+ if (state?.status === 'awaiting_human')
254
+ continue;
255
+ if (state?.creationToken) {
256
+ return reply.status(409).send({
257
+ error: `Agent "${id}" is bootstrapping; retry shortly or wait for it to enter awaiting_human state.`,
258
+ });
259
+ }
260
+ }
261
+ // claim deletion 占位:挡住第二个 DELETE 在 awaiting_human stale-lock takeover 路径下
262
+ // 撞同一 agent → 否则 phase2 (cleanupRemovedAgentRuntime) 会并发 kill 同一 tmux/worktree。
263
+ const conflict = app.ctx.agentManager.tryClaimDeletion(targets);
264
+ if (conflict) {
265
+ return reply.status(409).send({
266
+ error: `Agent "${conflict}" deletion already in progress; please wait and retry`,
267
+ });
268
+ }
269
+ claimedTargets = targets.slice();
270
+ for (const id of targets) {
271
+ const ok = await app.ctx.lockManager.acquire(id);
272
+ if (!ok) {
273
+ // awaiting_human 状态下 lock 是前任 op 留下的 stale lock(markAwaitingHuman 不释放
274
+ // lock),DELETE 是显式回收入口,直接接管——不计入 acquiredLocks,cleanupRemovedAgentRuntime
275
+ // 会一并删除 stale lock 文件。deletionInFlight claim 已挡住并发 DELETE。
276
+ const state = await app.ctx.agentStore.get(id);
277
+ if (state?.status === 'awaiting_human')
278
+ continue;
279
+ for (const got of acquiredLocks) {
280
+ await app.ctx.lockManager.release(got);
281
+ }
282
+ return reply.status(409).send({
283
+ error: `Agent "${id}" is currently locked by another op; please retry later`,
284
+ });
285
+ }
286
+ acquiredLocks.push(id);
287
+ }
288
+ for (const id of targets) {
289
+ const existing = await app.ctx.agentStore.get(id);
290
+ originalStates.set(id, existing);
291
+ }
292
+ originalConfigHash = configHash(app.ctx.config);
293
+ const removeRequest = omitAgentsFromProject(app.ctx.config, projectId, targets);
294
+ try {
295
+ validatedAfterRemove = prepareConfig(removeRequest);
296
+ }
297
+ catch (err) {
298
+ for (const got of acquiredLocks)
299
+ await app.ctx.lockManager.release(got);
300
+ if (err instanceof ConfigValidationError) {
301
+ return reply.status(400).send({ error: 'Invalid config', details: err.errors });
302
+ }
303
+ throw err;
304
+ }
305
+ return null;
306
+ });
307
+ if (phase1Result)
308
+ return phase1Result;
309
+ if (reply.sent)
310
+ return reply;
311
+ try {
312
+ await app.ctx.agentManager.cleanupRemovedAgentRuntime(targets);
313
+ }
314
+ catch (err) {
315
+ if (err instanceof CleanupFailedError) {
316
+ app.log.error({ failures: err.failures, targets }, 'DELETE /agents cleanupRemovedAgentRuntime failed; rolling back deletion marker');
317
+ await withConfigLock(async () => {
318
+ await rollbackPerTargetState(app, targets, originalStates);
319
+ for (const got of acquiredLocks)
320
+ await app.ctx.lockManager.release(got);
321
+ });
322
+ return reply.status(502).send({
323
+ error: `runtime cleanup failed for ${targets.join(',')}; agent state rolled back ` +
324
+ `to idle+missing. Fix the underlying SSH / tmux / worktree issue and retry DELETE.`,
325
+ failures: err.failures.map(f => ({ agentId: f.agentId, step: f.step,
326
+ error: f.error instanceof Error ? f.error.message : String(f.error) })),
327
+ });
328
+ }
329
+ app.log.warn({ err, targets }, 'DELETE /agents cleanupRemovedAgentRuntime threw an unrecognised error — proceeding to commit anyway');
330
+ }
331
+ const phase3Result = await withConfigLock(async () => {
332
+ const currentHash = configHash(app.ctx.config);
333
+ const rollbackBase = currentHash === originalConfigHash
334
+ ? validatedAfterRemove
335
+ : omitAgentsFromProject(app.ctx.config, projectId, targets);
336
+ let validated;
337
+ try {
338
+ validated = prepareConfig(rollbackBase);
339
+ }
340
+ catch (err) {
341
+ await rollbackPerTargetState(app, targets, originalStates);
342
+ for (const got of acquiredLocks)
343
+ await app.ctx.lockManager.release(got);
344
+ if (err instanceof ConfigValidationError) {
345
+ return reply.status(400).send({ error: 'Invalid config', details: err.errors });
346
+ }
347
+ throw err;
348
+ }
349
+ try {
350
+ await saveConfig(app.ctx.configPath, validated);
351
+ }
352
+ catch (err) {
353
+ app.log.error({ err, targets }, 'DELETE /agents Phase 3 saveConfig failed; rolling agent state back to idle+missing');
354
+ await rollbackPerTargetState(app, targets, originalStates);
355
+ for (const got of acquiredLocks)
356
+ await app.ctx.lockManager.release(got);
357
+ return reply.status(500).send({
358
+ error: 'failed to persist config after runtime cleanup; agents marked idle+missing for retry',
359
+ });
360
+ }
361
+ app.ctx.config = validated;
362
+ app.ctx.agentManager.replaceConfig(validated);
363
+ app.ctx.tmuxProbePoller?.replaceConfig(validated);
364
+ app.ctx.bootstrapPoller?.replaceConfig(validated);
365
+ for (const id of targets) {
366
+ try {
367
+ await app.ctx.agentStore.delete(id);
368
+ }
369
+ catch (delErr) {
370
+ app.log.warn({ err: delErr, agentId: id }, 'DELETE /agents Phase 3 agentStore.delete failed');
371
+ }
372
+ // Clear stale error records so reusing the same agent id (delete + recreate) doesn't
373
+ // inherit the previous incarnation's bootstrap failures in the new snapshot.
374
+ // Best-effort; failure is logged but doesn't block deletion.
375
+ if (app.ctx.errorRecordStore) {
376
+ try {
377
+ await app.ctx.errorRecordStore.purgeAgent(id);
378
+ }
379
+ catch (purgeErr) {
380
+ app.log.warn({ err: purgeErr, agentId: id }, 'DELETE /agents errorRecordStore.purgeAgent failed');
381
+ }
382
+ }
383
+ await app.ctx.lockManager.release(id);
384
+ }
385
+ return reply.send({ removed: targets, restartRequired: false });
386
+ });
387
+ return phase3Result;
388
+ }
389
+ finally {
390
+ if (claimedTargets.length > 0) {
391
+ app.ctx.agentManager.releaseDeletionClaim(claimedTargets);
392
+ }
393
+ }
394
+ });
395
+ app.post('/projects/:projectId/agents/:agentId/resume', async (request, reply) => {
396
+ const { projectId, agentId } = request.params;
397
+ const cfg = app.ctx.agentManager.getAgentConfig(agentId);
398
+ if (!cfg || cfg.projectId !== projectId) {
399
+ return reply.status(404).send({ error: `Agent "${agentId}" not found in project "${projectId}"` });
400
+ }
401
+ // withConfigLock 与 DELETE / create-agent 同一把锁串行化——避免 operator 同时
402
+ // 发起 DELETE 和 Resume 时,Resume 把 state 改回 ok / drainQueue 派新任务,
403
+ // 而 DELETE 的 cleanupRemovedAgentRuntime 还在杀 tmux/删 worktree。
404
+ return withConfigLock(async () => {
405
+ // DELETE phase2 (cleanupRemovedAgentRuntime) 在 phase1 释放 withConfigLock 后无锁运行;
406
+ // 期间 Resume 拿到 withConfigLock 仍可能撞——deletionInFlight claim 跨 phase 持有,拒绝 Resume。
407
+ if (app.ctx.agentManager.isDeletionInFlight(agentId)) {
408
+ return reply.status(409).send({
409
+ error: `Agent "${agentId}" is being deleted; Resume not allowed.`,
410
+ });
411
+ }
412
+ const state = await app.ctx.agentStore.get(agentId);
413
+ if (state?.status !== 'awaiting_human') {
414
+ return reply.status(409).send({
415
+ error: `Agent "${agentId}" is not awaiting human; nothing to resume.`,
416
+ });
417
+ }
418
+ const result = await app.ctx.agentManager.resumeAgent(agentId);
419
+ if (!result.resumed) {
420
+ const refreshed = await app.ctx.agentStore.get(agentId);
421
+ const reason = refreshed?.creationToken
422
+ ? 'Bootstrap dialog still unresolved; resolve via web terminal or DELETE the agent.'
423
+ : 'Resume rejected; agent not in a state that can be resumed.';
424
+ return reply.status(409).send({ error: reason, ...result, agentId });
425
+ }
426
+ return reply.send({ agentId, ...result });
427
+ });
428
+ });
429
+ app.post('/projects/:projectId/agents/:agentId/restart-repl', async (request, reply) => {
430
+ const { projectId, agentId } = request.params;
431
+ const cfg = app.ctx.agentManager.getAgentConfig(agentId);
432
+ if (!cfg || cfg.projectId !== projectId) {
433
+ return reply.status(404).send({ error: `Agent "${agentId}" not found in project "${projectId}"` });
434
+ }
435
+ const guard = await rejectIfOpInProgress(app, agentId);
436
+ if (guard)
437
+ return reply.status(guard.status).send({ error: guard.error });
438
+ const owner = await resolveLockOwnership(app, agentId);
439
+ if (!owner.takeover) {
440
+ const stateBefore = await app.ctx.agentStore.get(agentId);
441
+ const task = stateBefore?.taskId ? await app.ctx.taskStore.get(stateBefore.taskId) : null;
442
+ if (task && ACTIVE_TASK_STATUSES.has(task.status)) {
443
+ return reply.status(409).send({
444
+ error: `agent "${agentId}" is bound to active task ${task.id}; ` +
445
+ `restart-repl is reserved for failed REPLs — interrupting a healthy ` +
446
+ `task would lose work. cancel the task first.`,
447
+ });
448
+ }
449
+ const ok = await app.ctx.lockManager.acquire(agentId);
450
+ if (!ok) {
451
+ return reply.status(409).send({ error: `Agent "${agentId}" is locked by another op; please retry later` });
452
+ }
453
+ }
454
+ try {
455
+ await app.ctx.agentManager.restartReplOnly(agentId);
456
+ }
457
+ catch (err) {
458
+ if (!owner.takeover)
459
+ await app.ctx.lockManager.release(agentId);
460
+ const message = err instanceof Error ? err.message : String(err);
461
+ return reply.status(500).send({ error: message });
462
+ }
463
+ await pendingCleanupAfterReplReady(app, agentId, owner.takeover);
464
+ return reply.send({ ok: true, agentId });
465
+ });
466
+ app.post('/projects/:projectId/agents/:agentId/retry', async (request, reply) => {
467
+ const { projectId, agentId } = request.params;
468
+ const cfg = app.ctx.agentManager.getAgentConfig(agentId);
469
+ if (!cfg || cfg.projectId !== projectId) {
470
+ return reply.status(404).send({ error: `Agent "${agentId}" not found in project "${projectId}"` });
471
+ }
472
+ const stateBefore = await app.ctx.agentStore.get(agentId);
473
+ if (stateBefore?.creationToken) {
474
+ return reply.status(409).send({
475
+ error: 'agent is being created, please retry later',
476
+ });
477
+ }
478
+ if (app.ctx.tmuxSessionStatusStore.get(agentId).tmuxSessionStatus === 'present') {
479
+ return reply.status(409).send({ error: 'agent is already ready; retry is for failed/missing sessions' });
480
+ }
481
+ const owner = await resolveLockOwnership(app, agentId);
482
+ if (!owner.takeover) {
483
+ const ok = await app.ctx.lockManager.acquire(agentId);
484
+ if (!ok) {
485
+ return reply.status(409).send({ error: `Agent "${agentId}" is locked by another op; please retry later` });
486
+ }
487
+ }
488
+ try {
489
+ const result = await app.ctx.agentManager.ensureSession(agentId, 'runtime');
490
+ const now = new Date().toISOString();
491
+ const stateAfter = await app.ctx.agentStore.get(agentId);
492
+ await app.ctx.agentStore.set({
493
+ ...(stateAfter ?? { id: agentId, projectId, updatedAt: now }),
494
+ paneId: result.paneId,
495
+ updatedAt: now,
496
+ });
497
+ }
498
+ catch (err) {
499
+ // dialogPending check must precede createdSession-kill (kill strips dismiss handle).
500
+ if (await app.ctx.agentManager.handleDialogPendingFromRuntime(agentId, err)) {
501
+ if (!owner.takeover)
502
+ await app.ctx.lockManager.release(agentId);
503
+ return reply.status(202).send({
504
+ ok: true,
505
+ agentId,
506
+ runtimeStatus: 'pending',
507
+ message: 'REPL launched but blocked on a startup dialog; open the web ' +
508
+ 'terminal to dismiss — baxian will auto-detect ready and resume',
509
+ });
510
+ }
511
+ if (err instanceof EnsureSessionError && err.partial.createdSession) {
512
+ try {
513
+ const runner = createRunner(cfg.mode, cfg.host);
514
+ await new TmuxManager(runner).killSession(agentId);
515
+ }
516
+ catch (cleanupErr) {
517
+ app.log.warn({ err: cleanupErr, agentId }, 'POST /retry ensureSession rollback killSession failed');
518
+ }
519
+ }
520
+ if (!owner.takeover)
521
+ await app.ctx.lockManager.release(agentId);
522
+ const message = err instanceof Error ? err.message : String(err);
523
+ return reply.status(500).send({ error: message });
524
+ }
525
+ await pendingCleanupAfterReplReady(app, agentId, owner.takeover);
526
+ return reply.send({ ok: true, agentId });
527
+ });
528
+ }
529
+ /** dev keeps its lock across the fix loop — restart/retry must reuse it. */
530
+ async function resolveLockOwnership(app, agentId) {
531
+ const cfg = app.ctx.agentManager.getAgentConfig(agentId);
532
+ if (!cfg || cfg.role !== 'dev')
533
+ return { takeover: false };
534
+ const state = await app.ctx.agentStore.get(agentId);
535
+ if (!state?.taskId)
536
+ return { takeover: false };
537
+ const task = await app.ctx.taskStore.get(state.taskId);
538
+ if (!task)
539
+ return { takeover: false };
540
+ const ACTIVE_TASK = new Set(['review', 'fixing', 'in_progress', 'approved']);
541
+ if (!ACTIVE_TASK.has(task.status))
542
+ return { takeover: false };
543
+ const locked = await app.ctx.lockManager.isLocked(agentId);
544
+ if (!locked)
545
+ return { takeover: false };
546
+ return { takeover: true };
547
+ }
548
+ /** Returns null when the agent is open for ops. */
549
+ async function rejectIfOpInProgress(app, agentId) {
550
+ const state = await app.ctx.agentStore.get(agentId);
551
+ if (state?.creationToken) {
552
+ return { status: 409, error: `agent "${agentId}" is being created; please retry later` };
553
+ }
554
+ return null;
555
+ }
556
+ /** Terminal task → idle release; active task → mark waiting (keeps lock). */
557
+ async function pendingCleanupAfterReplReady(app, agentId, takeover) {
558
+ const state = await app.ctx.agentStore.get(agentId);
559
+ const taskId = state?.taskId;
560
+ if (!taskId) {
561
+ if (!takeover)
562
+ await app.ctx.lockManager.release(agentId);
563
+ return;
564
+ }
565
+ const task = await app.ctx.taskStore.get(taskId);
566
+ const TERMINAL = new Set(['merged', 'failed', 'max_rounds', 'cancelled']);
567
+ // restart-repl / retry 是显式 operator 操作,已确认 REPL 重启;前面的 ack_unknown/dev-wait-gate-failed/
568
+ // dialog_pending Held 状态都因新 REPL 而不再成立 → 用 allowAwaitingHuman + clearAwaitingHuman 清掉。
569
+ // 否则 endpoint 返回 200 但 agent 仍 Held + Resume 也拒,operator 卡死。
570
+ if (!task || TERMINAL.has(task.status)) {
571
+ await app.ctx.agentManager.releaseAgentForTask(agentId, taskId, 'idle', { allowAwaitingHuman: true })
572
+ .catch(err => app.log.warn({ err, agentId, taskId }, 'restart/retry idle-release failed'));
573
+ return;
574
+ }
575
+ await app.ctx.agentManager.markAgentWaiting(agentId, taskId, {
576
+ allowAwaitingHuman: true,
577
+ clearAwaitingHuman: true,
578
+ });
579
+ }
580
+ async function rollbackPerTargetState(app, targets, originalStates) {
581
+ for (const id of targets) {
582
+ const original = originalStates.get(id) ?? null;
583
+ if (!original) {
584
+ try {
585
+ await app.ctx.agentStore.delete(id);
586
+ }
587
+ catch { }
588
+ continue;
589
+ }
590
+ try {
591
+ await app.ctx.agentStore.set({
592
+ ...original,
593
+ paneId: undefined,
594
+ updatedAt: new Date().toISOString(),
595
+ });
596
+ }
597
+ catch (err) {
598
+ app.log.warn({ err, agentId: id }, 'DELETE /agents rollback agentStore.set failed');
599
+ }
600
+ }
601
+ }
602
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/api/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ export declare function restartRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=restart.d.ts.map