@sema-agent/core 1.291.0 → 1.293.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.
Files changed (59) hide show
  1. package/dist/agents/verify.d.ts +1 -0
  2. package/dist/agents/verify.d.ts.map +1 -1
  3. package/dist/agents/verify.js +1 -1
  4. package/dist/agents/verify.js.map +1 -1
  5. package/dist/core/auto-compaction.d.ts +2 -0
  6. package/dist/core/auto-compaction.d.ts.map +1 -1
  7. package/dist/core/auto-compaction.js +32 -5
  8. package/dist/core/auto-compaction.js.map +1 -1
  9. package/dist/core/runner/prepare-task.d.ts.map +1 -1
  10. package/dist/core/runner/prepare-task.js +63 -4
  11. package/dist/core/runner/prepare-task.js.map +1 -1
  12. package/dist/core/runner/runtask.d.ts +1 -1
  13. package/dist/core/runner/runtask.d.ts.map +1 -1
  14. package/dist/core/runner/runtask.js +61 -15
  15. package/dist/core/runner/runtask.js.map +1 -1
  16. package/dist/core/runner/synthetic-tools.d.ts +7 -1
  17. package/dist/core/runner/synthetic-tools.d.ts.map +1 -1
  18. package/dist/core/runner/synthetic-tools.js +62 -6
  19. package/dist/core/runner/synthetic-tools.js.map +1 -1
  20. package/dist/core/trace.d.ts +1 -1
  21. package/dist/core/trace.d.ts.map +1 -1
  22. package/dist/core/trace.js.map +1 -1
  23. package/dist/core/types.d.ts +6 -0
  24. package/dist/core/types.d.ts.map +1 -1
  25. package/dist/engine/compaction/compaction.d.ts +4 -2
  26. package/dist/engine/compaction/compaction.d.ts.map +1 -1
  27. package/dist/engine/compaction/compaction.js +21 -6
  28. package/dist/engine/compaction/compaction.js.map +1 -1
  29. package/dist/engine/compaction/utils.d.ts +13 -0
  30. package/dist/engine/compaction/utils.d.ts.map +1 -1
  31. package/dist/engine/compaction/utils.js +126 -0
  32. package/dist/engine/compaction/utils.js.map +1 -1
  33. package/dist/engine/harness/agent-harness.d.ts.map +1 -1
  34. package/dist/engine/harness/agent-harness.js +5 -1
  35. package/dist/engine/harness/agent-harness.js.map +1 -1
  36. package/dist/engine/harness/types.d.ts +5 -1
  37. package/dist/engine/harness/types.d.ts.map +1 -1
  38. package/dist/engine/harness/types.js.map +1 -1
  39. package/dist/engine/session/session.d.ts +3 -2
  40. package/dist/engine/session/session.d.ts.map +1 -1
  41. package/dist/engine/session/session.js +14 -4
  42. package/dist/engine/session/session.js.map +1 -1
  43. package/dist/internal/harness.d.ts +3 -1
  44. package/dist/internal/harness.d.ts.map +1 -1
  45. package/dist/internal/harness.js +2 -1
  46. package/dist/internal/harness.js.map +1 -1
  47. package/dist/orchestration/run-workflow-tool.d.ts +1 -0
  48. package/dist/orchestration/run-workflow-tool.d.ts.map +1 -1
  49. package/dist/orchestration/run-workflow-tool.js +10 -3
  50. package/dist/orchestration/run-workflow-tool.js.map +1 -1
  51. package/dist/orchestration/workflow.d.ts +4 -1
  52. package/dist/orchestration/workflow.d.ts.map +1 -1
  53. package/dist/orchestration/workflow.js +7 -2
  54. package/dist/orchestration/workflow.js.map +1 -1
  55. package/dist/prompts/supervisor.d.ts +1 -1
  56. package/dist/prompts/supervisor.d.ts.map +1 -1
  57. package/dist/prompts/supervisor.js +9 -4
  58. package/dist/prompts/supervisor.js.map +1 -1
  59. package/package.json +1 -1
@@ -2,7 +2,7 @@ import { AgentHarness, DEFAULT_COMPACTION_SETTINGS, uuidv7 } from "../../interna
2
2
  import { CheckpointError, BINDING_CHECKPOINT_VERSION, checkpointVersionOf, MAX_SUPPORTED_CHECKPOINT_VERSION, remainingBudgetMicroUsd, validatePendingSteer, winnerFromOutcome, } from "../checkpoint-store.js";
