awb-agent-manager 1.6.43 → 1.6.45

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.
@@ -103,4 +103,48 @@ export declare class InflightDispatchTracker {
103
103
  suppressedCount(reason?: DispatchSuppressReason): number;
104
104
  suppressionCounts(): Record<string, number>;
105
105
  }
106
+ export declare class DispatchBlockTracker {
107
+ #private;
108
+ record(kind: string | undefined | null): void;
109
+ counts(): Record<string, number>;
110
+ total(reason?: string): number;
111
+ }
112
+ export interface PendingRetryEntry {
113
+ key: string;
114
+ raw: string;
115
+ ticketId: string;
116
+ role: string;
117
+ agentId: string;
118
+ attempts: number;
119
+ delayMs: number;
120
+ timer: unknown | null;
121
+ attempting: boolean;
122
+ }
123
+ export interface RetryScheduler {
124
+ set(fn: () => void, ms: number): unknown;
125
+ clear(handle: unknown): void;
126
+ }
127
+ export interface PendingDispatchRetryOptions {
128
+ onRetry: (raw: string) => Promise<void> | void;
129
+ onGiveUp: (entry: PendingRetryEntry) => Promise<void> | void;
130
+ verify?: (entry: PendingRetryEntry) => Promise<boolean> | boolean;
131
+ scheduler?: RetryScheduler;
132
+ baseDelayMs?: number;
133
+ maxDelayMs?: number;
134
+ maxAttempts?: number;
135
+ log?: (msg: string) => void;
136
+ }
137
+ export declare class PendingDispatchRetry {
138
+ #private;
139
+ constructor(opts: PendingDispatchRetryOptions);
140
+ register(meta: InflightDispatchMeta, raw: string): {
141
+ created: boolean;
142
+ };
143
+ resolve(meta: InflightDispatchMeta): void;
144
+ cancel(key: string, reason: string): void;
145
+ cancelByTicket(ticketId: string, reason: string): void;
146
+ wake(reason: string): void;
147
+ has(key: string): boolean;
148
+ size(): number;
149
+ }
106
150
  export declare function firstLine(text: string | undefined | null): string;
@@ -244,6 +244,179 @@ export class InflightDispatchTracker {
244
244
  return out;
245
245
  }
246
246
  }
