baxian 1.2.53 → 1.2.55

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 (98) hide show
  1. package/dist/agent/bootstrap-poller.d.ts +2 -1
  2. package/dist/agent/bootstrap-poller.d.ts.map +1 -1
  3. package/dist/agent/bootstrap-poller.js +3 -1
  4. package/dist/agent/bootstrap-poller.js.map +1 -1
  5. package/dist/agent/bootstrap.d.ts +1 -1
  6. package/dist/agent/bootstrap.d.ts.map +1 -1
  7. package/dist/agent/bootstrap.js +12 -19
  8. package/dist/agent/bootstrap.js.map +1 -1
  9. package/dist/agent/branch.d.ts +64 -0
  10. package/dist/agent/branch.d.ts.map +1 -0
  11. package/dist/agent/branch.js +386 -0
  12. package/dist/agent/branch.js.map +1 -0
  13. package/dist/agent/detect/manifests/claude-code.json +2 -2
  14. package/dist/agent/detect/manifests/opencode.json +44 -0
  15. package/dist/agent/detect/manifests/qodercli.json +49 -0
  16. package/dist/agent/detect/region.d.ts +1 -0
  17. package/dist/agent/detect/region.d.ts.map +1 -1
  18. package/dist/agent/detect/region.js +27 -19
  19. package/dist/agent/detect/region.js.map +1 -1
  20. package/dist/agent/lineage.d.ts +1 -1
  21. package/dist/agent/lineage.d.ts.map +1 -1
  22. package/dist/agent/lineage.js +6 -7
  23. package/dist/agent/lineage.js.map +1 -1
  24. package/dist/agent/manager.d.ts +13 -9
  25. package/dist/agent/manager.d.ts.map +1 -1
  26. package/dist/agent/manager.js +1071 -426
  27. package/dist/agent/manager.js.map +1 -1
  28. package/dist/agent/preflight.d.ts.map +1 -1
  29. package/dist/agent/preflight.js +21 -15
  30. package/dist/agent/preflight.js.map +1 -1
  31. package/dist/agent/prompt.d.ts +2 -2
  32. package/dist/agent/prompt.d.ts.map +1 -1
  33. package/dist/agent/prompt.js +9 -7
  34. package/dist/agent/prompt.js.map +1 -1
  35. package/dist/agent/repo-store.d.ts +8 -4
  36. package/dist/agent/repo-store.d.ts.map +1 -1
  37. package/dist/agent/repo-store.js +142 -54
  38. package/dist/agent/repo-store.js.map +1 -1
  39. package/dist/agent/review-transport.d.ts +6 -4
  40. package/dist/agent/review-transport.d.ts.map +1 -1
  41. package/dist/agent/review-transport.js +39 -13
  42. package/dist/agent/review-transport.js.map +1 -1
  43. package/dist/agent/runner.d.ts +1 -0
  44. package/dist/agent/runner.d.ts.map +1 -1
  45. package/dist/agent/runner.js +5 -0
  46. package/dist/agent/runner.js.map +1 -1
  47. package/dist/agent/tmux-probe-poller.d.ts.map +1 -1
  48. package/dist/agent/tmux-probe-poller.js +2 -0
  49. package/dist/agent/tmux-probe-poller.js.map +1 -1
  50. package/dist/agent/tmux.d.ts +2 -1
  51. package/dist/agent/tmux.d.ts.map +1 -1
  52. package/dist/agent/tmux.js +73 -7
  53. package/dist/agent/tmux.js.map +1 -1
  54. package/dist/api/probe.d.ts.map +1 -1
  55. package/dist/api/probe.js +9 -1
  56. package/dist/api/probe.js.map +1 -1
  57. package/dist/api/projects.d.ts.map +1 -1
  58. package/dist/api/projects.js +228 -56
  59. package/dist/api/projects.js.map +1 -1
  60. package/dist/config/validator.d.ts.map +1 -1
  61. package/dist/config/validator.js +58 -8
  62. package/dist/config/validator.js.map +1 -1
  63. package/dist/event/server-handlers.js +8 -8
  64. package/dist/event/server-handlers.js.map +1 -1
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +1 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/shared/constants.d.ts +0 -1
  69. package/dist/shared/constants.d.ts.map +1 -1
  70. package/dist/shared/constants.js +0 -1
  71. package/dist/shared/constants.js.map +1 -1
  72. package/dist/shared/types.d.ts +15 -4
  73. package/dist/shared/types.d.ts.map +1 -1
  74. package/dist/shared/types.js.map +1 -1
  75. package/dist/skills/baxian-pr-feedback/SKILL.md +1 -1
  76. package/dist/skills/baxian-pr-recheck/SKILL.md +1 -1
  77. package/dist/skills/baxian-pr-review/SKILL.md +1 -1
  78. package/dist/skills/baxian-server-feedback/SKILL.md +4 -4
  79. package/dist/skills/baxian-server-review/SKILL.md +7 -7
  80. package/dist/skills/baxian-signals/SKILL.md +3 -1
  81. package/dist/skills/baxian-task-check/SKILL.md +4 -4
  82. package/dist/state/agent-store.js +4 -4
  83. package/dist/state/agent-store.js.map +1 -1
  84. package/dist/state/lock.d.ts +15 -2
  85. package/dist/state/lock.d.ts.map +1 -1
  86. package/dist/state/lock.js +104 -21
  87. package/dist/state/lock.js.map +1 -1
  88. package/dist/state/task-store.d.ts.map +1 -1
  89. package/dist/state/task-store.js +5 -2
  90. package/dist/state/task-store.js.map +1 -1
  91. package/dist/web/assets/index-BmnSiyut.js +13 -0
  92. package/dist/web/index.html +1 -1
  93. package/package.json +1 -1
  94. package/dist/agent/worktree.d.ts +0 -32
  95. package/dist/agent/worktree.d.ts.map +0 -1
  96. package/dist/agent/worktree.js +0 -291
  97. package/dist/agent/worktree.js.map +0 -1
  98. package/dist/web/assets/index-DAPd4Nv_.js +0 -13
