@librechat/agents 3.7.0 → 3.7.2

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 (101) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +11 -2
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/eventActor/EventActorExecutor.cjs +797 -0
  4. package/dist/cjs/eventActor/EventActorExecutor.cjs.map +1 -0
  5. package/dist/cjs/eventActor/index.cjs +1 -0
  6. package/dist/cjs/graphs/Graph.cjs +7 -2
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  8. package/dist/cjs/llm/invoke.cjs +56 -9
  9. package/dist/cjs/llm/invoke.cjs.map +1 -1
  10. package/dist/cjs/main.cjs +15 -1
  11. package/dist/cjs/messages/content.cjs +8 -5
  12. package/dist/cjs/messages/content.cjs.map +1 -1
  13. package/dist/cjs/messages/format.cjs +15 -5
  14. package/dist/cjs/messages/format.cjs.map +1 -1
  15. package/dist/cjs/messages/index.cjs +2 -1
  16. package/dist/cjs/messages/projectionInvariant.cjs +74 -0
  17. package/dist/cjs/messages/projectionInvariant.cjs.map +1 -0
  18. package/dist/cjs/messages/provenance.cjs +30 -8
  19. package/dist/cjs/messages/provenance.cjs.map +1 -1
  20. package/dist/cjs/messages/recency.cjs +202 -7
  21. package/dist/cjs/messages/recency.cjs.map +1 -1
  22. package/dist/cjs/messages/toolResultTypes.cjs +1 -0
  23. package/dist/cjs/session/AgentSession.cjs +4 -23
  24. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  25. package/dist/cjs/session/deriveMessages.cjs +25 -0
  26. package/dist/cjs/session/deriveMessages.cjs.map +1 -0
  27. package/dist/cjs/session/index.cjs +1 -0
  28. package/dist/cjs/summarization/node.cjs +13 -6
  29. package/dist/cjs/summarization/node.cjs.map +1 -1
  30. package/dist/cjs/tools/subagent/InMemorySubagentTaskStore.cjs +65 -8
  31. package/dist/cjs/tools/subagent/InMemorySubagentTaskStore.cjs.map +1 -1
  32. package/dist/esm/agents/AgentContext.mjs +11 -2
  33. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  34. package/dist/esm/eventActor/EventActorExecutor.mjs +796 -0
  35. package/dist/esm/eventActor/EventActorExecutor.mjs.map +1 -0
  36. package/dist/esm/eventActor/index.mjs +2 -0
  37. package/dist/esm/graphs/Graph.mjs +8 -3
  38. package/dist/esm/graphs/Graph.mjs.map +1 -1
  39. package/dist/esm/llm/invoke.mjs +56 -9
  40. package/dist/esm/llm/invoke.mjs.map +1 -1
  41. package/dist/esm/main.mjs +8 -4
  42. package/dist/esm/messages/content.mjs +8 -6
  43. package/dist/esm/messages/content.mjs.map +1 -1
  44. package/dist/esm/messages/format.mjs +16 -6
  45. package/dist/esm/messages/format.mjs.map +1 -1
  46. package/dist/esm/messages/index.mjs +2 -1
  47. package/dist/esm/messages/projectionInvariant.mjs +72 -0
  48. package/dist/esm/messages/projectionInvariant.mjs.map +1 -0
  49. package/dist/esm/messages/provenance.mjs +30 -9
  50. package/dist/esm/messages/provenance.mjs.map +1 -1
  51. package/dist/esm/messages/recency.mjs +201 -8
  52. package/dist/esm/messages/recency.mjs.map +1 -1
  53. package/dist/esm/messages/toolResultTypes.mjs +1 -1
  54. package/dist/esm/session/AgentSession.mjs +4 -23
  55. package/dist/esm/session/AgentSession.mjs.map +1 -1
  56. package/dist/esm/session/deriveMessages.mjs +25 -0
  57. package/dist/esm/session/deriveMessages.mjs.map +1 -0
  58. package/dist/esm/session/index.mjs +1 -0
  59. package/dist/esm/summarization/node.mjs +14 -7
  60. package/dist/esm/summarization/node.mjs.map +1 -1
  61. package/dist/esm/tools/subagent/InMemorySubagentTaskStore.mjs +65 -8
  62. package/dist/esm/tools/subagent/InMemorySubagentTaskStore.mjs.map +1 -1
  63. package/dist/types/agents/AgentContext.d.ts +6 -1
  64. package/dist/types/eventActor/EventActorExecutor.d.ts +18 -0
  65. package/dist/types/eventActor/index.d.ts +2 -0
  66. package/dist/types/eventActor/types.d.ts +193 -0
  67. package/dist/types/index.d.ts +1 -0
  68. package/dist/types/messages/content.d.ts +4 -1
  69. package/dist/types/messages/format.d.ts +6 -0
  70. package/dist/types/messages/index.d.ts +1 -0
  71. package/dist/types/messages/projectionInvariant.d.ts +25 -0
  72. package/dist/types/messages/provenance.d.ts +10 -0
  73. package/dist/types/messages/recency.d.ts +30 -18
  74. package/dist/types/session/deriveMessages.d.ts +11 -0
  75. package/dist/types/session/index.d.ts +2 -0
  76. package/dist/types/tools/subagent/InMemorySubagentTaskStore.d.ts +13 -1
  77. package/dist/types/types/graph.d.ts +1 -1
  78. package/dist/types/types/subagentTasks.d.ts +22 -0
  79. package/dist/types/types/summarize.d.ts +15 -13
  80. package/package.json +68 -77
  81. package/src/agents/AgentContext.ts +19 -5
  82. package/src/eventActor/EventActorExecutor.ts +1499 -0
  83. package/src/eventActor/index.ts +32 -0
  84. package/src/eventActor/types.ts +250 -0
  85. package/src/graphs/Graph.ts +9 -1
  86. package/src/index.ts +3 -0
  87. package/src/llm/invoke.ts +102 -23
  88. package/src/messages/content.ts +20 -10
  89. package/src/messages/format.ts +29 -5
  90. package/src/messages/index.ts +1 -0
  91. package/src/messages/projectionInvariant.ts +134 -0
  92. package/src/messages/provenance.ts +60 -18
  93. package/src/messages/recency.ts +429 -27
  94. package/src/session/AgentSession.ts +4 -30
  95. package/src/session/deriveMessages.ts +37 -0
  96. package/src/session/index.ts +2 -0
  97. package/src/summarization/node.ts +37 -15
  98. package/src/tools/subagent/InMemorySubagentTaskStore.ts +139 -6
  99. package/src/types/graph.ts +1 -0
  100. package/src/types/subagentTasks.ts +28 -0
  101. package/src/types/summarize.ts +15 -13