247
+ export class DispatchBlockTracker {
248
+ #counts = new Map();
249
+ record(kind) {
250
+ const k = (kind ?? '').trim();
251
+ if (!k)
252
+ return;
253
+ this.#counts.set(k, (this.#counts.get(k) ?? 0) + 1);
254
+ }
255
+ counts() {
256
+ const out = {};
257
+ for (const [k, n] of this.#counts)
258
+ if (n > 0)
259
+ out[k] = n;
260
+ return out;
261
+ }
262
+ total(reason) {
263
+ if (reason)
264
+ return this.#counts.get(reason) ?? 0;
265
+ let t = 0;
266
+ for (const n of this.#counts.values())
267
+ t += n;
268
+ return t;
269
+ }
270
+ }
271
+ const defaultRetryScheduler = {
272
+ set(fn, ms) {
273
+ const t = setTimeout(fn, ms);
274
+ t?.unref?.();
275
+ return t;
276
+ },
277
+ clear(handle) {
278
+ clearTimeout(handle);
279
+ },
280
+ };
281
+ export class PendingDispatchRetry {
282
+ #entries = new Map();
283
+ #onRetry;
284
+ #onGiveUp;
285
+ #verify;
286
+ #scheduler;
287
+ #baseDelayMs;
288
+ #maxDelayMs;
289
+ #maxAttempts;
290
+ #log;
291
+ constructor(opts) {
292
+ this.#onRetry = opts.onRetry;
293
+ this.#onGiveUp = opts.onGiveUp;
294
+ this.#verify = opts.verify ?? null;
295
+ this.#scheduler = opts.scheduler ?? defaultRetryScheduler;
296
+ this.#baseDelayMs = opts.baseDelayMs ?? 30_000;
297
+ this.#maxDelayMs = opts.maxDelayMs ?? 5 * 60_000;
298
+ this.#maxAttempts = opts.maxAttempts ?? 8;
299
+ this.#log = opts.log ?? (() => { });
300
+ }
301
+ register(meta, raw) {
302
+ const key = InflightDispatchTracker.key(meta.ticketId, meta.role, meta.agentId);
303
+ const existing = this.#entries.get(key);
304
+ if (existing) {
305
+ existing.raw = raw;
306
+ return { created: false };
307
+ }
308
+ const entry = {
309
+ key,
310
+ raw,
311
+ ticketId: meta.ticketId,
312
+ role: meta.role,
313
+ agentId: meta.agentId,
314
+ attempts: 0,
315
+ delayMs: this.#baseDelayMs,
316
+ timer: null,
317
+ attempting: false,
318
+ };
319
+ this.#entries.set(key, entry);
320
+ this.#arm(entry);
321
+ return { created: true };
322
+ }
323
+ #arm(entry) {
324
+ if (entry.timer !== null)
325
+ this.#scheduler.clear(entry.timer);
326
+ entry.timer = this.#scheduler.set(() => void this.#attempt(entry), entry.delayMs);
327
+ }
328
+ async #attempt(entry) {
329
+ if (!this.#entries.has(entry.key) || entry.attempting)
330
+ return;
331
+ entry.attempting = true;
332
+ entry.timer = null;
333
+ try {
334
+ if (this.#verify) {
335
+ let eligible = true;
336
+ try {
337
+ eligible = await this.#verify(entry);
338
+ }
339
+ catch (err) {
340
+ this.#log(`[pool-retry] verify failed for ${entry.key} (proceeding): ${err?.message ?? err}`);
341
+ eligible = true;
342
+ }
343
+ if (!this.#entries.has(entry.key))
344
+ return;
345
+ if (!eligible) {
346
+ this.cancel(entry.key, 'ticket left the active flow (pended/terminal)');
347
+ return;
348
+ }
349
+ }
350
+ entry.attempts += 1;
351
+ try {
352
+ await this.#onRetry(entry.raw);
353
+ }
354
+ catch (err) {
355
+ this.#log(`[pool-retry] retry replay threw for ${entry.key}: ${err?.message ?? err}`);
356
+ }
357
+ if (!this.#entries.has(entry.key))
358
+ return;
359
+ if (entry.attempts >= this.#maxAttempts) {
360
+ this.#entries.delete(entry.key);
361
+ this.#log(`[pool-retry] giving up on ${entry.key} after ${entry.attempts} attempt(s) — pending for operator`);
362
+ try {
363
+ await this.#onGiveUp(entry);
364
+ }
365
+ catch (err) {
366
+ this.#log(`[pool-retry] give-up handler threw for ${entry.key}: ${err?.message ?? err}`);
367
+ }
368
+ return;
369
+ }
370
+ entry.delayMs = Math.min(entry.delayMs * 2, this.#maxDelayMs);
371
+ this.#arm(entry);
372
+ }
373
+ finally {
374
+ entry.attempting = false;
375
+ }
376
+ }
377
+ resolve(meta) {
378
+ this.#drop(InflightDispatchTracker.key(meta.ticketId, meta.role, meta.agentId));
379
+ }
380
+ cancel(key, reason) {
381
+ if (this.#drop(key))
382
+ this.#log(`[pool-retry] cancelled ${key}: ${reason}`);
383
+ }
384
+ cancelByTicket(ticketId, reason) {
385
+ for (const [key, e] of [...this.#entries]) {
386
+ if (e.ticketId === ticketId)
387
+ this.cancel(key, reason);
388
+ }
389
+ }
390
+ #drop(key) {
391
+ const e = this.#entries.get(key);
392
+ if (!e)
393
+ return false;
394
+ if (e.timer !== null)
395
+ this.#scheduler.clear(e.timer);
396
+ this.#entries.delete(key);
397
+ return true;
398
+ }
399
+ wake(reason) {
400
+ if (this.#entries.size === 0)
401
+ return;
402
+ this.#log(`[pool-retry] wake (${reason}) — re-driving ${this.#entries.size} queued retry(ies)`);
403
+ for (const e of [...this.#entries.values()]) {
404
+ if (e.attempting)
405
+ continue;
406
+ if (e.timer !== null) {
407
+ this.#scheduler.clear(e.timer);
408
+ e.timer = null;
409
+ }
410
+ void this.#attempt(e);
411
+ }
412
+ }
413
+ has(key) {
414
+ return this.#entries.has(key);
415
+ }
416
+ size() {
417
+ return this.#entries.size;
418
+ }
419
+ }
247
420
  export function firstLine(text) {
248
421
  if (!text)
249
422
  return '';
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-preflight.js","sourceRoot":"","sources":["../../src/lib/dispatch-preflight.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dispatch-preflight.js","sourceRoot":"","sources":["../../src/lib/dispatch-preflight.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,8 @@ import type { AwbConfig } from './rest.js';
2
2
  import type { RunSessionBinding } from './base-session-manager.js';
3
3
  import type { ManagedAgentContextRegistry } from './managed-agent-context.js';
4
4
  import type { WorktreeManager, WorktreeMode } from './worktree-manager.js';
5
- import { InflightDispatchTracker } from './dispatch-preflight.js';
5
+ import { DispatchBlockTracker, InflightDispatchTracker } from './dispatch-preflight.js';
6
+ import type { RetryScheduler } from './dispatch-preflight.js';
6
7
  import type { HarnessSpec, ResolvedEffortPreset } from './cli-adapters/base.js';
7
8
  interface ResolvedEnvironmentConfig {
8
9
  repositories: Array<{
@@ -177,10 +178,17 @@ export interface EventDispatcherDeps {
177
178
  managedAgentContexts?: ManagedAgentContextRegistry | null;
178
179
  worktreeManager?: WorktreeManager | null;
179
180
  inflightDispatchTracker?: InflightDispatchTracker | null;
181
+ dispatchBlockTracker?: DispatchBlockTracker | null;
182
+ poolReclaimTrigger?: (() => Promise<number>) | null;
183
+ poolRetryScheduler?: RetryScheduler | null;
184
+ poolRetryMaxAttempts?: number | null;
180
185
  }
181
186
  export declare class EventDispatcher {
182
187
  #private;
183
188
  dispatchSuppressionCounts(): Record<string, number>;
189
+ dispatchBlockCounts(): Record<string, number>;
190
+ wakePoolRetries(reason: string): void;
191
+ pendingPoolRetryCount(): number;
184
192
  constructor(config: AwbConfig, deps?: EventDispatcherDeps);
185
193
  dispatch(eventType: string, raw: string): void | Promise<void>;
186
194
  handleFsRequest(raw: string): Promise<void>;
@@ -1,10 +1,10 @@
1
1
  import { log } from './logging.js';
2
2
  import { loadAgentInfo } from './config.js';
3
- import { fetchTicketContext, fetchChatRoomHistory, fetchAgentRecord, fetchRepositoryCredential, postFsResponse, postChatRoomMessage, } from './rest.js';
3
+ import { fetchTicketContext, fetchChatRoomHistory, fetchAgentRecord, fetchRepositoryCredential, postFsResponse, postChatRoomMessage, postDispatchAck, } from './rest.js';
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, InflightDispatchTracker, RoleSpawnSuppressor, classifyWorktreeOutcome, managedWorktreePath, provisioningPendReason } from './dispatch-preflight.js';
7
+ import { DispatchBlockerTracker, DispatchBlockTracker, InflightDispatchTracker, PendingDispatchRetry, RoleSpawnSuppressor, classifyWorktreeOutcome, managedWorktreePath, provisioningPendReason } from './dispatch-preflight.js';
8
8
  import { createAdapter, ADAPTER_CAPABILITIES } from './cli-adapters/index.js';
9
9
  import { parseRunProvision, provisionRunWorkspace, reconcileRunBaseWorkingDir, resolveRunFolder, } from './run-provisioner.js';
10
10
  import { FolderMutex } from './run-execution-lock.js';
@@ -180,6 +180,10 @@ export function validateWorktreeProvisioningInputs(args) {
180
180
  return null;
181
181
  }
182
182
  const AGENT_CHAIN_DEPTH_CAP = 3;
183
+ const POOL_EXHAUSTED_RETRY_COMMENT = `⚠️ **shared worktree 풀 고갈 (pool_exhausted)** — 공유 warm-pool 의 모든 슬롯이 활성 lease 라 에이전트를 실행하지 않고 디스패치를 보류했습니다.\n\n` +
184
+ `on-demand lease 재조정을 즉시 시도했지만 회수 가능한 슬롯이 없었습니다 (reclaim grace(20분) 이내의 lease 이거나, 같은 working_dir 를 공유하는 다른 보드와의 일시적 경합).\n\n` +
185
+ `매니저가 이 트리거를 **자동 재시도 큐**에 넣었습니다 — 백오프로 재시도하며, 활성 티켓이 끝나 슬롯을 반납하거나(또는 주기/부팅 재조정이 leaked lease 를 회수하는) 즉시 재프로비저닝합니다. **서버 재푸시가 필요 없습니다.**\n\n` +
186
+ `재시도 한도까지 계속 고갈이면 운영자 확인을 위해 자동으로 pend 되며, max_concurrent_tickets_per_agent(풀 크기 N)와 이 working_dir 를 공유하는 보드 구성을 점검하세요.`;
183
187
  export class EventDispatcher {
184
188
  #config;
185
189
  #subagentManager;
@@ -196,6 +200,18 @@ export class EventDispatcher {
196
200
  dispatchSuppressionCounts() {
197
201
  return this.#inflightDispatch.suppressionCounts();
198
202
  }
203
+ #dispatchBlockTracker;
204
+ #poolReclaimTrigger;
205
+ dispatchBlockCounts() {
206
+ return this.#dispatchBlockTracker.counts();
207
+ }
208
+ #poolRetry;
209
+ wakePoolRetries(reason) {
210
+ this.#poolRetry.wake(reason);
211
+ }
212
+ pendingPoolRetryCount() {
213
+ return this.#poolRetry.size();
214
+ }
199
215
  #runExecLock = new FolderMutex();
200
216
  constructor(config, deps = {}) {
201
217
  this.#config = config;
@@ -208,6 +224,16 @@ export class EventDispatcher {
208
224
  this.#managedAgentContexts = deps.managedAgentContexts ?? null;
209
225
  this.#worktreeManager = deps.worktreeManager ?? null;
210
226
  this.#inflightDispatch = deps.inflightDispatchTracker ?? new InflightDispatchTracker();
227
+ this.#dispatchBlockTracker = deps.dispatchBlockTracker ?? new DispatchBlockTracker();
228
+ this.#poolReclaimTrigger = deps.poolReclaimTrigger ?? null;
229
+ this.#poolRetry = new PendingDispatchRetry({
230
+ onRetry: (raw) => this.handleTrigger(raw),
231
+ onGiveUp: (entry) => this.#pendExhaustedPoolRetry(entry),
232
+ verify: (entry) => this.#isPoolRetryEligible(entry),
233
+ scheduler: deps.poolRetryScheduler ?? undefined,
234
+ maxAttempts: deps.poolRetryMaxAttempts ?? undefined,
235
+ log,
236
+ });
211
237
  }
212
238
  async #applyWorktreeCwd(agentContext, ticketId, role, mode, poolSize, bootstrapRepo) {
213
239
  const requiredError = validateWorktreeProvisioningInputs({
@@ -256,6 +282,30 @@ export class EventDispatcher {
256
282
  return { ok: false, reason, blockerKind: 'worktree:error' };
257
283
  }
258
284
  }
285
+ async #isPoolRetryEligible(entry) {
286
+ const ticket = await fetchTicketContext(this.#config, entry.ticketId);
287
+ if (!ticket)
288
+ return true;
289
+ if (ticket.pending_user_action)
290
+ return false;
291
+ if (ticket.terminal_entered_at)
292
+ return false;
293
+ return true;
294
+ }
295
+ async #pendExhaustedPoolRetry(entry) {
296
+ if (!entry.ticketId)
297
+ return;
298
+ const reason = `shared worktree 풀 고갈(pool_exhausted)이 매니저 자동 재시도 ${entry.attempts}회(약 20분 이상) 후에도 지속 — ` +
299
+ `회수 가능한 leaked lease 가 없어 실제 풀 과다구독으로 판단됩니다. max_concurrent_tickets_per_agent(풀 크기 N)와 이 working_dir 를 공유하는 보드 구성을 점검하고 unpend 로 재개하세요.`;
300
+ await fireAndForgetTool(this.#config, 'pend_ticket', { ticket_id: entry.ticketId, reason });
301
+ await fireAndForgetTool(this.#config, 'add_comment', {
302
+ ticket_id: entry.ticketId,
303
+ content: `⛔ **shared worktree 풀 고갈 지속 — 자동 재시도 한도 초과, pend** — 매니저가 ${entry.attempts}회 자동 재시도했지만 슬롯이 반납/회수되지 않아 디스패치를 pend 했습니다.\n\n` +
304
+ `leaked lease 는 이미 회수 grace(20분) 를 넘겨 재조정 대상이었으므로, 남은 원인은 이 working_dir 를 공유하는 보드들의 실제 동시 실행 수가 풀 크기 N 을 초과하는 과다구독입니다.\n\n` +
305
+ `**조치:** max_concurrent_tickets_per_agent 를 늘리거나, 이 working_dir 를 공유하는 보드/에이전트 구성을 분리한 뒤 unpend 하세요. (원인-불문 no-progress 백스톱: e7c87517)`,
306
+ });
307
+ log(`[pool-retry] pended ticket=${entry.ticketId.slice(0, 8)} role=${entry.role} after ${entry.attempts} exhausted retries`);
308
+ }
259
309
  async #cleanupTerminalTicketWorktrees(ticketId) {
260
310
  if (!this.#worktreeManager)
261
311
  return;
@@ -281,6 +331,7 @@ export class EventDispatcher {
281
331
  }
282
332
  if (total > 0) {
283
333
  log(`[worktree] terminal ticket=${ticketId.slice(0, 8)} reclaimed ${total} worktree(s)`);
334
+ this.#poolRetry.wake(`slot_release:terminal:${ticketId.slice(0, 8)}`);
284
335
  }
285
336
  }
286
337
  catch (err) {
@@ -317,6 +368,9 @@ export class EventDispatcher {
317
368
  if (worktrees > 0 || runDirs > 0) {
318
369
  log(`[worktree] archived ticket=${ticketId.slice(0, 8)} reclaimed ${worktrees} worktree(s) + ${runDirs} run workspace(s)`);
319
370
  }
371
+ if (worktrees > 0) {
372
+ this.#poolRetry.wake(`slot_release:archived:${ticketId.slice(0, 8)}`);
373
+ }
320
374
  }
321
375
  catch (err) {
322
376
  log(`[worktree] archive cleanup failed for ticket=${ticketId.slice(0, 8)}: ${err?.message ?? err}`);
@@ -496,7 +550,7 @@ export class EventDispatcher {
496
550
  }
497
551
  const reservedFresh = !!reservation && reservation.acquired && !reservation.live;
498
552
  try {
499
- await this.#dispatchTriggerBody(ev, agentContext, envConfig, canAuthoritative && reservedFresh);
553
+ await this.#dispatchTriggerBody(ev, agentContext, envConfig, canAuthoritative && reservedFresh, raw);
500
554
  }
501
555
  finally {
502
556
  if (inflightKey) {
@@ -526,26 +580,58 @@ export class EventDispatcher {
526
580
  }
527
581
  }
528
582
  }
529
- async #dispatchTriggerBody(ev, agentContext, envConfig, dispatchReserved) {
583
+ async #dispatchTriggerBody(ev, agentContext, envConfig, dispatchReserved, raw) {
530
584
  const selectedRepo = resolveBootstrapRepository(ev.base_repo, ev.base_branch, envConfig);
531
585
  const repoCredential = selectedRepo?.resourceId && agentContext?.agent_id
532
586
  ? await fetchRepositoryCredential(this.#config, selectedRepo.resourceId, agentContext.agent_id)
533
587
  : null;
534
- const worktreeProvision = await this.#applyWorktreeCwd(agentContext, ev.ticket_id, ev.action, parseWorktreeMode(ev.worktree_mode), typeof ev.max_concurrent_tickets_per_agent === 'number'
588
+ const applyWorktree = () => this.#applyWorktreeCwd(agentContext, ev.ticket_id, ev.action, parseWorktreeMode(ev.worktree_mode), typeof ev.max_concurrent_tickets_per_agent === 'number'
535
589
  ? ev.max_concurrent_tickets_per_agent
536
590
  : undefined, selectedRepo ? { ...selectedRepo, credential: repoCredential } : null);
591
+ let worktreeProvision = await applyWorktree();
592
+ if (!worktreeProvision.ok && worktreeProvision.reason === 'pool_exhausted') {
593
+ this.#dispatchBlockTracker.record(worktreeProvision.blockerKind || 'worktree:pool_exhausted');
594
+ const reclaimed = this.#poolReclaimTrigger
595
+ ? await this.#poolReclaimTrigger().catch((err) => {
596
+ log(`[worktree] on-demand pool reclaim failed: ${err?.message ?? err}`);
597
+ return 0;
598
+ })
599
+ : 0;
600
+ log(`[worktree] pool_exhausted for ticket=${String(ev.ticket_id).slice(0, 8)} role=${ev.action} — ` +
601
+ `on-demand reclaim freed ${reclaimed} orphaned lease(s)` +
602
+ (reclaimed > 0 ? '; retrying provisioning inline' : ' (no reclaimable lease — within-grace or genuine contention; queuing retry)'));
603
+ if (reclaimed > 0)
604
+ worktreeProvision = await applyWorktree();
605
+ if (!worktreeProvision.ok && ev.ticket_id) {
606
+ const meta = { ticketId: ev.ticket_id, role: ev.action || '', agentId: ev.actor_name || '' };
607
+ const { created } = this.#poolRetry.register(meta, raw);
608
+ if (created) {
609
+ await fireAndForgetTool(this.#config, 'add_comment', {
610
+ ticket_id: ev.ticket_id,
611
+ content: POOL_EXHAUSTED_RETRY_COMMENT,
612
+ });
613
+ }
614
+ log(`[worktree] pool_exhausted — queued manager-owned retry ticket=${String(ev.ticket_id).slice(0, 8)} ` +
615
+ `role=${ev.action} (new_episode=${created}, queued=${this.#poolRetry.size()})`);
616
+ return;
617
+ }
618
+ }
537
619
  if (!worktreeProvision.ok) {
538
620
  const blockerKind = worktreeProvision.blockerKind || `worktree:${worktreeProvision.reason || 'unknown'}`;
621
+ if (worktreeProvision.reason !== 'pool_exhausted') {
622
+ this.#dispatchBlockTracker.record(blockerKind);
623
+ }
539
624
  const provisionBlock = this.#spawnSuppressor.note(ev.ticket_id, ev.action, blockerKind, Date.now());
540
625
  if (ev.ticket_id && this.#dispatchBlockers.shouldComment(ev.ticket_id, blockerKind)) {
541
626
  const detailLine = worktreeProvision.detail ? `\n세부: \`${worktreeProvision.detail}\`` : '';
542
627
  const pathLine = worktreeProvision.path ? `\n경로: \`${worktreeProvision.path}\`` : '';
628
+ const content = `⚠️ **티켓 worktree 준비 실패** — 유효한 Git 체크아웃을 확보하지 못해 에이전트를 실행하지 않고 디스패치를 중단했습니다.\n\n` +
629
+ `원인: \`${worktreeProvision.reason || 'unknown error'}\`${detailLine}${pathLine}\n\n` +
630
+ `repository resource, credential과 working_dir 아래 AWB 관리 폴더(\`.awb/base\`, \`.awb/wt\`)를 확인한 뒤 다시 트리거하세요.\n\n` +
631
+ `_동일 오류로 인한 supervisor 자동 재트리거는 백오프로 억제됩니다 — 환경을 고친 뒤 코멘트/수동 트리거로 재개하세요._`;
543
632
  await fireAndForgetTool(this.#config, 'add_comment', {
544
633
  ticket_id: ev.ticket_id,
545
- content: `⚠️ **티켓 worktree 준비 실패** — 유효한 Git 체크아웃을 확보하지 못해 에이전트를 실행하지 않고 디스패치를 중단했습니다.\n\n` +
546
- `원인: \`${worktreeProvision.reason || 'unknown error'}\`${detailLine}${pathLine}\n\n` +
547
- `repository resource, credential과 working_dir 아래 AWB 관리 폴더(\`.awb/base\`, \`.awb/wt\`)를 확인한 뒤 다시 트리거하세요.\n\n` +
548
- `_동일 오류로 인한 supervisor 자동 재트리거는 백오프로 억제됩니다 — 환경을 고친 뒤 코멘트/수동 트리거로 재개하세요._`,
634
+ content,
549
635
  });
550
636
  }
551
637
  if (ev.ticket_id && provisionBlock.shouldPend) {
@@ -561,6 +647,7 @@ export class EventDispatcher {
561
647
  log(`[worktree] durable provisioning block — pended ticket=${ev.ticket_id} role=${ev.action} blocker=${blockerKind} aborts=${provisionBlock.count}`);
562
648
  }
563
649
  log(`Trigger aborted — ticket worktree verification failed: ticket=${ev.ticket_id} role=${ev.action} reason=${worktreeProvision.reason || 'unknown'} blocker=${blockerKind}${worktreeProvision.path ? ` path=${worktreeProvision.path}` : ''}`);
650
+ this.#ackDispatch(ev, 'nack', blockerKind);
564
651
  return;
565
652
  }
566
653
  if (ev.action === 'assignee'
@@ -568,6 +655,7 @@ export class EventDispatcher {
568
655
  const readiness = await this.#worktreeManager.verifyPushReadiness(agentContext.cwd, selectedRepo.url);
569
656
  if (!readiness.ok) {
570
657
  const blockerKind = readiness.reason || 'push_credential_unavailable';
658
+ this.#dispatchBlockTracker.record(blockerKind);
571
659
  const provisionBlock = this.#spawnSuppressor.note(ev.ticket_id, ev.action, blockerKind, Date.now());
572
660
  if (this.#dispatchBlockers.shouldComment(ev.ticket_id, blockerKind)) {
573
661
  await fireAndForgetTool(this.#config, 'add_comment', {
@@ -592,12 +680,14 @@ export class EventDispatcher {
592
680
  log(`[push-credential] durable provisioning block — pended ticket=${ev.ticket_id} role=${ev.action} blocker=${blockerKind} aborts=${provisionBlock.count}`);
593
681
  }
594
682
  log(`Trigger aborted — push credential unavailable: ticket=${ev.ticket_id} detail=${readiness.detail || ''}`);
683
+ this.#ackDispatch(ev, 'nack', blockerKind);
595
684
  return;
596
685
  }
597
686
  }
598
687
  if (ev.ticket_id) {
599
688
  this.#dispatchBlockers.clear(ev.ticket_id);
600
689
  this.#spawnSuppressor.clear(ev.ticket_id, ev.action);
690
+ this.#poolRetry.resolve({ ticketId: ev.ticket_id, role: ev.action || '', agentId: ev.actor_name || '' });
601
691
  }
602
692
  if (ev.worktree_rel_path && ev.column_prompt && typeof ev.column_prompt.content === 'string') {
603
693
  const workFolder = agentContext?.cwd || ev.worktree_rel_path;
@@ -652,6 +742,7 @@ export class EventDispatcher {
652
742
  });
653
743
  if (result.dispatched) {
654
744
  log(`Trigger dispatched to ticket session: ticket=${ev.ticket_id} pid=${result.pid}${result.firstTurn ? ' (new session)' : ''}`);
745
+ this.#ackDispatch(ev, 'processed');
655
746
  return;
656
747
  }
657
748
  if (result.reason === 'duplicate_trigger') {
@@ -696,6 +787,7 @@ export class EventDispatcher {
696
787
  });
697
788
  if (result.spawned) {
698
789
  log(`Trigger dispatched to subagent: ticket=${ev.ticket_id} pid=${result.pid}${agentContext ? ` agent=${agentContext.agent_id.slice(0, 8)}` : ''}`);
790
+ this.#ackDispatch(ev, 'processed');
699
791
  return;
700
792
  }
701
793
  log(`Subagent spawn declined (${result.reason}); no further fallback in standalone mode`);
@@ -706,6 +798,15 @@ export class EventDispatcher {
706
798
  }
707
799
  log(`Trigger processed (no delegation path spawned): ticket=${ev.ticket_id} role=${ev.action}`);
708
800
  }
801
+ #ackDispatch(ev, outcome, reason) {
802
+ void postDispatchAck(this.#config, {
803
+ ticket_id: String(ev?.ticket_id || ''),
804
+ role: String(ev?.action || ''),
805
+ trigger_id: String(ev?.field_changed || ''),
806
+ outcome,
807
+ reason: reason ? String(reason).slice(0, 500) : '',
808
+ });
809
+ }
709
810
  async handleChatRequest(raw) {
710
811
  let ev;
711
812
  try {
@@ -855,9 +956,11 @@ export class EventDispatcher {
855
956
  try {
856
957
  const ev = JSON.parse(raw);
857
958
  if (ev.entity_type === 'ticket' && ev.action === 'moved' && ev.ticket_id) {
959
+ this.#poolRetry.cancelByTicket(ev.ticket_id, 'ticket moved');
858
960
  void this.#cleanupTerminalTicketWorktrees(ev.ticket_id);
859
961
  }
860
962
  if (ev.entity_type === 'ticket' && ev.action === 'archived' && ev.ticket_id) {
963
+ this.#poolRetry.cancelByTicket(ev.ticket_id, 'ticket archived');
861
964
  void this.#cleanupArchivedTicketWorkspace(ev.ticket_id, ev.repository_resource_id);
862
965
  }
863
966
  if (this.#ticketSessionManager && ev.ticket_id) {