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.
- package/dist/agent/bootstrap-poller.d.ts +2 -1
- package/dist/agent/bootstrap-poller.d.ts.map +1 -1
- package/dist/agent/bootstrap-poller.js +3 -1
- package/dist/agent/bootstrap-poller.js.map +1 -1
- package/dist/agent/bootstrap.d.ts +1 -1
- package/dist/agent/bootstrap.d.ts.map +1 -1
- package/dist/agent/bootstrap.js +12 -19
- package/dist/agent/bootstrap.js.map +1 -1
- package/dist/agent/branch.d.ts +64 -0
- package/dist/agent/branch.d.ts.map +1 -0
- package/dist/agent/branch.js +386 -0
- package/dist/agent/branch.js.map +1 -0
- package/dist/agent/detect/manifests/claude-code.json +2 -2
- package/dist/agent/detect/manifests/opencode.json +44 -0
- package/dist/agent/detect/manifests/qodercli.json +49 -0
- package/dist/agent/detect/region.d.ts +1 -0
- package/dist/agent/detect/region.d.ts.map +1 -1
- package/dist/agent/detect/region.js +27 -19
- package/dist/agent/detect/region.js.map +1 -1
- package/dist/agent/lineage.d.ts +1 -1
- package/dist/agent/lineage.d.ts.map +1 -1
- package/dist/agent/lineage.js +6 -7
- package/dist/agent/lineage.js.map +1 -1
- package/dist/agent/manager.d.ts +13 -9
- package/dist/agent/manager.d.ts.map +1 -1
- package/dist/agent/manager.js +1071 -426
- package/dist/agent/manager.js.map +1 -1
- package/dist/agent/preflight.d.ts.map +1 -1
- package/dist/agent/preflight.js +21 -15
- package/dist/agent/preflight.js.map +1 -1
- package/dist/agent/prompt.d.ts +2 -2
- package/dist/agent/prompt.d.ts.map +1 -1
- package/dist/agent/prompt.js +9 -7
- package/dist/agent/prompt.js.map +1 -1
- package/dist/agent/repo-store.d.ts +8 -4
- package/dist/agent/repo-store.d.ts.map +1 -1
- package/dist/agent/repo-store.js +142 -54
- package/dist/agent/repo-store.js.map +1 -1
- package/dist/agent/review-transport.d.ts +6 -4
- package/dist/agent/review-transport.d.ts.map +1 -1
- package/dist/agent/review-transport.js +39 -13
- package/dist/agent/review-transport.js.map +1 -1
- package/dist/agent/runner.d.ts +1 -0
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +5 -0
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/tmux-probe-poller.d.ts.map +1 -1
- package/dist/agent/tmux-probe-poller.js +2 -0
- package/dist/agent/tmux-probe-poller.js.map +1 -1
- package/dist/agent/tmux.d.ts +2 -1
- package/dist/agent/tmux.d.ts.map +1 -1
- package/dist/agent/tmux.js +73 -7
- package/dist/agent/tmux.js.map +1 -1
- package/dist/api/probe.d.ts.map +1 -1
- package/dist/api/probe.js +9 -1
- package/dist/api/probe.js.map +1 -1
- package/dist/api/projects.d.ts.map +1 -1
- package/dist/api/projects.js +228 -56
- package/dist/api/projects.js.map +1 -1
- package/dist/config/validator.d.ts.map +1 -1
- package/dist/config/validator.js +58 -8
- package/dist/config/validator.js.map +1 -1
- package/dist/event/server-handlers.js +8 -8
- package/dist/event/server-handlers.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/shared/constants.d.ts +0 -1
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +0 -1
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/types.d.ts +15 -4
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/skills/baxian-pr-feedback/SKILL.md +1 -1
- package/dist/skills/baxian-pr-recheck/SKILL.md +1 -1
- package/dist/skills/baxian-pr-review/SKILL.md +1 -1
- package/dist/skills/baxian-server-feedback/SKILL.md +4 -4
- package/dist/skills/baxian-server-review/SKILL.md +7 -7
- package/dist/skills/baxian-signals/SKILL.md +3 -1
- package/dist/skills/baxian-task-check/SKILL.md +4 -4
- package/dist/state/agent-store.js +4 -4
- package/dist/state/agent-store.js.map +1 -1
- package/dist/state/lock.d.ts +15 -2
- package/dist/state/lock.d.ts.map +1 -1
- package/dist/state/lock.js +104 -21
- package/dist/state/lock.js.map +1 -1
- package/dist/state/task-store.d.ts.map +1 -1
- package/dist/state/task-store.js +5 -2
- package/dist/state/task-store.js.map +1 -1
- package/dist/web/assets/index-BmnSiyut.js +13 -0
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/agent/worktree.d.ts +0 -32
- package/dist/agent/worktree.d.ts.map +0 -1
- package/dist/agent/worktree.js +0 -291
- package/dist/agent/worktree.js.map +0 -1
- package/dist/web/assets/index-DAPd4Nv_.js +0 -13
package/dist/agent/repo-store.js
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
85
|
-
: `${GIT_NET_ENV} git clone
|
|
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
|
-
|
|
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
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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 &&
|
|
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
|
-
|
|
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":"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"}
|
|
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
|
-
|
|
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,
|
|
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
|
|
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,
|
|
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":"AACA,OAAO,EAOL,KAAK,WAAW,EAEhB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAc,KAAK,aAAa,EAAmB,MAAM,aAAa,CAAC;
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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 =
|
|
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.
|
|
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.
|
|
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
|
-
|
|
273
|
-
const wt = this.deps.
|
|
298
|
+
requireWorkdir(agentId) {
|
|
299
|
+
const wt = this.deps.resolveWorkdir(agentId);
|
|
274
300
|
if (!wt)
|
|
275
|
-
throw new ReviewExchangeError('no-
|
|
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,
|
|
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,
|
|
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');
|