@librechat/agents 3.3.11 → 3.3.12

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 (192) hide show
  1. package/dist/cjs/graphs/Graph.cjs +246 -25
  2. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  3. package/dist/cjs/llm/bedrock/index.cjs +13 -2
  4. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  5. package/dist/cjs/llm/invoke.cjs +146 -36
  6. package/dist/cjs/llm/invoke.cjs.map +1 -1
  7. package/dist/cjs/llm/openai/index.cjs +2 -2
  8. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  9. package/dist/cjs/llm/streamLimits.cjs +723 -0
  10. package/dist/cjs/llm/streamLimits.cjs.map +1 -0
  11. package/dist/cjs/main.cjs +8 -0
  12. package/dist/cjs/run.cjs +6 -2
  13. package/dist/cjs/run.cjs.map +1 -1
  14. package/dist/cjs/session/AgentSession.cjs +4 -1
  15. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  16. package/dist/cjs/stream.cjs +103 -12
  17. package/dist/cjs/stream.cjs.map +1 -1
  18. package/dist/cjs/summarization/node.cjs +157 -37
  19. package/dist/cjs/summarization/node.cjs.map +1 -1
  20. package/dist/cjs/tools/BashExecutor.cjs +3 -2
  21. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  22. package/dist/cjs/tools/CodeExecutor.cjs +4 -3
  23. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  24. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +5 -3
  25. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  26. package/dist/cjs/tools/ToolNode.cjs +76 -3
  27. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  28. package/dist/cjs/tools/ToolSearch.cjs +3 -2
  29. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  30. package/dist/cjs/tools/search/crw-scraper.cjs +7 -1
  31. package/dist/cjs/tools/search/crw-scraper.cjs.map +1 -1
  32. package/dist/cjs/tools/search/crw-search.cjs +3 -1
  33. package/dist/cjs/tools/search/crw-search.cjs.map +1 -1
  34. package/dist/cjs/tools/search/firecrawl.cjs +7 -1
  35. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  36. package/dist/cjs/tools/search/keenable-scraper.cjs +7 -1
  37. package/dist/cjs/tools/search/keenable-scraper.cjs.map +1 -1
  38. package/dist/cjs/tools/search/keenable-search.cjs +3 -1
  39. package/dist/cjs/tools/search/keenable-search.cjs.map +1 -1
  40. package/dist/cjs/tools/search/rerankers.cjs +26 -8
  41. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  42. package/dist/cjs/tools/search/search.cjs +30 -10
  43. package/dist/cjs/tools/search/search.cjs.map +1 -1
  44. package/dist/cjs/tools/search/serper-scraper.cjs +7 -1
  45. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  46. package/dist/cjs/tools/search/tavily-scraper.cjs +7 -1
  47. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
  48. package/dist/cjs/tools/search/tavily-search.cjs +3 -1
  49. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  50. package/dist/cjs/tools/search/tool.cjs +16 -2
  51. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  52. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +54 -3
  53. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  54. package/dist/cjs/utils/index.cjs +1 -0
  55. package/dist/cjs/utils/misc.cjs +12 -0
  56. package/dist/cjs/utils/misc.cjs.map +1 -1
  57. package/dist/cjs/utils/proxy.cjs +63 -0
  58. package/dist/cjs/utils/proxy.cjs.map +1 -0
  59. package/dist/esm/graphs/Graph.mjs +245 -24
  60. package/dist/esm/graphs/Graph.mjs.map +1 -1
  61. package/dist/esm/llm/bedrock/index.mjs +13 -2
  62. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  63. package/dist/esm/llm/invoke.mjs +146 -36
  64. package/dist/esm/llm/invoke.mjs.map +1 -1
  65. package/dist/esm/llm/openai/index.mjs +2 -2
  66. package/dist/esm/llm/openai/index.mjs.map +1 -1
  67. package/dist/esm/llm/streamLimits.mjs +704 -0
  68. package/dist/esm/llm/streamLimits.mjs.map +1 -0
  69. package/dist/esm/main.mjs +4 -2
  70. package/dist/esm/run.mjs +6 -2
  71. package/dist/esm/run.mjs.map +1 -1
  72. package/dist/esm/session/AgentSession.mjs +4 -1
  73. package/dist/esm/session/AgentSession.mjs.map +1 -1
  74. package/dist/esm/stream.mjs +103 -12
  75. package/dist/esm/stream.mjs.map +1 -1
  76. package/dist/esm/summarization/node.mjs +157 -37
  77. package/dist/esm/summarization/node.mjs.map +1 -1
  78. package/dist/esm/tools/BashExecutor.mjs +3 -2
  79. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  80. package/dist/esm/tools/CodeExecutor.mjs +4 -3
  81. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  82. package/dist/esm/tools/ProgrammaticToolCalling.mjs +5 -3
  83. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  84. package/dist/esm/tools/ToolNode.mjs +76 -3
  85. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  86. package/dist/esm/tools/ToolSearch.mjs +3 -2
  87. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  88. package/dist/esm/tools/search/crw-scraper.mjs +7 -1
  89. package/dist/esm/tools/search/crw-scraper.mjs.map +1 -1
  90. package/dist/esm/tools/search/crw-search.mjs +3 -1
  91. package/dist/esm/tools/search/crw-search.mjs.map +1 -1
  92. package/dist/esm/tools/search/firecrawl.mjs +7 -1
  93. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  94. package/dist/esm/tools/search/keenable-scraper.mjs +7 -1
  95. package/dist/esm/tools/search/keenable-scraper.mjs.map +1 -1
  96. package/dist/esm/tools/search/keenable-search.mjs +3 -1
  97. package/dist/esm/tools/search/keenable-search.mjs.map +1 -1
  98. package/dist/esm/tools/search/rerankers.mjs +26 -8
  99. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  100. package/dist/esm/tools/search/search.mjs +30 -10
  101. package/dist/esm/tools/search/search.mjs.map +1 -1
  102. package/dist/esm/tools/search/serper-scraper.mjs +7 -1
  103. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  104. package/dist/esm/tools/search/tavily-scraper.mjs +7 -1
  105. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
  106. package/dist/esm/tools/search/tavily-search.mjs +3 -1
  107. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  108. package/dist/esm/tools/search/tool.mjs +16 -2
  109. package/dist/esm/tools/search/tool.mjs.map +1 -1
  110. package/dist/esm/tools/subagent/SubagentExecutor.mjs +54 -3
  111. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  112. package/dist/esm/utils/index.mjs +1 -0
  113. package/dist/esm/utils/misc.mjs +12 -1
  114. package/dist/esm/utils/misc.mjs.map +1 -1
  115. package/dist/esm/utils/proxy.mjs +62 -0
  116. package/dist/esm/utils/proxy.mjs.map +1 -0
  117. package/dist/types/graphs/Graph.d.ts +53 -1
  118. package/dist/types/index.d.ts +2 -0
  119. package/dist/types/llm/invoke.d.ts +25 -4
  120. package/dist/types/llm/openai/index.d.ts +3 -0
  121. package/dist/types/llm/streamLimits.d.ts +314 -0
  122. package/dist/types/run.d.ts +1 -0
  123. package/dist/types/summarization/node.d.ts +27 -2
  124. package/dist/types/tools/BashExecutor.d.ts +2 -2
  125. package/dist/types/tools/CodeExecutor.d.ts +3 -3
  126. package/dist/types/tools/ToolNode.d.ts +11 -1
  127. package/dist/types/tools/search/crw-scraper.d.ts +2 -0
  128. package/dist/types/tools/search/firecrawl.d.ts +2 -0
  129. package/dist/types/tools/search/keenable-scraper.d.ts +2 -0
  130. package/dist/types/tools/search/rerankers.d.ts +9 -5
  131. package/dist/types/tools/search/serper-scraper.d.ts +2 -0
  132. package/dist/types/tools/search/tavily-scraper.d.ts +2 -0
  133. package/dist/types/tools/search/types.d.ts +28 -33
  134. package/dist/types/tools/subagent/SubagentExecutor.d.ts +44 -0
  135. package/dist/types/types/graph.d.ts +7 -1
  136. package/dist/types/types/run.d.ts +46 -1
  137. package/dist/types/types/tools.d.ts +21 -0
  138. package/dist/types/utils/index.d.ts +1 -0
  139. package/dist/types/utils/misc.d.ts +7 -0
  140. package/dist/types/utils/proxy.d.ts +31 -0
  141. package/package.json +2 -1
  142. package/src/__tests__/stream.eagerArgsDivergence.test.ts +158 -0
  143. package/src/__tests__/stream.eagerEventExecution.test.ts +1 -0
  144. package/src/__tests__/stream.streamLimits.test.ts +1982 -0
  145. package/src/graphs/Graph.ts +302 -27
  146. package/src/graphs/__tests__/Graph.breakerLifecycle.test.ts +234 -0
  147. package/src/index.ts +11 -0
  148. package/src/llm/bedrock/index.ts +22 -2
  149. package/src/llm/invoke.streamLimits.test.ts +142 -0
  150. package/src/llm/invoke.test.ts +89 -1
  151. package/src/llm/invoke.ts +197 -20
  152. package/src/llm/openai/cacheWriteTokens.test.ts +112 -0
  153. package/src/llm/openai/index.ts +14 -6
  154. package/src/llm/streamLimits.test.ts +450 -0
  155. package/src/llm/streamLimits.ts +1158 -0
  156. package/src/run.ts +4 -0
  157. package/src/session/AgentSession.ts +5 -0
  158. package/src/stream.ts +141 -6
  159. package/src/summarization/__tests__/node.test.ts +269 -0
  160. package/src/summarization/chunkHandler.test.ts +196 -0
  161. package/src/summarization/node.ts +203 -6
  162. package/src/tools/BashExecutor.ts +4 -3
  163. package/src/tools/CodeExecutor.ts +5 -4
  164. package/src/tools/ProgrammaticToolCalling.ts +7 -5
  165. package/src/tools/ToolNode.ts +109 -6
  166. package/src/tools/ToolSearch.ts +4 -3
  167. package/src/tools/__tests__/BashExecutor.test.ts +2 -2
  168. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +2 -4
  169. package/src/tools/__tests__/SubagentExecutor.test.ts +126 -0
  170. package/src/tools/__tests__/ToolNode.breakerSignal.test.ts +389 -0
  171. package/src/tools/__tests__/ToolNode.streamLimits.test.ts +69 -0
  172. package/src/tools/search/crw-scraper.ts +6 -0
  173. package/src/tools/search/crw-search.ts +6 -1
  174. package/src/tools/search/firecrawl.ts +6 -0
  175. package/src/tools/search/http-agent.test.ts +133 -0
  176. package/src/tools/search/keenable-scraper.ts +6 -0
  177. package/src/tools/search/keenable-search.ts +6 -1
  178. package/src/tools/search/rerankers.ts +36 -10
  179. package/src/tools/search/search.ts +29 -11
  180. package/src/tools/search/serper-scraper.ts +6 -0
  181. package/src/tools/search/tavily-scraper.ts +6 -0
  182. package/src/tools/search/tavily-search.ts +2 -0
  183. package/src/tools/search/tool.ts +16 -0
  184. package/src/tools/search/types.ts +31 -33
  185. package/src/tools/subagent/SubagentExecutor.ts +96 -3
  186. package/src/types/graph.ts +7 -0
  187. package/src/types/run.ts +49 -1
  188. package/src/types/tools.ts +21 -0
  189. package/src/utils/index.ts +1 -0
  190. package/src/utils/misc.ts +19 -0
  191. package/src/utils/proxy.test.ts +176 -0
  192. package/src/utils/proxy.ts +93 -0
