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,164 @@
1
+ import { LocalRunner, buildSshOptions, ensureMuxDir, shellQuote } from './runner.js';
2
+ const CLI_BINARY = {
3
+ 'claude-code': 'claude',
4
+ codex: 'codex',
5
+ };
6
+ const PREFLIGHT_PROBE_TIMEOUT_MS = 5000;
7
+ // login-interactive shells may print banners before `which`; the path is the last line.
8
+ function lastNonEmptyLine(s) {
9
+ const lines = s.split(/\r?\n/);
10
+ for (let i = lines.length - 1; i >= 0; i--) {
11
+ const line = lines[i].trim();
12
+ if (line)
13
+ return line;
14
+ }
15
+ return '';
16
+ }
17
+ async function probeBinary(runner, binary, step, okMessage, failMessage, options = {}) {
18
+ try {
19
+ const result = await runner.exec(`which ${binary}`, {
20
+ ...options,
21
+ timeout: PREFLIGHT_PROBE_TIMEOUT_MS,
22
+ });
23
+ const path = lastNonEmptyLine(result.stdout);
24
+ if (result.exitCode === 0 && path) {
25
+ return { step, ok: true, message: okMessage(path) };
26
+ }
27
+ return { step, ok: false, message: failMessage };
28
+ }
29
+ catch (err) {
30
+ const msg = err instanceof Error ? err.message : String(err);
31
+ return {
32
+ step,
33
+ ok: false,
34
+ message: /timed out/i.test(msg)
35
+ ? `${binary} probe timed out after ${PREFLIGHT_PROBE_TIMEOUT_MS}ms`
36
+ : `${binary} probe failed: ${msg}`,
37
+ };
38
+ }
39
+ }
40
+ export async function runPreflight(runner, agent, repo) {
41
+ const results = [];
42
+ const binary = CLI_BINARY[agent.runtime];
43
+ if (agent.mode === 'remote') {
44
+ if (!agent.host) {
45
+ results.push({ step: 'ssh', ok: false, message: 'Remote agent missing host config' });
46
+ return results;
47
+ }
48
+ const target = agent.host.user ? `${agent.host.user}@${agent.host.hostname}` : agent.host.hostname;
49
+ // `--` guards ssh target values starting with `-`.
50
+ await ensureMuxDir();
51
+ const sshCmd = `ssh ${buildSshOptions()} -- ${shellQuote(target)} echo ok`;
52
+ const sshCheck = await new LocalRunner().exec(sshCmd);
53
+ results.push({
54
+ step: 'ssh',
55
+ ok: sshCheck.exitCode === 0 && sshCheck.stdout.includes('ok'),
56
+ message: sshCheck.exitCode === 0
57
+ ? `SSH to ${target} OK`
58
+ : `Cannot reach ${target} via SSH (BatchMode=yes); check key auth and reachability`,
59
+ });
60
+ if (sshCheck.exitCode !== 0)
61
+ return results;
62
+ }
63
+ // Match the interactive tmux pane shell mode for accurate probes.
64
+ results.push(await probeBinary(runner, binary, 'cli', (path) => `${binary} found at ${path}`, `Please install ${agent.runtime} CLI (${binary})`, { remoteShell: 'login-interactive' }));
65
+ // tmux runs via default login shell; match it.
66
+ results.push(await probeBinary(runner, 'tmux', 'tmux', (path) => `tmux found at ${path}`, 'Please install tmux on the agent host'));
67
+ if (agent.mode === 'remote') {
68
+ results.push(await probeBinary(runner, 'openssl', 'openssl', (path) => `openssl found at ${path}`, 'Please install openssl on the agent host (used to decode skill/task files during injection)'));
69
+ }
70
+ const isAuto = !agent.workdir;
71
+ if (isAuto) {
72
+ await runAutoModePreflight(runner, repo, results);
73
+ }
74
+ else {
75
+ await runManualModePreflight(runner, agent.workdir, repo, results);
76
+ }
77
+ const ghCheck = await runner.exec('gh auth status');
78
+ results.push({
79
+ step: 'gh',
80
+ ok: ghCheck.exitCode === 0,
81
+ message: ghCheck.exitCode === 0 ? 'GitHub CLI authenticated' : 'Run "gh auth login" or set GITHUB_TOKEN',
82
+ });
83
+ const ghRepoCheck = await runner.exec(`gh api repos/${repo}`);
84
+ results.push({
85
+ step: 'gh-repo',
86
+ ok: ghRepoCheck.exitCode === 0,
87
+ message: ghRepoCheck.exitCode === 0
88
+ ? `gh api access to ${repo} OK`
89
+ : `gh api repos/${repo} failed — check token scopes`,
90
+ });
91
+ return results;
92
+ }
93
+ async function runManualModePreflight(runner, workdir, repo, results) {
94
+ const workdirCheck = await runner.exec(`cd ${shellQuote(workdir)} && git rev-parse --is-inside-work-tree`);
95
+ results.push({
96
+ step: 'workdir',
97
+ ok: workdirCheck.exitCode === 0 && workdirCheck.stdout.trim() === 'true',
98
+ message: workdirCheck.exitCode === 0
99
+ ? `${workdir} is a git workdir`
100
+ : `${workdir} is not accessible or not a git repository`,
101
+ });
102
+ const gitCheck = await runner.exec(`git ls-remote https://github.com/${repo}.git HEAD`);
103
+ results.push({
104
+ step: 'git',
105
+ ok: gitCheck.exitCode === 0,
106
+ message: gitCheck.exitCode === 0
107
+ ? 'Git repository accessible'
108
+ : 'Cannot access repository — check SSH key or HTTPS credentials',
109
+ });
110
+ }
111
+ async function runAutoModePreflight(runner, repo, results) {
112
+ const parent = '~/.baxian/repos';
113
+ const absRepoPath = `${parent}/${repo.toLowerCase()}`;
114
+ const mk = await runner.exec(`mkdir -p ${parent} && test -w ${parent}`);
115
+ if (mk.exitCode !== 0) {
116
+ results.push({
117
+ step: 'workdir',
118
+ ok: false,
119
+ message: `Cannot create or write to ${parent}: ${mk.stderr || mk.stdout}`,
120
+ });
121
+ return;
122
+ }
123
+ // Existing auto-mode paths must be git repos.
124
+ const dirCheck = await runner.exec(`test -d ${absRepoPath}`);
125
+ if (dirCheck.exitCode === 0) {
126
+ const gitCheck = await runner.exec(`test -d ${absRepoPath}/.git`);
127
+ if (gitCheck.exitCode !== 0) {
128
+ results.push({
129
+ step: 'workdir',
130
+ ok: false,
131
+ message: `${absRepoPath} exists but is not a git repository — remove it manually before running`,
132
+ });
133
+ return;
134
+ }
135
+ results.push({
136
+ step: 'workdir',
137
+ ok: true,
138
+ message: `${absRepoPath} is a git workdir`,
139
+ });
140
+ }
141
+ else {
142
+ results.push({
143
+ step: 'workdir',
144
+ ok: true,
145
+ message: `${absRepoPath} does not yet exist; will be created by gh repo clone`,
146
+ });
147
+ }
148
+ const proto = await runner.exec('gh config get git_protocol');
149
+ const protocol = proto.stdout.trim() || 'https';
150
+ const lsRemoteUrl = protocol === 'ssh'
151
+ ? `git@github.com:${repo}.git`
152
+ : `https://github.com/${repo}.git`;
153
+ const ls = await runner.exec(`git ls-remote ${shellQuote(lsRemoteUrl)} HEAD`);
154
+ results.push({
155
+ step: 'git',
156
+ ok: ls.exitCode === 0,
157
+ message: ls.exitCode === 0
158
+ ? `git ls-remote (${protocol}) OK`
159
+ : protocol === 'https'
160
+ ? `git ls-remote ${lsRemoteUrl} failed — run "gh auth setup-git" to register the credential helper`
161
+ : `git ls-remote ${lsRemoteUrl} failed — check ~/.ssh config; try "ssh -T git@github.com"`,
162
+ });
163
+ }
164
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/agent/preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type AgentConfig, type AgentRole, type TaskState } from '../shared/index.js';
2
+ import type { SkillRegistry } from '../skill/registry.js';
3
+ import { type ShortMarkerKind } from './marker-protocol.js';
4
+ export declare const BAXIAN_PR_MARKER = "<!-- baxian:managed -->";
5
+ export declare const MAX_PROMPT_BYTES: number;
6
+ export declare const MAX_PROMPT_BYTES_ROUTE_LIMIT: number;
7
+ export declare class PromptSizeError extends Error {
8
+ readonly bytes: number;
9
+ constructor(bytes: number);
10
+ }
11
+ export declare class RequiredSkillsMissingError extends Error {
12
+ readonly missing: string[];
13
+ constructor(missing: string[]);
14
+ }
15
+ export declare function buildSkillsXml(role: AgentRole, phase: string, registry: SkillRegistry, excludeSkills?: readonly string[]): string;
16
+ export interface BuildPromptOpts {
17
+ task: TaskState;
18
+ phase: string;
19
+ agent: AgentConfig;
20
+ worktreePath: string;
21
+ skillRegistry: SkillRegistry;
22
+ postApproveToken?: string;
23
+ specMarkerToken?: string;
24
+ /** findings.json 内容,caller 负责截断到 MAX_INLINE_FINDINGS_BYTES 以下。 */
25
+ specFindings?: string;
26
+ /** Caller-transmitted round — task field is stale during dispatch. */
27
+ currentSpecRound?: number;
28
+ excludeSkills?: readonly string[];
29
+ }
30
+ export declare const MAX_INLINE_FINDINGS_BYTES: number;
31
+ export declare function buildPromptInline(opts: BuildPromptOpts): string;
32
+ declare function buildMarkerEmitBlock(kind: ShortMarkerKind, token: string): string;
33
+ export interface PostMergeCleanupContext {
34
+ prNumber: number;
35
+ taskId: string;
36
+ branch: string;
37
+ }
38
+ export interface PostMergeBranchCleanupResult {
39
+ outcome: 'deleted' | 'absent' | 'failed' | 'skipped';
40
+ detail: string;
41
+ }
42
+ export declare function buildPostMergeCleanupPrompt(ctx: PostMergeCleanupContext, result: PostMergeBranchCleanupResult): string;
43
+ export { buildMarkerEmitBlock };
44
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/agent/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAExG,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAE1D,eAAO,MAAM,gBAAgB,QAAY,CAAC;AAE1C,eAAO,MAAM,4BAA4B,QAA0B,CAAC;AAEpE,qBAAa,eAAgB,SAAQ,KAAK;aACZ,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CAO1C;AAED,qBAAa,0BAA2B,SAAQ,KAAK;aACvB,OAAO,EAAE,MAAM,EAAE;gBAAjB,OAAO,EAAE,MAAM,EAAE;CAQ9C;AAyBD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,aAAa,EACvB,aAAa,GAAE,SAAS,MAAM,EAAO,GACpC,MAAM,CAqBR;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAI1B,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,eAAO,MAAM,yBAAyB,QAAY,CAAC;AAOnD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CA0B/D;AA0ID,iBAAS,oBAAoB,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAO1E;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,uBAAuB,EAC5B,MAAM,EAAE,4BAA4B,GACnC,MAAM,CASR;AAgBD,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,252 @@
1
+ import { AGENT_PHASES } from '../shared/index.js';
2
+ import { buildShortMarker, buildShortMarkerTemplate } from './marker-protocol.js';
3
+ export const BAXIAN_PR_MARKER = '<!-- baxian:managed -->';
4
+ export const MAX_PROMPT_BYTES = 80 * 1024;
5
+ // 1KB margin: preview uses placeholders; real worktree path may be longer at inject.
6
+ export const MAX_PROMPT_BYTES_ROUTE_LIMIT = MAX_PROMPT_BYTES - 1024;
7
+ export class PromptSizeError extends Error {
8
+ bytes;
9
+ constructor(bytes) {
10
+ super(`prompt size ${bytes} bytes exceeds ${MAX_PROMPT_BYTES} limit; ` +
11
+ `reduce task description or remove some skills from AGENT_PHASES`);
12
+ this.bytes = bytes;
13
+ this.name = 'PromptSizeError';
14
+ }
15
+ }
16
+ export class RequiredSkillsMissingError extends Error {
17
+ missing;
18
+ constructor(missing) {
19
+ super(`required skill(s) not found in registry: ${missing.join(', ')}. ` +
20
+ `Check the configured skills.source path and that the directory contains ` +
21
+ `every required skill.`);
22
+ this.missing = missing;
23
+ this.name = 'RequiredSkillsMissingError';
24
+ }
25
+ }
26
+ // Global invariants every dispatch carries, independent of phase. baxian-rules
27
+ // holds backend-state-machine constraints (verdict marker grammar, PR marker,
28
+ // etc.) that must be present even if a phase's AGENT_PHASES entry forgets it.
29
+ const GLOBAL_REQUIRED_SKILLS = ['baxian-rules'];
30
+ const XML_ESCAPE = {
31
+ '&': '&amp;',
32
+ '<': '&lt;',
33
+ '>': '&gt;',
34
+ '"': '&quot;',
35
+ "'": '&apos;',
36
+ };
37
+ function xmlEscapeAttr(value) {
38
+ return value.replace(/[&<>"']/g, c => XML_ESCAPE[c]);
39
+ }
40
+ // CDATA cannot contain `]]>`; split across two sections.
41
+ // Newlines around the fence keep tag boundaries visually separated from content.
42
+ function cdata(content) {
43
+ return `<![CDATA[\n${content.replace(/]]>/g, ']]]]><![CDATA[>')}\n]]>`;
44
+ }
45
+ export function buildSkillsXml(role, phase, registry, excludeSkills = []) {
46
+ const names = registry.skillsForPhase(role, phase);
47
+ const exclude = new Set(excludeSkills);
48
+ const emitted = names.filter(name => !exclude.has(name));
49
+ if (emitted.length === 0)
50
+ return '';
51
+ const skillBlocks = [];
52
+ for (const name of emitted) {
53
+ const def = registry.get(name);
54
+ if (!def)
55
+ continue;
56
+ const fileBlocks = def.files
57
+ .map(file => ` <file path="${xmlEscapeAttr(file.relPath)}">${cdata(file.text)}</file>`)
58
+ .join('\n');
59
+ skillBlocks.push(` <skill>\n` +
60
+ ` <name>${xmlEscapeAttr(def.name)}</name>\n` +
61
+ ` <description>${xmlEscapeAttr(def.description)}</description>\n` +
62
+ ` <files>\n${fileBlocks}\n </files>\n` +
63
+ ` </skill>`);
64
+ }
65
+ return `<skills>\n${skillBlocks.join('\n')}\n</skills>`;
66
+ }
67
+ export const MAX_INLINE_FINDINGS_BYTES = 10 * 1024;
68
+ // Throws PromptSizeError when fullPrompt > MAX_PROMPT_BYTES, or
69
+ // RequiredSkillsMissingError when a global or phase-declared skill cannot be
70
+ // resolved. The phase-declared check exists because skillsForPhase() silently
71
+ // filters missing names — without this fail-fast the prompt would build with
72
+ // silently-degraded behavior and no operator-visible signal.
73
+ export function buildPromptInline(opts) {
74
+ const phaseDeclared = AGENT_PHASES[opts.agent.role]?.[opts.phase]?.skills ?? [];
75
+ const required = [...new Set([...GLOBAL_REQUIRED_SKILLS, ...phaseDeclared])];
76
+ const missing = required.filter(name => !opts.skillRegistry.has(name));
77
+ if (missing.length > 0)
78
+ throw new RequiredSkillsMissingError(missing);
79
+ const skillsXml = buildSkillsXml(opts.agent.role, opts.phase, opts.skillRegistry, opts.excludeSkills);
80
+ const taskBody = buildTaskBody({
81
+ task: opts.task,
82
+ phase: opts.phase,
83
+ role: opts.agent.role,
84
+ worktreePath: opts.worktreePath,
85
+ postApproveToken: opts.postApproveToken,
86
+ specMarkerToken: opts.specMarkerToken,
87
+ specFindings: opts.specFindings,
88
+ currentSpecRound: opts.currentSpecRound,
89
+ });
90
+ const taskBlock = `<task>${cdata(taskBody)}</task>`;
91
+ const fullPrompt = skillsXml ? `${skillsXml}\n${taskBlock}` : taskBlock;
92
+ const bytes = Buffer.byteLength(fullPrompt, 'utf8');
93
+ if (bytes > MAX_PROMPT_BYTES)
94
+ throw new PromptSizeError(bytes);
95
+ return fullPrompt;
96
+ }
97
+ function buildTaskBody(args) {
98
+ const { task, phase, role, worktreePath, postApproveToken, specMarkerToken, specFindings, currentSpecRound, } = args;
99
+ const header = `Phase: ${phase}\nRole: ${role}\nTask ID: ${task.id}\nWorktree: ${worktreePath}\n` +
100
+ `cd into the worktree before any file operations.\n\n`;
101
+ if (phase === 'post_approve' && !postApproveToken) {
102
+ throw new Error('post_approve prompt requires postApproveToken');
103
+ }
104
+ if ((phase === 'spec-review' || phase === 'spec-fix') && !specMarkerToken) {
105
+ throw new Error(`${phase} prompt requires specMarkerToken`);
106
+ }
107
+ // Guard: the rendered prompt must not contain a filled marker literal —
108
+ // PaneStreamer would fire on the prompt itself if the agent verbatim-echoed
109
+ // it. buildMarkerEmitBlock keeps the template (with `<token>` placeholder)
110
+ // and the token on separate lines for exactly this reason.
111
+ const postApproveMarker = postApproveToken
112
+ ? buildShortMarker('post-approve-complete', postApproveToken)
113
+ : undefined;
114
+ const specKind = phase === 'spec-review' ? 'spec-review-complete'
115
+ : phase === 'spec-fix' ? 'spec-fix-complete'
116
+ : phase === 'develop' ? 'spec-ready'
117
+ : undefined;
118
+ const specMarkerLiteral = specMarkerToken && specKind
119
+ ? buildShortMarker(specKind, specMarkerToken)
120
+ : undefined;
121
+ let phaseInstructions = '';
122
+ if (phase === 'post_approve') {
123
+ phaseInstructions = [
124
+ 'Post-approve PR feedback check:',
125
+ '- QA approved this PR. Before it is merged, read the current PR feedback sources again.',
126
+ '- Process every outstanding review comment, review, and issue comment from humans or other agents.',
127
+ '- pr-feedback skill: per-source recency check before replying. Compute T_self = your latest reply timestamp in the source. Respond to EVERY non-self comment with created_at > T_self (consolidate replies if you want, but cover every unhandled item). Apply per review thread and across the flat top-level issue-comment stream. This is the idempotency rule that prevents your own replies from triggering an infinite re-dispatch loop while QA is approved.',
128
+ '- For each item that does need a response, either fix it or reply "Won\'t fix" with a concrete reason.',
129
+ '- If you make code changes, commit and push them; baxian will send the PR back to QA for recheck.',
130
+ '- Before echoing the marker: re-fetch the three feedback sources one more time. The server suppresses redispatches while you are running, so any human comment that arrived during your pass only reaches you through this final re-fetch. If any new non-self item now has created_at > T_self, handle it and re-fetch again. Only echo the marker when a re-fetch returns no unhandled items.',
131
+ '- If no code changes are needed after responding, signal completion and then stop:',
132
+ buildMarkerEmitBlock('post-approve-complete', postApproveToken),
133
+ '- Do not merge the PR yourself from this phase.',
134
+ '',
135
+ ].join('\n');
136
+ }
137
+ else if (phase === 'develop' && specMarkerToken) {
138
+ phaseInstructions = [
139
+ 'Spec review (optional):',
140
+ '- If you want QA to review a written spec before coding, commit + push the spec on this task\'s branch, then signal:',
141
+ buildMarkerEmitBlock('spec-ready', specMarkerToken),
142
+ '- Otherwise you may proceed straight to implementing and opening a PR.',
143
+ '',
144
+ ].join('\n');
145
+ }
146
+ else if (phase === 'spec-review') {
147
+ const round = currentSpecRound ?? task.specReviewRound ?? 1;
148
+ const branch = task.branch ?? '<branch>';
149
+ phaseInstructions = [
150
+ `Spec-review phase (round ${round}):`,
151
+ `- Fetch the task branch (origin/${branch}) and read the spec under docs/spec/${task.id}.md (or wherever dev placed it).`,
152
+ `- Review the spec for completeness, correctness, ambiguity, missing edge cases.`,
153
+ `- Write findings to .baxian/spec-review/round-${round}-findings.json with this schema:`,
154
+ ` { "round": ${round}, "verdict": "approve" | "changes-requested", "findings": [{ "id": "f-1", "severity": "critical"|"major"|"minor", "location": "docs/spec/...md#L10", "message": "..." }] }`,
155
+ `- If verdict is "approve", findings MAY be an empty array.`,
156
+ `- This worktree is checked out in detached HEAD. After committing, push with explicit refspec:`,
157
+ ` git push origin HEAD:${branch}`,
158
+ ` (a plain "git push" has no upstream and will fail.)`,
159
+ `- Then signal completion:`,
160
+ buildMarkerEmitBlock('spec-review-complete', specMarkerToken),
161
+ '',
162
+ ].join('\n');
163
+ }
164
+ else if (phase === 'spec-fix') {
165
+ const round = currentSpecRound ?? task.specReviewRound ?? 1;
166
+ const truncatedFindings = specFindings
167
+ ? truncateFindings(specFindings)
168
+ : undefined;
169
+ phaseInstructions = [
170
+ `Spec-fix phase (round ${round}):`,
171
+ `- Pull the latest task branch and read .baxian/spec-review/round-${round}-findings.json (already cached inline below if present).`,
172
+ `- For each finding decide: "fix" (revise the spec) or "reject" (with rationale).`,
173
+ `- After applying fixes, write a response file at .baxian/spec-review/round-${round}-response.json with this schema:`,
174
+ ` { "round": ${round}, "responses": [{ "findingId": "f-1", "action": "fix"|"reject", "rationale": "..." }] }`,
175
+ `- Commit + push BOTH the revised spec and the response file on this branch.`,
176
+ `- Then signal completion:`,
177
+ buildMarkerEmitBlock('spec-fix-complete', specMarkerToken),
178
+ ...(truncatedFindings
179
+ ? [
180
+ '',
181
+ `findings.json (round ${round})${truncatedFindings.truncated ? ' [truncated, fetch full file from branch]' : ''}:`,
182
+ truncatedFindings.text,
183
+ ]
184
+ : []),
185
+ '',
186
+ ].join('\n');
187
+ }
188
+ else if (phase === 'code') {
189
+ phaseInstructions = [
190
+ 'Code phase:',
191
+ '- Spec is approved. Implement code per the spec under docs/spec/<task-id>.md.',
192
+ '- Commit + push to this task\'s feature branch. Open / update the PR via your normal flow; baxian will route the PR to QA review when ready.',
193
+ '',
194
+ ].join('\n');
195
+ }
196
+ const titleAndBody = `Title: ${task.title}\n\n${task.description}`;
197
+ const body = header + phaseInstructions + titleAndBody;
198
+ if (postApproveMarker && body.includes(postApproveMarker)) {
199
+ throw new Error('post_approve prompt must not contain the complete marker literal');
200
+ }
201
+ if (specMarkerLiteral && body.includes(specMarkerLiteral)) {
202
+ throw new Error(`${phase} prompt must not contain the marker literal`);
203
+ }
204
+ return body;
205
+ }
206
+ function truncateFindings(text) {
207
+ const buf = Buffer.from(text, 'utf8');
208
+ if (buf.byteLength <= MAX_INLINE_FINDINGS_BYTES)
209
+ return { text, truncated: false };
210
+ // 回退到 UTF-8 字符边界,避免截出不可解析的多字节序列。
211
+ let cut = MAX_INLINE_FINDINGS_BYTES;
212
+ while (cut > 0 && (buf[cut] & 0xc0) === 0x80)
213
+ cut--;
214
+ return { text: buf.subarray(0, cut).toString('utf8'), truncated: true };
215
+ }
216
+ // Block agents inline in their reply text. Template contains a `<token>`
217
+ // placeholder and the real token is shown on a separate line — the agent must
218
+ // actively substitute when it decides to emit. This keeps the prompt itself
219
+ // marker-free, so PaneStreamer can't fire on a verbatim echo of these lines.
220
+ function buildMarkerEmitBlock(kind, token) {
221
+ return [
222
+ `- Emit on its own line in your reply, substituting <token>:`,
223
+ ` ${buildShortMarkerTemplate(kind)}`,
224
+ ` token: ${token}`,
225
+ ` Output the filled marker exactly once; do NOT inline it elsewhere.`,
226
+ ].join('\n');
227
+ }
228
+ export function buildPostMergeCleanupPrompt(ctx, result) {
229
+ const status = renderCleanupStatus(ctx.branch, result);
230
+ return [
231
+ `PR #${ctx.prNumber} (task ${ctx.taskId}, branch ${ctx.branch}) has merged.`,
232
+ '',
233
+ status,
234
+ '`/compact` will follow automatically once your runtime is back at the REPL prompt — that is the compression step for this round\'s context.',
235
+ '',
236
+ ].join('\n');
237
+ }
238
+ function renderCleanupStatus(branch, result) {
239
+ switch (result.outcome) {
240
+ case 'deleted':
241
+ return `baxian deleted the merged local feature branch \`${branch}\` from your repo clone (server-side via runner.exec).`;
242
+ case 'absent':
243
+ return `Local feature branch \`${branch}\` was already absent from your repo clone — nothing to clean up.`;
244
+ case 'failed':
245
+ return `WARNING: baxian failed to delete the local feature branch \`${branch}\`: ${result.detail || 'unknown error'}. ` +
246
+ 'Please clean it up manually (e.g. `git worktree prune && git branch -D ' + branch + '`) before the next task picks up this workspace.';
247
+ case 'skipped':
248
+ return `Local feature branch \`${branch}\` was not touched: ${result.detail || 'no repo path available'}.`;
249
+ }
250
+ }
251
+ export { buildMarkerEmitBlock };
252
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/agent/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoD,MAAM,oBAAoB,CAAC;AAEpG,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAwB,MAAM,sBAAsB,CAAC;AAExG,MAAM,CAAC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAE1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC1C,qFAAqF;AACrF,MAAM,CAAC,MAAM,4BAA4B,GAAG,gBAAgB,GAAG,IAAI,CAAC;AAEpE,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACZ;IAA5B,YAA4B,KAAa;QACvC,KAAK,CACH,eAAe,KAAK,kBAAkB,gBAAgB,UAAU;YAChE,iEAAiE,CAClE,CAAC;QAJwB,UAAK,GAAL,KAAK,CAAQ;QAKvC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACvB;IAA5B,YAA4B,OAAiB;QAC3C,KAAK,CACH,4CAA4C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAClE,0EAA0E;YAC1E,uBAAuB,CACxB,CAAC;QALwB,YAAO,GAAP,OAAO,CAAU;QAM3C,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,+EAA+E;AAC/E,8EAA8E;AAC9E,8EAA8E;AAC9E,MAAM,sBAAsB,GAAsB,CAAC,cAAc,CAAC,CAAC;AAEnE,MAAM,UAAU,GAA2B;IACzC,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,QAAQ;CACd,CAAC;AAEF,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,yDAAyD;AACzD,iFAAiF;AACjF,SAAS,KAAK,CAAC,OAAe;IAC5B,OAAO,cAAc,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAe,EACf,KAAa,EACb,QAAuB,EACvB,gBAAmC,EAAE;IAErC,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK;aACzB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,qBAAqB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;aAC3F,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,WAAW,CAAC,IAAI,CACd,aAAa;YACb,aAAa,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW;YAC/C,oBAAoB,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,kBAAkB;YACpE,gBAAgB,UAAU,kBAAkB;YAC5C,YAAY,CACb,CAAC;IACJ,CAAC;IACD,OAAO,aAAa,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AAC1D,CAAC;AAoBD,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnD,gEAAgE;AAChE,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;IAChF,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,sBAAsB,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,cAAc,CAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,EACf,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,aAAa,CACnB,CAAC;IACF,MAAM,QAAQ,GAAG,aAAa,CAAC;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;QACrB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KACxC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,SAAS,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;IACpD,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,KAAK,GAAG,gBAAgB;QAAE,MAAM,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC;AACpB,CAAC;AAaD,SAAS,aAAa,CAAC,IAAkB;IACvC,MAAM,EACJ,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAClE,YAAY,EAAE,gBAAgB,GAC/B,GAAG,IAAI,CAAC;IACT,MAAM,MAAM,GAAG,UAAU,KAAK,WAAW,IAAI,cAAc,IAAI,CAAC,EAAE,eAAe,YAAY,IAAI;QAC/F,sDAAsD,CAAC;IACzD,IAAI,KAAK,KAAK,cAAc,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC;IAC9D,CAAC;IACD,wEAAwE;IACxE,4EAA4E;IAC5E,2EAA2E;IAC3E,2DAA2D;IAC3D,MAAM,iBAAiB,GAAG,gBAAgB;QACxC,CAAC,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,gBAAgB,CAAC;QAC7D,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,QAAQ,GACZ,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,sBAAsB;QAChD,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,mBAAmB;YAC5C,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY;gBACpC,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,iBAAiB,GAAG,eAAe,IAAI,QAAQ;QACnD,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,eAAe,CAAC;QAC7C,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAC3B,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;QAC7B,iBAAiB,GAAG;YAClB,iCAAiC;YACjC,yFAAyF;YACzF,oGAAoG;YACpG,qcAAqc;YACrc,wGAAwG;YACxG,mGAAmG;YACnG,iYAAiY;YACjY,oFAAoF;YACpF,oBAAoB,CAAC,uBAAuB,EAAE,gBAAiB,CAAC;YAChE,iDAAiD;YACjD,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,KAAK,KAAK,SAAS,IAAI,eAAe,EAAE,CAAC;QAClD,iBAAiB,GAAG;YAClB,yBAAyB;YACzB,sHAAsH;YACtH,oBAAoB,CAAC,YAAY,EAAE,eAAe,CAAC;YACnD,wEAAwE;YACxE,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,gBAAgB,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;QACzC,iBAAiB,GAAG;YAClB,4BAA4B,KAAK,IAAI;YACrC,mCAAmC,MAAM,uCAAuC,IAAI,CAAC,EAAE,kCAAkC;YACzH,iFAAiF;YACjF,iDAAiD,KAAK,kCAAkC;YACxF,gBAAgB,KAAK,4KAA4K;YACjM,4DAA4D;YAC5D,gGAAgG;YAChG,0BAA0B,MAAM,EAAE;YAClC,uDAAuD;YACvD,2BAA2B;YAC3B,oBAAoB,CAAC,sBAAsB,EAAE,eAAgB,CAAC;YAC9D,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,gBAAgB,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;QAC5D,MAAM,iBAAiB,GAAG,YAAY;YACpC,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAC;YAChC,CAAC,CAAC,SAAS,CAAC;QACd,iBAAiB,GAAG;YAClB,yBAAyB,KAAK,IAAI;YAClC,oEAAoE,KAAK,0DAA0D;YACnI,kFAAkF;YAClF,8EAA8E,KAAK,kCAAkC;YACrH,gBAAgB,KAAK,yFAAyF;YAC9G,6EAA6E;YAC7E,2BAA2B;YAC3B,oBAAoB,CAAC,mBAAmB,EAAE,eAAgB,CAAC;YAC3D,GAAG,CAAC,iBAAiB;gBACnB,CAAC,CAAC;oBACE,EAAE;oBACF,wBAAwB,KAAK,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,EAAE,GAAG;oBAClH,iBAAiB,CAAC,IAAI;iBACvB;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC5B,iBAAiB,GAAG;YAClB,aAAa;YACb,+EAA+E;YAC/E,8IAA8I;YAC9I,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IACnE,MAAM,IAAI,GAAG,MAAM,GAAG,iBAAiB,GAAG,YAAY,CAAC;IACvD,IAAI,iBAAiB,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,iBAAiB,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,6CAA6C,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,GAAG,CAAC,UAAU,IAAI,yBAAyB;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnF,iCAAiC;IACjC,IAAI,GAAG,GAAG,yBAAyB,CAAC;IACpC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,GAAG,IAAI,CAAC,KAAK,IAAI;QAAE,GAAG,EAAE,CAAC;IACrD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,yEAAyE;AACzE,8EAA8E;AAC9E,4EAA4E;AAC5E,6EAA6E;AAC7E,SAAS,oBAAoB,CAAC,IAAqB,EAAE,KAAa;IAChE,OAAO;QACL,6DAA6D;QAC7D,OAAO,wBAAwB,CAAC,IAAI,CAAC,EAAE;QACvC,YAAY,KAAK,EAAE;QACnB,sEAAsE;KACvE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAaD,MAAM,UAAU,2BAA2B,CACzC,GAA4B,EAC5B,MAAoC;IAEpC,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO;QACL,OAAO,GAAG,CAAC,QAAQ,UAAU,GAAG,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,eAAe;QAC5E,EAAE;QACF,MAAM;QACN,6IAA6I;QAC7I,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc,EAAE,MAAoC;IAC/E,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,SAAS;YACZ,OAAO,oDAAoD,MAAM,wDAAwD,CAAC;QAC5H,KAAK,QAAQ;YACX,OAAO,0BAA0B,MAAM,mEAAmE,CAAC;QAC7G,KAAK,QAAQ;YACX,OAAO,+DAA+D,MAAM,OAAO,MAAM,CAAC,MAAM,IAAI,eAAe,IAAI;gBACrH,yEAAyE,GAAG,MAAM,GAAG,kDAAkD,CAAC;QAC5I,KAAK,SAAS;YACZ,OAAO,0BAA0B,MAAM,uBAAuB,MAAM,CAAC,MAAM,IAAI,wBAAwB,GAAG,CAAC;IAC/G,CAAC;AACH,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { CommandRunner } from './runner.js';
2
+ import type { AgentMode, HostConfig } from '../shared/index.js';
3
+ export interface RepoStoreCache {
4
+ homes: Map<string, string>;
5
+ mutex: Map<string, Promise<unknown>>;
6
+ lastFetchAt: Map<string, number>;
7
+ }
8
+ export declare function createRepoStoreCache(): RepoStoreCache;
9
+ export declare function normalizeRepoUrl(url: string): string | null;
10
+ export declare class RepoStore {
11
+ private runner;
12
+ private repoSlug;
13
+ private mode;
14
+ private host;
15
+ private cache;
16
+ constructor(runner: CommandRunner, repoSlug: string, mode: AgentMode, host: HostConfig | undefined, cache: RepoStoreCache);
17
+ ensure(): Promise<string>;
18
+ refresh(absRepoPath: string): Promise<void>;
19
+ readFileFromBranch(absRepoPath: string, branch: string, filePath: string): Promise<string | null>;
20
+ private hostKey;
21
+ private resolveAbsPath;
22
+ private resolveHome;
23
+ private cloneIfNeeded;
24
+ private fetchIfStale;
25
+ private runUnderMutex;
26
+ }
27
+ //# sourceMappingURL=repo-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-store.d.ts","sourceRoot":"","sources":["../../src/agent/repo-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAErD;AAMD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS3D;AAID,qBAAa,SAAS;IAElB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,KAAK;gBAJL,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,UAAU,GAAG,SAAS,EAC5B,KAAK,EAAE,cAAc;IAGzB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAUzB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiCzB,OAAO,CAAC,OAAO;YASD,cAAc;YAMd,WAAW;YAoBX,aAAa;YAuCb,YAAY;YAaZ,aAAa;CAM5B"}