awb-agent-manager 1.6.28 → 1.6.30

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.
@@ -0,0 +1,33 @@
1
+ export declare function isGitAuthFailure(stderr: string | undefined | null): boolean;
2
+ export interface PushReadinessProbe {
3
+ ran: boolean;
4
+ ok?: boolean;
5
+ stderr?: string;
6
+ }
7
+ export interface PushReadinessInput {
8
+ isHttps: boolean;
9
+ probe?: PushReadinessProbe;
10
+ }
11
+ export interface PushReadinessDecision {
12
+ ok: boolean;
13
+ reason?: string;
14
+ detail?: string;
15
+ }
16
+ export declare function decidePushReadiness(input: PushReadinessInput): PushReadinessDecision;
17
+ export interface WorktreeOutcome {
18
+ isWorktree?: boolean;
19
+ reason?: string;
20
+ }
21
+ export interface DispatchGateDecision {
22
+ blocked: boolean;
23
+ kind?: string;
24
+ reason?: string;
25
+ }
26
+ export declare function classifyWorktreeOutcome(res: WorktreeOutcome | null | undefined): DispatchGateDecision;
27
+ export declare class DispatchBlockerTracker {
28
+ #private;
29
+ shouldComment(ticketId: string | undefined, kind: string): boolean;
30
+ clear(ticketId: string | undefined): void;
31
+ activeKind(ticketId: string | undefined): string | undefined;
32
+ }
33
+ export declare function firstLine(text: string | undefined | null): string;
@@ -0,0 +1,73 @@
1
+ const GIT_AUTH_FAILURE_SIGNATURES = [
2
+ 'could not read username',
3
+ 'could not read password',
4
+ 'authentication failed',
5
+ 'terminal prompts disabled',
6
+ 'invalid username or password',
7
+ 'incorrect username or password',
8
+ 'support for password authentication was removed',
9
+ 'access denied',
10
+ '403 forbidden',
11
+ 'fatal: unauthorized',
12
+ 'remote: permission to',
13
+ 'repository not found',
14
+ ];
15
+ export function isGitAuthFailure(stderr) {
16
+ if (!stderr)
17
+ return false;
18
+ const s = stderr.toLowerCase();
19
+ return GIT_AUTH_FAILURE_SIGNATURES.some((sig) => s.includes(sig));
20
+ }
21
+ export function decidePushReadiness(input) {
22
+ if (!input.isHttps)
23
+ return { ok: true };
24
+ const probe = input.probe;
25
+ if (!probe || !probe.ran)
26
+ return { ok: true };
27
+ if (probe.ok)
28
+ return { ok: true };
29
+ if (isGitAuthFailure(probe.stderr)) {
30
+ return {
31
+ ok: false,
32
+ reason: 'push_credential_unavailable',
33
+ detail: firstLine(probe.stderr) || 'push credential unavailable',
34
+ };
35
+ }
36
+ return { ok: true };
37
+ }
38
+ export function classifyWorktreeOutcome(res) {
39
+ if (res?.isWorktree)
40
+ return { blocked: false };
41
+ const reason = res?.reason;
42
+ if (!reason || reason === 'disabled')
43
+ return { blocked: false };
44
+ return { blocked: true, kind: `worktree:${reason}`, reason };
45
+ }
46
+ export class DispatchBlockerTracker {
47
+ #byTicket = new Map();
48
+ shouldComment(ticketId, kind) {
49
+ if (!ticketId)
50
+ return true;
51
+ const prev = this.#byTicket.get(ticketId);
52
+ this.#byTicket.set(ticketId, kind);
53
+ return prev !== kind;
54
+ }
55
+ clear(ticketId) {
56
+ if (ticketId)
57
+ this.#byTicket.delete(ticketId);
58
+ }
59
+ activeKind(ticketId) {
60
+ return ticketId ? this.#byTicket.get(ticketId) : undefined;
61
+ }
62
+ }
63
+ export function firstLine(text) {
64
+ if (!text)
65
+ return '';
66
+ for (const raw of text.split('\n')) {
67
+ const t = raw.trim();
68
+ if (t)
69
+ return t;
70
+ }
71
+ return '';
72
+ }
73
+ //# sourceMappingURL=dispatch-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-preflight.js","sourceRoot":"","sources":["../../src/lib/dispatch-preflight.ts"],"names":[],"mappings":"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"}
@@ -12,10 +12,15 @@ export interface ResolvedEnvironmentConfig {
12
12
  setup_timeout_seconds: number;
13
13
  version: number;
14
14
  }