@@ -1,31 +1,72 @@
1
1
  import { homedir } from 'node:os';
2
- import { shellQuote, hostGroupKey } from './runner.js';
2
+ import { shellQuote, hostGroupKey, workdirHostGroupKey } from './runner.js';
3
3
  import { CLONE_EXEC_TIMEOUT_MS, GIT_NET_ENV, execNetwork } from './net-exec.js';
4
- import { isGitHubRepo, isSafeGitHost, normalizeRepoUrl, parseGitRemote, redactGitCredentials, repoSlug } from '../shared/index.js';
4
+ import { isGitHubRepo, normalizeRepoUrl, parseGitRemote, redactGitCredentials, repoSlug } from '../shared/index.js';
5
5
  export function createRepoStoreCache() {
6
- return { homes: new Map(), mutex: new Map(), lastFetchAt: new Map() };
6
+ return { homes: new Map(), mutex: new Map(), lastFetchAt: new Map(), owners: new Map() };
7
7
  }
8
8
  const FETCH_THROTTLE_MS = 30_000;
9
+ const BAXIAN_RUNTIME_DIRS = [
10
+ '.baxian',
11
+ '.baxian/review',
12
+ '.baxian/review/inbox',
13
+ '.baxian/review-inbox',
14
+ ];
15
+ export async function ensureBaxianRuntimeDirsSafe(runner, absRepoPath) {
16
+ const path = shellQuote(absRepoPath);
17
+ const tracked = await runner.exec(`git -C ${path} ls-files -- .baxian`);
18
+ if (tracked.exitCode !== 0) {
19
+ throw new Error(`Failed to inspect tracked .baxian paths in ${absRepoPath}: ${tracked.stderr}`);
20
+ }
21
+ if (tracked.stdout.trim()) {
22
+ throw new Error(`Workdir ${absRepoPath} tracks .baxian paths; baxian runtime files would modify project content.`);
23
+ }
24
+ const dirs = BAXIAN_RUNTIME_DIRS.map(dir => `${absRepoPath}/${dir}`);
25
+ const operands = dirs.map(shellQuote).join(' ');
26
+ const command = `for p in ${operands}; do ` +
27
+ `if [ -L "$p" ] || { [ -e "$p" ] && [ ! -d "$p" ]; }; then exit 9; fi; ` +
28
+ `done && mkdir -p ${operands} && ` +
29
+ `for p in ${operands}; do [ -d "$p" ] && [ ! -L "$p" ] || exit 9; done`;
30
+ const result = await runner.exec(`sh -c ${shellQuote(command)}`);
31
+ if (result.exitCode !== 0) {
32
+ throw new Error(`Workdir ${absRepoPath} has an unsafe .baxian runtime path; ` +
33
+ `baxian requires real directories contained in the Workdir.`);
34
+ }
35
+ }
9
36
  export class RepoStore {
10
37
  runner;
11
38
  mode;
12
39
  host;
13
40
  cache;
41
+ agentId;
42
+ configuredWorkdir;
14
43
  isGitHub;
15
44
  repo;
16
- constructor(runner, repo, mode, host, cache) {
45
+ constructor(runner, repo, mode, host, cache, agentId, configuredWorkdir) {
17
46
  this.runner = runner;
18
47
  this.mode = mode;
19
48
  this.host = host;
20
49
  this.cache = cache;
50
+ this.agentId = agentId;
51
+ this.configuredWorkdir = configuredWorkdir;
21
52
  this.repo = repo.trim();
22
53
  this.isGitHub = isGitHubRepo(this.repo);
23
54
  }
24
55
  async ensure() {
25
56
  const absRepoPath = await this.resolveAbsPath();
26
- const cacheKey = `${this.hostKey()}:${absRepoPath}`;
57
+ const ownerKey = `${this.workdirHostKey()}:${absRepoPath}`;
58
+ const cacheKey = `${this.hostKey()}:${absRepoPath}:${this.agentId}`;
59
+ const owner = this.cache.owners.get(ownerKey);
60
+ if (owner && owner !== this.agentId) {
61
+ throw new Error(`Workdir ${absRepoPath} on ${this.hostKey()} is already owned by agent "${owner}"; ` +
62
+ `different agents must not share a directory.`);
63
+ }
64
+ this.cache.owners.set(ownerKey, this.agentId);
27
65
  return this.runUnderMutex(cacheKey, async () => {
28
66
  const originChanged = await this.cloneIfNeeded(absRepoPath);
67
+ await this.validateClone(absRepoPath);
68
+ await ensureBaxianRuntimeDirsSafe(this.runner, absRepoPath);
69
+ await this.ensureBaxianExcluded(absRepoPath);
29
70
  if (originChanged)
30
71
  this.cache.lastFetchAt.delete(cacheKey);
31
72
  await this.fetchIfStale(cacheKey, absRepoPath);
@@ -33,7 +74,7 @@ export class RepoStore {
33
74
  });
34
75
  }
35
76
  async refresh(absRepoPath) {
36
- const cacheKey = `${this.hostKey()}:${absRepoPath}`;
77
+ const cacheKey = `${this.hostKey()}:${absRepoPath}:${this.agentId}`;
37
78
  await this.runUnderMutex(cacheKey, () => this.fetchIfStale(cacheKey, absRepoPath));
38
79
  }
39
80
  hostKey() {
@@ -43,12 +84,27 @@ export class RepoStore {
43
84
  throw new Error('Remote mode requires host config');
44
85
  return hostGroupKey(this.mode, this.host);
45
86
  }
87
+ workdirHostKey() {
88
+ if (this.mode === 'local')
89
+ return 'local';
90
+ if (!this.host)
91
+ throw new Error('Remote mode requires host config');
92
+ return workdirHostGroupKey(this.mode, this.host);
93
+ }
46
94
  async resolveAbsPath() {
47
- const home = await this.resolveHome();
48
- if (this.isGitHub) {
49
- return `${home}/.baxian/repos/${repoSlug(this.repo).toLowerCase()}`;
95
+ if (this.configuredWorkdir) {
96
+ if (!this.configuredWorkdir.startsWith('/')) {
97
+ throw new Error(`Workdir must be an absolute path: ${this.configuredWorkdir}`);
98
+ }
99
+ const result = await this.runner.exec(`cd ${shellQuote(this.configuredWorkdir)} 2>/dev/null && pwd -P`);
100
+ if (result.exitCode !== 0 || result.stdout.trim() === '') {
101
+ throw new Error(`Configured Workdir ${this.configuredWorkdir} does not exist or is not accessible; ` +
102
+ `baxian never creates a user-specified Workdir implicitly.`);
103
+ }
104
+ return result.stdout.trim();
50
105
  }
51
- return `${home}/.baxian/${nonGitHubSubpath(this.repo)}`;
106
+ const home = await this.resolveHome();
107
+ return `${home}/.baxian/agents/${this.agentId}/repo`;
52
108
  }
53
109
  async resolveHome() {
54
110
  const key = this.hostKey();
@@ -56,7 +112,11 @@ export class RepoStore {
56
112
  const cached = this.cache.homes.get(key);
57
113
  if (cached)
58
114
  return cached;
59
- const home = homedir();
115
+ const result = await this.runner.exec(`cd ${shellQuote(homedir())} && pwd -P`);
116
+ if (result.exitCode !== 0 || !result.stdout.trim()) {
117
+ throw new Error(`Failed to canonicalize local home ${homedir()}: ${result.stderr}`);
118
+ }
119
+ const home = result.stdout.trim();
60
120
  this.cache.homes.set(key, home);
61
121
  return home;
62
122
  }
@@ -67,22 +127,28 @@ export class RepoStore {
67
127
  if (result.exitCode !== 0 || !result.stdout) {
68
128
  throw new Error(`Failed to resolve $HOME on ${key}: ${result.stderr}`);
69
129
  }
70
- const home = result.stdout.trim();
130
+ const canonical = await this.runner.exec(`cd ${shellQuote(result.stdout.trim())} && pwd -P`);
131
+ if (canonical.exitCode !== 0 || !canonical.stdout.trim()) {
132
+ throw new Error(`Failed to canonicalize $HOME on ${key}: ${canonical.stderr}`);
133
+ }
134
+ const home = canonical.stdout.trim();
71
135
  this.cache.homes.set(key, home);
72
136
  return home;
73
137
  }
74
138
  async cloneIfNeeded(absRepoPath) {
75
139
  const dirExists = (await this.runner.exec(`test -d ${shellQuote(absRepoPath)}`)).exitCode === 0;
76
140
  if (!dirExists) {
141
+ if (this.configuredWorkdir) {
142
+ throw new Error(`Configured Workdir ${absRepoPath} does not exist; ` +
143
+ `baxian never creates a user-specified Workdir implicitly.`);
144
+ }
77
145
  const parent = absRepoPath.replace(/\/[^/]+$/, '');
78
146
  const mk = await this.runner.exec(`mkdir -p ${shellQuote(parent)}`);
79
147
  if (mk.exitCode !== 0)
80
148
  throw new Error(`Failed to mkdir ${parent}: ${mk.stderr}`);
81
- // Bare store: no checkout for an agent REPL to contaminate — every task must
82
- // work through its own worktree, and stray git commands in the store dir fail.
83
149
  const cloneCmd = this.isGitHub
84
- ? `${GIT_NET_ENV} gh repo clone ${shellQuote(repoSlug(this.repo))} ${shellQuote(absRepoPath)} --no-upstream -- --bare`
85
- : `${GIT_NET_ENV} git clone --bare ${shellQuote(this.repo)} ${shellQuote(absRepoPath)}`;
150
+ ? `${GIT_NET_ENV} gh repo clone ${shellQuote(repoSlug(this.repo))} ${shellQuote(absRepoPath)} --no-upstream`
151
+ : `${GIT_NET_ENV} git clone ${shellQuote(this.repo)} ${shellQuote(absRepoPath)}`;
86
152
  let clone;
87
153
  try {
88
154
  clone = await execNetwork(this.runner, cloneCmd, {
@@ -99,39 +165,67 @@ export class RepoStore {
99
165
  const cmd = this.isGitHub ? 'gh repo clone' : 'git clone';
100
166
  throw new Error(redactGitCredentials(`${cmd} ${this.repo} failed: ${clone.stderr || clone.stdout}`));
101
167
  }
102
- await this.installFetchRefspec(absRepoPath);
103
168
  if (this.isGitHub && parseGitRemote(this.repo) !== null) {
104
169
  return this.syncMatchingOriginUrl(absRepoPath);
105
170
  }
106
171
  return false;
107
172
  }
108
- // resolve-git-dir validates the directory itself (bare, or its .git for a
109
- // working-tree clone) without git's upward discovery — `git -C <dir> rev-parse`
110
- // would happily match an ancestor repo (e.g. a dotfiles repo in $HOME).
111
- const isRepo = (await this.runner.exec(`git rev-parse --resolve-git-dir ${shellQuote(absRepoPath)} || ` +
112
- `git rev-parse --resolve-git-dir ${shellQuote(`${absRepoPath}/.git`)}`)).exitCode === 0;
173
+ const isRepo = (await this.runner.exec(`git rev-parse --resolve-git-dir ${shellQuote(`${absRepoPath}/.git`)}`)).exitCode === 0;
113
174
  if (!isRepo) {
175
+ const discovered = await this.runner.exec(`git -C ${shellQuote(absRepoPath)} rev-parse --show-toplevel`);
176
+ if (discovered.exitCode === 0) {
177
+ throw new Error(`Workdir ${absRepoPath} must be the repository's exact top-level directory, not a subdirectory.`);
178
+ }
179
+ const bare = await this.runner.exec(`git rev-parse --resolve-git-dir ${shellQuote(absRepoPath)}`);
180
+ if (bare.exitCode === 0) {
181
+ throw new Error(`Workdir ${absRepoPath} must be a non-bare Git clone.`);
182
+ }
114
183
  throw new Error(`${absRepoPath} exists but is not a git repository. Remove it manually or change project.repo.`);
115
184
  }
116
- await this.ensureFetchRefspec(absRepoPath);
117
185
  return this.syncMatchingOriginUrl(absRepoPath);
118
186
  }
119
- async ensureFetchRefspec(absRepoPath) {
120
- // A bare store created outside cloneIfNeeded (e.g. a manual `git clone --bare`)
121
- // has no fetch refspec, so fetch never updates origin/* and origin/HEAD stays
122
- // unresolvable — a dead end `set-head --auto` cannot fix. Install only when
123
- // absent; a deliberate custom refspec is left alone.
124
- const existing = await this.runner.exec(`git -C ${shellQuote(absRepoPath)} config --get-all remote.origin.fetch`);
125
- if (existing.exitCode === 0 && existing.stdout.trim() !== '')
126
- return;
127
- await this.installFetchRefspec(absRepoPath);
187
+ async validateClone(absRepoPath) {
188
+ const path = shellQuote(absRepoPath);
189
+ const top = await this.runner.exec(`git -C ${path} rev-parse --show-toplevel`);
190
+ if (top.exitCode !== 0 || top.stdout.trim() === '') {
191
+ throw new Error(`${absRepoPath} is not a working-tree Git repository.`);
192
+ }
193
+ const canonicalTop = await this.runner.exec(`cd ${shellQuote(top.stdout.trim())} && pwd -P`);
194
+ if (canonicalTop.exitCode !== 0 || canonicalTop.stdout.trim() !== absRepoPath) {
195
+ throw new Error(`Workdir ${absRepoPath} must be the repository's exact top-level directory, not a subdirectory.`);
196
+ }
197
+ const bare = await this.runner.exec(`git -C ${path} rev-parse --is-bare-repository`);
198
+ if (bare.exitCode !== 0 || bare.stdout.trim() !== 'false') {
199
+ throw new Error(`Workdir ${absRepoPath} must be a non-bare Git clone.`);
200
+ }
201
+ const independent = await this.runner.exec(`test -d ${shellQuote(`${absRepoPath}/.git`)} && ` +
202
+ `test "$(git -C ${path} rev-parse --git-common-dir)" = .git && ` +
203
+ `test ! -s ${shellQuote(`${absRepoPath}/.git/objects/info/alternates`)}`);
204
+ if (independent.exitCode !== 0) {
205
+ throw new Error(`Workdir ${absRepoPath} must be an independent ordinary clone, not a linked worktree or alternates-based clone.`);
206
+ }
207
+ const writable = await this.runner.exec(`test -r ${path} -a -w ${path} -a -x ${path}`);
208
+ if (writable.exitCode !== 0) {
209
+ throw new Error(`Workdir ${absRepoPath} is not readable and writable by the agent host user.`);
210
+ }
211
+ const metadata = await this.runner.exec(`git -C ${path} rev-parse --git-dir HEAD >/dev/null`);
212
+ if (metadata.exitCode !== 0) {
213
+ throw new Error(`Workdir ${absRepoPath} has unreadable Git metadata or HEAD.`);
214
+ }
215
+ const remoteRefs = await this.runner.exec(`git -C ${path} for-each-ref --format=${shellQuote('%(refname)')} --count=1 refs/remotes/`);
216
+ if (remoteRefs.exitCode !== 0 || remoteRefs.stdout.trim() === '') {
217
+ throw new Error(`Workdir ${absRepoPath} has no readable remote-tracking refs.`);
218
+ }
128
219
  }
129
- async installFetchRefspec(absRepoPath) {
130
- // git clone --bare configures no remote-tracking refspec; without it fetch
131
- // never updates refs/remotes/origin/* and origin/HEAD stays unresolvable.
132
- const result = await this.runner.exec(`git -C ${shellQuote(absRepoPath)} config remote.origin.fetch ${shellQuote('+refs/heads/*:refs/remotes/origin/*')}`);
133
- if (result.exitCode !== 0) {
134
- throw new Error(`Failed to install fetch refspec at ${absRepoPath}: ${result.stderr}`);
220
+ async ensureBaxianExcluded(absRepoPath) {
221
+ const path = shellQuote(absRepoPath);
222
+ const command = `cd ${path} && p="$(git rev-parse --git-path info/exclude)" && ` +
223
+ `mkdir -p "$(dirname "$p")" && ` +
224
+ `{ grep -qxF '.baxian/' "$p" 2>/dev/null || printf '%s\\n' '.baxian/' >> "$p"; } && ` +
225
+ `git check-ignore -q -- .baxian/__probe__`;
226
+ const excluded = await this.runner.exec(`sh -c ${shellQuote(command)}`);
227
+ if (excluded.exitCode !== 0) {
228
+ throw new Error(`Failed to make .baxian runtime files invisible to Git in ${absRepoPath}.`);
135
229
  }
136
230
  }
137
231
  async syncMatchingOriginUrl(absRepoPath) {
@@ -143,6 +237,8 @@ export class RepoStore {
143
237
  if (!this.originMatches(originUrl)) {
144
238
  throw new Error(redactGitCredentials(`Existing repo at ${absRepoPath} has origin "${originUrl}" which does not match project.repo "${this.repo}". Remove the directory or change project.repo.`));
145
239
  }
240
+ if (this.configuredWorkdir)
241
+ return false;
146
242
  return this.syncOriginUrl(absRepoPath, originUrl);
147
243
  }
148
244
  async syncOriginUrl(absRepoPath, originUrl) {
@@ -174,32 +270,24 @@ export class RepoStore {
174
270
  const last = this.cache.lastFetchAt.get(cacheKey) ?? 0;
175
271
  if (Date.now() - last < FETCH_THROTTLE_MS)
176
272
  return;
177
- const result = await execNetwork(this.runner, `cd ${shellQuote(absRepoPath)} && ${GIT_NET_ENV} git fetch --all --prune && (git remote set-head origin --auto || true)`);
273
+ const result = await execNetwork(this.runner, `cd ${shellQuote(absRepoPath)} && ${GIT_NET_ENV} git fetch --all --prune && git remote set-head origin --auto`);
178
274
  if (result.exitCode !== 0) {
179
- throw new Error(`git fetch failed at ${absRepoPath}: ${result.stderr}`);
275
+ throw new Error(`git fetch failed or origin/HEAD could not be refreshed at ${absRepoPath}: ${result.stderr}`);
180
276
  }
181
277
  this.cache.lastFetchAt.set(cacheKey, Date.now());
182
278
  }
183
279
  async runUnderMutex(key, fn) {
184
280
  const prev = this.cache.mutex.get(key) ?? Promise.resolve();
185
281
  const cur = prev.then(fn, fn);
186
- this.cache.mutex.set(key, cur.then(() => undefined, () => undefined));
282
+ const settled = cur.then(() => undefined, () => undefined);
283
+ this.cache.mutex.set(key, settled);
284
+ void settled.finally(() => {
285
+ if (this.cache.mutex.get(key) === settled)
286
+ this.cache.mutex.delete(key);
287
+ });
187
288
  return cur;
188
289
  }
189
290
  }
190
- export function nonGitHubSubpath(repo) {
191
- const parsed = parseGitRemote(repo);
192
- if (!parsed)
193
- throw new Error(`cannot derive local path for non-GitHub repo "${repo}"`);
194
- if (!isSafeGitHost(parsed.host)) {
195
- throw new Error(`refusing unsafe host in repo "${repo}"`);
196
- }
197
- const segments = parsed.path.split('/');
198
- if (segments.some(s => s === '' || s === '.' || s === '..')) {
199
- throw new Error(`refusing unsafe path segment in repo "${repo}"`);
200
- }
201
- return `repos-ext/${parsed.host.replace(/:/g, '_')}/${segments.join('/')}`;
202
- }
203
291
  function urlScheme(url) {
204
292
  if (/^https:\/\//i.test(url))
205
293
  return 'https';
@@ -1 +1 @@
1
- {"version":3,"file":"repo-store.js","sourceRoot":"","sources":["../../src/agent/repo-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEhF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAQnI,MAAM,UAAU,oBAAoB;IAClC,OAAO,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,MAAM,OAAO,SAAS;IAKV;IAEA;IACA;IACA;IARO,QAAQ,CAAU;IAClB,IAAI,CAAS;IAE9B,YACU,MAAqB,EAC7B,IAAY,EACJ,IAAe,EACf,IAA4B,EAC5B,KAAqB;QAJrB,WAAM,GAAN,MAAM,CAAe;QAErB,SAAI,GAAJ,IAAI,CAAW;QACf,SAAI,GAAJ,IAAI,CAAwB;QAC5B,UAAK,GAAL,KAAK,CAAgB;QAE7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,WAAW,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAC5D,IAAI,aAAa;gBAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3D,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC/C,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,WAAmB;QAC/B,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,WAAW,EAAE,CAAC;QACpD,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IACrF,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,OAAO,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACpE,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,GAAG,IAAI,kBAAkB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACtE,CAAC;QACD,OAAO,GAAG,IAAI,YAAY,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;YAC1B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,WAAmB;QAC7C,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;QAEhG,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpE,IAAI,EAAE,CAAC,QAAQ,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;YAClF,6EAA6E;YAC7E,+EAA+E;YAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;gBAC5B,CAAC,CAAC,GAAG,WAAW,kBAAkB,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,0BAA0B;gBACtH,CAAC,CAAC,GAAG,WAAW,qBAAqB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1F,IAAI,KAAiB,CAAC;YACtB,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;oBAC/C,OAAO,EAAE,qBAAqB;oBAC9B,OAAO,EAAE,CAAC;iBACX,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;gBAC3C,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;gBAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,YAAY,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACvG,CAAC;YACD,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAC5C,IAAI,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACxD,OAAO,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0EAA0E;QAC1E,gFAAgF;QAChF,wEAAwE;QACxE,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACpC,mCAAmC,UAAU,CAAC,WAAW,CAAC,MAAM;YAChE,mCAAmC,UAAU,CAAC,GAAG,WAAW,OAAO,CAAC,EAAE,CACvE,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,GAAG,WAAW,iFAAiF,CAChG,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,WAAmB;QAClD,gFAAgF;QAChF,8EAA8E;QAC9E,4EAA4E;QAC5E,qDAAqD;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,UAAU,UAAU,CAAC,WAAW,CAAC,uCAAuC,CACzE,CAAC;QACF,IAAI,QAAQ,CAAC,QAAQ,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO;QACrE,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,WAAmB;QACnD,2EAA2E;QAC3E,0EAA0E;QAC1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACnC,UAAU,UAAU,CAAC,WAAW,CAAC,+BAA+B,UAAU,CAAC,qCAAqC,CAAC,EAAE,CACpH,CAAC;QACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,WAAW,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,WAAmB;QACrD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACzC,UAAU,UAAU,CAAC,WAAW,CAAC,wBAAwB,CAC1D,CAAC;QACF,IAAI,YAAY,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,gCAAgC,WAAW,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAClC,oBAAoB,WAAW,gBAAgB,SAAS,wCAAwC,IAAI,CAAC,IAAI,iDAAiD,CAC3J,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,WAAmB,EAAE,SAAiB;QAChE,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACnC,UAAU,UAAU,CAAC,WAAW,CAAC,2CAA2C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpG,CAAC;QACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAClC,kCAAkC,WAAW,KAAK,MAAM,CAAC,MAAM,EAAE,CAClE,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACpB,UAAU,UAAU,CAAC,WAAW,CAAC,2CAA2C,CAC7E,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,aAAa,CAAC,SAAiB;QACrC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,gBAAgB,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1F,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,IAAI,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC;IAC3F,CAAC;IAED,4EAA4E;IAC5E,2EAA2E;IACnE,KAAK,CAAC,kBAAkB,CAAC,WAAmB;QAClD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACrF,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,WAAmB;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,iBAAiB;YAAE,OAAO;QAClD,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,IAAI,CAAC,MAAM,EACX,MAAM,UAAU,CAAC,WAAW,CAAC,OAAO,WAAW,yEAAyE,CACzH,CAAC;QACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,WAAW,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IAEO,KAAK,CAAC,aAAa,CAAI,GAAW,EAAE,EAAoB;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACtE,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,GAAG,CAAC,CAAC;IACvF,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,GAAG,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,GAAG,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,aAAa,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7C,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3C,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzD,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC/C,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAAS,EAAE,CAAS;IACtD,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"repo-store.js","sourceRoot":"","sources":["../../src/agent/repo-store.ts"],"names":[],"mappings":"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"}
@@ -14,13 +14,14 @@ export interface ReadContentResult {
14
14
  }
15
15
  export interface ReviewTransportDeps {
16
16
  createRunnerFor(agent: AgentConfig): CommandRunner;
17
- resolveWorktree(agentId: string): string | undefined;
17
+ resolveWorkdir(agentId: string): string | undefined;
18
18
  }
19
19
  export declare function validateReviewFindings(raw: unknown): ReviewFindings;
20
20
  export declare function validateReviewResponse(raw: unknown): ReviewResponse;
21
21
  export declare class ReviewTransport {
22
22
  private readonly deps;
23
23
  constructor(deps: ReviewTransportDeps);
24
+ clearDispatchOutputs(agent: AgentConfig, workdir: string, phase: string): Promise<void>;
24
25
  readContent(task: TaskState, devAgent: AgentConfig, phase: TaskPhase): Promise<ReadContentResult>;
25
26
  readFindings(task: TaskState, qaAgent: AgentConfig): Promise<ReviewFindings | null>;
26
27
  readResponse(task: TaskState, devAgent: AgentConfig): Promise<ReviewResponse | null>;
@@ -29,11 +30,12 @@ export declare class ReviewTransport {
29
30
  readHeadSha(devAgent: AgentConfig): Promise<string>;
30
31
  readInterdiff(devAgent: AgentConfig, prevSha: string, curSha: string): Promise<string>;
31
32
  readFileRange(devAgent: AgentConfig, file: string, startLine: number, endLine: number): Promise<string>;
32
- deliverToInbox(agent: AgentConfig, worktreePath: string, filename: string, content: string): Promise<ReviewContentFileRef>;
33
+ deliverToInbox(agent: AgentConfig, workdir: string, filename: string, content: string): Promise<ReviewContentFileRef>;
33
34
  private readExchangeFile;
34
35
  private deleteExchangeFile;
36
+ private ensureRuntimeDirs;
35
37
  private parseJson;
36
- private requireWorktree;
38
+ private requireWorkdir;
37
39
  }
38
40
  export interface ServerPayloadInput {
39
41
  phase: string;
@@ -63,5 +65,5 @@ export interface ServerPayloadPromptOpts {
63
65
  serverPriorResponse?: string;
64
66
  serverPriorResponseFile?: ReviewContentFileRef;
65
67
  }
66
- export declare function resolveServerPayloads(transport: ReviewTransport, agent: AgentConfig, worktreePath: string, input: ServerPayloadInput): Promise<ServerPayloadPromptOpts>;
68
+ export declare function resolveServerPayloads(transport: ReviewTransport, agent: AgentConfig, workdir: string, input: ServerPayloadInput): Promise<ServerPayloadPromptOpts>;
67
69
  //# sourceMappingURL=review-transport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"review-transport.d.ts","sourceRoot":"","sources":["../../src/agent/review-transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review-transport.d.ts","sourceRoot":"","sources":["../../src/agent/review-transport.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { randomBytes } from 'node:crypto';
2
2
  import { isRecord, MAX_INLINE_CONTENT_BYTES, MAX_READ_FILE_BYTES, REVIEW_EXCHANGE_DIR, REVIEW_INBOX_DIR, SPEC_DOC_RELPATH, } from '../shared/index.js';
3
3
  import { shellQuote } from './runner.js';
4
4
  import { GIT_NET_ENV, execNetwork } from './net-exec.js';
5
+ import { ensureBaxianRuntimeDirsSafe } from './repo-store.js';
5
6
  export class ReviewExchangeError extends Error {
6
7
  reason;
7
8
  constructor(reason, message) {
@@ -98,10 +99,24 @@ export class ReviewTransport {
98
99
  constructor(deps) {
99
100
  this.deps = deps;
100
101
  }
102
+ async clearDispatchOutputs(agent, workdir, phase) {
103
+ const paths = [
104
+ `${workdir}/${REVIEW_EXCHANGE_DIR}/findings.json`,
105
+ `${workdir}/${REVIEW_EXCHANGE_DIR}/response.json`,
106
+ ...(phase === 'develop' ? [`${workdir}/${SPEC_DOC_RELPATH}`] : []),
107
+ ];
108
+ const runner = this.deps.createRunnerFor(agent);
109
+ await this.ensureRuntimeDirs(runner, workdir);
110
+ const result = await runner.exec(`rm -f ${paths.map(shellQuote).join(' ')}`);
111
+ if (result.exitCode !== 0) {
112
+ throw new ReviewExchangeError('artifact-cleanup-failed', `failed to clear stale dispatch outputs: ${result.stderr.trim() || `exit ${result.exitCode}`}`);
113
+ }
114
+ }
101
115
  async readContent(task, devAgent, phase) {
102
- const wt = this.requireWorktree(devAgent.id);
116
+ const wt = this.requireWorkdir(devAgent.id);
103
117
  const runner = this.deps.createRunnerFor(devAgent);
104
118
  if (phase === 'spec') {
119
+ await this.ensureRuntimeDirs(runner, wt);
105
120
  const r = await runner.exec(`cat ${shellQuote(`${wt}/${SPEC_DOC_RELPATH}`)}`);
106
121
  if (r.exitCode !== 0) {
107
122
  throw new ReviewExchangeError('spec-missing', `spec doc unreadable: ${r.stderr.trim()}`);
@@ -176,7 +191,7 @@ export class ReviewTransport {
176
191
  await this.deleteExchangeFile(devAgent, 'response.json');
177
192
  }
178
193
  async readHeadSha(devAgent) {
179
- const wt = this.requireWorktree(devAgent.id);
194
+ const wt = this.requireWorkdir(devAgent.id);
180
195
  const runner = this.deps.createRunnerFor(devAgent);
181
196
  const r = await runner.exec(`cd ${shellQuote(wt)} && git rev-parse HEAD`);
182
197
  if (r.exitCode !== 0 || r.stdout.trim() === '') {
@@ -185,7 +200,7 @@ export class ReviewTransport {
185
200
  return r.stdout.trim();
186
201
  }
187
202
  async readInterdiff(devAgent, prevSha, curSha) {
188
- const wt = this.requireWorktree(devAgent.id);
203
+ const wt = this.requireWorkdir(devAgent.id);
189
204
  const runner = this.deps.createRunnerFor(devAgent);
190
205
  // two-arg tree diff, not prev...cur — three-dot regresses to the whole patchset when the review head was rewritten (amend/squash/rebase, #515)
191
206
  const r = await runner.exec(`cd ${shellQuote(wt)} && git -c core.quotepath=false diff ${shellQuote(prevSha)} ${shellQuote(curSha)}`);
@@ -207,7 +222,7 @@ export class ReviewTransport {
207
222
  || startLine < 1 || endLine < startLine || endLine - startLine > 200) {
208
223
  throw new ReviewExchangeError('range', `${startLine}-${endLine}`);
209
224
  }
210
- const wt = this.requireWorktree(devAgent.id);
225
+ const wt = this.requireWorkdir(devAgent.id);
211
226
  const runner = this.deps.createRunnerFor(devAgent);
212
227
  const symlinkWalk = `p=${shellQuote(`${wt}/${file}`)}; ` +
213
228
  `while [ "$p" != ${shellQuote(wt)} ] && [ "$p" != "/" ] && [ -n "$p" ]; do ` +
@@ -223,15 +238,16 @@ export class ReviewTransport {
223
238
  const { text, truncated } = truncateUtf8(r.stdout, MAX_READ_FILE_BYTES);
224
239
  return truncated ? `${text}\n[truncated]` : text;
225
240
  }
226
- async deliverToInbox(agent, worktreePath, filename, content) {
241
+ async deliverToInbox(agent, workdir, filename, content) {
227
242
  if (filename === '' || filename.includes('/') || filename.startsWith('.')) {
228
243
  throw new ReviewExchangeError('bad-filename', JSON.stringify(filename));
229
244
  }
230
- const wt = worktreePath.endsWith('/') ? worktreePath.slice(0, -1) : worktreePath;
245
+ const wt = workdir.endsWith('/') ? workdir.slice(0, -1) : workdir;
231
246
  const dir = `${wt}/${REVIEW_INBOX_DIR}`;
232
247
  const tmp = `${dir}/.tmp-${randomBytes(6).toString('hex')}`;
233
248
  const final = `${dir}/${filename}`;
234
249
  const runner = this.deps.createRunnerFor(agent);
250
+ await this.ensureRuntimeDirs(runner, wt);
235
251
  try {
236
252
  await runner.writeFile(tmp, content);
237
253
  }
@@ -246,8 +262,9 @@ export class ReviewTransport {
246
262
  return { path: `${REVIEW_INBOX_DIR}/${filename}`, bytes: Buffer.byteLength(content, 'utf8') };
247
263
  }
248
264
  async readExchangeFile(agent, name) {
249
- const wt = this.requireWorktree(agent.id);
265
+ const wt = this.requireWorkdir(agent.id);
250
266
  const runner = this.deps.createRunnerFor(agent);
267
+ await this.ensureRuntimeDirs(runner, wt);
251
268
  const r = await runner.exec(`cat ${shellQuote(`${wt}/${REVIEW_EXCHANGE_DIR}/${name}`)}`);
252
269
  if (r.exitCode !== 0) {
253
270
  if (/no such file/i.test(r.stderr))
@@ -257,10 +274,19 @@ export class ReviewTransport {
257
274
  return r.stdout;
258
275
  }
259
276
  async deleteExchangeFile(agent, name) {
260
- const wt = this.requireWorktree(agent.id);
277
+ const wt = this.requireWorkdir(agent.id);
261
278
  const runner = this.deps.createRunnerFor(agent);
279
+ await this.ensureRuntimeDirs(runner, wt);
262
280
  await runner.exec(`rm -f ${shellQuote(`${wt}/${REVIEW_EXCHANGE_DIR}/${name}`)}`);
263
281
  }
282
+ async ensureRuntimeDirs(runner, workdir) {
283
+ try {
284
+ await ensureBaxianRuntimeDirsSafe(runner, workdir);
285
+ }
286
+ catch (err) {
287
+ throw new ReviewExchangeError('unsafe-runtime-path', err instanceof Error ? err.message : String(err));
288
+ }
289
+ }
264
290
  parseJson(raw, label) {
265
291
  try {
266
292
  return JSON.parse(raw);
@@ -269,10 +295,10 @@ export class ReviewTransport {
269
295
  throw new ReviewExchangeError('parse', `${label}: invalid JSON`);
270
296
  }
271
297
  }
272
- requireWorktree(agentId) {
273
- const wt = this.deps.resolveWorktree(agentId);
298
+ requireWorkdir(agentId) {
299
+ const wt = this.deps.resolveWorkdir(agentId);
274
300
  if (!wt)
275
- throw new ReviewExchangeError('no-worktree', `agent ${agentId} has no worktree`);
301
+ throw new ReviewExchangeError('no-workdir', `agent ${agentId} has no Workdir`);
276
302
  return wt.endsWith('/') ? wt.slice(0, -1) : wt;
277
303
  }
278
304
  }
@@ -286,7 +312,7 @@ function contentFilename(phase, round, batch) {
286
312
  return `spec-round-${round}.md`;
287
313
  return batch ? `diff-round-${round}-batch-${batch.index + 1}.patch` : `diff-round-${round}.patch`;
288
314
  }
289
- export async function resolveServerPayloads(transport, agent, worktreePath, input) {
315
+ export async function resolveServerPayloads(transport, agent, workdir, input) {
290
316
  if (input.phase === 'server-feedback' && input.serverContent !== undefined) {
291
317
  throw new ReviewExchangeError('unexpected-payload', 'server-feedback carries findings only');
292
318
  }
@@ -299,7 +325,7 @@ export async function resolveServerPayloads(transport, agent, worktreePath, inpu
299
325
  out[inlineKey] = value;
300
326
  return;
301
327
  }
302
- out[fileKey] = await transport.deliverToInbox(agent, worktreePath, filename, value);
328
+ out[fileKey] = await transport.deliverToInbox(agent, workdir, filename, value);
303
329
  };
304
330
  await place(input.serverContent, contentFilename(input.phase, round, input.batch), 'serverContent', 'serverContentFile', input.forceContentFile);
305
331
  await place(input.serverDiffstat, `diffstat-round-${round}.txt`, 'serverDiffstat', 'serverDiffstatFile');