@axlsdk/axl 0.24.3 → 0.25.0

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/index.cjs CHANGED
@@ -425,7 +425,7 @@ var TimeoutError = class extends AxlError {
425
425
  constructor(operation, timeoutMs, breakdown, agent2) {
426
426
  super(
427
427
  "TIMEOUT",
428
- `${operation} exceeded timeout of ${timeoutMs}ms` + (breakdown ? ` (elapsed ${breakdown.elapsedMs}ms: queued ${breakdown.queuedMs}ms, retries ${breakdown.retryMs}ms, wire ${breakdown.wireMs}ms, other ${breakdown.otherMs}ms)` : "") + (agent2 ? ` for agent '${agent2}'` : "")
428
+ `${operation} exceeded timeout of ${timeoutMs}ms` + (breakdown ? ` (elapsed ${breakdown.elapsedMs}ms: queued ${breakdown.queuedMs}ms, retries ${breakdown.retryMs}ms, wire ${breakdown.wireMs}ms, other ${breakdown.otherMs}ms, charged ${breakdown.chargedMs}ms)` : "") + (agent2 ? ` for agent '${agent2}'` : "")
429
429
  );
430
430
  this.name = "TimeoutError";
431
431
  if (breakdown) this.breakdown = breakdown;
@@ -563,7 +563,7 @@ var sharedGuard = typeof installedGuard === "object" && installedGuard !== null
563
563
  var buildPath = typeof __AXL_BUILD_PATH__ === "string" ? __AXL_BUILD_PATH__ : "<source>";
564
564
  var thisCopy = {
565
565
  path: buildPath.startsWith("file:") ? (0, import_node_url.fileURLToPath)(buildPath) : buildPath,
566
- version: true ? "0.24.3" : "unknown"
566
+ version: true ? "0.25.0" : "unknown"
567
567
  };
568
568
  function warnCrossCopy(other, joined) {
569
569
  if (other === thisCopy) return;
@@ -1547,6 +1547,41 @@ var OPENAI_DEFAULT_BASE_URL = "https://api.openai.com/v1";
1547
1547
  var ANTHROPIC_DEFAULT_BASE_URL = "https://api.anthropic.com/v1";
1548
1548
  var GEMINI_DEFAULT_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
1549
1549
 
1550
+ // src/ask-clock.ts
1551
+ var import_node_async_hooks2 = require("async_hooks");
1552
+ var askClockStorage = new import_node_async_hooks2.AsyncLocalStorage();
1553
+ function runWithAskClock(fn) {
1554
+ const tracker = { pausedMs: 0, activePauses: 0 };
1555
+ const enclosing = askClockStorage.getStore() ?? [];
1556
+ return askClockStorage.run([...enclosing, tracker], fn);
1557
+ }
1558
+ function currentAskClock() {
1559
+ return askClockStorage.getStore()?.at(-1);
1560
+ }
1561
+ function pausedAskClockMs(tracker, now = Date.now()) {
1562
+ return tracker.pausedMs + (tracker.activePauses > 0 && tracker.pauseStartedAt !== void 0 ? now - tracker.pauseStartedAt : 0);
1563
+ }
1564
+ async function pauseAskClocks(wait) {
1565
+ const trackers = askClockStorage.getStore();
1566
+ if (!trackers || trackers.length === 0) return wait();
1567
+ const startedAt = Date.now();
1568
+ for (const tracker of trackers) {
1569
+ if (tracker.activePauses++ === 0) tracker.pauseStartedAt = startedAt;
1570
+ }
1571
+ try {
1572
+ return await wait();
1573
+ } finally {
1574
+ const finishedAt = Date.now();
1575
+ for (const tracker of trackers) {
1576
+ tracker.activePauses--;
1577
+ if (tracker.activePauses === 0 && tracker.pauseStartedAt !== void 0) {
1578
+ tracker.pausedMs += finishedAt - tracker.pauseStartedAt;
1579
+ tracker.pauseStartedAt = void 0;
1580
+ }
1581
+ }
1582
+ }
1583
+ }
1584
+
1550
1585
  // src/providers/rate-limiter.ts
1551
1586
  function sanitizeRateLimitConfig(config) {
1552
1587
  const limits = {};
@@ -2609,7 +2644,7 @@ async function fetchWithRetry(input, init, opts) {
2609
2644
  let headersAt = 0;
2610
2645
  const waitSelfImposed = async (wait) => {
2611
2646
  const start = Date.now();
2612
- await wait();
2647
+ await pauseAskClocks(wait);
2613
2648
  const waited = Date.now() - start;
2614
2649
  queuedMs += waited;
2615
2650
  if (dispatches > 0) queuedAfterFirstDispatchMs += waited;
@@ -9234,7 +9269,7 @@ var TranscriptionProviderRegistry = class {
9234
9269
  };
9235
9270
 
9236
9271
  // src/context.ts
9237
- var import_node_async_hooks2 = require("async_hooks");
9272
+ var import_node_async_hooks3 = require("async_hooks");
9238
9273
  var import_node_crypto = require("crypto");
9239
9274
  var import_zod2 = require("zod");
9240
9275
 
@@ -12766,9 +12801,8 @@ function recordToolSpanOutcome(span, outcome) {
12766
12801
  }
12767
12802
 
12768
12803
  // src/context.ts
12769
- var signalStorage = new import_node_async_hooks2.AsyncLocalStorage();
12770
- var hardSignalStorage = new import_node_async_hooks2.AsyncLocalStorage();
12771
- var timeoutTrackerStorage = new import_node_async_hooks2.AsyncLocalStorage();
12804
+ var signalStorage = new import_node_async_hooks3.AsyncLocalStorage();
12805
+ var hardSignalStorage = new import_node_async_hooks3.AsyncLocalStorage();
12772
12806
  var MAX_TIMER_DELAY_MS = 2147483647;
12773
12807
  function composeAbortSignals(...signals) {
12774
12808
  const active = signals.filter((signal) => signal !== void 0);
@@ -12800,9 +12834,6 @@ function raceWithAbortSignal(promise, signal) {
12800
12834
  );
12801
12835
  });
12802
12836
  }
12803
- function pausedHumanWaitMs(tracker, now = Date.now()) {
12804
- return tracker.humanWaitMs + (tracker.activeHumanWaits > 0 && tracker.humanWaitStartedAt !== void 0 ? now - tracker.humanWaitStartedAt : 0);
12805
- }
12806
12837
  var DEFAULT_BRANCH_DRAIN_TIMEOUT_MS = 5e3;
12807
12838
  function resolveBranchDrainTimeoutMs(value) {
12808
12839
  const resolved = value === void 0 ? DEFAULT_BRANCH_DRAIN_TIMEOUT_MS : value;
@@ -12873,7 +12904,7 @@ function parseHumanDecision(value) {
12873
12904
  }
12874
12905
  return invalid3();
12875
12906
  }
12876
- var askStorage = new import_node_async_hooks2.AsyncLocalStorage();
12907
+ var askStorage = new import_node_async_hooks3.AsyncLocalStorage();
12877
12908
  var inlineSchemaCache = /* @__PURE__ */ new WeakMap();
12878
12909
  function zodToJsonSchema(schema) {
12879
12910
  const cached = inlineSchemaCache.get(schema);
@@ -13810,10 +13841,7 @@ var WorkflowContext = class _WorkflowContext {
13810
13841
  return hardAskSignal ? hardSignalStorage.run(hardAskSignal, runWithAskSignal) : runWithAskSignal();
13811
13842
  }
13812
13843
  async executeAgentCall(agent2, input, options, handoffMessages, usageCapture, sessionHistory = normalizeSessionHistory(this.sessionHistory)) {
13813
- const tracker = { humanWaitMs: 0, activeHumanWaits: 0 };
13814
- const enclosing = timeoutTrackerStorage.getStore() ?? [];
13815
- return timeoutTrackerStorage.run(
13816
- [...enclosing, tracker],
13844
+ return runWithAskClock(
13817
13845
  () => this.executeAgentCallImpl(
13818
13846
  agent2,
13819
13847
  input,
@@ -14088,7 +14116,7 @@ ${appendedSchemaText}`;
14088
14116
  );
14089
14117
  }
14090
14118
  const startTime = Date.now();
14091
- const timeoutTracker = timeoutTrackerStorage.getStore()?.at(-1);
14119
+ const askClock = currentAskClock();
14092
14120
  const timingTotals = { turns: 0, queuedMs: 0, retryMs: 0, wireMs: 0 };
14093
14121
  const currentMessages = [...messages];
14094
14122
  let turns = 0;
@@ -14105,13 +14133,16 @@ ${appendedSchemaText}`;
14105
14133
  while (turns < maxTurns) {
14106
14134
  this.currentSignal?.throwIfAborted();
14107
14135
  const now = Date.now();
14108
- const elapsedMs = now - startTime - (timeoutTracker ? pausedHumanWaitMs(timeoutTracker, now) : 0);
14109
- if (elapsedMs > timeoutMs) {
14136
+ const elapsedMs = now - startTime;
14137
+ const pausedMs = askClock ? pausedAskClockMs(askClock, now) : 0;
14138
+ const chargedMs = Math.max(0, elapsedMs - Math.min(pausedMs, Math.max(0, elapsedMs)));
14139
+ if (chargedMs > timeoutMs) {
14110
14140
  throw new TimeoutError(
14111
14141
  "ctx.ask()",
14112
14142
  timeoutMs,
14113
14143
  timingTotals.turns > 0 ? {
14114
14144
  elapsedMs,
14145
+ chargedMs,
14115
14146
  queuedMs: timingTotals.queuedMs,
14116
14147
  retryMs: timingTotals.retryMs,
14117
14148
  wireMs: timingTotals.wireMs,
@@ -15981,12 +16012,7 @@ ${summaryResponse.content}`
15981
16012
  }
15982
16013
  // ── ctx.awaitHuman() ──────────────────────────────────────────────────
15983
16014
  async awaitHuman(options) {
15984
- const trackers = timeoutTrackerStorage.getStore();
15985
- const startedAt = Date.now();
15986
- for (const tracker of trackers ?? []) {
15987
- if (tracker.activeHumanWaits++ === 0) tracker.humanWaitStartedAt = startedAt;
15988
- }
15989
- try {
16015
+ return pauseAskClocks(async () => {
15990
16016
  if (this.spanManager) {
15991
16017
  return await this.spanManager.withSpanAsync(
15992
16018
  "axl.ctx.awaitHuman",
@@ -16003,16 +16029,7 @@ ${summaryResponse.content}`
16003
16029
  );
16004
16030
  }
16005
16031
  return await this._awaitHumanImpl(options);
16006
- } finally {
16007
- const finishedAt = Date.now();
16008
- for (const tracker of trackers ?? []) {
16009
- tracker.activeHumanWaits--;
16010
- if (tracker.activeHumanWaits === 0 && tracker.humanWaitStartedAt !== void 0) {
16011
- tracker.humanWaitMs += finishedAt - tracker.humanWaitStartedAt;
16012
- tracker.humanWaitStartedAt = void 0;
16013
- }
16014
- }
16015
- }
16032
+ });
16016
16033
  }
16017
16034
  async _awaitHumanImpl(options) {
16018
16035
  const branchSignal = this.currentSignal;
@@ -17009,7 +17026,7 @@ function workflow(config) {
17009
17026
  // src/runtime.ts
17010
17027
  var import_node_events2 = require("events");
17011
17028
  var import_node_crypto4 = require("crypto");
17012
- var import_node_async_hooks3 = require("async_hooks");
17029
+ var import_node_async_hooks4 = require("async_hooks");
17013
17030
  var import_node_fs3 = require("fs");
17014
17031
  var import_node_path3 = require("path");
17015
17032
 
@@ -19189,7 +19206,7 @@ function assertNoRemovedObservationCallbacks(options) {
19189
19206
  `runtime.createContext() no longer accepts ${removed.join(", ")}. Observe ctx.events or use runtime.stream() instead. See docs/migration/stream-first-observation.md.`
19190
19207
  );
19191
19208
  }
19192
- var costScopeStorage = new import_node_async_hooks3.AsyncLocalStorage();
19209
+ var costScopeStorage = new import_node_async_hooks4.AsyncLocalStorage();
19193
19210
  function forwardAbortSignal(external, internal) {
19194
19211
  if (!external) return () => {
19195
19212
  };