15
+ export type RepositoryCredentialResolver = (resourceId: string, agentId: string) => Promise<{
16
+ username?: string;
17
+ token: string;
18
+ } | null>;
15
19
  export interface ProvisionArgs {
16
20
  agentId: string;
17
21
  config: ResolvedEnvironmentConfig;
18
22
  ticketId?: string;
23
+ resolveCredential?: RepositoryCredentialResolver;
19
24
  }
20
25
  export interface ProvisionResult {
21
26
  ok: boolean;
@@ -30,3 +35,8 @@ export declare class EnvironmentProvisioner {
30
35
  #private;
31
36
  provision(args: ProvisionArgs): Promise<ProvisionResult>;
32
37
  }
38
+ export declare function authenticatedUrl(url: string, cred: {
39
+ username?: string;
40
+ token: string;
41
+ } | null | undefined): string;
42
+ export declare function redactToken(text: string, token?: string): string;
@@ -88,7 +88,7 @@ export class EnvironmentProvisioner {
88
88
  try {
89
89
  await fsp.mkdir(envDir, { recursive: true });
90
90
  for (const repo of args.config.repositories || []) {
91
- await this.#prepareRepo(repo, agentDir, env, timeoutMs, steps);
91
+ await this.#prepareRepo(repo, agentDir, env, timeoutMs, steps, args.agentId, args.resolveCredential);
92
92
  }
93
93
  for (const cmd of args.config.setup_commands || []) {
94
94
  log(`[env-provision] setup: ${cmd} (agent=${args.agentId.slice(0, 8)})`);
@@ -117,34 +117,44 @@ export class EnvironmentProvisioner {
117
117
  return { ok: false, skipped: false, fingerprint, steps, error };
118
118
  }
119
119
  }
120
- async #prepareRepo(repo, agentDir, env, timeoutMs, steps) {
120
+ async #prepareRepo(repo, agentDir, env, timeoutMs, steps, agentId, resolveCredential) {
121
121
  const dest = join(agentDir, repo.target_dir);
122
122
  const gitDir = join(dest, '.git');
123
123
  let fresh = false;
124
+ const cred = repo.resource_id && resolveCredential
125
+ ? await resolveCredential(repo.resource_id, agentId)
126
+ : null;
127
+ const token = cred?.token;
124
128
  if (await pathExists(gitDir)) {
129
+ await this.#installCloneCredential(dest, repo.url, cred, timeoutMs);
125
130
  const fetched = await gitRaw(['-C', dest, 'fetch', '--all', '--prune'], undefined, timeoutMs);
126
- steps.push(`fetch ${repo.target_dir} → ${fetched.ok ? 'ok' : `FAIL: ${tail(fetched.stderr)}`}`);
131
+ steps.push(`fetch ${repo.target_dir} → ${fetched.ok ? 'ok' : `FAIL: ${redactToken(tail(fetched.stderr), token)}`}`);
127
132
  if (!fetched.ok) {
128
- throw new Error(`git fetch failed for ${repo.target_dir}: ${tail(fetched.stderr)}`);
133
+ throw new Error(`git fetch failed for ${repo.target_dir}: ${redactToken(tail(fetched.stderr), token)}`);
129
134
  }
130
135
  if (repo.branch) {
131
136
  const co = await gitRaw(['-C', dest, 'checkout', repo.branch], undefined, timeoutMs);
132
- steps.push(`checkout ${repo.branch} in ${repo.target_dir} → ${co.ok ? 'ok' : `skip: ${tail(co.stderr)}`}`);
137
+ steps.push(`checkout ${repo.branch} in ${repo.target_dir} → ${co.ok ? 'ok' : `skip: ${redactToken(tail(co.stderr), token)}`}`);
133
138
  }
134
139
  const pulled = await gitRaw(['-C', dest, 'pull', '--ff-only'], undefined, timeoutMs);
135
- steps.push(`pull --ff-only ${repo.target_dir} → ${pulled.ok ? 'ok' : `non-ff (left as-is): ${tail(pulled.stderr)}`}`);
140
+ steps.push(`pull --ff-only ${repo.target_dir} → ${pulled.ok ? 'ok' : `non-ff (left as-is): ${redactToken(tail(pulled.stderr), token)}`}`);
136
141
  }
137
142
  else {
138
143
  await fsp.mkdir(dirname(dest), { recursive: true });
144
+ const cloneUrl = authenticatedUrl(repo.url, cred);
139
145
  const args = ['clone'];
140
146
  if (repo.branch)
141
147
  args.push('--branch', repo.branch);
142
- args.push(repo.url, dest);
148
+ args.push('--', cloneUrl, dest);
143
149
  log(`[env-provision] clone ${repo.url} → ${repo.target_dir}`);
144
150
  const cloned = await gitRaw(args, undefined, timeoutMs);
145
- steps.push(`clone ${repo.url} → ${repo.target_dir} ${cloned.ok ? 'ok' : `FAIL: ${tail(cloned.stderr)}`}`);
151
+ steps.push(`clone ${repo.url} → ${repo.target_dir} ${cloned.ok ? 'ok' : `FAIL: ${redactToken(tail(cloned.stderr), token)}`}`);
146
152
  if (!cloned.ok) {
147
- throw new Error(`git clone failed for ${repo.url}: ${tail(cloned.stderr)}`);
153
+ throw new Error(`git clone failed for ${repo.url}: ${redactToken(tail(cloned.stderr), token)}`);
154
+ }
155
+ if (token) {
156
+ await gitRaw(['-C', dest, 'remote', 'set-url', 'origin', repo.url], undefined, timeoutMs);
157
+ await this.#installCloneCredential(dest, repo.url, cred, timeoutMs);
148
158
  }
149
159
  fresh = true;
150
160
  }
@@ -159,6 +169,24 @@ export class EnvironmentProvisioner {
159
169
  }
160
170
  }
161
171
  }
172
+ async #installCloneCredential(dest, url, cred, timeoutMs) {
173
+ if (!cred?.token || !/^https?:\/\//i.test(url))
174
+ return;
175
+ try {
176
+ const gitDirRes = await gitRaw(['-C', dest, 'rev-parse', '--absolute-git-dir'], undefined, timeoutMs);
177
+ const gitDir = gitDirRes.ok ? gitDirRes.stdout.trim() : '';
178
+ if (!gitDir)
179
+ return;
180
+ const credentialFile = join(gitDir, 'awb-credentials');
181
+ const u = new URL(url);
182
+ u.username = cred.username || 'x-access-token';
183
+ u.password = cred.token;
184
+ await fsp.writeFile(credentialFile, `${u.toString()}\n`, { mode: 0o600 });
185
+ await gitRaw(['-C', dest, 'config', 'credential.helper', `store --file=${JSON.stringify(credentialFile)}`], undefined, timeoutMs);
186
+ }
187
+ catch {
188
+ }
189
+ }
162
190
  async #readRecentFailure(failedPath) {
163
191
  try {
164
192
  const raw = await fsp.readFile(failedPath, 'utf8');
@@ -179,4 +207,22 @@ function tail(s, n = 1500) {
179
207
  const t = (s || '').trim();
180
208
  return t.length > n ? `…${t.slice(-n)}` : t;
181
209
  }
210
+ export function authenticatedUrl(url, cred) {
211
+ if (!cred?.token || !/^https?:\/\//i.test(url))
212
+ return url;
213
+ try {
214
+ const u = new URL(url);
215
+ u.username = cred.username || 'x-access-token';
216
+ u.password = cred.token;
217
+ return u.toString();
218
+ }
219
+ catch {
220
+ return url;
221
+ }
222
+ }
223
+ export function redactToken(text, token) {
224
+ if (!token)
225
+ return text;
226
+ return text.split(token).join('***');
227
+ }
182
228
  //# sourceMappingURL=environment-provisioner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"environment-provisioner.js","sourceRoot":"","sources":["../../src/lib/environment-provisioner.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAuCnC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAUzC,SAAS,MAAM,CAAC,IAAc,EAAE,GAAuB,EAAE,SAAiB;IACxE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CACN,KAAK,EACL,IAAI,EACJ,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAC1E,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACtB,OAAO,CAAC;gBACN,EAAE,EAAE,CAAC,GAAG;gBACR,IAAI,EAAG,GAAW,EAAE,IAAI,IAAI,CAAC;gBAC7B,MAAM,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;gBACjC,MAAM,EAAE,CAAC,MAAM,IAAK,GAAW,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;aAC3D,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAGD,SAAS,QAAQ,CACf,OAAe,EACf,GAAW,EACX,GAA2B,EAC3B,SAAiB;IAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,CACF,OAAO,EACP,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAChF,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACtB,OAAO,CAAC;gBACN,EAAE,EAAE,CAAC,GAAG;gBACR,IAAI,EAAG,GAAW,EAAE,IAAI,IAAI,CAAC;gBAC7B,MAAM,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;gBACjC,MAAM,EAAE,CAAC,MAAM,IAAK,GAAW,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;aAC3D,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAID,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC7E,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAiC;IACtE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,CAAS;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,OAAO,sBAAsB;IAIjC,SAAS,GAAG,IAAI,GAAG,EAAoC,CAAC;IAExD,KAAK,CAAC,SAAS,CAAC,IAAmB;QACjC,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACjC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAmB,EAAE,WAAmB;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,cAAc,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAa,EAAE,CAAC;QAG3B,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACzD,CAAC;QAKD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAChE,IAAI,aAAa,EAAE,CAAC;YAClB,GAAG,CACD,6CAA6C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,kBAAkB,aAAa,GAAG,CACtI,CAAC;YACF,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,KAAK;gBACd,WAAW;gBACX,KAAK;gBACL,KAAK,EAAE,8DAA8D,aAAa,EAAE;gBACpF,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC;QACxE,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAA4B,CAAC;QAE1F,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;gBAClD,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;gBACnD,GAAG,CAAC,0BAA0B,GAAG,WAAW,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;gBACzE,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;gBACxD,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;gBACzE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oBACV,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,IAAI,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;YACD,MAAM,GAAG,CAAC,SAAS,CACjB,UAAU,EACV,IAAI,CAAC,SAAS,CACZ;gBACE,WAAW;gBACX,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;aACxE,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACF,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC1D,GAAG,CACD,gCAAgC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAC7L,CAAC;YACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;YAC1C,GAAG,CAAC,iCAAiC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YACzG,MAAM,GAAG;iBACN,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;iBAClH,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAClE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,IAAmC,EACnC,QAAgB,EAChB,GAA2B,EAC3B,SAAiB,EACjB,KAAe;QAEf,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,IAAI,KAAK,GAAG,KAAK,CAAC;QAElB,IAAI,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAE7B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YAC9F,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAChG,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtF,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBACrF,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7G,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACrF,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACxH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;YACvB,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1B,GAAG,CAAC,yBAAyB,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1G,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QAGD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,mBAAmB,IAAI,EAAE,EAAE,CAAC;gBACjD,GAAG,CAAC,+BAA+B,IAAI,CAAC,UAAU,MAAM,GAAG,EAAE,CAAC,CAAC;gBAC/D,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;gBACpD,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,KAAK,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;gBAC1F,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oBACV,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC,UAAU,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACjH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QACzC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC5C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,kBAAkB;gBAAE,OAAO,IAAI,CAAC;YAC5D,OAAO,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,eAAe,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED,SAAS,IAAI,CAAC,CAAS,EAAE,CAAC,GAAG,IAAI;IAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"environment-provisioner.js","sourceRoot":"","sources":["../../src/lib/environment-provisioner.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,14 @@ export declare function resolveBootstrapRepository(baseRepo: unknown, baseBranch
14
14
  branch: string;
15
15
  } | null;
16
16
  export declare function parseWorktreeMode(raw: unknown): WorktreeMode | undefined;
17
+ export declare function validateWorktreeProvisioningInputs(args: {
18
+ mode: WorktreeMode | undefined;
19
+ hasAgentContext: boolean;
20
+ hasManager: boolean;
21
+ ticketId?: string;
22
+ role?: string;
23
+ repositoryResourceId?: string;
24
+ }): string | null;
17
25
  export interface AgentExecutionContext {
18
26
  agent_id: string;
19
27
  api_key: string;
@@ -4,6 +4,7 @@ import { fetchTicketContext, fetchChatRoomHistory, fetchAgentRecord, fetchReposi
4
4
  import { recordEvent } from './event-log-recorder.js';
5
5
  import { prepareChatAttachments } from './chat-attachment-prep.js';
6
6
  import { injectWorkFolder } from './prompts.js';
7
+ import { DispatchBlockerTracker, classifyWorktreeOutcome } from './dispatch-preflight.js';
7
8
  import { createAdapter, ADAPTER_CAPABILITIES } from './cli-adapters/index.js';
8
9
  import { parseRunProvision, provisionRunWorkspace, reconcileRunBaseWorkingDir, resolveRunFolder, } from './run-provisioner.js';
9
10
  import { FolderMutex } from './run-execution-lock.js';
@@ -165,6 +166,21 @@ export function resolveBootstrapRepository(baseRepo, baseBranch, environment) {
165
166
  export function parseWorktreeMode(raw) {
166
167
  return raw === 'per_ticket' || raw === 'shared' ? raw : undefined;
167
168
  }
169
+ export function validateWorktreeProvisioningInputs(args) {
170
+ if (args.mode !== 'per_ticket')
171
+ return null;
172
+ if (!args.hasAgentContext)
173
+ return 'missing_agent_context';
174
+ if (!args.hasManager)
175
+ return 'missing_worktree_manager';
176
+ if (!args.ticketId)
177
+ return 'missing_ticket_id';
178
+ if (!args.role)
179
+ return 'missing_role';
180
+ if (!args.repositoryResourceId)
181
+ return 'missing_repository_resource';
182
+ return null;
183
+ }
168
184
  const AGENT_CHAIN_DEPTH_CAP = 3;
169
185
  export class EventDispatcher {
170
186
  #config;
@@ -177,6 +193,7 @@ export class EventDispatcher {
177
193
  #managedAgentContexts;
178
194
  #worktreeManager;
179
195
  #environmentProvisioner;
196
+ #dispatchBlockers = new DispatchBlockerTracker();
180
197
  #runExecLock = new FolderMutex();
181
198
  constructor(config, deps = {}) {
182
199
  this.#config = config;
@@ -191,10 +208,20 @@ export class EventDispatcher {
191
208
  this.#environmentProvisioner = deps.environmentProvisioner ?? null;
192
209
  }
193
210
  async #applyWorktreeCwd(agentContext, ticketId, role, mode, poolSize, bootstrapRepo) {
211
+ const requiredError = validateWorktreeProvisioningInputs({
212
+ mode,
213
+ hasAgentContext: Boolean(agentContext),
214
+ hasManager: Boolean(this.#worktreeManager),
215
+ ticketId,
216
+ role,
217
+ repositoryResourceId: bootstrapRepo?.resourceId,
218
+ });
219
+ if (requiredError)
220
+ return { ok: false, reason: requiredError, blockerKind: `worktree:${requiredError}` };
194
221
  if (!agentContext || !this.#worktreeManager || !ticketId || !role)
195
- return;
222
+ return { ok: true };
196
223
  if (this.#config?.delegation?.worktreeIsolation === false)
197
- return;
224
+ return { ok: true };
198
225
  try {
199
226
  const res = await this.#worktreeManager.resolveCwd({
200
227
  baseWorkingDir: agentContext.cwd,
@@ -207,13 +234,19 @@ export class EventDispatcher {
207
234
  if (res.isWorktree) {
208
235
  log(`[worktree] ticket=${ticketId.slice(0, 8)} role=${role} agent=${agentContext.agent_id.slice(0, 8)} mode=${res.mode ?? mode ?? 'per_ticket'} cwd=${res.cwd}${res.reused ? ' (reused)' : ' (new)'}`);
209
236
  agentContext.cwd = res.cwd;
237
+ return { ok: true };
210
238
  }
211
- else if (res.reason && res.reason !== 'disabled') {
212
- log(`[worktree] isolation skipped for ticket=${ticketId.slice(0, 8)} role=${role}: ${res.reason} — using shared cwd ${agentContext.cwd}`);
239
+ const gate = classifyWorktreeOutcome(res);
240
+ if (gate.blocked) {
241
+ log(`[worktree] isolation provisioning failed for ticket=${ticketId.slice(0, 8)} role=${role}: ${gate.reason}`);
242
+ return { ok: false, reason: gate.reason, blockerKind: gate.kind };
213
243
  }
244
+ return { ok: true };
214
245
  }
215
246
  catch (err) {
216
- log(`[worktree] resolveCwd failed (${err?.message ?? err}); using shared cwd`);
247
+ const reason = err?.message ?? String(err);
248
+ log(`[worktree] resolveCwd failed (${reason})`);
249
+ return { ok: false, reason, blockerKind: 'worktree:error' };
217
250
  }
218
251
  }
219
252
  async #cleanupTerminalTicketWorktrees(ticketId) {
@@ -238,6 +271,7 @@ export class EventDispatcher {
238
271
  total += await this.#worktreeManager.removeTicketWorktrees({
239
272
  baseWorkingDir: ctx.working_dir,
240
273
  ticketId,
274
+ repositoryResourceId: ticket.base_repo?.id,
241
275
  });
242
276
  }
243
277
  if (total > 0) {
@@ -248,7 +282,7 @@ export class EventDispatcher {
248
282
  log(`[worktree] terminal cleanup failed for ticket=${ticketId.slice(0, 8)}: ${err?.message ?? err}`);
249
283
  }
250
284
  }
251
- async #cleanupArchivedTicketWorkspace(ticketId) {
285
+ async #cleanupArchivedTicketWorkspace(ticketId, repositoryResourceId) {
252
286
  if (!this.#worktreeManager || !this.#worktreeManager.enabled)
253
287
  return;
254
288
  if (this.#config?.delegation?.worktreeIsolation === false)
@@ -268,6 +302,7 @@ export class EventDispatcher {
268
302
  worktrees += await this.#worktreeManager.removeTicketWorktrees({
269
303
  baseWorkingDir: ctx.working_dir,
270
304
  ticketId,
305
+ repositoryResourceId,
271
306
  });
272
307
  if (await this.#worktreeManager.removeTicketRunWorkspace({
273
308
  baseWorkingDir: ctx.working_dir,
@@ -410,9 +445,43 @@ export class EventDispatcher {
410
445
  const repoCredential = selectedRepo?.resourceId && agentContext?.agent_id
411
446
  ? await fetchRepositoryCredential(this.#config, selectedRepo.resourceId, agentContext.agent_id)
412
447
  : null;
413
- await this.#applyWorktreeCwd(agentContext, ev.ticket_id, ev.action, parseWorktreeMode(ev.worktree_mode), typeof ev.max_concurrent_tickets_per_agent === 'number'
448
+ const worktreeProvision = await this.#applyWorktreeCwd(agentContext, ev.ticket_id, ev.action, parseWorktreeMode(ev.worktree_mode), typeof ev.max_concurrent_tickets_per_agent === 'number'
414
449
  ? ev.max_concurrent_tickets_per_agent
415
450
  : undefined, selectedRepo ? { ...selectedRepo, credential: repoCredential } : null);
451
+ if (!worktreeProvision.ok) {
452
+ const blockerKind = worktreeProvision.blockerKind || `worktree:${worktreeProvision.reason || 'unknown'}`;
453
+ if (ev.ticket_id && this.#dispatchBlockers.shouldComment(ev.ticket_id, blockerKind)) {
454
+ await fireAndForgetTool(this.#config, 'add_comment', {
455
+ ticket_id: ev.ticket_id,
456
+ content: `⚠️ **티켓 worktree 프로비저닝 실패** — 공유 작업 폴더에서 에이전트를 실행하지 않고 디스패치를 중단했습니다.\n\n` +
457
+ `원인: \`${worktreeProvision.reason || 'unknown error'}\`\n\n` +
458
+ `agent working_dir, repository resource와 \`.awb/wt\` 경로를 확인한 뒤 다시 트리거하세요.`,
459
+ });
460
+ }
461
+ log(`Trigger aborted — ticket worktree provisioning failed: ticket=${ev.ticket_id} reason=${worktreeProvision.reason || 'unknown'} blocker=${blockerKind}`);
462
+ return;
463
+ }
464
+ if (ev.action === 'assignee'
465
+ && ev.ticket_id && selectedRepo?.url && this.#worktreeManager && agentContext?.cwd) {
466
+ const readiness = await this.#worktreeManager.verifyPushReadiness(agentContext.cwd, selectedRepo.url);
467
+ if (!readiness.ok) {
468
+ const blockerKind = readiness.reason || 'push_credential_unavailable';
469
+ if (this.#dispatchBlockers.shouldComment(ev.ticket_id, blockerKind)) {
470
+ await fireAndForgetTool(this.#config, 'add_comment', {
471
+ ticket_id: ev.ticket_id,
472
+ content: `⚠️ **Git push 자격 증명 미확인** — 원격 인증이 준비되지 않아 작업을 시작하지 않고 디스패치를 중단했습니다.\n\n` +
473
+ `원격: \`${selectedRepo.url}\`\n` +
474
+ `원인: \`${readiness.detail || 'push credential unavailable'}\`\n\n` +
475
+ `이 repository resource 에 GitHub 자격 증명(토큰)을 설정하거나 push 가능한 환경으로 전환한 뒤 다시 트리거하세요. ` +
476
+ `(Merging 단계의 push 실패로 CLI 세션을 낭비하지 않도록 dispatch 전에 검증합니다.)`,
477
+ });
478
+ }
479
+ log(`Trigger aborted — push credential unavailable: ticket=${ev.ticket_id} detail=${readiness.detail || ''}`);
480
+ return;
481
+ }
482
+ }
483
+ if (ev.ticket_id)
484
+ this.#dispatchBlockers.clear(ev.ticket_id);
416
485
  if (ev.worktree_rel_path && ev.column_prompt && typeof ev.column_prompt.content === 'string') {
417
486
  const workFolder = agentContext?.cwd || ev.worktree_rel_path;
418
487
  ev.column_prompt = {
@@ -442,6 +511,7 @@ export class EventDispatcher {
442
511
  agentId: provisionAgentId,
443
512
  config: envConfig,
444
513
  ticketId: ev.ticket_id,
514
+ resolveCredential: (resourceId, credAgentId) => fetchRepositoryCredential(this.#config, resourceId, credAgentId),
445
515
  });
446
516
  if (!result.ok) {
447
517
  if (!result.reported && ev.ticket_id) {
@@ -702,7 +772,7 @@ export class EventDispatcher {
702
772
  void this.#cleanupTerminalTicketWorktrees(ev.ticket_id);
703
773
  }
704
774
  if (ev.entity_type === 'ticket' && ev.action === 'archived' && ev.ticket_id) {
705
- void this.#cleanupArchivedTicketWorkspace(ev.ticket_id);
775
+ void this.#cleanupArchivedTicketWorkspace(ev.ticket_id, ev.repository_resource_id);
706
776
  }
707
777
  if (this.#ticketSessionManager && ev.ticket_id) {
708
778
  const forwarded = this.#ticketSessionManager.forwardBoardUpdate(ev.ticket_id, ev);