@@ -1 +1 @@
1
- {"version":3,"file":"AgentSession.mjs","names":["isBaseMessage"],"sources":["../../../src/session/AgentSession.ts"],"sourcesContent":["import { MemorySaver } from '@langchain/langgraph';\nimport { HumanMessage, BaseMessage } from '@langchain/core/messages';\nimport type {\n BaseCheckpointSaver,\n CheckpointTuple,\n} from '@langchain/langgraph';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type {\n AgentSessionConfig,\n AgentSessionCheckpointing,\n AgentSessionCheckpointLookupOptions,\n AgentSessionCheckpointReference,\n AgentSessionInput,\n AgentSessionRunOptions,\n AgentSessionRunResult,\n AgentSessionStream,\n AgentSessionStreamEvent,\n SessionBranchOptions,\n SessionCheckpointEntry,\n SessionCompactOptions,\n SessionEntry,\n SessionForkOptions,\n} from './types';\nimport type { HookRegistry } from '@/hooks';\nimport type * as t from '@/types';\nimport { deserializeMessage } from './messageSerialization';\nimport { createSummarizeNode } from '@/summarization/node';\nimport { JsonlSessionStore } from './JsonlSessionStore';\nimport { AgentContext } from '@/agents/AgentContext';\nimport { ContentTypes, GraphEvents } from '@/common';\nimport { createRunId, createSessionId } from './ids';\nimport { createRunHandlers } from './handlers';\nimport { Run } from '@/run';\n\nfunction isBaseMessage(value: unknown): value is BaseMessage {\n return (\n value instanceof BaseMessage ||\n (value != null &&\n typeof value === 'object' &&\n '_getType' in value &&\n typeof (value as { _getType?: unknown })._getType === 'function')\n );\n}\n\ninterface NormalizedSessionInput {\n messages: BaseMessage[];\n state: t.IState;\n}\n\nfunction normalizeInput(input: AgentSessionInput): NormalizedSessionInput {\n if (typeof input === 'string') {\n const messages = [new HumanMessage(input)];\n return { messages, state: { messages } };\n }\n if (Array.isArray(input)) {\n return { messages: input, state: { messages: input } };\n }\n if (isBaseMessage(input)) {\n const messages = [input];\n return { messages, state: { messages } };\n }\n return { messages: input.messages, state: input };\n}\n\nfunction contentToText(\n content: Array<t.MessageContentComplex | undefined>\n): string {\n const chunks: string[] = [];\n for (const part of content) {\n if (!part) {\n continue;\n }\n if (part.type === ContentTypes.TEXT && typeof part.text === 'string') {\n chunks.push(part.text);\n }\n }\n return chunks.join('');\n}\n\nfunction normalizeConfig(config: AgentSessionConfig): {\n runConfig: t.RunConfig;\n cwd: string;\n sessionPath?: string;\n name?: string;\n ephemeral?: boolean;\n checkpointing?: AgentSessionCheckpointing;\n} {\n if ('runConfig' in config) {\n return {\n runConfig: config.runConfig,\n cwd: config.cwd ?? process.cwd(),\n sessionPath: config.sessionPath,\n name: config.name,\n ephemeral: config.ephemeral,\n checkpointing: config.checkpointing,\n };\n }\n const {\n cwd,\n sessionPath,\n name,\n ephemeral,\n checkpointing,\n sessionId: _sessionId,\n ...runConfig\n } = config;\n return {\n runConfig: {\n ...runConfig,\n runId: config.runId ?? createRunId(),\n },\n cwd: cwd ?? process.cwd(),\n sessionPath,\n name,\n ephemeral,\n checkpointing,\n };\n}\n\nfunction isMissingSessionError(error: unknown): boolean {\n if (error == null || typeof error !== 'object') {\n return false;\n }\n const candidate = error as { code?: string; message?: string };\n if (candidate.code === 'ENOENT') {\n return true;\n }\n return candidate.message?.startsWith('Session not found:') === true;\n}\n\nasync function createStore(params: {\n cwd: string;\n sessionPath?: string;\n name?: string;\n sessionId?: string;\n ephemeral?: boolean;\n}): Promise<JsonlSessionStore | undefined> {\n if (params.ephemeral === true) {\n return undefined;\n }\n if (params.sessionPath != null && params.sessionPath !== '') {\n try {\n return await JsonlSessionStore.openPath(params.sessionPath);\n } catch (error) {\n if (!isMissingSessionError(error)) {\n throw error;\n }\n return JsonlSessionStore.create({\n path: params.sessionPath,\n cwd: params.cwd,\n name: params.name,\n sessionId: params.sessionId,\n });\n }\n }\n return JsonlSessionStore.create({\n cwd: params.cwd,\n name: params.name,\n sessionId: params.sessionId,\n });\n}\n\ntype InitialSummary = NonNullable<t.AgentInputs['initialSummary']>;\n\nfunction mergeInitialSummary(\n existing: InitialSummary | undefined,\n sessionSummary: InitialSummary | undefined\n): InitialSummary | undefined {\n if (!existing) {\n return sessionSummary;\n }\n if (!sessionSummary) {\n return existing;\n }\n if (existing.text === sessionSummary.text) {\n return existing;\n }\n return {\n text: `${existing.text}\\n\\n${sessionSummary.text}`,\n tokenCount: existing.tokenCount + sessionSummary.tokenCount,\n };\n}\n\nfunction applyInitialSummaryToAgent(\n agent: t.AgentInputs,\n initialSummary: InitialSummary | undefined\n): t.AgentInputs {\n const merged = mergeInitialSummary(agent.initialSummary, initialSummary);\n return merged ? { ...agent, initialSummary: merged } : agent;\n}\n\nfunction applyInitialSummaryToGraphConfig(\n graphConfig: t.RunConfig['graphConfig'],\n initialSummary: InitialSummary | undefined\n): t.RunConfig['graphConfig'] {\n if (!initialSummary) {\n return graphConfig;\n }\n if ('agents' in graphConfig) {\n return {\n ...graphConfig,\n agents: graphConfig.agents.map((agent) =>\n applyInitialSummaryToAgent(agent, initialSummary)\n ),\n };\n }\n return {\n ...graphConfig,\n initialSummary: mergeInitialSummary(\n graphConfig.initialSummary,\n initialSummary\n ),\n };\n}\n\ninterface SessionCheckpointingState {\n enabled: boolean;\n checkpointer?: BaseCheckpointSaver;\n disableGraphCheckpointer?: boolean;\n}\n\nfunction isCheckpointSaver(value: unknown): value is BaseCheckpointSaver {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const candidate = value as Partial<BaseCheckpointSaver>;\n return (\n typeof candidate.getTuple === 'function' &&\n typeof candidate.list === 'function' &&\n typeof candidate.put === 'function' &&\n typeof candidate.putWrites === 'function' &&\n typeof candidate.deleteThread === 'function'\n );\n}\n\nfunction getGraphCheckpointer(\n graphConfig: t.RunConfig['graphConfig']\n): BaseCheckpointSaver | undefined {\n const checkpointer = graphConfig.compileOptions?.checkpointer;\n return isCheckpointSaver(checkpointer) ? checkpointer : undefined;\n}\n\nfunction createCheckpointingState(\n runConfig: t.RunConfig,\n checkpointing: AgentSessionCheckpointing | undefined\n): SessionCheckpointingState {\n const graphCheckpointer = getGraphCheckpointer(runConfig.graphConfig);\n if (checkpointing === false) {\n return {\n enabled: false,\n disableGraphCheckpointer: true,\n };\n }\n if (typeof checkpointing === 'object') {\n if (checkpointing.enabled === false) {\n return {\n enabled: false,\n disableGraphCheckpointer: true,\n };\n }\n return {\n enabled: true,\n checkpointer:\n checkpointing.checkpointer ?? graphCheckpointer ?? new MemorySaver(),\n };\n }\n if (checkpointing === true || runConfig.humanInTheLoop?.enabled === true) {\n return {\n enabled: true,\n checkpointer: graphCheckpointer ?? new MemorySaver(),\n };\n }\n return {\n enabled: graphCheckpointer != null,\n checkpointer: graphCheckpointer,\n };\n}\n\nfunction removeCheckpointerFromGraphConfig(\n graphConfig: t.RunConfig['graphConfig']\n): t.RunConfig['graphConfig'] {\n if (graphConfig.compileOptions?.checkpointer == null) {\n return graphConfig;\n }\n const { checkpointer: _checkpointer, ...compileOptions } =\n graphConfig.compileOptions;\n return {\n ...graphConfig,\n compileOptions,\n };\n}\n\nfunction applyCheckpointerToGraphConfig(\n graphConfig: t.RunConfig['graphConfig'],\n checkpointer: BaseCheckpointSaver | undefined\n): t.RunConfig['graphConfig'] {\n if (!checkpointer) {\n return graphConfig;\n }\n if (graphConfig.compileOptions?.checkpointer === checkpointer) {\n return graphConfig;\n }\n return {\n ...graphConfig,\n compileOptions: {\n ...(graphConfig.compileOptions ?? {}),\n checkpointer,\n },\n };\n}\n\nfunction applyCheckpointingToGraphConfig(\n graphConfig: t.RunConfig['graphConfig'],\n checkpointing: SessionCheckpointingState\n): t.RunConfig['graphConfig'] {\n if (checkpointing.disableGraphCheckpointer === true) {\n return removeCheckpointerFromGraphConfig(graphConfig);\n }\n return applyCheckpointerToGraphConfig(\n graphConfig,\n checkpointing.checkpointer\n );\n}\n\nfunction getConfigString(\n config: RunnableConfig | undefined,\n key: string\n): string | undefined {\n const configurable = config?.configurable as\n | Partial<Record<string, unknown>>\n | undefined;\n const value = configurable?.[key];\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction getConfigOptionalString(\n config: RunnableConfig | undefined,\n key: string\n): string | undefined {\n const configurable = config?.configurable as\n | Partial<Record<string, unknown>>\n | undefined;\n if (\n configurable == null ||\n !Object.prototype.hasOwnProperty.call(configurable, key)\n ) {\n return undefined;\n }\n const value = configurable[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction createCallerConfig(\n threadId: string,\n options: AgentSessionRunOptions\n): RunnableConfig & { version: 'v1' | 'v2' } {\n return {\n recursionLimit: 50,\n ...(options.config ?? {}),\n configurable: {\n ...(options.config?.configurable ?? {}),\n thread_id: threadId,\n },\n version: options.config?.version ?? 'v2',\n };\n}\n\nfunction createCheckpointLookupConfig(config: RunnableConfig): RunnableConfig {\n const threadId = getConfigString(config, 'thread_id');\n if (threadId == null) {\n return config;\n }\n const checkpointNs = getConfigString(config, 'checkpoint_ns') ?? '';\n const checkpointId = getConfigString(config, 'checkpoint_id');\n return {\n configurable: {\n ...config.configurable,\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n ...(checkpointId != null ? { checkpoint_id: checkpointId } : {}),\n },\n };\n}\n\nfunction applyCheckpointReferenceToConfig<\n TConfig extends RunnableConfig & { version?: 'v1' | 'v2' },\n>(\n config: TConfig,\n checkpoint:\n | {\n checkpointId?: string;\n checkpointNs?: string;\n }\n | undefined,\n options?: { overwrite?: boolean }\n): TConfig {\n if (\n checkpoint?.checkpointId == null ||\n checkpoint.checkpointId === '' ||\n (options?.overwrite !== true &&\n getConfigString(config, 'checkpoint_id') != null)\n ) {\n return config;\n }\n return {\n ...config,\n configurable: {\n ...config.configurable,\n checkpoint_id: checkpoint.checkpointId,\n checkpoint_ns: checkpoint.checkpointNs ?? '',\n },\n };\n}\n\nfunction getStoredCheckpointForConfig(\n store: JsonlSessionStore | undefined,\n threadId: string,\n config: RunnableConfig\n): SessionCheckpointEntry | undefined {\n const requestedCheckpointNs = getConfigOptionalString(\n config,\n 'checkpoint_ns'\n );\n if (requestedCheckpointNs == null) {\n return store?.getLatestCheckpoint(threadId);\n }\n const checkpoints = store?.getCheckpoints(threadId) ?? [];\n for (let i = checkpoints.length - 1; i >= 0; i--) {\n const checkpoint = checkpoints[i];\n if (checkpoint.data.source === 'reset') {\n return undefined;\n }\n if ((checkpoint.data.checkpointNs ?? '') === requestedCheckpointNs) {\n return checkpoint;\n }\n }\n return undefined;\n}\n\nfunction createLatestCheckpointLookupConfig(\n config: RunnableConfig\n): RunnableConfig {\n const lookup = createCheckpointLookupConfig(config);\n const { checkpoint_id: _checkpointId, ...configurable } =\n lookup.configurable ?? {};\n return { configurable };\n}\n\nasync function getLatestCheckpointTuple(\n checkpointer: BaseCheckpointSaver | undefined,\n config: RunnableConfig\n): Promise<CheckpointTuple | undefined> {\n if (!checkpointer) {\n return undefined;\n }\n const lookupConfig = createLatestCheckpointLookupConfig(config);\n const tuple = await checkpointer.getTuple(lookupConfig);\n if (tuple) {\n return tuple;\n }\n for await (const checkpoint of checkpointer.list(lookupConfig, {\n limit: 1,\n })) {\n return checkpoint;\n }\n return undefined;\n}\n\nasync function getSelectedCheckpointTuple(\n checkpointer: BaseCheckpointSaver | undefined,\n config: RunnableConfig\n): Promise<CheckpointTuple | undefined> {\n return checkpointer?.getTuple(createCheckpointLookupConfig(config));\n}\n\nfunction createCheckpointReference(params: {\n threadId: string;\n tuple: CheckpointTuple;\n}): AgentSessionCheckpointReference {\n const checkpointNs =\n getConfigString(params.tuple.config, 'checkpoint_ns') ?? '';\n const parentCheckpointId = getConfigString(\n params.tuple.parentConfig,\n 'checkpoint_id'\n );\n return {\n provider: 'langgraph',\n threadId: params.threadId,\n checkpointId: params.tuple.checkpoint.id,\n checkpointNs,\n ...(parentCheckpointId != null ? { parentCheckpointId } : {}),\n };\n}\n\nfunction createSessionRunState(entries: SessionEntry[]): {\n messages: BaseMessage[];\n initialSummary?: InitialSummary;\n} {\n const messages: BaseMessage[] = [];\n let initialSummary: InitialSummary | undefined;\n for (const entry of entries) {\n if (entry.type === 'summary') {\n initialSummary = {\n text: entry.data.text,\n tokenCount:\n typeof entry.data.tokenCount === 'number' &&\n Number.isFinite(entry.data.tokenCount)\n ? entry.data.tokenCount\n : 0,\n };\n messages.length = 0;\n continue;\n }\n if (entry.type === 'message') {\n messages.push(deserializeMessage(entry.data.message));\n }\n }\n return { messages, initialSummary };\n}\n\nfunction isMessageEntry(\n entry: SessionEntry\n): entry is Extract<SessionEntry, { type: 'message' }> {\n return entry.type === 'message';\n}\n\nfunction getSessionBranchTarget(\n store: JsonlSessionStore,\n entryId: string,\n position: 'before' | 'at'\n): SessionEntry | undefined {\n const entry = store.getEntry(entryId);\n if (!entry) {\n throw new Error(`Entry not found: ${entryId}`);\n }\n if (position === 'at') {\n return entry;\n }\n return entry.parentId == null ? undefined : store.getEntry(entry.parentId);\n}\n\nfunction getAbandonedPathForBranch(\n store: JsonlSessionStore,\n previousLeafId: string | null,\n targetLeafId: string | null\n): SessionEntry[] {\n const previousPath = store.getPath(previousLeafId ?? undefined);\n if (previousPath.length === 0) {\n return [];\n }\n const targetPath = targetLeafId == null ? [] : store.getPath(targetLeafId);\n const maxSharedLength = Math.min(previousPath.length, targetPath.length);\n let sharedLength = 0;\n while (\n sharedLength < maxSharedLength &&\n previousPath[sharedLength].id === targetPath[sharedLength].id\n ) {\n sharedLength++;\n }\n return previousPath.slice(sharedLength);\n}\n\nfunction createAgentInputFromGraphConfig(\n graphConfig: t.RunConfig['graphConfig'],\n initialSummary: InitialSummary | undefined,\n retainRecentTurns: number | undefined,\n instructions: string | undefined\n): t.AgentInputs {\n let agent: t.AgentInputs;\n if ('agents' in graphConfig) {\n if (graphConfig.agents.length === 0) {\n throw new Error('Cannot compact a session with no agents');\n }\n agent = graphConfig.agents[0];\n } else {\n const {\n type: _type,\n llmConfig,\n signal: _signal,\n tools = [],\n ...agentInputs\n } = graphConfig;\n const { provider, ...clientOptions } = llmConfig;\n agent = {\n ...agentInputs,\n tools,\n provider,\n clientOptions,\n agentId: 'default',\n };\n }\n const summarizationConfig: t.SummarizationConfig = {\n ...(agent.summarizationConfig ?? {}),\n ...(instructions != null && instructions !== ''\n ? { prompt: instructions }\n : {}),\n retainRecent: {\n ...(agent.summarizationConfig?.retainRecent ?? {}),\n ...(retainRecentTurns != null ? { turns: retainRecentTurns } : {}),\n },\n };\n return {\n ...applyInitialSummaryToAgent(agent, initialSummary),\n summarizationEnabled: true,\n summarizationConfig,\n };\n}\n\nfunction createManualCompactGraph(params: {\n runId: string;\n customHandlers?: Record<string, t.EventHandler>;\n hooks?: HookRegistry;\n}): {\n graph: Parameters<typeof createSummarizeNode>[0]['graph'];\n completedSummary?: t.SummaryContentBlock;\n} {\n const contentData: t.RunStep[] = [];\n const contentIndexMap = new Map<string, number>();\n const result: {\n graph: Parameters<typeof createSummarizeNode>[0]['graph'];\n completedSummary?: t.SummaryContentBlock;\n } = {\n graph: {\n contentData,\n contentIndexMap,\n runId: params.runId,\n isMultiAgent: false,\n hookRegistry: params.hooks,\n dispatchRunStep: async (runStep): Promise<void> => {\n contentData.push(runStep);\n contentIndexMap.set(runStep.id, runStep.index);\n await params.customHandlers?.[GraphEvents.ON_RUN_STEP]?.handle(\n GraphEvents.ON_RUN_STEP,\n runStep\n );\n },\n dispatchRunStepCompleted: async (stepId, completed): Promise<void> => {\n const runStep = contentData.find((step) => step.id === stepId);\n const resultWithStep = {\n ...completed,\n id: stepId,\n index: runStep?.index ?? 0,\n };\n if (completed.type === 'summary') {\n result.completedSummary = completed.summary;\n }\n await params.customHandlers?.[\n GraphEvents.ON_RUN_STEP_COMPLETED\n ]?.handle(GraphEvents.ON_RUN_STEP_COMPLETED, {\n result: resultWithStep,\n } as unknown as Parameters<t.EventHandler['handle']>[1]);\n },\n },\n };\n return result;\n}\n\nfunction getSummaryText(summary: t.SummaryContentBlock | undefined): string {\n const firstBlock = summary?.content?.[0];\n return firstBlock != null &&\n typeof firstBlock === 'object' &&\n 'text' in firstBlock &&\n typeof firstBlock.text === 'string'\n ? firstBlock.text\n : '';\n}\n\nfunction getSummaryTokenCount(\n summary: t.SummaryContentBlock | undefined\n): number {\n return typeof summary?.tokenCount === 'number' &&\n Number.isFinite(summary.tokenCount)\n ? summary.tokenCount\n : 0;\n}\n\nfunction filterRemoveMessages(messages: BaseMessage[]): BaseMessage[] {\n return messages.filter((message) => message._getType() !== 'remove');\n}\n\nclass LiveAgentSessionStream implements AgentSessionStream {\n private resultPromise: Promise<AgentSessionRunResult> | undefined;\n private readonly events: AgentSessionStreamEvent[] = [];\n private readonly waiters: Array<{\n resolve: (result: IteratorResult<AgentSessionStreamEvent>) => void;\n reject: (error: unknown) => void;\n }> = [];\n private closed = false;\n private failed = false;\n private error: unknown;\n\n setResultPromise(resultPromise: Promise<AgentSessionRunResult>): void {\n this.resultPromise = resultPromise;\n }\n\n push(event: AgentSessionStreamEvent): void {\n if (this.closed) {\n return;\n }\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter.resolve({ value: event, done: false });\n return;\n }\n this.events.push(event);\n }\n\n complete(): void {\n this.closed = true;\n for (const waiter of this.waiters.splice(0)) {\n waiter.resolve({\n value: undefined as unknown as AgentSessionStreamEvent,\n done: true,\n });\n }\n }\n\n fail(error: unknown): void {\n this.error = error;\n this.failed = true;\n this.closed = true;\n for (const waiter of this.waiters.splice(0)) {\n waiter.reject(error);\n }\n }\n\n private nextEvent(): Promise<IteratorResult<AgentSessionStreamEvent>> {\n const event = this.events.shift();\n if (event !== undefined) {\n return Promise.resolve({ value: event, done: false });\n }\n if (this.failed) {\n return Promise.reject(this.error);\n }\n if (this.closed) {\n return Promise.resolve({\n value: undefined as unknown as AgentSessionStreamEvent,\n done: true,\n });\n }\n return new Promise((resolve, reject) => {\n this.waiters.push({ resolve, reject });\n });\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<AgentSessionStreamEvent> {\n for (;;) {\n const next = await this.nextEvent();\n if (next.done === true) {\n return;\n }\n yield next.value;\n }\n }\n\n async *toTextStream(): AsyncIterable<string> {\n for await (const event of this) {\n if (event.type !== 'message.delta' || event.data == null) {\n continue;\n }\n const data = event.data;\n if (typeof data === 'object' && !Array.isArray(data)) {\n const delta = data.delta;\n if (\n delta != null &&\n typeof delta === 'object' &&\n !Array.isArray(delta)\n ) {\n const content = delta.content;\n if (Array.isArray(content)) {\n for (const part of content) {\n if (\n part != null &&\n typeof part === 'object' &&\n !Array.isArray(part) &&\n typeof part.text === 'string'\n ) {\n yield part.text;\n }\n }\n }\n }\n }\n }\n }\n\n finalResult(): Promise<AgentSessionRunResult> {\n if (!this.resultPromise) {\n return Promise.reject(new Error('Session stream has not started'));\n }\n return this.resultPromise;\n }\n}\n\nexport class AgentSession {\n private runConfig: t.RunConfig;\n private store: JsonlSessionStore | undefined;\n private calibrationRatio: number | undefined;\n private checkpointing: SessionCheckpointingState;\n cwd: string;\n threadId: string;\n\n private constructor(params: {\n runConfig: t.RunConfig;\n cwd: string;\n threadId: string;\n checkpointing: SessionCheckpointingState;\n store?: JsonlSessionStore;\n }) {\n this.runConfig = params.runConfig;\n this.cwd = params.cwd;\n this.threadId = params.threadId;\n this.store = params.store;\n this.checkpointing = params.checkpointing;\n }\n\n static async create(config: AgentSessionConfig): Promise<AgentSession> {\n const normalized = normalizeConfig(config);\n const explicitSessionId =\n 'sessionId' in config && typeof config.sessionId === 'string'\n ? config.sessionId\n : undefined;\n const store = await createStore({\n cwd: normalized.cwd,\n sessionPath: normalized.sessionPath,\n name: normalized.name,\n sessionId: explicitSessionId,\n ephemeral: normalized.ephemeral,\n });\n return new AgentSession({\n runConfig: normalized.runConfig,\n cwd: normalized.cwd,\n threadId: store?.header.id ?? explicitSessionId ?? createSessionId(),\n checkpointing: createCheckpointingState(\n normalized.runConfig,\n normalized.checkpointing\n ),\n store,\n });\n }\n\n get sessionPath(): string | undefined {\n return this.store?.path;\n }\n\n getSessionStore(): JsonlSessionStore | undefined {\n return this.store;\n }\n\n getCheckpointer(): BaseCheckpointSaver | undefined {\n return this.checkpointing.checkpointer;\n }\n\n async getLatestCheckpoint(\n options: AgentSessionCheckpointLookupOptions = {}\n ): Promise<AgentSessionCheckpointReference | undefined> {\n const threadId = options.threadId ?? this.threadId;\n const baseConfig = options.config ?? {};\n const config = createCheckpointLookupConfig({\n ...baseConfig,\n configurable: {\n ...(baseConfig.configurable ?? {}),\n thread_id: threadId,\n ...(options.checkpointNs != null\n ? { checkpoint_ns: options.checkpointNs }\n : {}),\n },\n });\n const tuple = await getLatestCheckpointTuple(\n this.checkpointing.checkpointer,\n config\n );\n return tuple ? createCheckpointReference({ threadId, tuple }) : undefined;\n }\n\n private async hasCheckpointState(config: RunnableConfig): Promise<boolean> {\n if (!this.checkpointing.enabled) {\n return false;\n }\n const tuple = await getSelectedCheckpointTuple(\n this.checkpointing.checkpointer,\n config\n );\n return tuple != null;\n }\n\n private async recordCheckpoint(params: {\n source: 'run' | 'resume';\n runId: string;\n threadId: string;\n config: RunnableConfig;\n checkpointId?: string;\n checkpointNs?: string;\n }): Promise<void> {\n if (!this.checkpointing.enabled) {\n return;\n }\n const checkpointConfig = applyCheckpointReferenceToConfig(\n params.config,\n {\n checkpointId: params.checkpointId,\n checkpointNs: params.checkpointNs,\n },\n { overwrite: true }\n );\n const tuple =\n params.checkpointId != null && params.checkpointId !== ''\n ? await getSelectedCheckpointTuple(\n this.checkpointing.checkpointer,\n checkpointConfig\n )\n : await getLatestCheckpointTuple(\n this.checkpointing.checkpointer,\n params.config\n );\n if (!tuple) {\n return;\n }\n const reference = createCheckpointReference({\n threadId: params.threadId,\n tuple,\n });\n await this.store?.appendCheckpoint({\n source: params.source,\n runId: params.runId,\n threadId: params.threadId,\n checkpointId: reference.checkpointId,\n checkpointNs: reference.checkpointNs,\n parentCheckpointId: reference.parentCheckpointId,\n });\n }\n\n private getCheckpointThreadIds(): string[] {\n const threadIds = new Set<string>([this.threadId]);\n for (const checkpoint of this.store?.getCheckpoints() ?? []) {\n threadIds.add(checkpoint.data.threadId);\n }\n return [...threadIds];\n }\n\n private async resetCheckpointThreads(reason: string): Promise<void> {\n const checkpointer = this.checkpointing.checkpointer;\n if (!this.checkpointing.enabled || checkpointer == null) {\n return;\n }\n for (const threadId of this.getCheckpointThreadIds()) {\n await checkpointer.deleteThread(threadId);\n await this.store?.appendCheckpoint({\n source: 'reset',\n threadId,\n reason,\n });\n }\n }\n\n private async runInternal(\n input: AgentSessionInput,\n options: AgentSessionRunOptions = {},\n onEvent?: (event: AgentSessionStreamEvent) => void\n ): Promise<AgentSessionRunResult> {\n const runId = options.runId ?? createRunId();\n const threadId = options.threadId ?? this.threadId;\n const isSessionThread = threadId === this.threadId;\n const normalizedInput = normalizeInput(input);\n const inputMessages = normalizedInput.messages;\n const callerConfig = createCallerConfig(threadId, options);\n const useCheckpointState = await this.hasCheckpointState(callerConfig);\n let parentId = this.store?.getLeafEntry()?.id ?? null;\n if (isSessionThread) {\n for (const message of inputMessages) {\n const entry = await this.store?.appendMessage(message, parentId);\n parentId = entry?.id ?? parentId;\n }\n }\n await this.store?.appendRunEvent('run.started', undefined, {\n runId,\n threadId,\n });\n\n const handlerResult = createRunHandlers({\n runId,\n threadId,\n userHandlers: this.runConfig.customHandlers,\n onEvent,\n });\n const emitTerminalEvent = (\n event: Omit<\n AgentSessionStreamEvent,\n 'sequence' | 'runId' | 'threadId' | 'timestamp'\n >\n ): void => {\n const streamEvent: AgentSessionStreamEvent = {\n ...event,\n sequence: handlerResult.events.length,\n runId,\n threadId,\n timestamp: new Date().toISOString(),\n };\n handlerResult.events.push(streamEvent);\n onEvent?.(streamEvent);\n };\n const sessionState = createSessionRunState(\n isSessionThread ? (this.store?.getPath() ?? []) : []\n );\n try {\n const runConfig: t.RunConfig = {\n ...this.runConfig,\n runId,\n graphConfig: applyCheckpointingToGraphConfig(\n applyInitialSummaryToGraphConfig(\n this.runConfig.graphConfig,\n sessionState.initialSummary\n ),\n this.checkpointing\n ),\n returnContent: true,\n calibrationRatio: this.calibrationRatio,\n customHandlers: {\n ...(this.runConfig.customHandlers ?? {}),\n ...handlerResult.handlers,\n },\n };\n const run = await Run.create<t.IState>(runConfig);\n let messages = inputMessages;\n if (!useCheckpointState && sessionState.messages.length > 0) {\n messages = sessionState.messages;\n }\n const content = await run.processStream(\n { ...normalizedInput.state, messages },\n callerConfig,\n options.streamOptions\n );\n const runMessages = run.getRunMessages() ?? [];\n if (isSessionThread) {\n for (const message of runMessages) {\n await this.store?.appendMessage(message);\n }\n }\n this.calibrationRatio = run.getCalibrationRatio();\n const interrupt = run.getInterrupt();\n const haltedReason = run.getHaltReason();\n if (interrupt) {\n emitTerminalEvent({ type: 'run.interrupted' });\n await this.store?.appendRunEvent('run.interrupted', interrupt, {\n runId,\n threadId,\n });\n } else if (haltedReason != null && haltedReason !== '') {\n emitTerminalEvent({ type: 'run.halted', data: haltedReason });\n await this.store?.appendRunEvent('run.halted', haltedReason, {\n runId,\n threadId,\n });\n } else {\n emitTerminalEvent({ type: 'run.completed' });\n await this.store?.appendRunEvent('run.completed', undefined, {\n runId,\n threadId,\n });\n }\n await this.recordCheckpoint({\n source: 'run',\n runId,\n threadId,\n config: callerConfig,\n checkpointId: interrupt?.checkpointId,\n checkpointNs: interrupt?.checkpointNs,\n });\n const contentParts = (content ?? handlerResult.contentParts).filter(\n (part): part is t.MessageContentComplex => part != null\n );\n return {\n text: contentToText(contentParts),\n content: contentParts,\n messages: runMessages,\n usage: handlerResult.usage,\n steps: handlerResult.steps,\n interrupt,\n haltedReason,\n runId,\n threadId,\n };\n } catch (error) {\n emitTerminalEvent({\n type: 'run.failed',\n data: error instanceof Error ? error.message : String(error),\n });\n await this.store?.appendRunEvent('run.failed', error, {\n runId,\n threadId,\n });\n await this.recordCheckpoint({\n source: 'run',\n runId,\n threadId,\n config: callerConfig,\n });\n throw error;\n }\n }\n\n async run(\n input: AgentSessionInput,\n options: AgentSessionRunOptions = {}\n ): Promise<AgentSessionRunResult> {\n return this.runInternal(input, options);\n }\n\n stream(\n input: AgentSessionInput,\n options: AgentSessionRunOptions = {}\n ): AgentSessionStream {\n const stream = new LiveAgentSessionStream();\n const resultPromise = this.runInternal(input, options, (event) => {\n stream.push(event);\n }).then(\n (result) => {\n stream.complete();\n return result;\n },\n (error: unknown) => {\n stream.fail(error);\n throw error;\n }\n );\n stream.setResultPromise(resultPromise);\n return stream;\n }\n\n async resumeSession(pathOrId?: string): Promise<AgentSession> {\n if (pathOrId == null || pathOrId === '') {\n const sessions = await JsonlSessionStore.list(this.cwd);\n if (sessions.length === 0) {\n throw new Error(`No sessions found for ${this.cwd}`);\n }\n this.store = await JsonlSessionStore.open(sessions[0].path);\n this.cwd = this.store.header.cwd;\n this.threadId = this.store.header.id;\n return this;\n }\n this.store = await JsonlSessionStore.open(pathOrId);\n this.cwd = this.store.header.cwd;\n this.threadId = this.store.header.id;\n return this;\n }\n\n async clone(options: SessionForkOptions = {}): Promise<AgentSession> {\n if (!this.store) {\n throw new Error('Cannot clone an ephemeral session');\n }\n const store = await this.store.clone(options);\n return new AgentSession({\n runConfig: this.runConfig,\n cwd: store.header.cwd,\n threadId: store.header.id,\n checkpointing: this.checkpointing,\n store,\n });\n }\n\n async fork(\n entryId: string,\n options: SessionForkOptions = {}\n ): Promise<AgentSession> {\n if (!this.store) {\n throw new Error('Cannot fork an ephemeral session');\n }\n const store = await this.store.fork(entryId, options);\n return new AgentSession({\n runConfig: this.runConfig,\n cwd: store.header.cwd,\n threadId: store.header.id,\n checkpointing: this.checkpointing,\n store,\n });\n }\n\n async branch(\n entryId: string,\n options: SessionBranchOptions = {}\n ): Promise<void> {\n const store = this.store;\n if (!store) {\n throw new Error('Cannot branch an ephemeral session');\n }\n const target = getSessionBranchTarget(\n store,\n entryId,\n options.position ?? 'at'\n );\n const previousLeafId = store.getLeafEntry()?.id ?? null;\n let leafId = target?.id ?? null;\n const summarizeAbandoned = options.summarizeAbandoned;\n if (summarizeAbandoned !== undefined && summarizeAbandoned !== false) {\n const instructions =\n typeof summarizeAbandoned === 'object'\n ? summarizeAbandoned.instructions\n : undefined;\n const abandonedPath = getAbandonedPathForBranch(\n store,\n previousLeafId,\n leafId\n );\n const summary = await this.compactActivePath(\n { instructions, retainRecentTurns: 0 },\n leafId,\n abandonedPath\n );\n leafId = summary?.id ?? leafId;\n }\n if (leafId === previousLeafId) {\n return;\n }\n await store.setLeaf(leafId);\n await this.resetCheckpointThreads('branch');\n }\n\n async compact(options: SessionCompactOptions = {}): Promise<void> {\n const summary = await this.compactActivePath(options, null);\n if (summary) {\n await this.resetCheckpointThreads('compact');\n }\n }\n\n private async compactActivePath(\n options: SessionCompactOptions = {},\n parentId: string | null,\n path?: SessionEntry[]\n ): Promise<Extract<SessionEntry, { type: 'summary' }> | undefined> {\n const store = this.store;\n if (!store) {\n throw new Error('Cannot compact an ephemeral session');\n }\n const activePath = path ?? store.getPath();\n const sessionState = createSessionRunState(activePath);\n const messageEntries = activePath.filter(isMessageEntry);\n if (sessionState.messages.length === 0) {\n return undefined;\n }\n const compactRunId = createRunId();\n const agentContext = AgentContext.fromConfig(\n createAgentInputFromGraphConfig(\n this.runConfig.graphConfig,\n sessionState.initialSummary,\n options.retainRecentTurns,\n options.instructions\n ),\n this.runConfig.tokenCounter\n );\n const graph = createManualCompactGraph({\n runId: compactRunId,\n customHandlers: this.runConfig.customHandlers,\n hooks: this.runConfig.hooks,\n });\n const summarizeNode = createSummarizeNode({\n agentContext,\n graph: graph.graph,\n generateStepId: (stepKey): [string, number] => [\n `${stepKey}-${compactRunId}`,\n graph.graph.contentData.length,\n ],\n });\n const summarizedState = await summarizeNode(\n {\n messages: sessionState.messages,\n summarizationRequest: {\n remainingContextTokens: agentContext.maxContextTokens ?? 0,\n agentId: agentContext.agentId,\n },\n },\n {\n configurable: { thread_id: this.threadId },\n metadata: { run_id: compactRunId },\n }\n );\n const completedSummaryText = getSummaryText(graph.completedSummary);\n const contextSummaryText = agentContext.getSummaryText();\n let summaryText = completedSummaryText;\n if (summaryText === '' && contextSummaryText != null) {\n summaryText = contextSummaryText;\n }\n if (summaryText === '') {\n return undefined;\n }\n const retainedMessages = filterRemoveMessages(\n summarizedState.messages ?? []\n );\n let retainedEntryIds: string[] = [];\n if (retainedMessages.length > 0) {\n retainedEntryIds = messageEntries\n .slice(-retainedMessages.length)\n .map((entry) => entry.id);\n }\n const retainedEntryIdSet = new Set(retainedEntryIds);\n const summarized = messageEntries.filter(\n (entry) => !retainedEntryIdSet.has(entry.id)\n );\n const summary = await store.appendEntryForCompaction({\n text: summaryText,\n tokenCount: getSummaryTokenCount(graph.completedSummary),\n retainedEntryIds,\n summarizedEntryIds: summarized.map((entry) => entry.id),\n instructions: options.instructions,\n parentId,\n });\n let retainedParentId: string | null = summary.id;\n for (const message of retainedMessages) {\n const retainedMessage = await store.appendMessage(\n message,\n retainedParentId\n );\n retainedParentId = retainedMessage.id;\n }\n await store.appendCompactionEntry({\n summaryEntryId: summary.id,\n retainedEntryIds,\n summarizedEntryIds: summarized.map((entry) => entry.id),\n });\n return summary;\n }\n\n async resumeInterrupt<TResume>(\n resumeValue: TResume,\n options: AgentSessionRunOptions = {}\n ): Promise<AgentSessionRunResult> {\n const runId = options.runId ?? createRunId();\n const threadId = options.threadId ?? this.threadId;\n const isSessionThread = threadId === this.threadId;\n const baseCallerConfig = createCallerConfig(threadId, options);\n const callerConfig = applyCheckpointReferenceToConfig(\n baseCallerConfig,\n getStoredCheckpointForConfig(this.store, threadId, baseCallerConfig)?.data\n );\n await this.store?.appendRunEvent('run.started', undefined, {\n runId,\n threadId,\n });\n const handlerResult = createRunHandlers({\n runId,\n threadId,\n userHandlers: this.runConfig.customHandlers,\n });\n const sessionState = createSessionRunState(\n isSessionThread ? (this.store?.getPath() ?? []) : []\n );\n try {\n const run = await Run.create<t.IState>({\n ...this.runConfig,\n runId,\n graphConfig: applyCheckpointingToGraphConfig(\n applyInitialSummaryToGraphConfig(\n this.runConfig.graphConfig,\n sessionState.initialSummary\n ),\n this.checkpointing\n ),\n returnContent: true,\n calibrationRatio: this.calibrationRatio,\n customHandlers: {\n ...(this.runConfig.customHandlers ?? {}),\n ...handlerResult.handlers,\n },\n });\n const content = await run.resume(resumeValue, callerConfig);\n const runMessages = run.getRunMessages() ?? [];\n if (isSessionThread) {\n for (const message of runMessages) {\n await this.store?.appendMessage(message);\n }\n }\n this.calibrationRatio = run.getCalibrationRatio();\n const interrupt = run.getInterrupt();\n const haltedReason = run.getHaltReason();\n if (interrupt) {\n await this.store?.appendRunEvent('run.interrupted', interrupt, {\n runId,\n threadId,\n });\n } else if (haltedReason != null && haltedReason !== '') {\n await this.store?.appendRunEvent('run.halted', haltedReason, {\n runId,\n threadId,\n });\n } else {\n await this.store?.appendRunEvent('run.completed', undefined, {\n runId,\n threadId,\n });\n }\n await this.recordCheckpoint({\n source: 'resume',\n runId,\n threadId,\n config: callerConfig,\n checkpointId: interrupt?.checkpointId,\n checkpointNs: interrupt?.checkpointNs,\n });\n const contentParts = (content ?? handlerResult.contentParts).filter(\n (part): part is t.MessageContentComplex => part != null\n );\n return {\n text: contentToText(contentParts),\n content: contentParts,\n messages: runMessages,\n usage: handlerResult.usage,\n steps: handlerResult.steps,\n interrupt,\n haltedReason,\n runId,\n threadId,\n };\n } catch (error) {\n await this.store?.appendRunEvent('run.failed', error, {\n runId,\n threadId,\n });\n await this.recordCheckpoint({\n source: 'resume',\n runId,\n threadId,\n config: callerConfig,\n });\n throw error;\n }\n }\n}\n\nexport function createAgentSession(\n config: AgentSessionConfig\n): Promise<AgentSession> {\n return AgentSession.create(config);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AgentSession.mjs","names":["isBaseMessage"],"sources":["../../../src/session/AgentSession.ts"],"sourcesContent":["import { MemorySaver } from '@langchain/langgraph';\nimport { HumanMessage, BaseMessage } from '@langchain/core/messages';\nimport type {\n BaseCheckpointSaver,\n CheckpointTuple,\n} from '@langchain/langgraph';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type {\n AgentSessionConfig,\n AgentSessionCheckpointing,\n AgentSessionCheckpointLookupOptions,\n AgentSessionCheckpointReference,\n AgentSessionInput,\n AgentSessionRunOptions,\n AgentSessionRunResult,\n AgentSessionStream,\n AgentSessionStreamEvent,\n SessionBranchOptions,\n SessionCheckpointEntry,\n SessionCompactOptions,\n SessionEntry,\n SessionForkOptions,\n} from './types';\nimport type { HookRegistry } from '@/hooks';\nimport type * as t from '@/types';\nimport { deserializeMessage } from './messageSerialization';\nimport { createSummarizeNode } from '@/summarization/node';\nimport { resolveStreamLimits } from '@/llm/streamLimits';\nimport { JsonlSessionStore } from './JsonlSessionStore';\nimport { AgentContext } from '@/agents/AgentContext';\nimport { ContentTypes, GraphEvents } from '@/common';\nimport { createRunId, createSessionId } from './ids';\nimport { createRunHandlers } from './handlers';\nimport { Run } from '@/run';\n\nfunction isBaseMessage(value: unknown): value is BaseMessage {\n return (\n value instanceof BaseMessage ||\n (value != null &&\n typeof value === 'object' &&\n '_getType' in value &&\n typeof (value as { _getType?: unknown })._getType === 'function')\n );\n}\n\ninterface NormalizedSessionInput {\n messages: BaseMessage[];\n state: t.IState;\n}\n\nfunction normalizeInput(input: AgentSessionInput): NormalizedSessionInput {\n if (typeof input === 'string') {\n const messages = [new HumanMessage(input)];\n return { messages, state: { messages } };\n }\n if (Array.isArray(input)) {\n return { messages: input, state: { messages: input } };\n }\n if (isBaseMessage(input)) {\n const messages = [input];\n return { messages, state: { messages } };\n }\n return { messages: input.messages, state: input };\n}\n\nfunction contentToText(\n content: Array<t.MessageContentComplex | undefined>\n): string {\n const chunks: string[] = [];\n for (const part of content) {\n if (!part) {\n continue;\n }\n if (part.type === ContentTypes.TEXT && typeof part.text === 'string') {\n chunks.push(part.text);\n }\n }\n return chunks.join('');\n}\n\nfunction normalizeConfig(config: AgentSessionConfig): {\n runConfig: t.RunConfig;\n cwd: string;\n sessionPath?: string;\n name?: string;\n ephemeral?: boolean;\n checkpointing?: AgentSessionCheckpointing;\n} {\n if ('runConfig' in config) {\n return {\n runConfig: config.runConfig,\n cwd: config.cwd ?? process.cwd(),\n sessionPath: config.sessionPath,\n name: config.name,\n ephemeral: config.ephemeral,\n checkpointing: config.checkpointing,\n };\n }\n const {\n cwd,\n sessionPath,\n name,\n ephemeral,\n checkpointing,\n sessionId: _sessionId,\n ...runConfig\n } = config;\n return {\n runConfig: {\n ...runConfig,\n runId: config.runId ?? createRunId(),\n },\n cwd: cwd ?? process.cwd(),\n sessionPath,\n name,\n ephemeral,\n checkpointing,\n };\n}\n\nfunction isMissingSessionError(error: unknown): boolean {\n if (error == null || typeof error !== 'object') {\n return false;\n }\n const candidate = error as { code?: string; message?: string };\n if (candidate.code === 'ENOENT') {\n return true;\n }\n return candidate.message?.startsWith('Session not found:') === true;\n}\n\nasync function createStore(params: {\n cwd: string;\n sessionPath?: string;\n name?: string;\n sessionId?: string;\n ephemeral?: boolean;\n}): Promise<JsonlSessionStore | undefined> {\n if (params.ephemeral === true) {\n return undefined;\n }\n if (params.sessionPath != null && params.sessionPath !== '') {\n try {\n return await JsonlSessionStore.openPath(params.sessionPath);\n } catch (error) {\n if (!isMissingSessionError(error)) {\n throw error;\n }\n return JsonlSessionStore.create({\n path: params.sessionPath,\n cwd: params.cwd,\n name: params.name,\n sessionId: params.sessionId,\n });\n }\n }\n return JsonlSessionStore.create({\n cwd: params.cwd,\n name: params.name,\n sessionId: params.sessionId,\n });\n}\n\ntype InitialSummary = NonNullable<t.AgentInputs['initialSummary']>;\n\nfunction mergeInitialSummary(\n existing: InitialSummary | undefined,\n sessionSummary: InitialSummary | undefined\n): InitialSummary | undefined {\n if (!existing) {\n return sessionSummary;\n }\n if (!sessionSummary) {\n return existing;\n }\n if (existing.text === sessionSummary.text) {\n return existing;\n }\n return {\n text: `${existing.text}\\n\\n${sessionSummary.text}`,\n tokenCount: existing.tokenCount + sessionSummary.tokenCount,\n };\n}\n\nfunction applyInitialSummaryToAgent(\n agent: t.AgentInputs,\n initialSummary: InitialSummary | undefined\n): t.AgentInputs {\n const merged = mergeInitialSummary(agent.initialSummary, initialSummary);\n return merged ? { ...agent, initialSummary: merged } : agent;\n}\n\nfunction applyInitialSummaryToGraphConfig(\n graphConfig: t.RunConfig['graphConfig'],\n initialSummary: InitialSummary | undefined\n): t.RunConfig['graphConfig'] {\n if (!initialSummary) {\n return graphConfig;\n }\n if ('agents' in graphConfig) {\n return {\n ...graphConfig,\n agents: graphConfig.agents.map((agent) =>\n applyInitialSummaryToAgent(agent, initialSummary)\n ),\n };\n }\n return {\n ...graphConfig,\n initialSummary: mergeInitialSummary(\n graphConfig.initialSummary,\n initialSummary\n ),\n };\n}\n\ninterface SessionCheckpointingState {\n enabled: boolean;\n checkpointer?: BaseCheckpointSaver;\n disableGraphCheckpointer?: boolean;\n}\n\nfunction isCheckpointSaver(value: unknown): value is BaseCheckpointSaver {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const candidate = value as Partial<BaseCheckpointSaver>;\n return (\n typeof candidate.getTuple === 'function' &&\n typeof candidate.list === 'function' &&\n typeof candidate.put === 'function' &&\n typeof candidate.putWrites === 'function' &&\n typeof candidate.deleteThread === 'function'\n );\n}\n\nfunction getGraphCheckpointer(\n graphConfig: t.RunConfig['graphConfig']\n): BaseCheckpointSaver | undefined {\n const checkpointer = graphConfig.compileOptions?.checkpointer;\n return isCheckpointSaver(checkpointer) ? checkpointer : undefined;\n}\n\nfunction createCheckpointingState(\n runConfig: t.RunConfig,\n checkpointing: AgentSessionCheckpointing | undefined\n): SessionCheckpointingState {\n const graphCheckpointer = getGraphCheckpointer(runConfig.graphConfig);\n if (checkpointing === false) {\n return {\n enabled: false,\n disableGraphCheckpointer: true,\n };\n }\n if (typeof checkpointing === 'object') {\n if (checkpointing.enabled === false) {\n return {\n enabled: false,\n disableGraphCheckpointer: true,\n };\n }\n return {\n enabled: true,\n checkpointer:\n checkpointing.checkpointer ?? graphCheckpointer ?? new MemorySaver(),\n };\n }\n if (checkpointing === true || runConfig.humanInTheLoop?.enabled === true) {\n return {\n enabled: true,\n checkpointer: graphCheckpointer ?? new MemorySaver(),\n };\n }\n return {\n enabled: graphCheckpointer != null,\n checkpointer: graphCheckpointer,\n };\n}\n\nfunction removeCheckpointerFromGraphConfig(\n graphConfig: t.RunConfig['graphConfig']\n): t.RunConfig['graphConfig'] {\n if (graphConfig.compileOptions?.checkpointer == null) {\n return graphConfig;\n }\n const { checkpointer: _checkpointer, ...compileOptions } =\n graphConfig.compileOptions;\n return {\n ...graphConfig,\n compileOptions,\n };\n}\n\nfunction applyCheckpointerToGraphConfig(\n graphConfig: t.RunConfig['graphConfig'],\n checkpointer: BaseCheckpointSaver | undefined\n): t.RunConfig['graphConfig'] {\n if (!checkpointer) {\n return graphConfig;\n }\n if (graphConfig.compileOptions?.checkpointer === checkpointer) {\n return graphConfig;\n }\n return {\n ...graphConfig,\n compileOptions: {\n ...(graphConfig.compileOptions ?? {}),\n checkpointer,\n },\n };\n}\n\nfunction applyCheckpointingToGraphConfig(\n graphConfig: t.RunConfig['graphConfig'],\n checkpointing: SessionCheckpointingState\n): t.RunConfig['graphConfig'] {\n if (checkpointing.disableGraphCheckpointer === true) {\n return removeCheckpointerFromGraphConfig(graphConfig);\n }\n return applyCheckpointerToGraphConfig(\n graphConfig,\n checkpointing.checkpointer\n );\n}\n\nfunction getConfigString(\n config: RunnableConfig | undefined,\n key: string\n): string | undefined {\n const configurable = config?.configurable as\n | Partial<Record<string, unknown>>\n | undefined;\n const value = configurable?.[key];\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction getConfigOptionalString(\n config: RunnableConfig | undefined,\n key: string\n): string | undefined {\n const configurable = config?.configurable as\n | Partial<Record<string, unknown>>\n | undefined;\n if (\n configurable == null ||\n !Object.prototype.hasOwnProperty.call(configurable, key)\n ) {\n return undefined;\n }\n const value = configurable[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction createCallerConfig(\n threadId: string,\n options: AgentSessionRunOptions\n): RunnableConfig & { version: 'v1' | 'v2' } {\n return {\n recursionLimit: 50,\n ...(options.config ?? {}),\n configurable: {\n ...(options.config?.configurable ?? {}),\n thread_id: threadId,\n },\n version: options.config?.version ?? 'v2',\n };\n}\n\nfunction createCheckpointLookupConfig(config: RunnableConfig): RunnableConfig {\n const threadId = getConfigString(config, 'thread_id');\n if (threadId == null) {\n return config;\n }\n const checkpointNs = getConfigString(config, 'checkpoint_ns') ?? '';\n const checkpointId = getConfigString(config, 'checkpoint_id');\n return {\n configurable: {\n ...config.configurable,\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n ...(checkpointId != null ? { checkpoint_id: checkpointId } : {}),\n },\n };\n}\n\nfunction applyCheckpointReferenceToConfig<\n TConfig extends RunnableConfig & { version?: 'v1' | 'v2' },\n>(\n config: TConfig,\n checkpoint:\n | {\n checkpointId?: string;\n checkpointNs?: string;\n }\n | undefined,\n options?: { overwrite?: boolean }\n): TConfig {\n if (\n checkpoint?.checkpointId == null ||\n checkpoint.checkpointId === '' ||\n (options?.overwrite !== true &&\n getConfigString(config, 'checkpoint_id') != null)\n ) {\n return config;\n }\n return {\n ...config,\n configurable: {\n ...config.configurable,\n checkpoint_id: checkpoint.checkpointId,\n checkpoint_ns: checkpoint.checkpointNs ?? '',\n },\n };\n}\n\nfunction getStoredCheckpointForConfig(\n store: JsonlSessionStore | undefined,\n threadId: string,\n config: RunnableConfig\n): SessionCheckpointEntry | undefined {\n const requestedCheckpointNs = getConfigOptionalString(\n config,\n 'checkpoint_ns'\n );\n if (requestedCheckpointNs == null) {\n return store?.getLatestCheckpoint(threadId);\n }\n const checkpoints = store?.getCheckpoints(threadId) ?? [];\n for (let i = checkpoints.length - 1; i >= 0; i--) {\n const checkpoint = checkpoints[i];\n if (checkpoint.data.source === 'reset') {\n return undefined;\n }\n if ((checkpoint.data.checkpointNs ?? '') === requestedCheckpointNs) {\n return checkpoint;\n }\n }\n return undefined;\n}\n\nfunction createLatestCheckpointLookupConfig(\n config: RunnableConfig\n): RunnableConfig {\n const lookup = createCheckpointLookupConfig(config);\n const { checkpoint_id: _checkpointId, ...configurable } =\n lookup.configurable ?? {};\n return { configurable };\n}\n\nasync function getLatestCheckpointTuple(\n checkpointer: BaseCheckpointSaver | undefined,\n config: RunnableConfig\n): Promise<CheckpointTuple | undefined> {\n if (!checkpointer) {\n return undefined;\n }\n const lookupConfig = createLatestCheckpointLookupConfig(config);\n const tuple = await checkpointer.getTuple(lookupConfig);\n if (tuple) {\n return tuple;\n }\n for await (const checkpoint of checkpointer.list(lookupConfig, {\n limit: 1,\n })) {\n return checkpoint;\n }\n return undefined;\n}\n\nasync function getSelectedCheckpointTuple(\n checkpointer: BaseCheckpointSaver | undefined,\n config: RunnableConfig\n): Promise<CheckpointTuple | undefined> {\n return checkpointer?.getTuple(createCheckpointLookupConfig(config));\n}\n\nfunction createCheckpointReference(params: {\n threadId: string;\n tuple: CheckpointTuple;\n}): AgentSessionCheckpointReference {\n const checkpointNs =\n getConfigString(params.tuple.config, 'checkpoint_ns') ?? '';\n const parentCheckpointId = getConfigString(\n params.tuple.parentConfig,\n 'checkpoint_id'\n );\n return {\n provider: 'langgraph',\n threadId: params.threadId,\n checkpointId: params.tuple.checkpoint.id,\n checkpointNs,\n ...(parentCheckpointId != null ? { parentCheckpointId } : {}),\n };\n}\n\nfunction createSessionRunState(entries: SessionEntry[]): {\n messages: BaseMessage[];\n initialSummary?: InitialSummary;\n} {\n const messages: BaseMessage[] = [];\n let initialSummary: InitialSummary | undefined;\n for (const entry of entries) {\n if (entry.type === 'summary') {\n initialSummary = {\n text: entry.data.text,\n tokenCount:\n typeof entry.data.tokenCount === 'number' &&\n Number.isFinite(entry.data.tokenCount)\n ? entry.data.tokenCount\n : 0,\n };\n messages.length = 0;\n continue;\n }\n if (entry.type === 'message') {\n messages.push(deserializeMessage(entry.data.message));\n }\n }\n return { messages, initialSummary };\n}\n\nfunction isMessageEntry(\n entry: SessionEntry\n): entry is Extract<SessionEntry, { type: 'message' }> {\n return entry.type === 'message';\n}\n\nfunction getSessionBranchTarget(\n store: JsonlSessionStore,\n entryId: string,\n position: 'before' | 'at'\n): SessionEntry | undefined {\n const entry = store.getEntry(entryId);\n if (!entry) {\n throw new Error(`Entry not found: ${entryId}`);\n }\n if (position === 'at') {\n return entry;\n }\n return entry.parentId == null ? undefined : store.getEntry(entry.parentId);\n}\n\nfunction getAbandonedPathForBranch(\n store: JsonlSessionStore,\n previousLeafId: string | null,\n targetLeafId: string | null\n): SessionEntry[] {\n const previousPath = store.getPath(previousLeafId ?? undefined);\n if (previousPath.length === 0) {\n return [];\n }\n const targetPath = targetLeafId == null ? [] : store.getPath(targetLeafId);\n const maxSharedLength = Math.min(previousPath.length, targetPath.length);\n let sharedLength = 0;\n while (\n sharedLength < maxSharedLength &&\n previousPath[sharedLength].id === targetPath[sharedLength].id\n ) {\n sharedLength++;\n }\n return previousPath.slice(sharedLength);\n}\n\nfunction createAgentInputFromGraphConfig(\n graphConfig: t.RunConfig['graphConfig'],\n initialSummary: InitialSummary | undefined,\n retainRecentTurns: number | undefined,\n instructions: string | undefined\n): t.AgentInputs {\n let agent: t.AgentInputs;\n if ('agents' in graphConfig) {\n if (graphConfig.agents.length === 0) {\n throw new Error('Cannot compact a session with no agents');\n }\n agent = graphConfig.agents[0];\n } else {\n const {\n type: _type,\n llmConfig,\n signal: _signal,\n tools = [],\n ...agentInputs\n } = graphConfig;\n const { provider, ...clientOptions } = llmConfig;\n agent = {\n ...agentInputs,\n tools,\n provider,\n clientOptions,\n agentId: 'default',\n };\n }\n const summarizationConfig: t.SummarizationConfig = {\n ...(agent.summarizationConfig ?? {}),\n ...(instructions != null && instructions !== ''\n ? { prompt: instructions }\n : {}),\n retainRecent: {\n ...(agent.summarizationConfig?.retainRecent ?? {}),\n ...(retainRecentTurns != null ? { turns: retainRecentTurns } : {}),\n },\n };\n return {\n ...applyInitialSummaryToAgent(agent, initialSummary),\n summarizationEnabled: true,\n summarizationConfig,\n };\n}\n\nfunction createManualCompactGraph(params: {\n runId: string;\n customHandlers?: Record<string, t.EventHandler>;\n hooks?: HookRegistry;\n /** Session run-level stream limits, so manual compaction honors them. */\n streamLimits?: t.StreamLimits;\n}): {\n graph: Parameters<typeof createSummarizeNode>[0]['graph'];\n completedSummary?: t.SummaryContentBlock;\n} {\n const contentData: t.RunStep[] = [];\n const contentIndexMap = new Map<string, number>();\n const result: {\n graph: Parameters<typeof createSummarizeNode>[0]['graph'];\n completedSummary?: t.SummaryContentBlock;\n } = {\n graph: {\n contentData,\n contentIndexMap,\n runId: params.runId,\n isMultiAgent: false,\n hookRegistry: params.hooks,\n streamLimits: resolveStreamLimits(params.streamLimits),\n dispatchRunStep: async (runStep): Promise<void> => {\n contentData.push(runStep);\n contentIndexMap.set(runStep.id, runStep.index);\n await params.customHandlers?.[GraphEvents.ON_RUN_STEP]?.handle(\n GraphEvents.ON_RUN_STEP,\n runStep\n );\n },\n dispatchRunStepCompleted: async (stepId, completed): Promise<void> => {\n const runStep = contentData.find((step) => step.id === stepId);\n const resultWithStep = {\n ...completed,\n id: stepId,\n index: runStep?.index ?? 0,\n };\n if (completed.type === 'summary') {\n result.completedSummary = completed.summary;\n }\n await params.customHandlers?.[\n GraphEvents.ON_RUN_STEP_COMPLETED\n ]?.handle(GraphEvents.ON_RUN_STEP_COMPLETED, {\n result: resultWithStep,\n } as unknown as Parameters<t.EventHandler['handle']>[1]);\n },\n },\n };\n return result;\n}\n\nfunction getSummaryText(summary: t.SummaryContentBlock | undefined): string {\n const firstBlock = summary?.content?.[0];\n return firstBlock != null &&\n typeof firstBlock === 'object' &&\n 'text' in firstBlock &&\n typeof firstBlock.text === 'string'\n ? firstBlock.text\n : '';\n}\n\nfunction getSummaryTokenCount(\n summary: t.SummaryContentBlock | undefined\n): number {\n return typeof summary?.tokenCount === 'number' &&\n Number.isFinite(summary.tokenCount)\n ? summary.tokenCount\n : 0;\n}\n\nfunction filterRemoveMessages(messages: BaseMessage[]): BaseMessage[] {\n return messages.filter((message) => message._getType() !== 'remove');\n}\n\nclass LiveAgentSessionStream implements AgentSessionStream {\n private resultPromise: Promise<AgentSessionRunResult> | undefined;\n private readonly events: AgentSessionStreamEvent[] = [];\n private readonly waiters: Array<{\n resolve: (result: IteratorResult<AgentSessionStreamEvent>) => void;\n reject: (error: unknown) => void;\n }> = [];\n private closed = false;\n private failed = false;\n private error: unknown;\n\n setResultPromise(resultPromise: Promise<AgentSessionRunResult>): void {\n this.resultPromise = resultPromise;\n }\n\n push(event: AgentSessionStreamEvent): void {\n if (this.closed) {\n return;\n }\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter.resolve({ value: event, done: false });\n return;\n }\n this.events.push(event);\n }\n\n complete(): void {\n this.closed = true;\n for (const waiter of this.waiters.splice(0)) {\n waiter.resolve({\n value: undefined as unknown as AgentSessionStreamEvent,\n done: true,\n });\n }\n }\n\n fail(error: unknown): void {\n this.error = error;\n this.failed = true;\n this.closed = true;\n for (const waiter of this.waiters.splice(0)) {\n waiter.reject(error);\n }\n }\n\n private nextEvent(): Promise<IteratorResult<AgentSessionStreamEvent>> {\n const event = this.events.shift();\n if (event !== undefined) {\n return Promise.resolve({ value: event, done: false });\n }\n if (this.failed) {\n return Promise.reject(this.error);\n }\n if (this.closed) {\n return Promise.resolve({\n value: undefined as unknown as AgentSessionStreamEvent,\n done: true,\n });\n }\n return new Promise((resolve, reject) => {\n this.waiters.push({ resolve, reject });\n });\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<AgentSessionStreamEvent> {\n for (;;) {\n const next = await this.nextEvent();\n if (next.done === true) {\n return;\n }\n yield next.value;\n }\n }\n\n async *toTextStream(): AsyncIterable<string> {\n for await (const event of this) {\n if (event.type !== 'message.delta' || event.data == null) {\n continue;\n }\n const data = event.data;\n if (typeof data === 'object' && !Array.isArray(data)) {\n const delta = data.delta;\n if (\n delta != null &&\n typeof delta === 'object' &&\n !Array.isArray(delta)\n ) {\n const content = delta.content;\n if (Array.isArray(content)) {\n for (const part of content) {\n if (\n part != null &&\n typeof part === 'object' &&\n !Array.isArray(part) &&\n typeof part.text === 'string'\n ) {\n yield part.text;\n }\n }\n }\n }\n }\n }\n }\n\n finalResult(): Promise<AgentSessionRunResult> {\n if (!this.resultPromise) {\n return Promise.reject(new Error('Session stream has not started'));\n }\n return this.resultPromise;\n }\n}\n\nexport class AgentSession {\n private runConfig: t.RunConfig;\n private store: JsonlSessionStore | undefined;\n private calibrationRatio: number | undefined;\n private checkpointing: SessionCheckpointingState;\n cwd: string;\n threadId: string;\n\n private constructor(params: {\n runConfig: t.RunConfig;\n cwd: string;\n threadId: string;\n checkpointing: SessionCheckpointingState;\n store?: JsonlSessionStore;\n }) {\n this.runConfig = params.runConfig;\n this.cwd = params.cwd;\n this.threadId = params.threadId;\n this.store = params.store;\n this.checkpointing = params.checkpointing;\n }\n\n static async create(config: AgentSessionConfig): Promise<AgentSession> {\n const normalized = normalizeConfig(config);\n const explicitSessionId =\n 'sessionId' in config && typeof config.sessionId === 'string'\n ? config.sessionId\n : undefined;\n const store = await createStore({\n cwd: normalized.cwd,\n sessionPath: normalized.sessionPath,\n name: normalized.name,\n sessionId: explicitSessionId,\n ephemeral: normalized.ephemeral,\n });\n return new AgentSession({\n runConfig: normalized.runConfig,\n cwd: normalized.cwd,\n threadId: store?.header.id ?? explicitSessionId ?? createSessionId(),\n checkpointing: createCheckpointingState(\n normalized.runConfig,\n normalized.checkpointing\n ),\n store,\n });\n }\n\n get sessionPath(): string | undefined {\n return this.store?.path;\n }\n\n getSessionStore(): JsonlSessionStore | undefined {\n return this.store;\n }\n\n getCheckpointer(): BaseCheckpointSaver | undefined {\n return this.checkpointing.checkpointer;\n }\n\n async getLatestCheckpoint(\n options: AgentSessionCheckpointLookupOptions = {}\n ): Promise<AgentSessionCheckpointReference | undefined> {\n const threadId = options.threadId ?? this.threadId;\n const baseConfig = options.config ?? {};\n const config = createCheckpointLookupConfig({\n ...baseConfig,\n configurable: {\n ...(baseConfig.configurable ?? {}),\n thread_id: threadId,\n ...(options.checkpointNs != null\n ? { checkpoint_ns: options.checkpointNs }\n : {}),\n },\n });\n const tuple = await getLatestCheckpointTuple(\n this.checkpointing.checkpointer,\n config\n );\n return tuple ? createCheckpointReference({ threadId, tuple }) : undefined;\n }\n\n private async hasCheckpointState(config: RunnableConfig): Promise<boolean> {\n if (!this.checkpointing.enabled) {\n return false;\n }\n const tuple = await getSelectedCheckpointTuple(\n this.checkpointing.checkpointer,\n config\n );\n return tuple != null;\n }\n\n private async recordCheckpoint(params: {\n source: 'run' | 'resume';\n runId: string;\n threadId: string;\n config: RunnableConfig;\n checkpointId?: string;\n checkpointNs?: string;\n }): Promise<void> {\n if (!this.checkpointing.enabled) {\n return;\n }\n const checkpointConfig = applyCheckpointReferenceToConfig(\n params.config,\n {\n checkpointId: params.checkpointId,\n checkpointNs: params.checkpointNs,\n },\n { overwrite: true }\n );\n const tuple =\n params.checkpointId != null && params.checkpointId !== ''\n ? await getSelectedCheckpointTuple(\n this.checkpointing.checkpointer,\n checkpointConfig\n )\n : await getLatestCheckpointTuple(\n this.checkpointing.checkpointer,\n params.config\n );\n if (!tuple) {\n return;\n }\n const reference = createCheckpointReference({\n threadId: params.threadId,\n tuple,\n });\n await this.store?.appendCheckpoint({\n source: params.source,\n runId: params.runId,\n threadId: params.threadId,\n checkpointId: reference.checkpointId,\n checkpointNs: reference.checkpointNs,\n parentCheckpointId: reference.parentCheckpointId,\n });\n }\n\n private getCheckpointThreadIds(): string[] {\n const threadIds = new Set<string>([this.threadId]);\n for (const checkpoint of this.store?.getCheckpoints() ?? []) {\n threadIds.add(checkpoint.data.threadId);\n }\n return [...threadIds];\n }\n\n private async resetCheckpointThreads(reason: string): Promise<void> {\n const checkpointer = this.checkpointing.checkpointer;\n if (!this.checkpointing.enabled || checkpointer == null) {\n return;\n }\n for (const threadId of this.getCheckpointThreadIds()) {\n await checkpointer.deleteThread(threadId);\n await this.store?.appendCheckpoint({\n source: 'reset',\n threadId,\n reason,\n });\n }\n }\n\n private async runInternal(\n input: AgentSessionInput,\n options: AgentSessionRunOptions = {},\n onEvent?: (event: AgentSessionStreamEvent) => void\n ): Promise<AgentSessionRunResult> {\n const runId = options.runId ?? createRunId();\n const threadId = options.threadId ?? this.threadId;\n const isSessionThread = threadId === this.threadId;\n const normalizedInput = normalizeInput(input);\n const inputMessages = normalizedInput.messages;\n const callerConfig = createCallerConfig(threadId, options);\n const useCheckpointState = await this.hasCheckpointState(callerConfig);\n let parentId = this.store?.getLeafEntry()?.id ?? null;\n if (isSessionThread) {\n for (const message of inputMessages) {\n const entry = await this.store?.appendMessage(message, parentId);\n parentId = entry?.id ?? parentId;\n }\n }\n await this.store?.appendRunEvent('run.started', undefined, {\n runId,\n threadId,\n });\n\n const handlerResult = createRunHandlers({\n runId,\n threadId,\n userHandlers: this.runConfig.customHandlers,\n onEvent,\n });\n const emitTerminalEvent = (\n event: Omit<\n AgentSessionStreamEvent,\n 'sequence' | 'runId' | 'threadId' | 'timestamp'\n >\n ): void => {\n const streamEvent: AgentSessionStreamEvent = {\n ...event,\n sequence: handlerResult.events.length,\n runId,\n threadId,\n timestamp: new Date().toISOString(),\n };\n handlerResult.events.push(streamEvent);\n onEvent?.(streamEvent);\n };\n const sessionState = createSessionRunState(\n isSessionThread ? (this.store?.getPath() ?? []) : []\n );\n try {\n const runConfig: t.RunConfig = {\n ...this.runConfig,\n runId,\n graphConfig: applyCheckpointingToGraphConfig(\n applyInitialSummaryToGraphConfig(\n this.runConfig.graphConfig,\n sessionState.initialSummary\n ),\n this.checkpointing\n ),\n returnContent: true,\n calibrationRatio: this.calibrationRatio,\n customHandlers: {\n ...(this.runConfig.customHandlers ?? {}),\n ...handlerResult.handlers,\n },\n };\n const run = await Run.create<t.IState>(runConfig);\n let messages = inputMessages;\n if (!useCheckpointState && sessionState.messages.length > 0) {\n messages = sessionState.messages;\n }\n const content = await run.processStream(\n { ...normalizedInput.state, messages },\n callerConfig,\n options.streamOptions\n );\n const runMessages = run.getRunMessages() ?? [];\n if (isSessionThread) {\n for (const message of runMessages) {\n await this.store?.appendMessage(message);\n }\n }\n this.calibrationRatio = run.getCalibrationRatio();\n const interrupt = run.getInterrupt();\n const haltedReason = run.getHaltReason();\n if (interrupt) {\n emitTerminalEvent({ type: 'run.interrupted' });\n await this.store?.appendRunEvent('run.interrupted', interrupt, {\n runId,\n threadId,\n });\n } else if (haltedReason != null && haltedReason !== '') {\n emitTerminalEvent({ type: 'run.halted', data: haltedReason });\n await this.store?.appendRunEvent('run.halted', haltedReason, {\n runId,\n threadId,\n });\n } else {\n emitTerminalEvent({ type: 'run.completed' });\n await this.store?.appendRunEvent('run.completed', undefined, {\n runId,\n threadId,\n });\n }\n await this.recordCheckpoint({\n source: 'run',\n runId,\n threadId,\n config: callerConfig,\n checkpointId: interrupt?.checkpointId,\n checkpointNs: interrupt?.checkpointNs,\n });\n const contentParts = (content ?? handlerResult.contentParts).filter(\n (part): part is t.MessageContentComplex => part != null\n );\n return {\n text: contentToText(contentParts),\n content: contentParts,\n messages: runMessages,\n usage: handlerResult.usage,\n steps: handlerResult.steps,\n interrupt,\n haltedReason,\n runId,\n threadId,\n };\n } catch (error) {\n emitTerminalEvent({\n type: 'run.failed',\n data: error instanceof Error ? error.message : String(error),\n });\n await this.store?.appendRunEvent('run.failed', error, {\n runId,\n threadId,\n });\n await this.recordCheckpoint({\n source: 'run',\n runId,\n threadId,\n config: callerConfig,\n });\n throw error;\n }\n }\n\n async run(\n input: AgentSessionInput,\n options: AgentSessionRunOptions = {}\n ): Promise<AgentSessionRunResult> {\n return this.runInternal(input, options);\n }\n\n stream(\n input: AgentSessionInput,\n options: AgentSessionRunOptions = {}\n ): AgentSessionStream {\n const stream = new LiveAgentSessionStream();\n const resultPromise = this.runInternal(input, options, (event) => {\n stream.push(event);\n }).then(\n (result) => {\n stream.complete();\n return result;\n },\n (error: unknown) => {\n stream.fail(error);\n throw error;\n }\n );\n stream.setResultPromise(resultPromise);\n return stream;\n }\n\n async resumeSession(pathOrId?: string): Promise<AgentSession> {\n if (pathOrId == null || pathOrId === '') {\n const sessions = await JsonlSessionStore.list(this.cwd);\n if (sessions.length === 0) {\n throw new Error(`No sessions found for ${this.cwd}`);\n }\n this.store = await JsonlSessionStore.open(sessions[0].path);\n this.cwd = this.store.header.cwd;\n this.threadId = this.store.header.id;\n return this;\n }\n this.store = await JsonlSessionStore.open(pathOrId);\n this.cwd = this.store.header.cwd;\n this.threadId = this.store.header.id;\n return this;\n }\n\n async clone(options: SessionForkOptions = {}): Promise<AgentSession> {\n if (!this.store) {\n throw new Error('Cannot clone an ephemeral session');\n }\n const store = await this.store.clone(options);\n return new AgentSession({\n runConfig: this.runConfig,\n cwd: store.header.cwd,\n threadId: store.header.id,\n checkpointing: this.checkpointing,\n store,\n });\n }\n\n async fork(\n entryId: string,\n options: SessionForkOptions = {}\n ): Promise<AgentSession> {\n if (!this.store) {\n throw new Error('Cannot fork an ephemeral session');\n }\n const store = await this.store.fork(entryId, options);\n return new AgentSession({\n runConfig: this.runConfig,\n cwd: store.header.cwd,\n threadId: store.header.id,\n checkpointing: this.checkpointing,\n store,\n });\n }\n\n async branch(\n entryId: string,\n options: SessionBranchOptions = {}\n ): Promise<void> {\n const store = this.store;\n if (!store) {\n throw new Error('Cannot branch an ephemeral session');\n }\n const target = getSessionBranchTarget(\n store,\n entryId,\n options.position ?? 'at'\n );\n const previousLeafId = store.getLeafEntry()?.id ?? null;\n let leafId = target?.id ?? null;\n const summarizeAbandoned = options.summarizeAbandoned;\n if (summarizeAbandoned !== undefined && summarizeAbandoned !== false) {\n const instructions =\n typeof summarizeAbandoned === 'object'\n ? summarizeAbandoned.instructions\n : undefined;\n const abandonedPath = getAbandonedPathForBranch(\n store,\n previousLeafId,\n leafId\n );\n const summary = await this.compactActivePath(\n { instructions, retainRecentTurns: 0 },\n leafId,\n abandonedPath\n );\n leafId = summary?.id ?? leafId;\n }\n if (leafId === previousLeafId) {\n return;\n }\n await store.setLeaf(leafId);\n await this.resetCheckpointThreads('branch');\n }\n\n async compact(options: SessionCompactOptions = {}): Promise<void> {\n const summary = await this.compactActivePath(options, null);\n if (summary) {\n await this.resetCheckpointThreads('compact');\n }\n }\n\n private async compactActivePath(\n options: SessionCompactOptions = {},\n parentId: string | null,\n path?: SessionEntry[]\n ): Promise<Extract<SessionEntry, { type: 'summary' }> | undefined> {\n const store = this.store;\n if (!store) {\n throw new Error('Cannot compact an ephemeral session');\n }\n const activePath = path ?? store.getPath();\n const sessionState = createSessionRunState(activePath);\n const messageEntries = activePath.filter(isMessageEntry);\n if (sessionState.messages.length === 0) {\n return undefined;\n }\n const compactRunId = createRunId();\n const agentContext = AgentContext.fromConfig(\n createAgentInputFromGraphConfig(\n this.runConfig.graphConfig,\n sessionState.initialSummary,\n options.retainRecentTurns,\n options.instructions\n ),\n this.runConfig.tokenCounter\n );\n const graph = createManualCompactGraph({\n runId: compactRunId,\n customHandlers: this.runConfig.customHandlers,\n hooks: this.runConfig.hooks,\n streamLimits: this.runConfig.streamLimits,\n });\n const summarizeNode = createSummarizeNode({\n agentContext,\n graph: graph.graph,\n generateStepId: (stepKey): [string, number] => [\n `${stepKey}-${compactRunId}`,\n graph.graph.contentData.length,\n ],\n });\n const summarizedState = await summarizeNode(\n {\n messages: sessionState.messages,\n summarizationRequest: {\n remainingContextTokens: agentContext.maxContextTokens ?? 0,\n agentId: agentContext.agentId,\n },\n },\n {\n configurable: { thread_id: this.threadId },\n metadata: { run_id: compactRunId },\n }\n );\n const completedSummaryText = getSummaryText(graph.completedSummary);\n const contextSummaryText = agentContext.getSummaryText();\n let summaryText = completedSummaryText;\n if (summaryText === '' && contextSummaryText != null) {\n summaryText = contextSummaryText;\n }\n if (summaryText === '') {\n return undefined;\n }\n const retainedMessages = filterRemoveMessages(\n summarizedState.messages ?? []\n );\n let retainedEntryIds: string[] = [];\n if (retainedMessages.length > 0) {\n retainedEntryIds = messageEntries\n .slice(-retainedMessages.length)\n .map((entry) => entry.id);\n }\n const retainedEntryIdSet = new Set(retainedEntryIds);\n const summarized = messageEntries.filter(\n (entry) => !retainedEntryIdSet.has(entry.id)\n );\n const summary = await store.appendEntryForCompaction({\n text: summaryText,\n tokenCount: getSummaryTokenCount(graph.completedSummary),\n retainedEntryIds,\n summarizedEntryIds: summarized.map((entry) => entry.id),\n instructions: options.instructions,\n parentId,\n });\n let retainedParentId: string | null = summary.id;\n for (const message of retainedMessages) {\n const retainedMessage = await store.appendMessage(\n message,\n retainedParentId\n );\n retainedParentId = retainedMessage.id;\n }\n await store.appendCompactionEntry({\n summaryEntryId: summary.id,\n retainedEntryIds,\n summarizedEntryIds: summarized.map((entry) => entry.id),\n });\n return summary;\n }\n\n async resumeInterrupt<TResume>(\n resumeValue: TResume,\n options: AgentSessionRunOptions = {}\n ): Promise<AgentSessionRunResult> {\n const runId = options.runId ?? createRunId();\n const threadId = options.threadId ?? this.threadId;\n const isSessionThread = threadId === this.threadId;\n const baseCallerConfig = createCallerConfig(threadId, options);\n const callerConfig = applyCheckpointReferenceToConfig(\n baseCallerConfig,\n getStoredCheckpointForConfig(this.store, threadId, baseCallerConfig)?.data\n );\n await this.store?.appendRunEvent('run.started', undefined, {\n runId,\n threadId,\n });\n const handlerResult = createRunHandlers({\n runId,\n threadId,\n userHandlers: this.runConfig.customHandlers,\n });\n const sessionState = createSessionRunState(\n isSessionThread ? (this.store?.getPath() ?? []) : []\n );\n try {\n const run = await Run.create<t.IState>({\n ...this.runConfig,\n runId,\n graphConfig: applyCheckpointingToGraphConfig(\n applyInitialSummaryToGraphConfig(\n this.runConfig.graphConfig,\n sessionState.initialSummary\n ),\n this.checkpointing\n ),\n returnContent: true,\n calibrationRatio: this.calibrationRatio,\n customHandlers: {\n ...(this.runConfig.customHandlers ?? {}),\n ...handlerResult.handlers,\n },\n });\n const content = await run.resume(resumeValue, callerConfig);\n const runMessages = run.getRunMessages() ?? [];\n if (isSessionThread) {\n for (const message of runMessages) {\n await this.store?.appendMessage(message);\n }\n }\n this.calibrationRatio = run.getCalibrationRatio();\n const interrupt = run.getInterrupt();\n const haltedReason = run.getHaltReason();\n if (interrupt) {\n await this.store?.appendRunEvent('run.interrupted', interrupt, {\n runId,\n threadId,\n });\n } else if (haltedReason != null && haltedReason !== '') {\n await this.store?.appendRunEvent('run.halted', haltedReason, {\n runId,\n threadId,\n });\n } else {\n await this.store?.appendRunEvent('run.completed', undefined, {\n runId,\n threadId,\n });\n }\n await this.recordCheckpoint({\n source: 'resume',\n runId,\n threadId,\n config: callerConfig,\n checkpointId: interrupt?.checkpointId,\n checkpointNs: interrupt?.checkpointNs,\n });\n const contentParts = (content ?? handlerResult.contentParts).filter(\n (part): part is t.MessageContentComplex => part != null\n );\n return {\n text: contentToText(contentParts),\n content: contentParts,\n messages: runMessages,\n usage: handlerResult.usage,\n steps: handlerResult.steps,\n interrupt,\n haltedReason,\n runId,\n threadId,\n };\n } catch (error) {\n await this.store?.appendRunEvent('run.failed', error, {\n runId,\n threadId,\n });\n await this.recordCheckpoint({\n source: 'resume',\n runId,\n threadId,\n config: callerConfig,\n });\n throw error;\n }\n }\n}\n\nexport function createAgentSession(\n config: AgentSessionConfig\n): Promise<AgentSession> {\n return AgentSession.create(config);\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { composeAbortSignals } from "./utils/misc.mjs";
1
2
  import { CODE_EXECUTION_TOOLS, LOCAL_CODING_BUNDLE_NAMES } from "./common/enum.mjs";
2
3
  import "./common/index.mjs";
3
4
  import { calculateMaxToolResultChars, truncateToolResultContent } from "./utils/truncation.mjs";
@@ -8,6 +9,7 @@ import "./messages/index.mjs";
8
9
  import { getStreamedToolCallAdapter, getStreamedToolCallSeal, streamedToolCallAdapterAllowsSequentialSeal } from "./tools/streamedToolCallSeals.mjs";
9
10
  import { buildToolExecutionRequestPlan, coerceRecordArgs, normalizeError } from "./tools/eagerEventExecution.mjs";
10
11
  import { handleServerToolResult, handleToolCallChunks, handleToolCalls } from "./tools/handlers.mjs";
12
+ import { STREAM_LIMIT_EPOCH_KEY, StreamLimitExceededError, claimStreamLimitCharge, combineCompleteToolCalls, enforceCompleteToolCallArgLimit, enforceStreamDeltaEventLimit, enforceStreamedToolCallArgLimit, requiresStreamLimitAccounting } from "./llm/streamLimits.mjs";
11
13
  import { outcomeFieldsFromResult, resolveToolOutcome } from "./tools/intentArg.mjs";
12
14
  import { TOOL_OUTPUT_REF_PATTERN } from "./tools/toolOutputReferences.mjs";
13
15
  import { isGoogleLike } from "./utils/llm.mjs";
@@ -316,6 +318,7 @@ function startEagerToolExecutions(args) {
316
318
  agentId: agentContext?.agentId,
317
319
  configurable: graph.config?.configurable,
318
320
  metadata,
321
+ signal: composeAbortSignals(graph.config?.signal, graph.breakerAbort.signal),
319
322
  resolve: (results) => {
320
323
  resultSettled = true;
321
324
  settledResults = results;
@@ -439,7 +442,7 @@ function recordEagerToolCallChunks(args) {
439
442
  const incomingArgs = toolCallChunk.args ?? "";
440
443
  const argsText = incomingArgs !== "" && incomingArgs.length > 1 && incomingArgs === existing.lastArgsFragment ? existing.argsText : mergeToolCallArgsText(existing.argsText, incomingArgs);
441
444
  const index = getEagerToolChunkIndex(toolCallChunk) ?? existing.index;
442
- const sealCoversChunk = seal != null && (seal.kind === "all" || seal.kind === "single" && (seal.id != null && seal.id === id || seal.index != null && seal.index === index));
445
+ const sealCoversChunk = seal != null && (seal.kind === "all" || seal.id != null && seal.id === id || seal.index != null && seal.index === index);
443
446
  const next = {
444
447
  id,
445
448
  name,
@@ -608,8 +611,90 @@ var ChatModelStreamHandler = class {
608
611
  console.warn(`No chunk found in ${event} event`);
609
612
  return;
610
613
  }
611
- const agentContext = graph.getAgentContext(metadata);
612
614
  const chunk = data.chunk;
615
+ /** Attempts stamp their breaker epoch into event metadata; a mismatch
616
+ * marks a straggling chunk from a failed run that outlived
617
+ * `resetValues()`. Dropped OUTRIGHT: content handling and the eager
618
+ * paths below compose the LIVE controller, so acting on a dead run's
619
+ * chunk could dispatch host tools into the run now using it. Events
620
+ * without a stamp (direct handler callers, partial stubs) keep the
621
+ * live-controller behavior. */
622
+ const eventEpoch = metadata?.[STREAM_LIMIT_EPOCH_KEY];
623
+ /** Runtime-honest widening: partial handler stubs carry neither an
624
+ * epoch nor a run scope despite the field types. */
625
+ const liveEpoch = graph.breakerEpoch;
626
+ if (eventEpoch != null && liveEpoch != null && eventEpoch !== liveEpoch) return;
627
+ const eventBreaker = graph.breakerAbort instanceof AbortController ? graph.breakerAbort : void 0;
628
+ /** Immutable scope captured at handler entry. A reset while this
629
+ * handler is suspended in an await replaces the object, so ONE
630
+ * reference comparison proves the event still belongs to the live run
631
+ * before anything composes `graph.breakerAbort` or `graph.config`. */
632
+ const entryRunScope = graph.runScope;
633
+ const runScopeInvalidated = () => entryRunScope != null && graph.runScope !== entryRunScope;
634
+ const throwIfRunBreakerTripped = () => {
635
+ if (eventBreaker != null && eventBreaker.signal.aborted && eventBreaker.signal.reason instanceof StreamLimitExceededError) throw eventBreaker.signal.reason;
636
+ };
637
+ /**
638
+ * Enforced before every content-specific early return below
639
+ * (server-tool results, deferred mixed reasoning, late OpenRouter
640
+ * reasoning): a looping provider can flood through any of those paths,
641
+ * a coalesced event can carry client `tool_call_chunks` alongside a
642
+ * server-tool result, and the complete-call dispatch branch further
643
+ * down can prestart a side-effecting tool from an arrival-sealed
644
+ * oversized call. Charging is claim-based: the producer loop and this
645
+ * decoupled echo can observe the same chunk object in either order, and
646
+ * only the first claimer charges it. The argument guard is
647
+ * deliberately NOT gated on numeric chunk indices, so id-only or
648
+ * index-less runaway streams stay bounded, and complete parsed
649
+ * `tool_calls` without a raw chunk representation are judged standalone.
650
+ */
651
+ if (requiresStreamLimitAccounting(graph, chunk) && claimStreamLimitCharge(graph, data.chunk, "consumer", metadata)) try {
652
+ enforceStreamDeltaEventLimit({
653
+ graph,
654
+ metadata
655
+ });
656
+ /** Combined first so raw-chunk name correlation sees invalid calls
657
+ * too; an unnamed raw chunk twinned with a named invalid call must
658
+ * select that tool's override, not the global cap. */
659
+ const completeCalls = combineCompleteToolCalls(chunk);
660
+ if (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) enforceStreamedToolCallArgLimit({
661
+ graph,
662
+ metadata,
663
+ toolCallChunks: chunk.tool_call_chunks,
664
+ responseMetadata: chunk.response_metadata,
665
+ parsedToolCalls: completeCalls
666
+ });
667
+ /** Judged whenever parsed calls are present, not only when raw
668
+ * chunks are absent — an adapter can pair an empty or partial raw
669
+ * chunk with a complete parsed call; the standalone check is
670
+ * stateless, so the common both-present case is not double-tallied.
671
+ * Invalid calls are included because ToolNode processes and
672
+ * promotes them. */
673
+ if (completeCalls != null) enforceCompleteToolCallArgLimit({
674
+ graph,
675
+ metadata,
676
+ toolCalls: completeCalls
677
+ });
678
+ } catch (error) {
679
+ /** A breach detected on this consumer path must still stop parallel
680
+ * fan-out work: the producer skips its own enforcement once this
681
+ * side has claimed the emission, so createCallModel's breaker-abort
682
+ * never fires for it. Trip the EVENT's run-bound breaker before the
683
+ * throw rejects the run — never the live controller of a newer run. */
684
+ if (error instanceof StreamLimitExceededError && eventBreaker != null) eventBreaker.abort(error);
685
+ throw error;
686
+ }
687
+ /** A parallel producer can trip the shared breaker while this event was
688
+ * already queued in `streamEvents`. Stop before content handling or the
689
+ * eager-tool paths below — those can dispatch a side-effecting host
690
+ * tool with an already-aborted signal the handler never inspects.
691
+ * Rechecked again immediately before each eager dispatch: the awaits in
692
+ * between (server-tool results, tool-call handling, content dispatch)
693
+ * are windows for a sibling's trip — or for a full reset, after which
694
+ * this event belongs to a dead run and is dropped. */
695
+ if (runScopeInvalidated()) return;
696
+ throwIfRunBreakerTripped();
697
+ const agentContext = graph.getAgentContext(metadata);
613
698
  const content = getChunkContent({
614
699
  chunk,
615
700
  reasoningKey: agentContext.reasoningKey,
@@ -647,6 +732,8 @@ var ChatModelStreamHandler = class {
647
732
  if (chunk.tool_calls && chunk.tool_calls.length > 0 && chunk.tool_calls.every((tc) => tc.id != null && tc.id !== "" && tc.name != null && tc.name !== "")) {
648
733
  hasToolCalls = true;
649
734
  await handleToolCalls(chunk.tool_calls, metadata, graph);
735
+ if (runScopeInvalidated()) return;
736
+ throwIfRunBreakerTripped();
650
737
  if (hasFinalToolCallSignal(chunk)) {
651
738
  startEagerToolExecutions({
652
739
  graph,
@@ -699,16 +786,20 @@ var ChatModelStreamHandler = class {
699
786
  toolCallChunks: chunk.tool_call_chunks,
700
787
  metadata
701
788
  });
702
- if (canStreamEager) startReadyStreamedEagerToolExecutions({
703
- graph,
704
- metadata,
705
- agentContext,
706
- stepKey,
707
- toolCallChunks: chunk.tool_call_chunks,
708
- seal: streamedToolCallSeal,
709
- allowSequentialSeal,
710
- sealAll: hasFinalToolCallSignal(chunk)
711
- });
789
+ if (canStreamEager) {
790
+ if (runScopeInvalidated()) return;
791
+ throwIfRunBreakerTripped();
792
+ startReadyStreamedEagerToolExecutions({
793
+ graph,
794
+ metadata,
795
+ agentContext,
796
+ stepKey,
797
+ toolCallChunks: chunk.tool_call_chunks,
798
+ seal: streamedToolCallSeal,
799
+ allowSequentialSeal,
800
+ sealAll: hasFinalToolCallSignal(chunk)
801
+ });
802
+ }
712
803
  }
713
804
  if (isEmptyContent) return;
714
805
  if (hasGoogleServerSideToolContent) return;