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,395 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { shellQuote, SshRunner } from './runner.js';
3
+ const run = (runner, cmd, opts) => runner['exec'](cmd, opts);
4
+ const MAX_PROMPT_BYTES = 80 * 1024;
5
+ // claude shows semver on linux / `claude.exe` on macOS; `node` is codex-only.
6
+ const REPL_PROC_TITLES = {
7
+ 'claude-code': /^(?:claude(?:\.exe)?|\d+\.\d+\.\d+)$/,
8
+ codex: /^(?:codex|node)$/,
9
+ };
10
+ const READY_ANCHORS = {
11
+ 'claude-code': /⏵⏵ bypass permissions on/,
12
+ codex: /permissions: YOLO mode|(?:^|\n)› [^\n]+\n\n\s+[A-Za-z0-9][A-Za-z0-9._:/-]*(?:\s+[A-Za-z0-9][A-Za-z0-9._:/-]*){0,2}\s+·[^\n]*(?:\n\s*)?$/,
13
+ };
14
+ // Question + option must co-occur — either alone could appear in normal output.
15
+ const TRUST_DIALOGS = {
16
+ 'claude-code': /Quick safety check[\s\S]{0,500}Yes, I trust this folder/,
17
+ codex: /Do you trust the contents[\s\S]{0,500}Yes, continue/,
18
+ };
19
+ // Detection only — operator dismisses; auto-answer would override product decisions.
20
+ const STARTUP_DIALOG_SIGNALS = [
21
+ /Press (?:enter|return|any key) to (?:continue|proceed)/i,
22
+ /Enter to confirm[^\n]{0,40}Esc to cancel/i,
23
+ /Auto-updating(?:\s*(?:…|\.\.\.)|\b(?!-))/im,
24
+ ];
25
+ export function detectStartupDialog(stripped) {
26
+ return STARTUP_DIALOG_SIGNALS.some(re => re.test(stripped));
27
+ }
28
+ // Mid-task interactive picker anchors — subset of STARTUP_DIALOG_SIGNALS (excludes Auto-updating).
29
+ const RUNTIME_MENU_SIGNALS = [
30
+ /Enter to select[^\n]{0,80}Esc to cancel/i,
31
+ /Enter to confirm[^\n]{0,40}Esc to cancel/i,
32
+ ];
33
+ export function detectRuntimeMenu(stripped) {
34
+ return RUNTIME_MENU_SIGNALS.some(re => re.test(stripped));
35
+ }
36
+ export function hasReplReadyAnchor(stripped, runtime) {
37
+ return READY_ANCHORS[runtime].test(stripped);
38
+ }
39
+ export function hasReplProcTitle(current, runtime) {
40
+ return REPL_PROC_TITLES[runtime].test(current);
41
+ }
42
+ // readiness 探针的 busy 判定:spinner 在 viewport 任意位置 OK(SPINNER_LINE_RE 格式严格,
43
+ // 普通对话文本极难误命中),但 "esc to interrupt" 仅看 viewport 底部状态区,避免历史/引用
44
+ // 文本误报。detectBusy 保留原语义(已被 tmux-probe-poller 使用)。
45
+ const ESC_TO_INTERRUPT_TAIL_LINES = 8;
46
+ export function detectReplActiveBusy(stripped) {
47
+ for (const m of stripped.matchAll(SPINNER_LINE_RE)) {
48
+ if (!COMPLETION_MARKER_RE.test(stripped.slice(m.index + m[0].length)))
49
+ return true;
50
+ }
51
+ const lines = stripped.split('\n');
52
+ const tail = lines.slice(Math.max(0, lines.length - ESC_TO_INTERRUPT_TAIL_LINES)).join('\n');
53
+ return /esc to interrupt/i.test(tail);
54
+ }
55
+ const SPINNER_LINE_RE = /^[·✢✳✶✻✽][ \t]+[^\n…]{1,200}…[ \t]*\([ \t]*(?:\d+[ \t]*m[ \t]+)?\d+[ \t]*s/gm;
56
+ const COMPLETION_MARKER_RE = /^✻[ \t]+Worked for/m;
57
+ export function detectBusy(stripped) {
58
+ if (/esc to interrupt/i.test(stripped))
59
+ return true;
60
+ for (const m of stripped.matchAll(SPINNER_LINE_RE)) {
61
+ if (!COMPLETION_MARKER_RE.test(stripped.slice(m.index + m[0].length)))
62
+ return true;
63
+ }
64
+ return false;
65
+ }
66
+ export class ReplNotReadyError extends Error {
67
+ paneId;
68
+ runtime;
69
+ lastScreen;
70
+ constructor(paneId, runtime, lastScreen, detail) {
71
+ const head = `repl not ready (paneId=${paneId}, runtime=${runtime}) within timeout`;
72
+ const tail = lastScreen ? `\nLast pane snapshot:\n${lastScreen}` : '';
73
+ super(detail ? `${head}: ${detail}${tail}` : `${head}${tail}`);
74
+ this.paneId = paneId;
75
+ this.runtime = runtime;
76
+ this.lastScreen = lastScreen;
77
+ this.name = 'ReplNotReadyError';
78
+ }
79
+ }
80
+ const SHELL_PROC_TITLES = /^(?:zsh|bash|sh|fish|dash|ash|ksh|mksh|tcsh|csh|nu|xonsh|pwsh)$/;
81
+ const ANSI_PATTERN = /\x1b\[[0-9;]*[A-Za-z]/g;
82
+ const stripAnsi = (s) => s.replace(ANSI_PATTERN, '');
83
+ const sleep = (ms) => new Promise(r => setTimeout(r, ms));
84
+ export class TmuxManager {
85
+ runner;
86
+ constructor(runner) {
87
+ this.runner = runner;
88
+ }
89
+ static async probeTmuxVersion(runner) {
90
+ const result = await runner.exec('tmux -V');
91
+ if (result.exitCode !== 0) {
92
+ throw new Error(`tmux -V failed (exit ${result.exitCode}): ${result.stderr || 'unknown error'}`);
93
+ }
94
+ const match = /tmux\s+(?:next-)?(\d+)\.(\d+)/.exec(result.stdout);
95
+ if (!match) {
96
+ throw new Error(`unparseable tmux -V output: ${JSON.stringify(result.stdout)}`);
97
+ }
98
+ return { major: parseInt(match[1], 10), minor: parseInt(match[2], 10) };
99
+ }
100
+ // PATH literal — fish would corrupt the colon form on $PATH expansion.
101
+ async createSession(name, workdir) {
102
+ const PATH = '/opt/homebrew/bin:/usr/local/bin:/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin';
103
+ const result = await run(this.runner, `tmux new-session -d -s ${shellQuote(name)} ` +
104
+ `-e ${shellQuote(`PATH=${PATH}`)} ` +
105
+ `-x 200 -y 50 -c ${shellQuote(workdir)}`);
106
+ if (result.exitCode !== 0) {
107
+ throw new Error(`Failed to create tmux session ${name}: ${result.stderr}`);
108
+ }
109
+ }
110
+ async sendInput(name, data) {
111
+ if (data.length === 0)
112
+ return;
113
+ const bufName = `bx-input-${randomUUID()}`;
114
+ const payload = Buffer.from(data, 'utf8');
115
+ const loadCmd = `tmux load-buffer -b ${shellQuote(bufName)} -`;
116
+ const pasteCmd = `tmux paste-buffer -d -b ${shellQuote(bufName)} -t ${shellQuote(`=${name}:`)}`;
117
+ const deleteCmd = `tmux delete-buffer -b ${shellQuote(bufName)}`;
118
+ try {
119
+ const r1 = this.runner instanceof SshRunner
120
+ ? await this.runner.execRawRemoteWithStdin(loadCmd, payload)
121
+ : await this.runner.execWithStdin(loadCmd, payload);
122
+ if (r1.exitCode !== 0) {
123
+ throw new Error(`tmux sendInput ${name} load-buffer failed: ${r1.stderr || 'unknown error'}`);
124
+ }
125
+ const r2 = await run(this.runner, pasteCmd);
126
+ if (r2.exitCode !== 0) {
127
+ throw new Error(`tmux sendInput ${name} paste-buffer failed: ${r2.stderr || 'unknown error'}`);
128
+ }
129
+ }
130
+ finally {
131
+ // -d skips delete on paste failure; force explicit delete to avoid leak.
132
+ await run(this.runner, deleteCmd).catch(() => undefined);
133
+ }
134
+ }
135
+ async resizeWindow(name, cols, rows) {
136
+ const result = await run(this.runner, `tmux resize-window -t ${shellQuote(`=${name}`)} -x ${cols} -y ${rows}`);
137
+ if (result.exitCode !== 0) {
138
+ throw new Error(`tmux resizeWindow ${name} failed: ${result.stderr}`);
139
+ }
140
+ }
141
+ async killSession(name) {
142
+ const result = await run(this.runner, `tmux kill-session -t ${shellQuote(`=${name}`)}`);
143
+ if (result.exitCode === 0)
144
+ return;
145
+ if (result.exitCode === 1 && isSessionAbsent(result.stderr))
146
+ return;
147
+ if (result.exitCode === 255) {
148
+ throw new Error(`tmux killSession ${name} runner error (ssh/exec layer): ${result.stderr}`);
149
+ }
150
+ throw new Error(`tmux killSession ${name} unexpected exit ${result.exitCode}: ${result.stderr}`);
151
+ }
152
+ async hasSession(name, opts) {
153
+ const result = await run(this.runner, `tmux has-session -t ${shellQuote(`=${name}`)}`, opts);
154
+ if (result.exitCode === 0)
155
+ return true;
156
+ if (result.exitCode === 1 && isSessionAbsent(result.stderr))
157
+ return false;
158
+ if (result.exitCode === 255) {
159
+ throw new Error(`tmux hasSession ${name} runner error (ssh/exec layer): ${result.stderr}`);
160
+ }
161
+ throw new Error(`tmux hasSession ${name} unexpected exit ${result.exitCode}: ${result.stderr}`);
162
+ }
163
+ async listPanes(name, opts) {
164
+ const result = await run(this.runner, `tmux list-panes -t ${shellQuote(`=${name}`)} -F '#{pane_id} #{pane_current_command}'`, opts);
165
+ if (result.exitCode !== 0) {
166
+ throw new Error(`tmux listPanes ${name} failed: ${result.stderr}`);
167
+ }
168
+ return result.stdout
169
+ .split('\n')
170
+ .map(line => line.trim())
171
+ .filter(Boolean)
172
+ .map(line => {
173
+ const idx = line.indexOf(' ');
174
+ return idx === -1
175
+ ? { paneId: line, current: '' }
176
+ : { paneId: line.slice(0, idx), current: line.slice(idx + 1) };
177
+ });
178
+ }
179
+ async getSinglePaneId(name, opts) {
180
+ const panes = await this.listPanes(name, opts);
181
+ if (panes.length === 0) {
182
+ throw new Error(`tmux session ${name} has no panes`);
183
+ }
184
+ if (panes.length > 1) {
185
+ throw new Error(`tmux session ${name} has ${panes.length} panes; baxian expects exactly one — external split-window not supported`);
186
+ }
187
+ return panes[0].paneId;
188
+ }
189
+ async displayMessage(paneId, fmt, opts) {
190
+ const result = await run(this.runner, `tmux display-message -p -t ${shellQuote(paneId)} ${shellQuote(fmt)}`, opts);
191
+ if (result.exitCode !== 0) {
192
+ throw new Error(`tmux displayMessage ${paneId} failed: ${result.stderr}`);
193
+ }
194
+ return result.stdout.replace(/\n$/, '');
195
+ }
196
+ async setOption(name, key, value) {
197
+ const result = await run(this.runner, `tmux set-option -t ${shellQuote(`=${name}:`)} ${shellQuote(key)} ${shellQuote(value)}`);
198
+ if (result.exitCode !== 0) {
199
+ throw new Error(`tmux setOption ${name} ${key} failed: ${result.stderr}`);
200
+ }
201
+ }
202
+ async setServerOption(key, value) {
203
+ const result = await run(this.runner, `tmux set-option -s ${shellQuote(key)} ${shellQuote(value)}`);
204
+ if (result.exitCode !== 0) {
205
+ throw new Error(`tmux setServerOption ${key} failed: ${result.stderr}`);
206
+ }
207
+ }
208
+ // grep -F gate prevents `set -sa` from duplicating on repeat calls.
209
+ async appendServerOptionIfMissing(key, value) {
210
+ const result = await run(this.runner, `(tmux show-option -s -v ${shellQuote(key)} 2>/dev/null | ` +
211
+ `grep -qF ${shellQuote(value)}) || ` +
212
+ `tmux set-option -sa ${shellQuote(key)} ${shellQuote(value)}`);
213
+ if (result.exitCode !== 0) {
214
+ throw new Error(`tmux appendServerOptionIfMissing ${key} failed: ${result.stderr}`);
215
+ }
216
+ }
217
+ async getOption(name, key) {
218
+ const result = await run(this.runner, `tmux show-option -t ${shellQuote(`=${name}:`)} -v ${shellQuote(key)}`);
219
+ if (result.exitCode === 0) {
220
+ const trimmed = result.stdout.replace(/\n$/, '');
221
+ return trimmed === '' ? null : trimmed;
222
+ }
223
+ if (result.exitCode === 1)
224
+ return null;
225
+ throw new Error(`tmux getOption ${name} ${key} unexpected exit ${result.exitCode}: ${result.stderr}`);
226
+ }
227
+ async sendKeysToPane(paneId, ...keys) {
228
+ if (keys.length === 0)
229
+ return;
230
+ const args = keys.map(k => shellQuote(k)).join(' ');
231
+ const result = await run(this.runner, `tmux send-keys -t ${shellQuote(paneId)} ${args}`);
232
+ if (result.exitCode !== 0) {
233
+ throw new Error(`tmux sendKeys ${paneId} failed: ${result.stderr}`);
234
+ }
235
+ }
236
+ async sendKeysLiteral(paneId, text) {
237
+ const result = await run(this.runner, `tmux send-keys -l -t ${shellQuote(paneId)} ${shellQuote(text)}`);
238
+ if (result.exitCode !== 0) {
239
+ throw new Error(`tmux sendKeysLiteral ${paneId} failed: ${result.stderr}`);
240
+ }
241
+ }
242
+ /** Prefer {@link sendKeysToPane}. */
243
+ async sendKeys(name, keys) {
244
+ const result = await run(this.runner, `tmux send-keys -t ${shellQuote(name)} ${shellQuote(keys)} Enter`);
245
+ if (result.exitCode !== 0) {
246
+ throw new Error(`tmux sendKeys ${name} failed: ${result.stderr}`);
247
+ }
248
+ }
249
+ async capturePaneById(paneId, opts = {}) {
250
+ const ansi = opts.ansi ?? false;
251
+ const scrollback = opts.scrollback;
252
+ const flags = ['-p', '-J'];
253
+ if (ansi)
254
+ flags.push('-e');
255
+ if (typeof scrollback === 'number' && scrollback > 0) {
256
+ flags.push('-S', `-${scrollback}`);
257
+ }
258
+ else if (scrollback === 0) {
259
+ flags.push('-S', '0');
260
+ }
261
+ const execOpts = opts.timeoutMs ? { timeout: opts.timeoutMs } : undefined;
262
+ const result = await run(this.runner, `tmux capture-pane ${flags.join(' ')} -t ${shellQuote(paneId)}`, execOpts);
263
+ if (result.exitCode !== 0) {
264
+ throw new Error(`tmux capturePane ${paneId} failed: ${result.stderr || 'unknown error'}`);
265
+ }
266
+ return result.stdout;
267
+ }
268
+ async injectPrompt(paneId, prompt, agentId) {
269
+ const bytes = Buffer.byteLength(prompt, 'utf8');
270
+ if (bytes > MAX_PROMPT_BYTES) {
271
+ throw new Error(`tmux injectPrompt ${paneId} prompt too large: ${bytes} bytes > ${MAX_PROMPT_BYTES}`);
272
+ }
273
+ const promptB64 = Buffer.from(prompt, 'utf8').toString('base64');
274
+ const buf = `baxian-${agentId}-${randomUUID()}`;
275
+ const cmd = `printf '%s' ${shellQuote(promptB64)} | openssl base64 -d -A | ` +
276
+ `tmux load-buffer -b ${shellQuote(buf)} - && ` +
277
+ `tmux paste-buffer -b ${shellQuote(buf)} -t ${shellQuote(paneId)} -d -p -r`;
278
+ const result = await run(this.runner, cmd);
279
+ if (result.exitCode !== 0) {
280
+ throw new Error(`tmux injectPrompt ${paneId} failed: ${result.stderr}`);
281
+ }
282
+ }
283
+ // Visible + history_size in one command to avoid torn baselines.
284
+ async capturePaneSnapshot(paneId) {
285
+ const SEP = '___bx-snap-sep___';
286
+ const cmd = `tmux capture-pane -t ${shellQuote(paneId)} -e -p && ` +
287
+ `printf '%s\\n' ${shellQuote(SEP)} && ` +
288
+ `tmux display-message -t ${shellQuote(paneId)} -p '#{history_size}'`;
289
+ const result = await run(this.runner, cmd);
290
+ if (result.exitCode !== 0) {
291
+ throw new Error(`tmux capturePaneSnapshot ${paneId} failed: ${result.stderr || 'unknown error'}`);
292
+ }
293
+ const idx = result.stdout.lastIndexOf(`${SEP}\n`);
294
+ if (idx < 0) {
295
+ throw new Error(`tmux capturePaneSnapshot ${paneId}: separator missing in output`);
296
+ }
297
+ const visible = stripAnsi(result.stdout.slice(0, idx));
298
+ const history = result.stdout.slice(idx + SEP.length + 1).trim();
299
+ return `${visible}\n---history_size:${history}---`;
300
+ }
301
+ async sendEnter(paneId) {
302
+ await this.sendKeysToPane(paneId, 'Enter');
303
+ }
304
+ async waitAck(paneId, baseline, opts = {}) {
305
+ const deadline = Date.now() + (opts.timeoutMs ?? 30_000);
306
+ const interval = opts.intervalMs ?? 500;
307
+ while (Date.now() < deadline) {
308
+ const cur = await this.capturePaneSnapshot(paneId);
309
+ if (cur !== baseline)
310
+ return;
311
+ await sleep(interval);
312
+ }
313
+ throw new Error(`runtime ack timeout (paneId=${paneId})`);
314
+ }
315
+ async handleTrustDialog(paneId, runtime, opts = {}) {
316
+ const deadline = Date.now() + (opts.timeoutMs ?? 10_000);
317
+ const interval = opts.intervalMs ?? 500;
318
+ const dialogPattern = TRUST_DIALOGS[runtime];
319
+ while (Date.now() < deadline) {
320
+ const cap = await this.capturePaneById(paneId, { ansi: true, scrollback: 50 });
321
+ const stripped = stripAnsi(cap);
322
+ if (dialogPattern.test(stripped)) {
323
+ await this.sendKeysToPane(paneId, 'Enter');
324
+ await sleep(800);
325
+ return true;
326
+ }
327
+ const ready = READY_ANCHORS[runtime];
328
+ if (ready.test(stripped))
329
+ return false;
330
+ await sleep(interval);
331
+ }
332
+ return false;
333
+ }
334
+ // procTitle is authoritative (pane_pid is shell pid, not foreground); check before regexes.
335
+ async classifyPaneForAdopt(paneId, runtime, opts) {
336
+ const SEP = '___bx-classify-sep___';
337
+ const result = await this.runner.exec(`tmux display-message -p -t ${shellQuote(paneId)} '#{pane_current_command}' ` +
338
+ `&& printf '%s\\n' ${shellQuote(SEP)} ` +
339
+ `&& tmux capture-pane -p -t ${shellQuote(paneId)} -e -S 0`, opts);
340
+ if (result.exitCode !== 0) {
341
+ throw new Error(`classifyPaneForAdopt(${paneId}) tmux probe failed: ${result.stderr || 'unknown error'}`);
342
+ }
343
+ const sepIdx = result.stdout.indexOf(SEP);
344
+ if (sepIdx < 0) {
345
+ throw new Error(`classifyPaneForAdopt(${paneId}): separator missing in output`);
346
+ }
347
+ const current = result.stdout.slice(0, sepIdx).split('\n')[0]?.trim() ?? '';
348
+ const captureStart = result.stdout.indexOf('\n', sepIdx) + 1;
349
+ const stripped = stripAnsi(result.stdout.slice(captureStart));
350
+ if (REPL_PROC_TITLES[runtime].test(current)) {
351
+ if (TRUST_DIALOGS[runtime].test(stripped))
352
+ return { kind: 'trust-dialog' };
353
+ if (detectStartupDialog(stripped))
354
+ return { kind: 'startup-dialog', lastScreen: stripped };
355
+ return { kind: 'live-runtime' };
356
+ }
357
+ if (SHELL_PROC_TITLES.test(current))
358
+ return { kind: 'shell' };
359
+ return { kind: 'other', paneCurrentCommand: current };
360
+ }
361
+ async waitReplReady(paneId, runtime, opts = {}) {
362
+ const deadline = Date.now() + (opts.timeoutMs ?? 30_000);
363
+ const interval = opts.intervalMs ?? 500;
364
+ const failFastOnShell = opts.failFastOnShell ?? false;
365
+ // scrollback=0: history would let a stale anchor satisfy the check.
366
+ const scrollback = opts.scrollback ?? 0;
367
+ const anchor = READY_ANCHORS[runtime];
368
+ const procTitle = REPL_PROC_TITLES[runtime];
369
+ const cmdOpts = opts.perCommandTimeoutMs ? { timeout: opts.perCommandTimeoutMs } : undefined;
370
+ let lastStripped = '';
371
+ while (Date.now() < deadline) {
372
+ const current = await this.displayMessage(paneId, '#{pane_current_command}', cmdOpts);
373
+ if (failFastOnShell && SHELL_PROC_TITLES.test(current)) {
374
+ throw new ReplNotReadyError(paneId, runtime, lastStripped, `pane_current_command=${current} (shell), failFastOnShell triggered`);
375
+ }
376
+ const cap = await this.capturePaneById(paneId, { ansi: true, scrollback, timeoutMs: opts.perCommandTimeoutMs });
377
+ const stripped = stripAnsi(cap);
378
+ lastStripped = stripped;
379
+ if (anchor.test(stripped) && procTitle.test(current))
380
+ return;
381
+ await sleep(interval);
382
+ }
383
+ throw new ReplNotReadyError(paneId, runtime, lastStripped);
384
+ }
385
+ }
386
+ function isSessionAbsent(stderr) {
387
+ // Strict whitelist — unknown stderr escalates as unexpected to avoid masking infra failures.
388
+ const s = (stderr || '').trim().toLowerCase();
389
+ return (s.includes('no server running') ||
390
+ s.includes('session not found') ||
391
+ s.includes("can't find session") ||
392
+ s.includes('no such session') ||
393
+ (s.includes('error connecting to') && s.includes('no such file or directory')));
394
+ }
395
+ //# sourceMappingURL=tmux.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/agent/tmux.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CommandRunner } from './runner.js';
2
+ export declare class WorktreeManager {
3
+ private runner;
4
+ constructor(runner: CommandRunner);
5
+ create(repoDir: string, taskId: string, baseRef?: string): Promise<string>;
6
+ createDetached(repoDir: string, taskId: string, remoteBranch: string): Promise<string>;
7
+ remove(repoDir: string, worktreePath: string): Promise<void>;
8
+ list(repoDir: string): Promise<string[]>;
9
+ }
10
+ //# sourceMappingURL=worktree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/agent/worktree.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AASjD,qBAAa,eAAe;IACd,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAEnC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1E,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYtF,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAM/C"}
@@ -0,0 +1,41 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { shellQuote } from './runner.js';
3
+ import { BRANCH_PREFIX, WORKTREE_DIR } from '../shared/index.js';
4
+ function uniqueSuffix() {
5
+ // 64 bits keeps retry collisions negligible.
6
+ return randomBytes(8).toString('hex');
7
+ }
8
+ export class WorktreeManager {
9
+ runner;
10
+ constructor(runner) {
11
+ this.runner = runner;
12
+ }
13
+ async create(repoDir, taskId, baseRef) {
14
+ const worktreePath = `${repoDir}/${WORKTREE_DIR}/${taskId}_${uniqueSuffix()}`;
15
+ const branchName = `${BRANCH_PREFIX}${taskId}`;
16
+ const baseClause = baseRef ? ` ${shellQuote(baseRef)}` : '';
17
+ // -B keeps partial-failure retries idempotent.
18
+ const result = await this.runner.exec(`cd ${shellQuote(repoDir)} && git worktree add ${shellQuote(worktreePath)} -B ${shellQuote(branchName)}${baseClause}`);
19
+ if (result.exitCode !== 0)
20
+ throw new Error(`Failed to create worktree: ${result.stderr}`);
21
+ return worktreePath;
22
+ }
23
+ async createDetached(repoDir, taskId, remoteBranch) {
24
+ const worktreePath = `${repoDir}/${WORKTREE_DIR}/${taskId}-review_${uniqueSuffix()}`;
25
+ // FETCH_HEAD works regardless of whether the remote refspec updates refs/remotes/origin/*.
26
+ const result = await this.runner.exec(`cd ${shellQuote(repoDir)} ` +
27
+ `&& git fetch origin ${shellQuote(remoteBranch)} ` +
28
+ `&& git worktree add --detach ${shellQuote(worktreePath)} FETCH_HEAD`);
29
+ if (result.exitCode !== 0)
30
+ throw new Error(`Failed to create detached worktree: ${result.stderr}`);
31
+ return worktreePath;
32
+ }
33
+ async remove(repoDir, worktreePath) {
34
+ await this.runner.exec(`cd ${shellQuote(repoDir)} && git worktree remove ${shellQuote(worktreePath)} --force`);
35
+ }
36
+ async list(repoDir) {
37
+ const result = await this.runner.exec(`cd ${shellQuote(repoDir)} && git worktree list --porcelain`);
38
+ return result.stdout.split('\n').filter(line => line.startsWith('worktree ')).map(line => line.slice('worktree '.length));
39
+ }
40
+ }
41
+ //# sourceMappingURL=worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/agent/worktree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEjE,SAAS,YAAY;IACnB,6CAA6C;IAC7C,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,OAAO,eAAe;IACN;IAApB,YAAoB,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAE7C,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,MAAc,EAAE,OAAgB;QAC5D,MAAM,YAAY,GAAG,GAAG,OAAO,IAAI,YAAY,IAAI,MAAM,IAAI,YAAY,EAAE,EAAE,CAAC;QAC9E,MAAM,UAAU,GAAG,GAAG,aAAa,GAAG,MAAM,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,+CAA+C;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACnC,MAAM,UAAU,CAAC,OAAO,CAAC,wBAAwB,UAAU,CAAC,YAAY,CAAC,OAAO,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,EAAE,CACtH,CAAC;QACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1F,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,MAAc,EAAE,YAAoB;QACxE,MAAM,YAAY,GAAG,GAAG,OAAO,IAAI,YAAY,IAAI,MAAM,WAAW,YAAY,EAAE,EAAE,CAAC;QACrF,2FAA2F;QAC3F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACnC,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG;YAC1B,uBAAuB,UAAU,CAAC,YAAY,CAAC,GAAG;YAClD,gCAAgC,UAAU,CAAC,YAAY,CAAC,aAAa,CACxE,CAAC;QACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACnG,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,YAAoB;QAChD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACpB,MAAM,UAAU,CAAC,OAAO,CAAC,2BAA2B,UAAU,CAAC,YAAY,CAAC,UAAU,CACvF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACnC,MAAM,UAAU,CAAC,OAAO,CAAC,mCAAmC,CAC7D,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5H,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ export declare function agentRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/api/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BrE"}
@@ -0,0 +1,29 @@
1
+ import { buildAgentSnapshotById, buildAllAgentSnapshots } from '../state/snapshot.js';
2
+ export async function agentRoutes(app) {
3
+ // Use the startup agent index so /agents matches preview/stop until restart.
4
+ app.get('/agents', async () => buildAllAgentSnapshots(app.ctx));
5
+ app.get('/agents/:id', async (request, reply) => {
6
+ const configured = app.ctx.agentManager.getAgentConfig(request.params.id);
7
+ if (!configured) {
8
+ return reply.status(404).send({ error: 'Agent not found' });
9
+ }
10
+ void configured;
11
+ return buildAgentSnapshotById(app.ctx, request.params.id);
12
+ });
13
+ app.delete('/agents/:id/session', async (request, reply) => {
14
+ const state = await app.ctx.agentStore.get(request.params.id);
15
+ if (state?.taskId) {
16
+ try {
17
+ await app.ctx.agentManager.cancelTask(state.taskId);
18
+ }
19
+ catch (err) {
20
+ // Task may already be terminal (cancel during merge race); 204 is the right
21
+ // response either way — the route's contract is "no active session for this agent".
22
+ const message = err instanceof Error ? err.message : String(err);
23
+ app.log.warn({ err: message, agentId: request.params.id, taskId: state.taskId }, 'DELETE /agents/:id/session: cancelTask failed; proceeding with idle response');
24
+ }
25
+ }
26
+ return reply.status(204).send();
27
+ });
28
+ }
29
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/api/agents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEtF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAoB;IACpD,6EAA6E;IAC7E,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhE,GAAG,CAAC,GAAG,CAA6B,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC1E,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK,UAAU,CAAC;QAChB,OAAO,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAA6B,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACrF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,4EAA4E;gBAC5E,oFAAoF;gBACpF,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAC7E,8EAA8E,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import type { BaxianConfig } from '../shared/index.js';
3
+ export declare function redactConfig(config: BaxianConfig): BaxianConfig;
4
+ export declare function configRoutes(app: FastifyInstance): Promise<void>;
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/api/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAkBvD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAQ/D;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAiGtE"}