@@ -1,5 +1,7 @@
1
1
  export { AgentSession, createAgentSession } from './AgentSession';
2
+ export { deriveMessages } from './deriveMessages';
2
3
  export { JsonlSessionStore, SessionManager } from './JsonlSessionStore';
3
4
  export { createRunHandlers } from './handlers';
4
5
  export { serializeMessage, deserializeMessage, extractTextFromContent, } from './messageSerialization';
5
6
  export type { AgentSessionConfig, AgentSessionCheckpointLookupOptions, AgentSessionCheckpointReference, AgentSessionCheckpointing, AgentSessionCheckpointingOptions, AgentSessionHandlersResult, AgentSessionInput, AgentSessionRunOptions, AgentSessionRunResult, AgentSessionStream, AgentSessionStreamEvent, AgentSessionUsage, CreateSessionFileOptions, JsonObject, JsonPrimitive, JsonValue, SerializedSessionMessage, SessionBranchOptions, SessionCompactOptions, SessionCheckpointEntry, SessionCompactionEntry, SessionEntry, SessionEntryBase, SessionEntryType, SessionForkOptions, SessionHeader, SessionLabelEntry, SessionListItem, SessionMessageEntry, SessionPosition, SessionRunEventEntry, SessionStateEntry, SessionSummaryEntry, SessionTreeNode, } from './types';
