@vtxmacro/cli 2026.8.33 → 2026.8.35

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 (2) hide show
  1. package/bin/vtx.js +44 -8
  2. package/package.json +1 -1
package/bin/vtx.js CHANGED
@@ -38,7 +38,7 @@ var init_agent_cli_release = __esm({
38
38
  "agent-cli-release.json"() {
39
39
  agent_cli_release_default = {
40
40
  package_name: "@vtxmacro/cli",
41
- package_version: "2026.8.33",
41
+ package_version: "2026.8.35",
42
42
  codex_package_name: "@openai/codex",
43
43
  codex_version: "0.147.0",
44
44
  platforms: {
@@ -29880,6 +29880,7 @@ var init_runner = __esm({
29880
29880
  now()
29881
29881
  )
29882
29882
  });
29883
+ const recoveryQueue = [];
29883
29884
  const launchClaim = (claim, recovery, claimRequest) => {
29884
29885
  if (!recovery) {
29885
29886
  claimed += 1;
@@ -29901,6 +29902,7 @@ var init_runner = __esm({
29901
29902
  pendingClaimPromotions = Math.max(0, pendingClaimPromotions - 1);
29902
29903
  };
29903
29904
  if (claimRequest) pendingClaimPromotions += 1;
29905
+ let retryRecovery = null;
29904
29906
  const promise2 = this.executeClaim({
29905
29907
  claim,
29906
29908
  attemptId,
@@ -29960,7 +29962,16 @@ var init_runner = __esm({
29960
29962
  onClaimPersisted: settleClaimPromotion
29961
29963
  }).then((outcome) => {
29962
29964
  if (outcome === "completed") completed += 1;
29963
- else failed += 1;
29965
+ else if (outcome === "failed") failed += 1;
29966
+ else {
29967
+ const recovery2 = receipt.attempts[attemptId];
29968
+ if (recovery2?.phase !== "claimed") {
29969
+ throw new InferenceHostRecoveryRequiredError(
29970
+ "The retryable pre-dispatch attempt receipt is unavailable."
29971
+ );
29972
+ }
29973
+ retryRecovery = recovery2;
29974
+ }
29964
29975
  }).catch((error48) => {
29965
29976
  failed += 1;
29966
29977
  requestDrain(controlPlaneFatal(error48) ? "authority_lost" : "attempt_terminal_unconfirmed");
@@ -29968,6 +29979,14 @@ var init_runner = __esm({
29968
29979
  settleClaimPromotion();
29969
29980
  active.delete(attemptId);
29970
29981
  attemptControllers.delete(attemptId);
29982
+ if (retryRecovery) {
29983
+ recoveryQueue.push(retryRecovery);
29984
+ emitDiagnostic("attempt_start_retry_scheduled", {
29985
+ job_id: claim.job_id,
29986
+ attempt_id: attemptId,
29987
+ active_attempts: active.size
29988
+ });
29989
+ }
29971
29990
  });
29972
29991
  active.set(attemptId, promise2);
29973
29992
  emitDiagnostic("attempt_started", {
@@ -29986,7 +30005,6 @@ var init_runner = __esm({
29986
30005
  receipt = { ...receipt, attempts, updated_at: isoAt(now()) };
29987
30006
  await this.persistReceipt(receipt, now);
29988
30007
  };
29989
- const recoveryQueue = [];
29990
30008
  for (const recovery of Object.values({ ...receipt.attempts })) {
29991
30009
  if (recovery.phase === "terminal_pending") {
29992
30010
  try {
@@ -30362,7 +30380,17 @@ var init_runner = __esm({
30362
30380
  await removeAttempt();
30363
30381
  return "failed";
30364
30382
  }
30365
- throw error48;
30383
+ if (signal.aborted) throw error48;
30384
+ if (controlPlaneFatal(error48)) throw error48;
30385
+ const remainingMs = Math.max(
30386
+ MIN_SLEEP_MS,
30387
+ attemptDeadlineAtMs - now() - MIN_CLAIM_START_WINDOW_MS
30388
+ );
30389
+ await options.sleep(
30390
+ Math.min(remoteRetryAfterMs(error48, 1e3), remainingMs),
30391
+ signal
30392
+ );
30393
+ return "retry_claimed";
30366
30394
  }
30367
30395
  assertStartResult(startRequest, startResult);
30368
30396
  await updateAttempt({ phase: "started" });
@@ -30426,6 +30454,11 @@ var init_runner = __esm({
30426
30454
  heartbeatFailure = error48;
30427
30455
  attemptAbort.abort();
30428
30456
  });
30457
+ const stopHeartbeat = async () => {
30458
+ heartbeatStopped = true;
30459
+ attemptAbort.abort();
30460
+ await heartbeatLoop;
30461
+ };
30429
30462
  try {
30430
30463
  this.validateImmutableSelection(jobInput);
30431
30464
  const outputContract = parseOutputContract(jobInput);
@@ -30584,6 +30617,7 @@ var init_runner = __esm({
30584
30617
  { cause: error48 }
30585
30618
  );
30586
30619
  }
30620
+ await stopHeartbeat();
30587
30621
  await removeAttempt();
30588
30622
  options.onAttemptOutcome?.({
30589
30623
  outcome: "completed",
@@ -30661,7 +30695,10 @@ var init_runner = __esm({
30661
30695
  failure_category: failure.category,
30662
30696
  failure_code: failure.code,
30663
30697
  retryable: failure.retryable,
30664
- membership_disposition: membershipFailureDisposition(failure),
30698
+ membership_disposition: membershipFailureDisposition({
30699
+ ...failure,
30700
+ dispatchOutcome
30701
+ }),
30665
30702
  failed_at: isoAt(now())
30666
30703
  });
30667
30704
  await updateAttempt({
@@ -30685,6 +30722,7 @@ var init_runner = __esm({
30685
30722
  { cause: terminalError }
30686
30723
  );
30687
30724
  }
30725
+ await stopHeartbeat();
30688
30726
  await removeAttempt();
30689
30727
  options.onAttemptOutcome?.({
30690
30728
  outcome: "failed",
@@ -30698,10 +30736,8 @@ var init_runner = __esm({
30698
30736
  });
30699
30737
  return "failed";
30700
30738
  } finally {
30701
- heartbeatStopped = true;
30702
- attemptAbort.abort();
30703
30739
  signal.removeEventListener("abort", relayAbort);
30704
- await heartbeatLoop;
30740
+ await stopHeartbeat();
30705
30741
  }
30706
30742
  }
30707
30743
  validateImmutableSelection(jobInput) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vtxmacro/cli",
3
- "version": "2026.8.33",
3
+ "version": "2026.8.35",
4
4
  "description": "VTX Macro CLI, MCP server, and durable subscription inference host.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",