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,382 @@
1
+ import xterm from '@xterm/headless';
2
+ import { SerializeAddon } from '@xterm/addon-serialize';
3
+ import { buildAttachInteractiveCommand } from '../terminal/attach.js';
4
+ const DEFAULT_MAX_SCROLLBACK_BYTES = 512 * 1024;
5
+ const DEFAULT_IDLE_GRACE_MS = 5000;
6
+ const MIN_REATTACH_DELAY_MS = 1000;
7
+ const MAX_TIMER_DELAY_MS = 2_147_483_647;
8
+ const DEFAULT_REATTACH_DELAY_MS = MIN_REATTACH_DELAY_MS;
9
+ const DEFAULT_SESSION_PROBE_TIMEOUT_MS = 3000;
10
+ const DEFAULT_COLS = 200;
11
+ const DEFAULT_ROWS = 50;
12
+ let cachedPtyFactory = null;
13
+ async function defaultPtyFactory() {
14
+ if (cachedPtyFactory)
15
+ return cachedPtyFactory;
16
+ const nodePty = await import('node-pty');
17
+ cachedPtyFactory = (cmd, cols, rows) => nodePty.spawn(cmd.file, cmd.args, {
18
+ name: 'xterm-256color',
19
+ cols,
20
+ rows,
21
+ env: process.env,
22
+ });
23
+ return cachedPtyFactory;
24
+ }
25
+ function normalizeReattachDelayMs(value) {
26
+ if (!Number.isFinite(value))
27
+ return DEFAULT_REATTACH_DELAY_MS;
28
+ return Math.min(Math.max(Math.trunc(value), MIN_REATTACH_DELAY_MS), MAX_TIMER_DELAY_MS);
29
+ }
30
+ function normalizeSessionProbeTimeoutMs(value) {
31
+ if (!Number.isFinite(value) || value <= 0)
32
+ return DEFAULT_SESSION_PROBE_TIMEOUT_MS;
33
+ return Math.min(Math.trunc(value), MAX_TIMER_DELAY_MS);
34
+ }
35
+ export class PaneStreamer {
36
+ agent;
37
+ tmux;
38
+ pty = null;
39
+ headless;
40
+ serialize;
41
+ onPtyDataChain = Promise.resolve();
42
+ nextSeq = 0;
43
+ lastBroadcastSeq = -1;
44
+ live = new Set();
45
+ sessionGoneCbs = new Set();
46
+ scrollback = [];
47
+ scrollbackBytes = 0;
48
+ idleTimer = null;
49
+ reattachTimer = null;
50
+ reattaching = null;
51
+ ptyGeneration = 0;
52
+ destroyed = false;
53
+ starting = null;
54
+ started = false;
55
+ maxScrollbackBytes;
56
+ idleGraceMs;
57
+ reattachDelayMs;
58
+ sessionProbeTimeoutMs;
59
+ initialCols;
60
+ initialRows;
61
+ ptyFactoryProvided;
62
+ constructor(agent, tmux, _runner, opts = {}) {
63
+ this.agent = agent;
64
+ this.tmux = tmux;
65
+ this.maxScrollbackBytes = opts.maxScrollbackBytes ?? DEFAULT_MAX_SCROLLBACK_BYTES;
66
+ this.idleGraceMs = opts.idleGraceMs ?? DEFAULT_IDLE_GRACE_MS;
67
+ this.reattachDelayMs = normalizeReattachDelayMs(opts.reattachDelayMs ?? DEFAULT_REATTACH_DELAY_MS);
68
+ this.sessionProbeTimeoutMs = normalizeSessionProbeTimeoutMs(opts.sessionProbeTimeoutMs ?? DEFAULT_SESSION_PROBE_TIMEOUT_MS);
69
+ this.initialCols = opts.initialCols ?? DEFAULT_COLS;
70
+ this.initialRows = opts.initialRows ?? DEFAULT_ROWS;
71
+ this.ptyFactoryProvided = opts.ptyFactory;
72
+ this.headless = new xterm.Terminal({
73
+ cols: this.initialCols,
74
+ rows: this.initialRows,
75
+ allowProposedApi: true,
76
+ });
77
+ this.serialize = new SerializeAddon();
78
+ this.headless.loadAddon(this.serialize);
79
+ }
80
+ async ensureStarted() {
81
+ if (this.destroyed)
82
+ throw new Error('PaneStreamer is destroyed');
83
+ if (this.started) {
84
+ if (!this.pty)
85
+ await this.ensureAttachPty();
86
+ return;
87
+ }
88
+ if (this.starting)
89
+ return this.starting;
90
+ this.starting = this.startInner();
91
+ try {
92
+ await this.starting;
93
+ }
94
+ finally {
95
+ this.starting = null;
96
+ }
97
+ }
98
+ async startInner() {
99
+ await this.ensureAttachPty();
100
+ this.started = true;
101
+ }
102
+ async ensureAttachPty() {
103
+ if (this.destroyed)
104
+ throw new Error('PaneStreamer is destroyed');
105
+ if (this.pty)
106
+ return;
107
+ if (this.reattachTimer) {
108
+ clearTimeout(this.reattachTimer);
109
+ this.reattachTimer = null;
110
+ }
111
+ if (this.reattaching)
112
+ return this.reattaching;
113
+ const p = this.spawnAttachPty().finally(() => {
114
+ if (this.reattaching === p)
115
+ this.reattaching = null;
116
+ });
117
+ this.reattaching = p;
118
+ return p;
119
+ }
120
+ async spawnAttachPty() {
121
+ const factory = this.ptyFactoryProvided ?? (await defaultPtyFactory());
122
+ if (this.destroyed)
123
+ throw new Error('PaneStreamer destroyed during attach');
124
+ const cmd = buildAttachInteractiveCommand(this.agent);
125
+ const pty = factory(cmd, this.headless.cols, this.headless.rows);
126
+ const generation = ++this.ptyGeneration;
127
+ this.pty = pty;
128
+ pty.onData((data) => {
129
+ if (generation !== this.ptyGeneration || this.destroyed)
130
+ return;
131
+ this.onPtyData(data);
132
+ });
133
+ pty.onExit(() => {
134
+ if (generation !== this.ptyGeneration || this.destroyed)
135
+ return;
136
+ this.pty = null;
137
+ void this.handleAttachExit();
138
+ });
139
+ }
140
+ onPtyData(data) {
141
+ this.pushScrollback(data);
142
+ this.onPtyDataChain = this.onPtyDataChain.then(async () => {
143
+ if (this.destroyed)
144
+ return;
145
+ const seq = this.nextSeq++;
146
+ await new Promise((resolve) => this.headless.write(data, () => resolve()));
147
+ this.lastBroadcastSeq = seq;
148
+ for (const cb of [...this.live]) {
149
+ try {
150
+ cb(data, seq);
151
+ }
152
+ catch { }
153
+ }
154
+ });
155
+ }
156
+ async subscribeAtomic(cbs) {
157
+ this.cancelIdleTimer();
158
+ await this.ensureStarted();
159
+ return new Promise((resolve, reject) => {
160
+ this.onPtyDataChain = this.onPtyDataChain.then(() => {
161
+ if (this.destroyed) {
162
+ reject(new Error('PaneStreamer destroyed before subscribe'));
163
+ return;
164
+ }
165
+ const snapshot = {
166
+ cols: this.headless.cols,
167
+ rows: this.headless.rows,
168
+ data: this.serialize.serialize(),
169
+ };
170
+ const snapshotSeq = this.lastBroadcastSeq;
171
+ this.live.add(cbs.onLive);
172
+ this.sessionGoneCbs.add(cbs.onSessionGone);
173
+ resolve({
174
+ unsubscribe: () => this.unsubscribeOne(cbs),
175
+ snapshot,
176
+ snapshotSeq,
177
+ });
178
+ });
179
+ });
180
+ }
181
+ async getSnapshotAtomic() {
182
+ this.cancelIdleTimer();
183
+ await this.ensureStarted();
184
+ return new Promise((resolve, reject) => {
185
+ this.onPtyDataChain = this.onPtyDataChain.then(() => {
186
+ if (this.destroyed) {
187
+ reject(new Error('PaneStreamer destroyed before snapshot'));
188
+ return;
189
+ }
190
+ const snapshot = {
191
+ cols: this.headless.cols,
192
+ rows: this.headless.rows,
193
+ data: this.serialize.serialize(),
194
+ };
195
+ resolve({ snapshot, snapshotSeq: this.lastBroadcastSeq });
196
+ });
197
+ });
198
+ }
199
+ // tmux first: if it rejects, PTY/headless keep the last known pane size.
200
+ async resize(cols, rows) {
201
+ if (this.destroyed)
202
+ throw new Error('PaneStreamer is destroyed');
203
+ await this.tmux.resizeWindow(this.agent.id, cols, rows);
204
+ this.pty?.resize(cols, rows);
205
+ this.headless.resize(cols, rows);
206
+ try {
207
+ await this.tmux.setOption(this.agent.id, 'window-size', 'latest');
208
+ }
209
+ catch (err) {
210
+ console.warn(`[pane-streamer] set window-size=latest failed after resize(${this.agent.id}):`, err);
211
+ }
212
+ }
213
+ // PTY stdin keeps bytes in tmux's keybind table; paste-buffer would bypass it.
214
+ async sendInput(data) {
215
+ if (this.destroyed)
216
+ throw new Error('PaneStreamer is destroyed');
217
+ if (data.length === 0)
218
+ return;
219
+ await this.ensureStarted();
220
+ if (!this.pty)
221
+ throw new Error('PaneStreamer pty unavailable');
222
+ this.pty.write(data);
223
+ }
224
+ isDestroyed() {
225
+ return this.destroyed;
226
+ }
227
+ // Fire sessionGoneCbs before kill — pty.onExit would otherwise see no subscribers.
228
+ destroy() {
229
+ if (this.destroyed)
230
+ return;
231
+ this.destroyed = true;
232
+ if (this.idleTimer) {
233
+ clearTimeout(this.idleTimer);
234
+ this.idleTimer = null;
235
+ }
236
+ if (this.reattachTimer) {
237
+ clearTimeout(this.reattachTimer);
238
+ this.reattachTimer = null;
239
+ }
240
+ const goneCbs = [...this.sessionGoneCbs];
241
+ this.sessionGoneCbs.clear();
242
+ this.live.clear();
243
+ for (const cb of goneCbs) {
244
+ try {
245
+ cb();
246
+ }
247
+ catch { }
248
+ }
249
+ this.killAttachPty();
250
+ }
251
+ killAttachPty() {
252
+ if (this.pty) {
253
+ const pty = this.pty;
254
+ this.pty = null;
255
+ try {
256
+ pty.kill();
257
+ }
258
+ catch { }
259
+ }
260
+ }
261
+ async handleAttachExit() {
262
+ if (this.destroyed)
263
+ return;
264
+ if (this.live.size === 0 && this.sessionGoneCbs.size === 0) {
265
+ this.scheduleIdleIfEmpty();
266
+ return;
267
+ }
268
+ let sessionPresent = null;
269
+ try {
270
+ sessionPresent = await this.tmux.hasSession(this.agent.id, { timeout: this.sessionProbeTimeoutMs });
271
+ }
272
+ catch (err) {
273
+ console.warn(`[pane-streamer] hasSession(${this.agent.id}) failed after attach exit; will retry attach:`, err);
274
+ }
275
+ if (this.destroyed)
276
+ return;
277
+ if (sessionPresent === false) {
278
+ this.markSessionGone();
279
+ return;
280
+ }
281
+ this.scheduleReattach();
282
+ }
283
+ scheduleReattach() {
284
+ if (this.destroyed || this.pty || this.reattaching || this.reattachTimer)
285
+ return;
286
+ const run = () => {
287
+ this.ensureAttachPty().catch((err) => {
288
+ if (this.destroyed)
289
+ return;
290
+ console.warn(`[pane-streamer] reattach(${this.agent.id}) failed; retrying:`, err);
291
+ this.scheduleReattach();
292
+ });
293
+ };
294
+ // Delay prevents hot-loop on SSH/tmux outage.
295
+ this.reattachTimer = setTimeout(() => {
296
+ this.reattachTimer = null;
297
+ run();
298
+ }, this.reattachDelayMs);
299
+ }
300
+ markSessionGone() {
301
+ if (this.destroyed)
302
+ return;
303
+ this.destroyed = true;
304
+ if (this.idleTimer) {
305
+ clearTimeout(this.idleTimer);
306
+ this.idleTimer = null;
307
+ }
308
+ if (this.reattachTimer) {
309
+ clearTimeout(this.reattachTimer);
310
+ this.reattachTimer = null;
311
+ }
312
+ const cbs = [...this.sessionGoneCbs];
313
+ this.sessionGoneCbs.clear();
314
+ this.live.clear();
315
+ this.killAttachPty();
316
+ for (const cb of cbs) {
317
+ try {
318
+ cb();
319
+ }
320
+ catch { }
321
+ }
322
+ }
323
+ unsubscribeOne(cbs) {
324
+ this.live.delete(cbs.onLive);
325
+ this.sessionGoneCbs.delete(cbs.onSessionGone);
326
+ this.scheduleIdleIfEmpty();
327
+ }
328
+ scheduleIdleIfEmpty() {
329
+ if (this.destroyed)
330
+ return;
331
+ if (this.live.size > 0 || this.sessionGoneCbs.size > 0)
332
+ return;
333
+ if (this.idleTimer)
334
+ return;
335
+ if (this.idleGraceMs <= 0)
336
+ return;
337
+ this.idleTimer = setTimeout(() => {
338
+ this.idleTimer = null;
339
+ if (this.live.size === 0 && this.sessionGoneCbs.size === 0 && !this.destroyed) {
340
+ this.destroy();
341
+ }
342
+ }, this.idleGraceMs);
343
+ }
344
+ cancelIdleTimer() {
345
+ if (this.idleTimer) {
346
+ clearTimeout(this.idleTimer);
347
+ this.idleTimer = null;
348
+ }
349
+ }
350
+ pushScrollback(data) {
351
+ const bytes = Buffer.byteLength(data, 'utf8');
352
+ if (bytes > this.maxScrollbackBytes) {
353
+ const buf = Buffer.from(data, 'utf8');
354
+ const tailBuf = buf.subarray(bytes - this.maxScrollbackBytes);
355
+ const tail = new TextDecoder('utf-8', { fatal: false }).decode(tailBuf);
356
+ this.scrollback = [tail];
357
+ this.scrollbackBytes = Buffer.byteLength(tail, 'utf8');
358
+ return;
359
+ }
360
+ this.scrollback.push(data);
361
+ this.scrollbackBytes += bytes;
362
+ if (this.scrollbackBytes <= this.maxScrollbackBytes)
363
+ return;
364
+ let removeBytes = this.scrollbackBytes - this.maxScrollbackBytes;
365
+ let removeCount = 0;
366
+ while (removeCount < this.scrollback.length && removeBytes > 0) {
367
+ const chunkBytes = Buffer.byteLength(this.scrollback[removeCount], 'utf8');
368
+ removeBytes -= chunkBytes;
369
+ this.scrollbackBytes -= chunkBytes;
370
+ removeCount++;
371
+ }
372
+ if (removeCount > 0)
373
+ this.scrollback.splice(0, removeCount);
374
+ }
375
+ getScrollbackByteCount() {
376
+ return this.scrollbackBytes;
377
+ }
378
+ _waitForChainDrain() {
379
+ return this.onPtyDataChain;
380
+ }
381
+ }
382
+ //# sourceMappingURL=pane-streamer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pane-streamer.js","sourceRoot":"","sources":["../../src/agent/pane-streamer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { AgentConfig } from '../shared/index.js';
2
+ import type { EventBus } from '../event/bus.js';
3
+ import type { PaneStreamerManager } from './pane-streamer-manager.js';
4
+ export interface PostApproveMarkerWatcherDeps {
5
+ paneStreamerManager: PaneStreamerManager;
6
+ eventBus: EventBus;
7
+ resolveAgent: (agentId: string) => AgentConfig | undefined;
8
+ }
9
+ export interface PostApproveMarkerStartArgs {
10
+ taskId: string;
11
+ projectId: string;
12
+ agentId: string;
13
+ token: string;
14
+ skipSnapshot?: boolean;
15
+ }
16
+ export declare class PostApproveMarkerWatcher {
17
+ private readonly deps;
18
+ private readonly entries;
19
+ constructor(deps: PostApproveMarkerWatcherDeps);
20
+ start(args: PostApproveMarkerStartArgs): Promise<void>;
21
+ stop(taskId: string): void;
22
+ has(taskId: string): boolean;
23
+ private onPaneData;
24
+ private emitCompletion;
25
+ private onSessionGone;
26
+ private emitArmFailureIntervention;
27
+ private emitInterventionFireAndForget;
28
+ }
29
+ //# sourceMappingURL=post-approve-marker-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-approve-marker-watcher.d.ts","sourceRoot":"","sources":["../../src/agent/post-approve-marker-watcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAetE,MAAM,WAAW,4BAA4B;IAC3C,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;CAC5D;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IAEd,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,wBAAwB;IAGvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;gBAE5B,IAAI,EAAE,4BAA4B;IAEzD,KAAK,CAAC,IAAI,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC5D,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAW1B,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI5B,OAAO,CAAC,UAAU;YAgCJ,cAAc;IAgC5B,OAAO,CAAC,aAAa;YAaP,0BAA0B;YAa1B,6BAA6B;CA2B5C"}
@@ -0,0 +1,160 @@
1
+ import { scanShortMarkers } from './marker-protocol.js';
2
+ const MATCH_BUFFER_CHARS = 1024;
3
+ export class PostApproveMarkerWatcher {
4
+ deps;
5
+ entries = new Map();
6
+ constructor(deps) {
7
+ this.deps = deps;
8
+ }
9
+ async start(args) {
10
+ this.stop(args.taskId);
11
+ const agent = this.deps.resolveAgent(args.agentId);
12
+ if (!agent)
13
+ return;
14
+ const streamer = this.deps.paneStreamerManager.ensure(agent);
15
+ const entry = {
16
+ taskId: args.taskId,
17
+ projectId: args.projectId,
18
+ agentId: args.agentId,
19
+ expectedToken: args.token,
20
+ buffer: '',
21
+ unsubscribe: () => undefined,
22
+ fired: false,
23
+ };
24
+ let sub;
25
+ try {
26
+ sub = await streamer.subscribeAtomic({
27
+ onLive: (data) => this.onPaneData(entry, data),
28
+ onSessionGone: () => this.onSessionGone(entry),
29
+ });
30
+ }
31
+ catch (err) {
32
+ // Silent failure would strand the task in 'approved'.
33
+ console.warn(`[PostApproveMarkerWatcher] subscribe failed for task=${args.taskId} agent=${args.agentId}:`, err);
34
+ await this.emitArmFailureIntervention(args, err);
35
+ return;
36
+ }
37
+ entry.unsubscribe = sub.unsubscribe;
38
+ this.entries.set(args.taskId, entry);
39
+ if (!args.skipSnapshot) {
40
+ this.onPaneData(entry, sub.snapshot.data);
41
+ }
42
+ }
43
+ stop(taskId) {
44
+ const entry = this.entries.get(taskId);
45
+ if (!entry)
46
+ return;
47
+ this.entries.delete(taskId);
48
+ try {
49
+ entry.unsubscribe();
50
+ }
51
+ catch {
52
+ // streamer may already be gone
53
+ }
54
+ }
55
+ has(taskId) {
56
+ return this.entries.has(taskId);
57
+ }
58
+ onPaneData(entry, chunk) {
59
+ if (entry.fired)
60
+ return;
61
+ // Merge before scan so chunk-split markers and ANSI escapes both rejoin.
62
+ // Search BEFORE slicing — initial snapshot may exceed the buffer cap.
63
+ const rawCombined = entry.buffer + chunk;
64
+ const marker = scanShortMarkers(rawCombined).find(candidate => candidate.kind === 'post-approve-complete' && candidate.token === entry.expectedToken);
65
+ entry.buffer = rawCombined.slice(-MATCH_BUFFER_CHARS);
66
+ if (!marker)
67
+ return;
68
+ entry.fired = true;
69
+ this.entries.delete(entry.taskId);
70
+ try {
71
+ entry.unsubscribe();
72
+ }
73
+ catch { }
74
+ const event = {
75
+ id: '',
76
+ type: 'pr.updated',
77
+ timestamp: new Date().toISOString(),
78
+ projectId: entry.projectId,
79
+ agentId: entry.agentId,
80
+ taskId: entry.taskId,
81
+ data: {
82
+ kind: 'post-approve-complete',
83
+ verdictAgentId: entry.agentId,
84
+ postApproveToken: entry.expectedToken,
85
+ source: 'pane-marker',
86
+ },
87
+ };
88
+ void this.emitCompletion(event, entry);
89
+ }
90
+ async emitCompletion(event, entry) {
91
+ try {
92
+ await this.deps.eventBus.emit(event);
93
+ return;
94
+ }
95
+ catch (err) {
96
+ // Marker consumed; cannot retry — escalate via intervention.
97
+ console.error(`[PostApproveMarkerWatcher] eventBus.emit failed for task=${entry.taskId}:`, err);
98
+ try {
99
+ await this.deps.eventBus.emit({
100
+ id: '',
101
+ type: 'human.intervention',
102
+ timestamp: new Date().toISOString(),
103
+ projectId: entry.projectId,
104
+ agentId: entry.agentId,
105
+ taskId: entry.taskId,
106
+ data: {
107
+ phase: 'post-approve-marker-emit-failed',
108
+ error: err instanceof Error ? err.message : String(err),
109
+ },
110
+ });
111
+ }
112
+ catch (interventionErr) {
113
+ console.error(`[PostApproveMarkerWatcher] emit-failed intervention also failed for task=${entry.taskId}:`, interventionErr);
114
+ }
115
+ }
116
+ }
117
+ onSessionGone(entry) {
118
+ // Re-arm may have replaced this entry — ignore stale callback.
119
+ if (this.entries.get(entry.taskId) !== entry)
120
+ return;
121
+ this.entries.delete(entry.taskId);
122
+ if (entry.fired)
123
+ return;
124
+ void this.emitInterventionFireAndForget({
125
+ taskId: entry.taskId,
126
+ projectId: entry.projectId,
127
+ agentId: entry.agentId,
128
+ phase: 'post-approve-marker-session-gone',
129
+ });
130
+ }
131
+ async emitArmFailureIntervention(args, err) {
132
+ await this.emitInterventionFireAndForget({
133
+ taskId: args.taskId,
134
+ projectId: args.projectId,
135
+ agentId: args.agentId,
136
+ phase: 'post-approve-marker-arm-failed',
137
+ error: err instanceof Error ? err.message : String(err),
138
+ });
139
+ }
140
+ async emitInterventionFireAndForget(data) {
141
+ try {
142
+ await this.deps.eventBus.emit({
143
+ id: '',
144
+ type: 'human.intervention',
145
+ timestamp: new Date().toISOString(),
146
+ projectId: data.projectId,
147
+ agentId: data.agentId,
148
+ taskId: data.taskId,
149
+ data: {
150
+ phase: data.phase,
151
+ ...(data.error ? { error: data.error } : {}),
152
+ },
153
+ });
154
+ }
155
+ catch (emitErr) {
156
+ console.warn(`[PostApproveMarkerWatcher] intervention emit (${data.phase}) failed for task=${data.taskId}:`, emitErr);
157
+ }
158
+ }
159
+ }
160
+ //# sourceMappingURL=post-approve-marker-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-approve-marker-watcher.js","sourceRoot":"","sources":["../../src/agent/post-approve-marker-watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CommandRunner } from './runner.js';
2
+ import type { AgentConfig } from '../shared/index.js';
3
+ export interface PreflightResult {
4
+ step: string;
5
+ ok: boolean;
6
+ message: string;
7
+ }
8
+ export declare function runPreflight(runner: CommandRunner, agent: AgentConfig, repo: string): Promise<PreflightResult[]>;
9
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/agent/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,oBAAoB,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAiDD,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,eAAe,EAAE,CAAC,CAmF5B"}