3
3
  import { effectiveCushionMs, estimateCycleMs, minLiveWriteoutWindowMs, recordCallSample, recordToolSample, recordTtftSample, softExecDeadlineMs, writeoutCushionMs } from "./call-cap.js";
4
4
  import { engineVersion } from "../version.js";
5
- import { DEFAULT_COMPACTION_INSTRUCTIONS, createRapidRefillState, isCompactionWalltimeAbort, maybeCompact, nextTrimForceBackoff, recordCompactionAndCheckRapidRefill } from "../auto-compaction.js";
5
+ import { DEFAULT_COMPACTION_INSTRUCTIONS, createRapidRefillState, isCompactionManualCancel, isCompactionWalltimeAbort, maybeCompact, nextTrimForceBackoff, recordCompactionAndCheckRapidRefill } from "../auto-compaction.js";
6
6
  import { ASK_USER_QUESTION_TOOL_NAME } from "../ask-question.js";
7
7
  import { computeCostMicroUsd, modelCostToPricing } from "../pricing.js";
8
8
  import { emitTrace } from "../trace.js";
@@ -41,7 +41,7 @@ import { createBrainMemorySelector } from "../memory-recall.js";
41
41
  import { buildRecallQuery, runDynamicRecall } from "../dynamic-recall.js";
42
42
  import { guardedMemoryStore } from "../memory.js";
43
43
  import { releaseSession } from "../../agents/session-util.js";
44
- export const DEFAULT_MAX_TURNS = 500;
44
+ export const DEFAULT_MAX_TURNS = 1000;
45
45
  const MAX_CONSECUTIVE_COMPACTION_FAILURES = 3;
46
46
  const STOP_HOOK_BLOCK_CAP = 8;
47
47
  const COMPACTION_REGROWTH_FACTOR = 1.5;
