@sema-agent/core 1.310.0 → 1.312.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.
@@ -1 +1 @@
1
- {"version":3,"file":"runtask.d.ts","sourceRoot":"","sources":["../../../src/core/runner/runtask.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtask.d.ts","sourceRoot":"","sources":["../../../src/core/runner/runtask.ts"],"names":[],"mappings":"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"}
@@ -749,6 +749,7 @@ export class Runner {
749
749
  taskIdRef.sessionId = prepared.sessionId;
750
750
  }
751
751
  const taskStart = Date.now();
752
+ const taskStartMonotonic = performance.now();
752
753
  void Promise.resolve(this.sessions.noteTaskRun?.(prepared.sessionId, taskId)).catch(() => { });
753
754
  const recordDegraded = (info, toModel) => {
754
755
  if (degraded !== undefined)
@@ -972,6 +973,7 @@ export class Runner {
972
973
  });
973
974
  }
974
975
  const walltimeDeadlineMs = spec.limits?.timeoutSec ? taskStart + spec.limits.timeoutSec * 1000 : undefined;
976
+ const walltimeMonotonicDeadline = spec.limits?.timeoutSec ? taskStartMonotonic + spec.limits.timeoutSec * 1000 : undefined;
975
977
  if (prepared.callCapRef && prepared.suspendForResource === undefined && walltimeDeadlineMs !== undefined) {
976
978
  prepared.callCapRef.deadlineMs = walltimeDeadlineMs;
977
979
  if (spec.limits?.gracefulFinalize !== false) {
@@ -980,6 +982,7 @@ export class Runner {
980
982
  }
981
983
  }
982
984
  let finalizeInjected = false;
985
+ let walltimeSyncBackstopFired = false;
983
986
  const nudgeSchedule = [];
984
987
  {
985
988
  const conf = spec.limits?.deadlineNudge;
@@ -1015,7 +1018,7 @@ export class Runner {
1015
1018
  ? ` After writing, if seconds permit, confirm the deliverable file actually EXISTS at the required path with your latest content.`
1016
1019
  : "") +
1017
1020
  `</system-reminder>`;
1018
- const timeout = startTimeout(prepared.harness, prepared.abortController, spec.limits?.timeoutSec, prepared.suspendForResource !== undefined);
1021
+ const timeout = startTimeout(prepared.harness, prepared.abortController, walltimeMonotonicDeadline !== undefined ? walltimeMonotonicDeadline - performance.now() : undefined, prepared.suspendForResource !== undefined);
1019
1022
  const parentToolCallId = internals?.parentToolCallId;
1020
1023
  const ident = () => parentToolCallId !== undefined ? { eventId: uuidv7(), parentToolCallId, sourceTaskId: taskId } : { eventId: uuidv7() };
1021
1024
  notificationIdent = ident;
@@ -1783,7 +1786,7 @@ export class Runner {
1783
1786
  queue.push({ type: "steering_injected", source: "deadline_nudge", preview: due.text.slice(0, 220), ...ident() });
1784
1787
  }
1785
1788
  }
1786
- const walltimeHit = walltimeDeadlineMs !== undefined && Date.now() >= walltimeDeadlineMs;
1789
+ const walltimeHit = walltimeMonotonicDeadline !== undefined && performance.now() >= walltimeMonotonicDeadline;
1787
1790
  const preemptHit = spec.preemptSignal?.aborted === true;
1788
1791
  if (preemptHit && !prepared.suspendForResource && !preemptIgnoredReported) {
1789
1792
  preemptIgnoredReported = true;
@@ -1810,6 +1813,19 @@ export class Runner {
1810
1813
  }
1811
1814
  return undefined;
1812
1815
  }
1816
+ if (walltimeMonotonicDeadline !== undefined &&
1817
+ prepared.suspendForResource === undefined &&
1818
+ performance.now() >= walltimeMonotonicDeadline) {
1819
+ if (!timeout.fired) {
1820
+ timeout.fired = true;
1821
+ timeout.clear();
1822
+ timeout.latenessMs = Math.max(timeout.latenessMs ?? 0, performance.now() - walltimeMonotonicDeadline);
1823
+ walltimeSyncBackstopFired = true;
1824
+ void prepared.harness.abort();
1825
+ prepared.abortController.abort();
1826
+ }
1827
+ return undefined;
1828
+ }
1813
1829
  if (prepared.reviewRequestRef.pending !== undefined) {
1814
1830
  const { reason } = prepared.reviewRequestRef.pending;
1815
1831
  prepared.reviewRequestRef.pending = undefined;
@@ -2602,6 +2618,7 @@ export class Runner {
2602
2618
  ...(timeout.latenessMs !== undefined && timeout.latenessMs > TIMER_LATENESS_REPORT_MS
2603
2619
  ? { timerLatenessMs: timeout.latenessMs }
2604
2620
  : {}),
2621
+ ...(walltimeSyncBackstopFired ? { walltimeSyncBackstop: true } : {}),
2605
2622
  ts: Date.now(),
2606
2623
  }));
2607
2624
  setResult(result);
@@ -3280,17 +3297,19 @@ export function runTask(spec, deps) {
3280
3297
  }
3281
3298
  const WALLTIME_SUSPEND_GRACE_SEC = 120;
3282
3299
  const TIMER_LATENESS_REPORT_MS = 5_000;
3283
- function startTimeout(harness, abortController, timeoutSec, softSuspendable = false) {
3300
+ function startTimeout(harness, abortController, remainingMs, softSuspendable = false) {
3284
3301
  const state = { fired: false, clear: () => { } };
3285
- if (timeoutSec && timeoutSec > 0) {
3286
- const hardSec = softSuspendable ? timeoutSec + WALLTIME_SUSPEND_GRACE_SEC : timeoutSec;
3287
- const scheduledAtMs = Date.now() + hardSec * 1000;
3302
+ if (remainingMs !== undefined) {
3303
+ const hardMs = Math.max(0, remainingMs + (softSuspendable ? WALLTIME_SUSPEND_GRACE_SEC * 1000 : 0));
3304
+ const scheduledAtMs = Date.now() + hardMs;
3288
3305
  const timer = setTimeout(() => {
3306
+ if (state.fired)
3307
+ return;
3289
3308
  state.fired = true;
3290
3309
  state.latenessMs = Math.max(0, Date.now() - scheduledAtMs);
3291
3310
  abortController.abort();
3292
3311
  void harness.abort();
3293
- }, hardSec * 1000);
3312
+ }, hardMs);
3294
3313
  timer.unref?.();
3295
3314
  state.clear = () => clearTimeout(timer);
3296
3315
  }