7
+ export type { DerivedSessionMessages } from './deriveMessages';
@@ -1,8 +1,9 @@
1
- import type { SubagentTaskClaim, SubagentTaskControlCommand, SubagentTaskControlResult, SubagentTaskSnapshot, SubagentTaskStartRequest, SubagentTaskStartResult, SubagentTaskStore } from '@/types';
1
+ import type { SubagentTaskClaim, SubagentTaskControlCommand, SubagentTaskControlReceipt, SubagentTaskControlResult, SubagentTaskSnapshot, SubagentTaskStartRequest, SubagentTaskStartResult, SubagentTaskStore } from '@/types';
2
2
  export interface InMemorySubagentTaskStoreOptions {
3
3
  completedTtlMs?: number;
4
4
  maxControlMessageChars?: number;
5
5
  maxControlsPerTask?: number;
6
+ maxControlReceiptsPerTask?: number;
6
7
  maxErrorChars?: number;
7
8
  maxResultChars?: number;
8
9
  maxRunningPerScope?: number;
@@ -25,6 +26,14 @@ export declare class InMemorySubagentTaskStore implements SubagentTaskStore {
25
26
  private runningTasks;
26
27
  private totalTasks;
27
28
  constructor(options?: InMemorySubagentTaskStoreOptions);
29
+ /**
30
+ * Payload-free transition seam for hosts that durably project authoritative
31
+ * receipts. Implementations must return synchronously, must not reproduce
32
+ * task-store transition rules, and cannot veto task-store state transitions:
33
+ * hook failures are deliberately isolated by the caller.
34
+ */
35
+ protected onControlReceipt(_scopeId: string, _taskId: string, _receipt: SubagentTaskControlReceipt): void;
36
+ private emitControlReceipt;
28
37
  start(request: SubagentTaskStartRequest): SubagentTaskStartResult;
29
38
  get(scopeId: string, taskId: string): SubagentTaskSnapshot | undefined;
30
39
  list(scopeId: string): SubagentTaskSnapshot[];
@@ -37,6 +46,9 @@ export declare class InMemorySubagentTaskStore implements SubagentTaskStore {
37
46
  private sweepBucket;
38
47
  private removeTask;
39
48
  private dropEmptyBucket;
49
+ private makeRoomForControlReceipt;
50
+ private transitionControl;
51
+ private failPendingControls;
40
52
  private scheduleExpiry;
41
53
  private clearTaskExpiry;
42
54
  private clearTaskTimeout;
@@ -452,7 +452,7 @@ export type ExecutableSubagentConfig = ResolvedSubagentConfig | LazySingleAgentS
452
452
  /** Graph-aware config accepted by the executor. Graph configs stay eager. */
453
453
  export type ExecutableSubagentConfigEntry = ExecutableSubagentConfig | GraphSubagentConfig;
454
454
  /** Lifecycle phase carried on {@link SubagentUpdateEvent}. */
455
- export type SubagentUpdatePhase = 'start' | 'run_step' | 'run_step_delta' | 'run_step_completed' | 'run_step_closed' | 'message_delta' | 'reasoning_delta' | 'stop' | 'error';
455
+ export type SubagentUpdatePhase = 'start' | 'run_step' | 'run_step_delta' | 'run_step_completed' | 'run_step_closed' | 'message_delta' | 'reasoning_delta' | 'control' | 'stop' | 'error';
456
456
  export interface SubagentAncestryEntry {
457
457
  readonly subagentRunId: string;
458
458
  readonly subagentType: string;
@@ -5,6 +5,22 @@ import type { InjectedMessage } from './tools';
5
5
  export type SubagentTaskStatus = 'running' | 'completed' | 'error' | 'cancelled';
6
6
  /** Where a pending parent message may enter the child run. */
7
7
  export type SubagentTaskBoundary = 'preempt' | 'tool' | 'turn';
8
+ /**
9
+ * Lifecycle of one parent-to-child message after the task store accepts it.
10
+ * Hosts may render a transient `submitted` state before this authoritative
11
+ * receipt exists; that transport state is intentionally not persisted here.
12
+ */
13
+ export type SubagentTaskControlReceiptStatus = 'accepted' | 'applied' | 'rejected' | 'failed';
14
+ /** Bounded authoritative receipt for one steer, queue, or interrupt command. */
15
+ export interface SubagentTaskControlReceipt {
16
+ controlId: string;
17
+ action: 'steer' | 'queue' | 'interrupt';
18
+ status: SubagentTaskControlReceiptStatus;
19
+ createdAt: number;
20
+ updatedAt: number;
21
+ boundary?: SubagentTaskBoundary;
22
+ reason?: 'withdrawn' | 'task_completed' | 'task_cancelled' | 'task_failed';
23
+ }
8
24
  /** Parent-to-child control operations accepted while a task is running. */
9
25
  export type SubagentTaskControlCommand = {
10
26
  action: 'steer' | 'queue' | 'interrupt';
@@ -39,6 +55,12 @@ export interface SubagentTaskSnapshot {
39
55
  resultAvailable: boolean;
40
56
  resultClaimed: boolean;
41
57
  pendingControls: number;
58
+ /**
59
+ * Bounded receipts emitted by stores that support authoritative control
60
+ * tracking. Optional so legacy and custom stores remain compatible during
61
+ * rolling upgrades.
62
+ */
63
+ controlReceipts?: SubagentTaskControlReceipt[];
42
64
  progress?: SubagentTaskProgress;
43
65
  error?: string;
44
66
  }
@@ -5,25 +5,27 @@ export type SummarizationTrigger = {
5
5
  value: number;
6
6
  };
7
7
  /**
8
- * Controls how many recent messages are preserved verbatim during
9
- * compaction. The most recent user-led turn is always preserved
10
- * regardless of these caps, so a single oversized first message is
11
- * never destroyed by summarization.
8
+ * Controls how much recent context is preserved verbatim during compaction.
9
+ * User-turn boundaries are preferred. Under context pressure, older closed
10
+ * tool units inside an otherwise indivisible turn may be summarized while a
11
+ * token-priced recent tail is retained. A lone user payload stays intact.
12
12
  */
13
13
  export type RetainRecentConfig = {
14
14
  /**
15
- * Maximum number of recent user-led turns to keep in the tail. A turn
16
- * begins at a HumanMessage and includes every following AIMessage and
17
- * ToolMessage up to (but not including) the next HumanMessage. Cutting
18
- * at turn boundaries guarantees tool_use / tool_result pairs are never
19
- * split. Set to `0` to disable the recency window (legacy behavior:
20
- * summarize everything). Defaults to `2`.
15
+ * Maximum number of recent user-led turns to keep in the tail. A turn begins
16
+ * at a user-authored HumanMessage and includes every following AIMessage and
17
+ * tool result up to the next user-authored HumanMessage. Provider-native
18
+ * HumanMessages containing only tool results remain in the current turn.
19
+ * Set to `0` to disable the recency window (legacy behavior: summarize
20
+ * everything). Defaults to `2`.
21
21
  */
22
22
  turns?: number;
23
23
  /**
24
- * Optional cap on retained-recent tokens beyond the most recent turn.
25
- * Older turns are added whole only while cumulative tokens stay below
26
- * the cap. Defaults to undefined (no cap; bounded only by `turns`).
24
+ * Optional retained-recent token budget. Older turns are added whole only
25
+ * while cumulative tokens stay below the cap. If a tool-heavy history has
26
+ * no compactable turn-level head, this is also the minimum recent tail kept
27
+ * behind a pairing-balanced intra-turn cut. When omitted, that fallback
28
+ * retains 16% of the configured context window.
27
29
  */
28
30
  tokens?: number;
29
31
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@librechat/agents",
3
- "version": "3.7.0",
3
+ "version": "3.7.2",
4
4
  "reova": {
5
5
  "enabled": true,
6
6
  "endpoint": "https://telemetry.reo.dev/data"
@@ -197,80 +197,72 @@
197
197
  "sort-imports:check": "node scripts/sort-imports.ts --check",
198
198
  "start": "node dist/esm/main.js",
199
199
  "clean": "node ./config/clean.js",
200
- "script": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli.ts",
200
+ "script": "tsx -r dotenv/config ./src/scripts/cli.ts",
201
201
  "bun:cli": "bun -r dotenv/config ./src/scripts/cli.ts --provider 'bedrock' --name 'Jo' --location 'New York, NY'",
202
- "start:cli": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
203
- "content": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/content.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
204
- "stream": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/stream.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
205
- "code_exec": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
206
- "image": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/image.ts --provider 'google' --name 'Jo' --location 'New York, NY'",
207
- "code_exec_files": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec_files.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
208
- "code_exec_session": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec_session.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
209
- "code_exec_multi_session": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec_multi_session.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
210
- "code_exec_simple": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec_simple.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
211
- "simple": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/simple.ts --provider 'bedrock' --name 'Jo' --location 'New York, NY'",
212
- "caching": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/caching.ts --name 'Jo' --location 'New York, NY'",
213
- "thinking": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/thinking.ts --name 'Jo' --location 'New York, NY'",
214
- "thinking:bedrock": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/thinking-bedrock.ts --name 'Jo' --location 'New York, NY'",
215
- "memory": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/memory.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
216
- "tool": "node --trace-warnings -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/tools.ts --provider 'bedrock' --name 'Jo' --location 'New York, NY'",
217
- "search": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/search.ts --provider 'bedrock' --name 'Jo' --location 'New York, NY'",
218
- "tool_search": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/tool_search.ts",
219
- "bench:cache": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/bench-prompt-cache.ts",
220
- "bench:context-pressure": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/bench-context-pressure-cache.ts",
221
- "bench:provider-derivation": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/bench-provider-derivation.ts",
222
- "bench:execution-world": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/bench-execution-world.ts",
223
- "probe:overflow": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/context-overflow-probe.ts",
224
- "subagent": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-subagent.ts",
225
- "subagent:events": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/subagent-event-driven-debug.ts",
226
- "subagent:tools": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/subagent-tools-debug.ts",
227
- "programmatic_exec": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/programmatic_exec.ts",
228
- "code_exec_ptc": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec_ptc.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
229
- "local": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/local_engine.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
230
- "local:ptc": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/local_engine_ptc.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
231
- "local:hooks": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/local_engine_hooks.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
232
- "local:checkpointer": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/local_engine_checkpointer.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
233
- "local:image": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/local_engine_image.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
234
- "local:compile": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/local_engine_compile.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
235
- "compare:pi": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/compare_pi_vs_ours.ts",
236
- "session:live": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/session_live.ts",
237
- "local:workspace": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/local_engine_workspace.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
238
- "programmatic_exec_agent": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/programmatic_exec_agent.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
239
- "ant_web_search": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/ant_web_search.ts --name 'Jo' --location 'New York, NY'",
240
- "ant_web_search_edge_case": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/ant_web_search_edge_case.ts --name 'Jo' --location 'New York, NY'",
241
- "ant_web_search_error_edge_case": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/ant_web_search_error_edge_case.ts --name 'Jo' --location 'New York, NY'",
242
- "abort": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/abort.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
243
- "start:cli2": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli2.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
244
- "multi-agent-test": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-test.ts",
245
- "test-tools-before-handoff": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-tools-before-handoff.ts",
246
- "multi-agent-parallel": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-parallel.ts",
247
- "multi-agent-parallel-start": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-parallel-start.ts",
248
- "single-agent-metadata-test": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/single-agent-metadata-test.ts",
249
- "multi-agent-chain": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-chain.ts",
250
- "multi-agent-sequence": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-sequence.ts",
251
- "multi-agent-conditional": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-conditional.ts",
252
- "multi-agent-subagent": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-subagent.ts",
253
- "multi-agent-supervisor": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-supervisor.ts",
254
- "test-handoff-preamble": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-handoff-preamble.ts",
255
- "multi-agent-list-handoff": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-multi-agent-list-handoff.ts",
256
- "test-parallel-agent-labeling": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-parallel-agent-labeling.ts",
257
- "test-thinking-handoff": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-thinking-handoff.ts",
258
- "test-thinking-handoff-bedrock": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-thinking-handoff-bedrock.ts",
259
- "test-thinking-to-thinking-handoff-bedrock": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-thinking-to-thinking-handoff-bedrock.ts",
260
- "multi-agent-hybrid-flow": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-hybrid-flow.ts",
261
- "test-handoff-input": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-handoff-input.ts",
262
- "test-custom-prompt-key": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-custom-prompt-key.ts",
263
- "script2": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/proto/example_test.ts",
264
- "script3": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/proto/example_test_anthropic.ts",
265
- "script4": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli4.ts --name 'Jo' --location 'New York, NY'",
266
- "script5": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli5.ts --name 'Jo' --location 'New York, NY'",
267
- "start:standard": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/standard.ts",
268
- "start:cg": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/collab.ts",
269
- "start:tasks": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/tasks.ts",
270
- "start:collab": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/main.ts",
271
- "start:collab5": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/collab_design_v5.ts",
272
- "start:dev": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/main.ts",
273
- "supervised": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/supervised.ts --provider anthropic --name Jo --location \"New York, NY\"",
202
+ "start:cli": "tsx -r dotenv/config ./src/scripts/cli.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
203
+ "content": "tsx -r dotenv/config ./src/scripts/content.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
204
+ "stream": "tsx -r dotenv/config ./src/scripts/stream.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
205
+ "code_exec": "tsx -r dotenv/config ./src/scripts/code_exec.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
206
+ "code_exec_files": "tsx -r dotenv/config ./src/scripts/code_exec_files.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
207
+ "code_exec_session": "tsx -r dotenv/config ./src/scripts/code_exec_session.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
208
+ "code_exec_multi_session": "tsx -r dotenv/config ./src/scripts/code_exec_multi_session.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
209
+ "code_exec_simple": "tsx -r dotenv/config ./src/scripts/code_exec_simple.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
210
+ "simple": "tsx -r dotenv/config ./src/scripts/simple.ts --provider 'bedrock' --name 'Jo' --location 'New York, NY'",
211
+ "caching": "tsx -r dotenv/config ./src/scripts/caching.ts --name 'Jo' --location 'New York, NY'",
212
+ "thinking": "tsx -r dotenv/config ./src/scripts/thinking.ts --name 'Jo' --location 'New York, NY'",
213
+ "thinking:bedrock": "tsx -r dotenv/config ./src/scripts/thinking-bedrock.ts --name 'Jo' --location 'New York, NY'",
214
+ "memory": "tsx -r dotenv/config ./src/scripts/memory.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
215
+ "tool": "tsx --trace-warnings -r dotenv/config ./src/scripts/tools.ts --provider 'bedrock' --name 'Jo' --location 'New York, NY'",
216
+ "search": "tsx -r dotenv/config ./src/scripts/search.ts --provider 'bedrock' --name 'Jo' --location 'New York, NY'",
217
+ "tool_search": "tsx -r dotenv/config ./src/scripts/tool_search.ts",
218
+ "bench:cache": "tsx ./src/scripts/bench-prompt-cache.ts",
219
+ "bench:context-pressure": "tsx ./src/scripts/bench-context-pressure-cache.ts",
220
+ "bench:compaction-range": "tsx ./src/scripts/bench-compaction-range.ts",
221
+ "bench:provider-derivation": "tsx ./src/scripts/bench-provider-derivation.ts",
222
+ "bench:provider-projection": "tsx ./src/scripts/bench-provider-request-projection.ts",
223
+ "bench:execution-world": "tsx ./src/scripts/bench-execution-world.ts",
224
+ "probe:overflow": "tsx -r dotenv/config ./src/scripts/context-overflow-probe.ts",
225
+ "subagent": "tsx -r dotenv/config ./src/scripts/multi-agent-subagent.ts",
226
+ "subagent:events": "tsx -r dotenv/config ./src/scripts/subagent-event-driven-debug.ts",
227
+ "subagent:tools": "tsx -r dotenv/config ./src/scripts/subagent-tools-debug.ts",
228
+ "programmatic_exec": "tsx -r dotenv/config ./src/scripts/programmatic_exec.ts",
229
+ "code_exec_ptc": "tsx -r dotenv/config ./src/scripts/code_exec_ptc.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
230
+ "local": "tsx -r dotenv/config ./src/scripts/local_engine.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
231
+ "local:ptc": "tsx -r dotenv/config ./src/scripts/local_engine_ptc.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
232
+ "local:hooks": "tsx -r dotenv/config ./src/scripts/local_engine_hooks.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
233
+ "local:checkpointer": "tsx -r dotenv/config ./src/scripts/local_engine_checkpointer.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
234
+ "local:image": "tsx -r dotenv/config ./src/scripts/local_engine_image.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
235
+ "local:compile": "tsx -r dotenv/config ./src/scripts/local_engine_compile.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
236
+ "compare:pi": "tsx -r dotenv/config ./src/scripts/compare_pi_vs_ours.ts",
237
+ "session:live": "tsx -r dotenv/config ./src/scripts/session_live.ts",
238
+ "local:workspace": "tsx -r dotenv/config ./src/scripts/local_engine_workspace.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
239
+ "programmatic_exec_agent": "tsx -r dotenv/config ./src/scripts/programmatic_exec_agent.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
240
+ "ant_web_search": "tsx -r dotenv/config ./src/scripts/ant_web_search.ts --name 'Jo' --location 'New York, NY'",
241
+ "ant_web_search_edge_case": "tsx -r dotenv/config ./src/scripts/ant_web_search_edge_case.ts --name 'Jo' --location 'New York, NY'",
242
+ "ant_web_search_error_edge_case": "tsx -r dotenv/config ./src/scripts/ant_web_search_error_edge_case.ts --name 'Jo' --location 'New York, NY'",
243
+ "abort": "tsx -r dotenv/config ./src/scripts/abort.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
244
+ "start:cli2": "tsx -r dotenv/config ./src/scripts/cli2.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
245
+ "multi-agent-test": "tsx -r dotenv/config ./src/scripts/multi-agent-test.ts",
246
+ "test-tools-before-handoff": "tsx -r dotenv/config ./src/scripts/test-tools-before-handoff.ts",
247
+ "multi-agent-parallel": "tsx -r dotenv/config ./src/scripts/multi-agent-parallel.ts",
248
+ "multi-agent-parallel-start": "tsx -r dotenv/config ./src/scripts/multi-agent-parallel-start.ts",
249
+ "single-agent-metadata-test": "tsx -r dotenv/config ./src/scripts/single-agent-metadata-test.ts",
250
+ "multi-agent-chain": "tsx -r dotenv/config ./src/scripts/multi-agent-chain.ts",
251
+ "multi-agent-sequence": "tsx -r dotenv/config ./src/scripts/multi-agent-sequence.ts",
252
+ "multi-agent-conditional": "tsx -r dotenv/config ./src/scripts/multi-agent-conditional.ts",
253
+ "multi-agent-subagent": "tsx -r dotenv/config ./src/scripts/multi-agent-subagent.ts",
254
+ "multi-agent-supervisor": "tsx -r dotenv/config ./src/scripts/multi-agent-supervisor.ts",
255
+ "test-handoff-preamble": "tsx -r dotenv/config ./src/scripts/test-handoff-preamble.ts",
256
+ "multi-agent-list-handoff": "tsx -r dotenv/config ./src/scripts/test-multi-agent-list-handoff.ts",
257
+ "test-parallel-agent-labeling": "tsx -r dotenv/config ./src/scripts/test-parallel-agent-labeling.ts",
258
+ "test-thinking-handoff": "tsx -r dotenv/config ./src/scripts/test-thinking-handoff.ts",
259
+ "test-thinking-handoff-bedrock": "tsx -r dotenv/config ./src/scripts/test-thinking-handoff-bedrock.ts",
260
+ "test-thinking-to-thinking-handoff-bedrock": "tsx -r dotenv/config ./src/scripts/test-thinking-to-thinking-handoff-bedrock.ts",
261
+ "multi-agent-hybrid-flow": "tsx -r dotenv/config ./src/scripts/multi-agent-hybrid-flow.ts",
262
+ "test-handoff-input": "tsx -r dotenv/config ./src/scripts/test-handoff-input.ts",
263
+ "test-custom-prompt-key": "tsx -r dotenv/config ./src/scripts/test-custom-prompt-key.ts",
264
+ "script4": "tsx -r dotenv/config ./src/scripts/cli4.ts --name 'Jo' --location 'New York, NY'",
265
+ "script5": "tsx -r dotenv/config ./src/scripts/cli5.ts --name 'Jo' --location 'New York, NY'",
274
266
  "test": "NODE_OPTIONS='--experimental-vm-modules' jest",
275
267
  "test:live:handoffs": "RUN_HANDOFF_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest src/specs/agent-handoffs.live.test.ts --runInBand",
276
268
  "test:live:ask-user-questions": "RUN_ASK_USER_QUESTIONS_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest src/specs/ask-user-questions.live.test.ts --runInBand",
@@ -281,7 +273,7 @@
281
273
  "lint": "eslint \"{,!(node_modules|venv)/**/}*.{js,jsx,ts,tsx}\" --fix",
282
274
  "format": "prettier --write .",
283
275
  "audit": "npm audit --omit=dev",
284
- "label:eval": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/activity-labels/run.ts",
276
+ "label:eval": "tsx -r dotenv/config ./src/scripts/activity-labels/run.ts",
285
277
  "label:rescore": "node ./src/scripts/activity-labels/rescore.cjs"
286
278
  },
287
279
  "overrides": {
@@ -365,11 +357,10 @@
365
357
  "mongodb-memory-server-core": "^11.2.0",
366
358
  "prettier": "^3.6.2",
367
359
  "ts-jest": "^29.4.6",
368
- "ts-node": "^10.9.2",
369
360
  "tsc-alias": "^1.8.10",
370
- "tsconfig-paths": "^4.2.0",
371
361
  "tsdown": "^0.22.2",
372
362
  "tslib": "^2.6.3",
363
+ "tsx": "^4.23.12",
373
364
  "typescript": "^5.5.3",
374
365
  "winston": "^3.17.0"
375
366
  },
@@ -357,6 +357,8 @@ export class AgentContext {
357
357
  * - `'none'`: no summary present
358
358
  */
359
359
  private _summaryLocation: 'system_prompt' | 'user_message' | 'none' = 'none';
360
+ /** Whether a mid-run summary must appear before every retained message. */
361
+ private summaryPrecedesMessages: boolean = false;
360
362
  /**
361
363
  * Durable summary that survives reset() calls. Set from initialSummary
362
364
  * during fromConfig() and updated by setSummary() so that the latest
@@ -365,6 +367,7 @@ export class AgentContext {
365
367
  */
366
368
  private _durableSummaryText?: string;
367
369
  private _durableSummaryTokenCount: number = 0;
370
+ private durableSummaryPrecedesMessages: boolean = false;
368
371
  /** Number of summarization cycles that have occurred for this agent context */
369
372
  private _summaryVersion: number = 0;
370
373
  /**
@@ -989,10 +992,10 @@ export class AgentContext {
989
992
  return messages;
990
993
  }
991
994
 
992
- const tailIndex = this.getPromptCacheDynamicTailIndex(
993
- messages,
994
- promptCacheProvider
995
- );
995
+ const tailIndex =
996
+ this._summaryLocation === 'user_message' && this.summaryPrecedesMessages
997
+ ? 0
998
+ : this.getPromptCacheDynamicTailIndex(messages, promptCacheProvider);
996
999
  const stablePrefix = messages.slice(0, tailIndex);
997
1000
  const trailingMessages = messages.slice(tailIndex);
998
1001
  const cacheablePrefix = this.addStablePromptCacheMarkers(
@@ -1204,6 +1207,7 @@ export class AgentContext {
1204
1207
 
1205
1208
  this.summaryText = this._durableSummaryText;
1206
1209
  this.summaryTokenCount = this._durableSummaryTokenCount;
1210
+ this.summaryPrecedesMessages = this.durableSummaryPrecedesMessages;
1207
1211
  this._lastSummarizationMsgCount = 0;
1208
1212
  this.lastCallUsage = undefined;
1209
1213
  this.totalTokensFresh = false;
@@ -1461,12 +1465,18 @@ export class AgentContext {
1461
1465
  }
1462
1466
  }
1463
1467
 
1464
- setSummary(text: string, tokenCount: number): void {
1468
+ setSummary(
1469
+ text: string,
1470
+ tokenCount: number,
1471
+ options?: { precedesMessages?: boolean }
1472
+ ): void {
1465
1473
  this.summaryText = text;
1466
1474
  this.summaryTokenCount = tokenCount;
1467
1475
  this._summaryLocation = 'user_message';
1476
+ this.summaryPrecedesMessages = options?.precedesMessages === true;
1468
1477
  this._durableSummaryText = text;
1469
1478
  this._durableSummaryTokenCount = tokenCount;
1479
+ this.durableSummaryPrecedesMessages = this.summaryPrecedesMessages;
1470
1480
  this._summaryVersion += 1;
1471
1481
  this.systemRunnableStale = true;
1472
1482
  this.pruneMessages = undefined;
@@ -1477,8 +1487,10 @@ export class AgentContext {
1477
1487
  this.summaryText = text;
1478
1488
  this.summaryTokenCount = tokenCount;
1479
1489
  this._summaryLocation = 'system_prompt';
1490
+ this.summaryPrecedesMessages = false;
1480
1491
  this._durableSummaryText = text;
1481
1492
  this._durableSummaryTokenCount = tokenCount;
1493
+ this.durableSummaryPrecedesMessages = false;
1482
1494
  this._summaryVersion += 1;
1483
1495
  this.systemRunnableStale = true;
1484
1496
  }
@@ -1683,6 +1695,8 @@ export class AgentContext {
1683
1695
  this.summaryTokenCount = 0;
1684
1696
  this._durableSummaryText = undefined;
1685
1697
  this._durableSummaryTokenCount = 0;
1698
+ this.summaryPrecedesMessages = false;
1699
+ this.durableSummaryPrecedesMessages = false;
1686
1700
  this._summaryLocation = 'none';
1687
1701
  this.systemRunnableStale = true;
1688
1702
  }