@@ -335,9 +335,8 @@ export class Runner {
335
335
  const manualCompactRef = { requested: false, waiters: [] };
336
336
  const drainManualCompactWaiters = (outcome) => {
337
337
  manualCompactRef.requested = false;
338
- manualCompactRef.instructions = undefined;
339
338
  for (const w of manualCompactRef.waiters.splice(0))
340
- w(outcome);
339
+ w.resolve(outcome);
341
340
  };
342
341
  const runStartedAt = Date.now();
343
342
  const taskIdRef = { current: spec.taskId, sessionId: spec.sessionId };
@@ -532,15 +531,39 @@ export class Runner {
532
531
  compact: async (opts) => {
533
532
  if (resultValue)
534
533
  throw steeringError("the task has already finished");
534
+ if (opts?.signal?.aborted)
535
+ return "mooted";
535
536
  const h = handle ?? (await orTimeout(ready));
536
537
  if (!h)
537
538
  throw steeringError("the task is not running");
539
+ if (opts?.signal?.aborted)
540
+ return "mooted";
538
541
  return new Promise((resolve) => {
539
- manualCompactRef.requested = true;
540
- if (opts?.instructions !== undefined) {
541
- manualCompactRef.instructions = opts.instructions;
542
+ const signal = opts?.signal;
543
+ const entry = {
544
+ resolve,
545
+ ...(signal !== undefined ? { signal } : {}),
546
+ ...(opts?.instructions !== undefined ? { instructions: opts.instructions } : {}),
547
+ };
548
+ if (signal !== undefined) {
549
+ const onAbort = () => {
550
+ const i = manualCompactRef.waiters.indexOf(entry);
551
+ if (i >= 0) {
552
+ manualCompactRef.waiters.splice(i, 1);
553
+ if (manualCompactRef.waiters.length === 0) {
554
+ manualCompactRef.requested = false;
555
+ }
556
+ entry.resolve("mooted");
557
+ }
558
+ };
559
+ entry.resolve = (outcome) => {
560
+ signal.removeEventListener("abort", onAbort);
561
+ resolve(outcome);
562
+ };
563
+ signal.addEventListener("abort", onAbort, { once: true });
542
564
  }
543
- manualCompactRef.waiters.push(resolve);
565
+ manualCompactRef.requested = true;
566
+ manualCompactRef.waiters.push(entry);
544
567
  });
545
568
  },
546
569
  detach: (toolCallId) => {
@@ -1626,9 +1649,8 @@ export class Runner {
1626
1649
  let trimForceBackoff = false;
1627
1650
  const drainManualCompact = (outcome) => {
1628
1651
  manualCompactRef.requested = false;
1629
- manualCompactRef.instructions = undefined;
1630
1652
  for (const w of manualCompactRef.waiters.splice(0))
1631
- w(outcome);
1653
+ w.resolve(outcome);
1632
1654
  };
1633
1655
  const onTurnBoundary = async (event) => {
1634
1656
  let boundarySteered = false;
@@ -1863,17 +1885,35 @@ export class Runner {
1863
1885
  return undefined;
1864
1886
  }
1865
1887
  const claimedManual = forceManual
1866
- ? { instructions: manualCompactRef.instructions, waiters: manualCompactRef.waiters.splice(0) }
1888
+ ? (() => {
1889
+ const waiters = manualCompactRef.waiters.splice(0);
1890
+ let instructions;
1891
+ for (let i = waiters.length - 1; i >= 0; i--) {
1892
+ if (waiters[i].instructions !== undefined) {
1893
+ instructions = waiters[i].instructions;
1894
+ break;
1895
+ }
1896
+ }
1897
+ return { instructions, waiters };
1898
+ })()
1867
1899
  : undefined;
1868
1900
  if (forceManual) {
1869
1901
  manualCompactRef.requested = false;
1870
- manualCompactRef.instructions = undefined;
1871
1902
  }
1872
1903
  const resolveClaimedWaiters = (outcome) => {
1873
1904
  if (claimedManual !== undefined)
1874
1905
  for (const w of claimedManual.waiters.splice(0))
1875
- w(outcome);
1906
+ w.resolve(outcome);
1876
1907
  };
1908
+ const claimedCancelSignals = claimedManual?.waiters.flatMap((w) => (w.signal !== undefined ? [w.signal] : [])) ?? [];
1909
+ const manualCancelSignal = claimedCancelSignals.length === 0
1910
+ ? undefined
1911
+ : claimedCancelSignals.length === 1
1912
+ ? claimedCancelSignals[0]
1913
+ : AbortSignal.any(claimedCancelSignals);
1914
+ const compactionPassSignal = claimedCancelSignals.length > 0
1915
+ ? AbortSignal.any([prepared.abortController.signal, ...claimedCancelSignals])
1916
+ : prepared.abortController.signal;
1877
1917
  const trimPressureArmed = prepared.trimPressureRef.droppedMessages;
1878
1918
  if (trimPressureArmed)
1879
1919
  prepared.trimPressureRef.droppedMessages = false;
@@ -1893,7 +1933,8 @@ export class Runner {
1893
1933
  thinking: prepared.thinking,
1894
1934
  settings: { ...DEFAULT_COMPACTION_SETTINGS, ...spec.compaction },
1895
1935
  customInstructions: manualInstructions ?? spec.compaction?.instructions ?? DEFAULT_COMPACTION_INSTRUCTIONS,
1896
- signal: prepared.abortController.signal,
1936
+ signal: compactionPassSignal,
1937
+ ...(manualCancelSignal !== undefined ? { manualCancelSignal } : {}),
1897
1938
  minTokens: forceManual ? 0 : compactionFloor,
1898
1939
  force: forceManual,
1899
1940
  onInputTruncated: (info) => emitTrace(tracer, () => ({ kind: "compaction.input_truncated", version: 1, taskId, label: info.label, droppedChars: info.droppedChars, keptChars: info.keptChars, ts: Date.now() })),
@@ -1984,7 +2025,12 @@ export class Runner {
1984
2025
  }
1985
2026
  }
1986
2027
  catch (err) {
1987
- if (!prepared.abortController.signal.aborted) {
2028
+ const manualCancelAbort = !prepared.abortController.signal.aborted && isCompactionManualCancel(err);
2029
+ if (manualCancelAbort) {
2030
+ emitTrace(tracer, () => ({ kind: "compaction.mooted", version: 1, taskId, reason: "cancelled", ts: Date.now() }));
2031
+ manualOutcome = "mooted";
2032
+ }
2033
+ else if (!prepared.abortController.signal.aborted) {
1988
2034
  const walltimeAbort = isCompactionWalltimeAbort(err);
1989
2035
  if (!walltimeAbort)
1990
2036
  compactionBreaker.failures += 1;