@agent-relay/factory 0.1.54 → 0.1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/orchestrator/factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/orchestrator/factory.ts"],"names":[],"mappings":"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"}
@@ -6060,8 +6060,10 @@ export class FactoryLoop {
6060
6060
  await this.#recordPendingBabysitterWake(state);
6061
6061
  }
6062
6062
  this.#babysitterWakeStates.set(babysitterWakeKey(record.issue, ref), state);
6063
- if (state.kinds.size > 0)
6063
+ if (state.kinds.size > 0 &&
6064
+ !await this.#suspendBabysitterWakeForHuman(state)) {
6064
6065
  this.#scheduleBabysitterWake(state, BABYSITTER_EVENT_COALESCE_MS);
6066
+ }
6065
6067
  }
6066
6068
  await this.#persistBabysitterSession(record.issue, ref, tracked, ownershipKey);
6067
6069
  }
@@ -8522,6 +8524,8 @@ export class FactoryLoop {
8522
8524
  babysitter: ref.agentName,
8523
8525
  kinds: [...state.kinds],
8524
8526
  });
8527
+ if (await this.#suspendBabysitterWakeForHuman(state))
8528
+ return true;
8525
8529
  if (state.deferredSubmitTargets || state.inFlight || this.#babysitterCriticalAgents.has(state.agentName)) {
8526
8530
  this.#increment('babysitterEventWakesDeferred');
8527
8531
  return true;
@@ -8567,8 +8571,44 @@ export class FactoryLoop {
8567
8571
  ...(ref.pendingDeliveryClaims?.length ? { pendingDeliveryClaims: structuredClone(ref.pendingDeliveryClaims) } : {}),
8568
8572
  });
8569
8573
  }
8574
+ async #suspendBabysitterWakeForHuman(state) {
8575
+ const key = issueKey(state.issue);
8576
+ const [lifecycle, clarification] = await Promise.all([
8577
+ this.#usesDurableDispatchLifecycle()
8578
+ ? this.#state.getDispatchLifecycle(this.#workspaceId, key)
8579
+ : undefined,
8580
+ this.#state.getWaitingClarification(this.#workspaceId, key),
8581
+ ]);
8582
+ // parkedAtMs is the durable release fence for local/non-lifecycle fleets.
8583
+ // Once a lifecycle exists it is authoritative, because clarification
8584
+ // resume promotes it before the saved agent sessions are restored.
8585
+ const waitingForHuman = lifecycle
8586
+ ? lifecycle.phase === 'waiting-for-human'
8587
+ : clarification?.parkedAtMs !== undefined;
8588
+ if (!waitingForHuman) {
8589
+ state.suspendedForHuman = false;
8590
+ return false;
8591
+ }
8592
+ if (!state.suspendedForHuman) {
8593
+ state.suspendedForHuman = true;
8594
+ this.#increment('babysitterEventWakesDeferredWaitingForHuman');
8595
+ this.#logger.debug?.('[factory] suspended babysitter PR event wake while waiting for human clarification', {
8596
+ issue: state.issue.key,
8597
+ repo: state.repo,
8598
+ prNumber: state.prNumber,
8599
+ babysitter: state.agentName,
8600
+ kinds: [...state.kinds].sort(compareBabysitterWakeKinds),
8601
+ });
8602
+ }
8603
+ return true;
8604
+ }
8570
8605
  #scheduleBabysitterWake(state, delayMs) {
8571
- if (state.timer || state.inFlight || state.deferredSubmitTargets || state.cancelled || this.#stopping)
8606
+ if (state.timer ||
8607
+ state.inFlight ||
8608
+ state.deferredSubmitTargets ||
8609
+ state.suspendedForHuman ||
8610
+ state.cancelled ||
8611
+ this.#stopping)
8572
8612
  return;
8573
8613
  state.timer = setTimeout(() => {
8574
8614
  state.timer = undefined;
@@ -8578,7 +8618,10 @@ export class FactoryLoop {
8578
8618
  state.inFlight = undefined;
8579
8619
  if (this.#stopping)
8580
8620
  return;
8581
- if (state.kinds.size > 0 && !state.deferredSubmitTargets && !this.#babysitterCriticalAgents.has(state.agentName)) {
8621
+ if (state.kinds.size > 0 &&
8622
+ !state.deferredSubmitTargets &&
8623
+ !state.suspendedForHuman &&
8624
+ !this.#babysitterCriticalAgents.has(state.agentName)) {
8582
8625
  const delayMs = state.nextDelayMs ?? BABYSITTER_EVENT_COALESCE_MS;
8583
8626
  state.nextDelayMs = undefined;
8584
8627
  this.#scheduleBabysitterWake(state, delayMs);
@@ -8605,6 +8648,8 @@ export class FactoryLoop {
8605
8648
  this.#increment('babysitterEventWakesCancelledNonOwner');
8606
8649
  return;
8607
8650
  }
8651
+ if (await this.#suspendBabysitterWakeForHuman(state))
8652
+ return;
8608
8653
  if (this.#babysitterCriticalAgents.has(state.agentName)) {
8609
8654
  this.#increment('babysitterEventWakesDeferredCritical');
8610
8655
  return;
@@ -8785,6 +8830,8 @@ export class FactoryLoop {
8785
8830
  for (const state of this.#babysitterWakeStates.values()) {
8786
8831
  if (state.agentName !== agentName)
8787
8832
  continue;
8833
+ if (await this.#suspendBabysitterWakeForHuman(state))
8834
+ continue;
8788
8835
  if (state.deferredSubmitTargets) {
8789
8836
  const targets = state.deferredSubmitTargets;
8790
8837
  state.deferredSubmitTargets = undefined;
@@ -11171,8 +11218,10 @@ export class FactoryLoop {
11171
11218
  batch.recordSpawn(record, tracked.spec, invocationId, result);
11172
11219
  await this.#saveDispatchLifecycle(record, 'dispatching');
11173
11220
  const live = record.agents.get(result.name);
11174
- if (live)
11221
+ if (live) {
11175
11222
  resumed.push([result.name, live]);
11223
+ await this.#retargetBabysitterAgent(record, parked.name, live);
11224
+ }
11176
11225
  this.#assertClarificationWakeRunning();
11177
11226
  await renewLease();
11178
11227
  }