@librechat/agents 3.4.4 → 3.4.6

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 (107) hide show
  1. package/dist/cjs/common/enum.cjs +2 -0
  2. package/dist/cjs/common/enum.cjs.map +1 -1
  3. package/dist/cjs/graphs/Graph.cjs +268 -14
  4. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  5. package/dist/cjs/hitl/askUserQuestions.cjs +66 -0
  6. package/dist/cjs/hitl/askUserQuestions.cjs.map +1 -0
  7. package/dist/cjs/hitl/askUserQuestionsInterrupt.cjs +46 -0
  8. package/dist/cjs/hitl/askUserQuestionsInterrupt.cjs.map +1 -0
  9. package/dist/cjs/hitl/index.cjs +2 -0
  10. package/dist/cjs/langfuseTraceShaping.cjs +9 -6
  11. package/dist/cjs/langfuseTraceShaping.cjs.map +1 -1
  12. package/dist/cjs/main.cjs +6 -0
  13. package/dist/cjs/run.cjs +147 -14
  14. package/dist/cjs/run.cjs.map +1 -1
  15. package/dist/cjs/session/AgentSession.cjs +93 -31
  16. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  17. package/dist/cjs/session/handlers.cjs +10 -0
  18. package/dist/cjs/session/handlers.cjs.map +1 -1
  19. package/dist/cjs/stream.cjs +17 -3
  20. package/dist/cjs/stream.cjs.map +1 -1
  21. package/dist/cjs/summarization/node.cjs +1 -0
  22. package/dist/cjs/summarization/node.cjs.map +1 -1
  23. package/dist/cjs/tools/ToolNode.cjs +4 -2
  24. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  25. package/dist/cjs/tools/handlers.cjs +1 -0
  26. package/dist/cjs/tools/handlers.cjs.map +1 -1
  27. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +28 -0
  28. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  29. package/dist/cjs/types/hitl.cjs +13 -0
  30. package/dist/cjs/types/hitl.cjs.map +1 -0
  31. package/dist/cjs/utils/handlers.cjs +3 -0
  32. package/dist/cjs/utils/handlers.cjs.map +1 -1
  33. package/dist/esm/common/enum.mjs +2 -0
  34. package/dist/esm/common/enum.mjs.map +1 -1
  35. package/dist/esm/graphs/Graph.mjs +268 -14
  36. package/dist/esm/graphs/Graph.mjs.map +1 -1
  37. package/dist/esm/hitl/askUserQuestions.mjs +66 -0
  38. package/dist/esm/hitl/askUserQuestions.mjs.map +1 -0
  39. package/dist/esm/hitl/askUserQuestionsInterrupt.mjs +43 -0
  40. package/dist/esm/hitl/askUserQuestionsInterrupt.mjs.map +1 -0
  41. package/dist/esm/hitl/index.mjs +2 -0
  42. package/dist/esm/langfuseTraceShaping.mjs +9 -6
  43. package/dist/esm/langfuseTraceShaping.mjs.map +1 -1
  44. package/dist/esm/main.mjs +3 -1
  45. package/dist/esm/run.mjs +147 -14
  46. package/dist/esm/run.mjs.map +1 -1
  47. package/dist/esm/session/AgentSession.mjs +93 -31
  48. package/dist/esm/session/AgentSession.mjs.map +1 -1
  49. package/dist/esm/session/handlers.mjs +10 -0
  50. package/dist/esm/session/handlers.mjs.map +1 -1
  51. package/dist/esm/stream.mjs +17 -3
  52. package/dist/esm/stream.mjs.map +1 -1
  53. package/dist/esm/summarization/node.mjs +1 -0
  54. package/dist/esm/summarization/node.mjs.map +1 -1
  55. package/dist/esm/tools/ToolNode.mjs +4 -2
  56. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  57. package/dist/esm/tools/handlers.mjs +1 -0
  58. package/dist/esm/tools/handlers.mjs.map +1 -1
  59. package/dist/esm/tools/subagent/SubagentExecutor.mjs +28 -0
  60. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  61. package/dist/esm/types/hitl.mjs +13 -0
  62. package/dist/esm/types/hitl.mjs.map +1 -0
  63. package/dist/esm/utils/handlers.mjs +3 -0
  64. package/dist/esm/utils/handlers.mjs.map +1 -1
  65. package/dist/types/common/enum.d.ts +2 -0
  66. package/dist/types/graphs/Graph.d.ts +87 -0
  67. package/dist/types/hitl/askUserQuestions.d.ts +24 -0
  68. package/dist/types/hitl/askUserQuestionsInterrupt.d.ts +11 -0
  69. package/dist/types/hitl/index.d.ts +2 -0
  70. package/dist/types/langfuseTraceShaping.d.ts +4 -3
  71. package/dist/types/run.d.ts +9 -1
  72. package/dist/types/session/types.d.ts +1 -1
  73. package/dist/types/summarization/node.d.ts +6 -0
  74. package/dist/types/types/graph.d.ts +3 -3
  75. package/dist/types/types/hitl.d.ts +31 -2
  76. package/dist/types/types/stream.d.ts +57 -0
  77. package/dist/types/utils/handlers.d.ts +1 -0
  78. package/package.json +2 -1
  79. package/src/aggregator.test.ts +127 -0
  80. package/src/common/enum.ts +2 -0
  81. package/src/graphs/Graph.ts +365 -7
  82. package/src/graphs/__tests__/Graph.closeRunStep.test.ts +385 -0
  83. package/src/hitl/askUserQuestions.ts +126 -0
  84. package/src/hitl/askUserQuestionsInterrupt.ts +115 -0
  85. package/src/hitl/index.ts +6 -0
  86. package/src/langfuseTraceShaping.ts +14 -7
  87. package/src/run.ts +219 -41
  88. package/src/session/AgentSession.ts +105 -13
  89. package/src/session/handlers.ts +14 -2
  90. package/src/session/types.ts +1 -0
  91. package/src/specs/activity-label-observability.live.test.ts +262 -0
  92. package/src/specs/activity-label-observability.test.ts +167 -0
  93. package/src/specs/ask-user-questions.live.test.ts +185 -0
  94. package/src/specs/ask-user-questions.test.ts +293 -0
  95. package/src/specs/langfuse-trace-shaping.test.ts +32 -0
  96. package/src/specs/run-step-timestamps.test.ts +414 -0
  97. package/src/stream.ts +29 -6
  98. package/src/summarization/node.ts +11 -0
  99. package/src/tools/ToolNode.ts +2 -0
  100. package/src/tools/__tests__/SubagentExecutor.test.ts +52 -10
  101. package/src/tools/__tests__/handlers.test.ts +2 -0
  102. package/src/tools/handlers.ts +1 -0
  103. package/src/tools/subagent/SubagentExecutor.ts +46 -4
  104. package/src/types/graph.ts +9 -6
  105. package/src/types/hitl.ts +36 -2
  106. package/src/types/stream.ts +65 -12
  107. package/src/utils/handlers.ts +13 -0
@@ -326,29 +326,74 @@ function createAgentInputFromGraphConfig(graphConfig, initialSummary, retainRece
326
326
  function createManualCompactGraph(params) {
327
327
  const contentData = [];
328
328
  const contentIndexMap = /* @__PURE__ */ new Map();
329
- const result = { graph: {
330
- contentData,
331
- contentIndexMap,
332
- runId: params.runId,
333
- isMultiAgent: false,
334
- hookRegistry: params.hooks,
335
- streamLimits: require_streamLimits.resolveStreamLimits(params.streamLimits),
336
- dispatchRunStep: async (runStep) => {
337
- contentData.push(runStep);
338
- contentIndexMap.set(runStep.id, runStep.index);
339
- await params.customHandlers?.["on_run_step"]?.handle("on_run_step", runStep);
329
+ /** Stamps the terminal state and publishes the single terminal event. */
330
+ const closeStep = async (runStep, status, at) => {
331
+ if (runStep.status !== "in_progress") return;
332
+ runStep.status = status;
333
+ if (status === "completed") runStep.completed_at = at;
334
+ else if (status === "cancelled") runStep.cancelled_at = at;
335
+ else runStep.failed_at = at;
336
+ const closedEvent = {
337
+ id: runStep.id,
338
+ index: runStep.index,
339
+ type: runStep.type,
340
+ status,
341
+ closed_at: at
342
+ };
343
+ if (runStep.created_at != null) closedEvent.created_at = runStep.created_at;
344
+ if (runStep.runId != null) closedEvent.runId = runStep.runId;
345
+ await params.customHandlers?.["on_run_step_closed"]?.handle("on_run_step_closed", closedEvent);
346
+ };
347
+ const result = {
348
+ /**
349
+ * Terminal sweep for compaction, which runs outside `Run.processStream`
350
+ * and so has no stream-level equivalent: a summarization model that
351
+ * rejects, aborts, or trips a stream limit after the step was published
352
+ * would otherwise strand observers with a permanently open step.
353
+ */
354
+ closeOpenSteps: async (status) => {
355
+ const closedAt = Date.now();
356
+ for (const runStep of contentData) try {
357
+ await closeStep(runStep, status, closedAt);
358
+ } catch (_e) {}
340
359
  },
341
- dispatchRunStepCompleted: async (stepId, completed) => {
342
- const runStep = contentData.find((step) => step.id === stepId);
343
- const resultWithStep = {
344
- ...completed,
345
- id: stepId,
346
- index: runStep?.index ?? 0
347
- };
348
- if (completed.type === "summary") result.completedSummary = completed.summary;
349
- await params.customHandlers?.["on_run_step_completed"]?.handle("on_run_step_completed", { result: resultWithStep });
360
+ graph: {
361
+ contentData,
362
+ contentIndexMap,
363
+ runId: params.runId,
364
+ isMultiAgent: false,
365
+ hookRegistry: params.hooks,
366
+ streamLimits: require_streamLimits.resolveStreamLimits(params.streamLimits),
367
+ dispatchRunStep: async (runStep) => {
368
+ runStep.created_at ??= Date.now();
369
+ runStep.status ??= "in_progress";
370
+ contentData.push(runStep);
371
+ contentIndexMap.set(runStep.id, runStep.index);
372
+ await params.customHandlers?.["on_run_step"]?.handle("on_run_step", runStep);
373
+ },
374
+ closeRunStep: async (stepId, status) => {
375
+ const stepIndex = contentIndexMap.get(stepId);
376
+ const runStep = stepIndex === void 0 ? void 0 : contentData[stepIndex];
377
+ if (runStep == null) return;
378
+ await closeStep(runStep, status, Date.now());
379
+ },
380
+ dispatchRunStepCompleted: async (stepId, completed) => {
381
+ const completedAt = Date.now();
382
+ const stepIndex = contentIndexMap.get(stepId);
383
+ const runStep = stepIndex === void 0 ? void 0 : contentData[stepIndex];
384
+ const resultWithStep = {
385
+ ...completed,
386
+ id: stepId,
387
+ index: runStep?.index ?? 0,
388
+ completed_at: completedAt
389
+ };
390
+ if (completed.type === "summary") result.completedSummary = completed.summary;
391
+ await params.customHandlers?.["on_run_step_completed"]?.handle("on_run_step_completed", { result: resultWithStep });
392
+ if (runStep == null) return;
393
+ await closeStep(runStep, "completed", completedAt);
394
+ }
350
395
  }
351
- } };
396
+ };
352
397
  return result;
353
398
  }
354
399
  function getSummaryText(summary) {
@@ -771,20 +816,37 @@ var AgentSession = class AgentSession {
771
816
  hooks: this.runConfig.hooks,
772
817
  streamLimits: this.runConfig.streamLimits
773
818
  });
774
- const summarizedState = await require_node.createSummarizeNode({
819
+ const summarizeNode = require_node.createSummarizeNode({
775
820
  agentContext,
776
821
  graph: graph.graph,
777
822
  generateStepId: (stepKey) => [`${stepKey}-${compactRunId}`, graph.graph.contentData.length]
778
- })({
779
- messages: sessionState.messages,
780
- summarizationRequest: {
781
- remainingContextTokens: agentContext.maxContextTokens ?? 0,
782
- agentId: agentContext.agentId
783
- }
784
- }, {
785
- configurable: { thread_id: this.threadId },
786
- metadata: { run_id: compactRunId }
787
823
  });
824
+ let summarizedState;
825
+ try {
826
+ summarizedState = await summarizeNode({
827
+ messages: sessionState.messages,
828
+ summarizationRequest: {
829
+ remainingContextTokens: agentContext.maxContextTokens ?? 0,
830
+ agentId: agentContext.agentId
831
+ }
832
+ }, {
833
+ configurable: { thread_id: this.threadId },
834
+ metadata: { run_id: compactRunId }
835
+ });
836
+ } catch (error) {
837
+ /**
838
+ * `failed`, not `cancelled`: manual compaction is invoked without a
839
+ * caller abort signal, so there is no cancellation source to
840
+ * corroborate against. An error that merely carries the `AbortError`
841
+ * name is an unexpected failure here, and it propagates to the caller
842
+ * either way.
843
+ */
844
+ await graph.closeOpenSteps("failed").catch(() => {
845
+ /** the sweep must never mask the summarization failure */
846
+ });
847
+ throw error;
848
+ }
849
+ await graph.closeOpenSteps("completed");
788
850
  const completedSummaryText = getSummaryText(graph.completedSummary);
789
851
  const contextSummaryText = agentContext.getSummaryText();
790
852
  let summaryText = completedSummaryText;
@@ -1 +1 @@
1
- {"version":3,"file":"AgentSession.cjs","names":["BaseMessage","HumanMessage","createRunId","JsonlSessionStore","MemorySaver","deserializeMessage","resolveStreamLimits","createSessionId","createRunHandlers","Run","AgentContext","createSummarizeNode"],"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 async recordChildCheckpointThreads(params: {\n source: 'run' | 'resume';\n runId: string;\n run: Run<t.IState>;\n }): Promise<void> {\n if (!this.checkpointing.enabled || this.store == null) {\n return;\n }\n const recordedThreadIds = new Set(\n this.store.getCheckpoints().map((checkpoint) => checkpoint.data.threadId)\n );\n for (const threadId of params.run.getChildCheckpointThreadIds()) {\n if (recordedThreadIds.has(threadId)) {\n continue;\n }\n recordedThreadIds.add(threadId);\n await this.store.appendCheckpoint({\n source: params.source,\n runId: params.runId,\n threadId,\n });\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 let run: Run<t.IState> | undefined;\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 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 await this.recordChildCheckpointThreads({\n source: 'run',\n runId,\n run,\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 if (run != null) {\n await this.recordChildCheckpointThreads({\n source: 'run',\n runId,\n run,\n });\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 let run: Run<t.IState> | undefined;\n try {\n 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 await this.recordChildCheckpointThreads({\n source: 'resume',\n runId,\n run,\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 if (run != null) {\n await this.recordChildCheckpointThreads({\n source: 'resume',\n runId,\n run,\n });\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.cjs","names":["BaseMessage","HumanMessage","createRunId","JsonlSessionStore","MemorySaver","deserializeMessage","resolveStreamLimits","createSessionId","createRunHandlers","Run","AgentContext","createSummarizeNode"],"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 closeOpenSteps: (\n status: Exclude<t.RunStepStatus, 'in_progress'>\n ) => Promise<void>;\n} {\n const contentData: t.RunStep[] = [];\n const contentIndexMap = new Map<string, number>();\n /** Stamps the terminal state and publishes the single terminal event. */\n const closeStep = async (\n runStep: t.RunStep,\n status: Exclude<t.RunStepStatus, 'in_progress'>,\n at: number\n ): Promise<void> => {\n if (runStep.status !== 'in_progress') {\n return;\n }\n runStep.status = status;\n if (status === 'completed') {\n runStep.completed_at = at;\n } else if (status === 'cancelled') {\n runStep.cancelled_at = at;\n } else {\n runStep.failed_at = at;\n }\n const closedEvent: t.RunStepClosedEvent = {\n id: runStep.id,\n index: runStep.index,\n type: runStep.type,\n status,\n closed_at: at,\n };\n if (runStep.created_at != null) {\n closedEvent.created_at = runStep.created_at;\n }\n if (runStep.runId != null) {\n closedEvent.runId = runStep.runId;\n }\n await params.customHandlers?.[GraphEvents.ON_RUN_STEP_CLOSED]?.handle(\n GraphEvents.ON_RUN_STEP_CLOSED,\n closedEvent\n );\n };\n const result: {\n graph: Parameters<typeof createSummarizeNode>[0]['graph'];\n completedSummary?: t.SummaryContentBlock;\n closeOpenSteps: (\n status: Exclude<t.RunStepStatus, 'in_progress'>\n ) => Promise<void>;\n } = {\n /**\n * Terminal sweep for compaction, which runs outside `Run.processStream`\n * and so has no stream-level equivalent: a summarization model that\n * rejects, aborts, or trips a stream limit after the step was published\n * would otherwise strand observers with a permanently open step.\n */\n closeOpenSteps: async (status): Promise<void> => {\n const closedAt = Date.now();\n for (const runStep of contentData) {\n try {\n await closeStep(runStep, status, closedAt);\n } catch (_e) {\n /** Delivery failure for one step must not halt the sweep */\n }\n }\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 runStep.created_at ??= Date.now();\n runStep.status ??= 'in_progress';\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 closeRunStep: async (stepId, status): Promise<void> => {\n const stepIndex = contentIndexMap.get(stepId);\n const runStep =\n stepIndex === undefined ? undefined : contentData[stepIndex];\n if (runStep == null) {\n return;\n }\n await closeStep(runStep, status, Date.now());\n },\n dispatchRunStepCompleted: async (stepId, completed): Promise<void> => {\n const completedAt = Date.now();\n const stepIndex = contentIndexMap.get(stepId);\n const runStep =\n stepIndex === undefined ? undefined : contentData[stepIndex];\n const resultWithStep = {\n ...completed,\n id: stepId,\n index: runStep?.index ?? 0,\n completed_at: completedAt,\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 if (runStep == null) {\n return;\n }\n await closeStep(runStep, 'completed', completedAt);\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 async recordChildCheckpointThreads(params: {\n source: 'run' | 'resume';\n runId: string;\n run: Run<t.IState>;\n }): Promise<void> {\n if (!this.checkpointing.enabled || this.store == null) {\n return;\n }\n const recordedThreadIds = new Set(\n this.store.getCheckpoints().map((checkpoint) => checkpoint.data.threadId)\n );\n for (const threadId of params.run.getChildCheckpointThreadIds()) {\n if (recordedThreadIds.has(threadId)) {\n continue;\n }\n recordedThreadIds.add(threadId);\n await this.store.appendCheckpoint({\n source: params.source,\n runId: params.runId,\n threadId,\n });\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 let run: Run<t.IState> | undefined;\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 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 await this.recordChildCheckpointThreads({\n source: 'run',\n runId,\n run,\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 if (run != null) {\n await this.recordChildCheckpointThreads({\n source: 'run',\n runId,\n run,\n });\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 let summarizedState;\n try {\n 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 } catch (error) {\n /**\n * `failed`, not `cancelled`: manual compaction is invoked without a\n * caller abort signal, so there is no cancellation source to\n * corroborate against. An error that merely carries the `AbortError`\n * name is an unexpected failure here, and it propagates to the caller\n * either way.\n */\n await graph.closeOpenSteps('failed').catch(() => {\n /** the sweep must never mask the summarization failure */\n });\n throw error;\n }\n await graph.closeOpenSteps('completed');\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 let run: Run<t.IState> | undefined;\n try {\n 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 await this.recordChildCheckpointThreads({\n source: 'resume',\n runId,\n run,\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 if (run != null) {\n await this.recordChildCheckpointThreads({\n source: 'resume',\n runId,\n run,\n });\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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"}
@@ -149,6 +149,16 @@ function createRunHandlers(params) {
149
149
  graph
150
150
  });
151
151
  } },
152
+ ["on_run_step_closed"]: { handle: async (event, data, metadata, graph) => {
153
+ emitEvent(createEvent("step.finished", data));
154
+ await callUserHandler({
155
+ userHandlers: params.userHandlers,
156
+ event,
157
+ data,
158
+ metadata,
159
+ graph
160
+ });
161
+ } },
152
162
  ["on_message_delta"]: { handle: async (event, data, metadata, graph) => {
153
163
  const delta = data;
154
164
  aggregateContent({
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.cjs","names":["createTimestamp","toJsonValue","createContentAggregator","ToolEndHandler","ModelEndHandler","dispatchesChatModelStream","SDK_STREAM_DISPATCH"],"sources":["../../../src/session/handlers.ts"],"sourcesContent":["import type { UsageMetadata } from '@langchain/core/messages';\nimport type {\n AgentSessionHandlersResult,\n AgentSessionStreamEvent,\n AgentSessionUsage,\n} from './types';\nimport type * as t from '@/types';\nimport { ModelEndHandler, ToolEndHandler } from '@/events';\nimport { toJsonValue } from './messageSerialization';\nimport {\n createContentAggregator,\n dispatchesChatModelStream,\n SDK_STREAM_DISPATCH,\n} from '@/stream';\nimport { createTimestamp } from './ids';\nimport { GraphEvents } from '@/common';\n\ntype CompletedRunStepResult =\n | t.ToolEndEvent\n | (t.SummaryCompleted & { id: string; index: number });\n\nfunction isToolCompletion(\n result: CompletedRunStepResult\n): result is t.ToolEndEvent {\n return 'tool_call' in result;\n}\n\nfunction createEventFactory(params: {\n runId: string;\n threadId: string;\n}): (\n type: AgentSessionStreamEvent['type'],\n data?: unknown\n) => AgentSessionStreamEvent {\n let sequence = 0;\n return (type, data) => ({\n type,\n sequence: sequence++,\n runId: params.runId,\n threadId: params.threadId,\n timestamp: createTimestamp(),\n ...(typeof data !== 'undefined' ? { data: toJsonValue(data) } : {}),\n });\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction updateUsage(usage: AgentSessionUsage, data: t.ModelEndData): void {\n const metadata = data?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!metadata) {\n return;\n }\n const inputTokens = getTokenCount(metadata.input_tokens);\n const outputTokens = getTokenCount(metadata.output_tokens);\n const totalTokens =\n metadata.total_tokens == null\n ? inputTokens + outputTokens\n : getTokenCount(metadata.total_tokens);\n usage.inputTokens += inputTokens;\n usage.outputTokens += outputTokens;\n usage.totalTokens += totalTokens;\n}\n\nasync function callUserHandler(params: {\n userHandlers?: Record<string, t.EventHandler>;\n event: string;\n data: Parameters<t.EventHandler['handle']>[1];\n metadata?: Record<string, unknown>;\n graph?: Parameters<t.EventHandler['handle']>[3];\n}): Promise<void> {\n const handler = params.userHandlers?.[params.event];\n if (!handler) {\n return;\n }\n await handler.handle(\n params.event,\n params.data,\n params.metadata,\n params.graph\n );\n}\n\nexport function createRunHandlers(params: {\n runId: string;\n threadId: string;\n userHandlers?: Record<string, t.EventHandler>;\n onEvent?: (event: AgentSessionStreamEvent) => void;\n}): AgentSessionHandlersResult {\n const { contentParts, aggregateContent } = createContentAggregator();\n const steps: t.RunStep[] = [];\n const usage: AgentSessionUsage = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n };\n const events: AgentSessionStreamEvent[] = [];\n const createEvent = createEventFactory({\n runId: params.runId,\n threadId: params.threadId,\n });\n const emitEvent = (event: AgentSessionStreamEvent): void => {\n events.push(event);\n params.onEvent?.(event);\n };\n const toolEndHandler = new ToolEndHandler();\n const modelEndHandler = new ModelEndHandler();\n\n emitEvent(createEvent('run.started'));\n\n /**\n * Forwards to the host's own handler, so it inherits that handler's\n * capability. Branding matters because this wrapper is installed on EVERY\n * session run and merged last: without it, a host that registered\n * `new ChatModelStreamHandler()` would silently lose the sealing opt-out\n * that registration is supposed to buy.\n */\n const streamWrapper: t.EventHandler = {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n };\n if (\n dispatchesChatModelStream(\n params.userHandlers?.[GraphEvents.CHAT_MODEL_STREAM]\n )\n ) {\n Object.defineProperty(streamWrapper, SDK_STREAM_DISPATCH, { value: true });\n }\n\n const handlers: Record<string, t.EventHandler> = {\n [GraphEvents.CHAT_MODEL_STREAM]: streamWrapper,\n [GraphEvents.CHAT_MODEL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await modelEndHandler.handle(\n event,\n data as t.ModelEndData,\n metadata,\n graph\n );\n updateUsage(usage, data as t.ModelEndData);\n emitEvent(createEvent('usage.updated', usage));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.TOOL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await toolEndHandler.handle(\n event,\n data as t.StreamEventData,\n metadata,\n graph\n );\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const runStep = data as t.RunStep;\n steps.push(runStep);\n aggregateContent({ event: GraphEvents.ON_RUN_STEP, data: runStep });\n if (runStep.stepDetails.type === 'tool_calls') {\n emitEvent(createEvent('tool.started', runStep));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.RunStepDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_RUN_STEP_DELTA, data: delta });\n emitEvent(createEvent('tool.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_COMPLETED]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const completed = data as unknown as { result: CompletedRunStepResult };\n aggregateContent({\n event: GraphEvents.ON_RUN_STEP_COMPLETED,\n data: completed as { result: t.ToolEndEvent },\n });\n if (isToolCompletion(completed.result)) {\n emitEvent(createEvent('tool.completed', completed));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.MessageDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_MESSAGE_DELTA, data: delta });\n emitEvent(createEvent('message.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.ReasoningDeltaEvent;\n aggregateContent({\n event: GraphEvents.ON_REASONING_DELTA,\n data: delta,\n });\n emitEvent(createEvent('reasoning.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_DELTA,\n data: data as t.SummarizeDeltaData,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_COMPLETE]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_COMPLETE,\n data: data as t.SummarizeCompleteEvent,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n };\n\n return { contentParts, steps, usage, events, handlers };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"handlers.cjs","names":["createTimestamp","toJsonValue","createContentAggregator","ToolEndHandler","ModelEndHandler","dispatchesChatModelStream","SDK_STREAM_DISPATCH"],"sources":["../../../src/session/handlers.ts"],"sourcesContent":["import type { UsageMetadata } from '@langchain/core/messages';\nimport type {\n AgentSessionHandlersResult,\n AgentSessionStreamEvent,\n AgentSessionUsage,\n} from './types';\nimport type * as t from '@/types';\nimport {\n createContentAggregator,\n dispatchesChatModelStream,\n SDK_STREAM_DISPATCH,\n} from '@/stream';\nimport { ModelEndHandler, ToolEndHandler } from '@/events';\nimport { toJsonValue } from './messageSerialization';\nimport { createTimestamp } from './ids';\nimport { GraphEvents } from '@/common';\n\ntype CompletedRunStepResult =\n | t.ToolEndEvent\n | (t.SummaryCompleted & { id: string; index: number });\n\nfunction isToolCompletion(\n result: CompletedRunStepResult\n): result is t.ToolEndEvent {\n return 'tool_call' in result;\n}\n\nfunction createEventFactory(params: {\n runId: string;\n threadId: string;\n}): (\n type: AgentSessionStreamEvent['type'],\n data?: unknown\n) => AgentSessionStreamEvent {\n let sequence = 0;\n return (type, data) => ({\n type,\n sequence: sequence++,\n runId: params.runId,\n threadId: params.threadId,\n timestamp: createTimestamp(),\n ...(typeof data !== 'undefined' ? { data: toJsonValue(data) } : {}),\n });\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction updateUsage(usage: AgentSessionUsage, data: t.ModelEndData): void {\n const metadata = data?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!metadata) {\n return;\n }\n const inputTokens = getTokenCount(metadata.input_tokens);\n const outputTokens = getTokenCount(metadata.output_tokens);\n const totalTokens =\n metadata.total_tokens == null\n ? inputTokens + outputTokens\n : getTokenCount(metadata.total_tokens);\n usage.inputTokens += inputTokens;\n usage.outputTokens += outputTokens;\n usage.totalTokens += totalTokens;\n}\n\nasync function callUserHandler(params: {\n userHandlers?: Record<string, t.EventHandler>;\n event: string;\n data: Parameters<t.EventHandler['handle']>[1];\n metadata?: Record<string, unknown>;\n graph?: Parameters<t.EventHandler['handle']>[3];\n}): Promise<void> {\n const handler = params.userHandlers?.[params.event];\n if (!handler) {\n return;\n }\n await handler.handle(\n params.event,\n params.data,\n params.metadata,\n params.graph\n );\n}\n\nexport function createRunHandlers(params: {\n runId: string;\n threadId: string;\n userHandlers?: Record<string, t.EventHandler>;\n onEvent?: (event: AgentSessionStreamEvent) => void;\n}): AgentSessionHandlersResult {\n const { contentParts, aggregateContent } = createContentAggregator();\n const steps: t.RunStep[] = [];\n const usage: AgentSessionUsage = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n };\n const events: AgentSessionStreamEvent[] = [];\n const createEvent = createEventFactory({\n runId: params.runId,\n threadId: params.threadId,\n });\n const emitEvent = (event: AgentSessionStreamEvent): void => {\n events.push(event);\n params.onEvent?.(event);\n };\n const toolEndHandler = new ToolEndHandler();\n const modelEndHandler = new ModelEndHandler();\n\n emitEvent(createEvent('run.started'));\n\n /**\n * Forwards to the host's own handler, so it inherits that handler's\n * capability. Branding matters because this wrapper is installed on EVERY\n * session run and merged last: without it, a host that registered\n * `new ChatModelStreamHandler()` would silently lose the sealing opt-out\n * that registration is supposed to buy.\n */\n const streamWrapper: t.EventHandler = {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n };\n if (\n dispatchesChatModelStream(\n params.userHandlers?.[GraphEvents.CHAT_MODEL_STREAM]\n )\n ) {\n Object.defineProperty(streamWrapper, SDK_STREAM_DISPATCH, { value: true });\n }\n\n const handlers: Record<string, t.EventHandler> = {\n [GraphEvents.CHAT_MODEL_STREAM]: streamWrapper,\n [GraphEvents.CHAT_MODEL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await modelEndHandler.handle(\n event,\n data as t.ModelEndData,\n metadata,\n graph\n );\n updateUsage(usage, data as t.ModelEndData);\n emitEvent(createEvent('usage.updated', usage));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.TOOL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await toolEndHandler.handle(\n event,\n data as t.StreamEventData,\n metadata,\n graph\n );\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const runStep = data as t.RunStep;\n steps.push(runStep);\n aggregateContent({ event: GraphEvents.ON_RUN_STEP, data: runStep });\n if (runStep.stepDetails.type === 'tool_calls') {\n emitEvent(createEvent('tool.started', runStep));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.RunStepDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_RUN_STEP_DELTA, data: delta });\n emitEvent(createEvent('tool.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_COMPLETED]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const completed = data as unknown as { result: CompletedRunStepResult };\n aggregateContent({\n event: GraphEvents.ON_RUN_STEP_COMPLETED,\n data: completed as { result: t.ToolEndEvent },\n });\n if (isToolCompletion(completed.result)) {\n emitEvent(createEvent('tool.completed', completed));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_CLOSED]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n emitEvent(createEvent('step.finished', data as t.RunStepClosedEvent));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.MessageDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_MESSAGE_DELTA, data: delta });\n emitEvent(createEvent('message.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.ReasoningDeltaEvent;\n aggregateContent({\n event: GraphEvents.ON_REASONING_DELTA,\n data: delta,\n });\n emitEvent(createEvent('reasoning.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_DELTA,\n data: data as t.SummarizeDeltaData,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_COMPLETE]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_COMPLETE,\n data: data as t.SummarizeCompleteEvent,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n };\n\n return { contentParts, steps, usage, events, handlers };\n}\n"],"mappings":"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"}
@@ -386,7 +386,8 @@ async function dispatchEagerToolCompletions(args) {
386
386
  output,
387
387
  progress: 1,
388
388
  ...outcome != null && { outcome }
389
- }
389
+ },
390
+ completed_at: Date.now()
390
391
  } }, graph.config) === false) continue;
391
392
  record.completionDispatched = true;
392
393
  } catch (error) {
@@ -1056,12 +1057,25 @@ function createContentAggregator() {
1056
1057
  console.warn("Content type mismatch");
1057
1058
  return;
1058
1059
  }
1059
- if (partType.startsWith("text") && "text" in contentPart && typeof contentPart.text === "string") {
1060
+ const incomingText = "text" in contentPart && typeof contentPart.text === "string" ? contentPart.text : void 0;
1061
+ /**
1062
+ * Anthropic emits a search turn's citations as their own `citations_delta`,
1063
+ * which arrives here as a text part carrying `citations` and no `text`.
1064
+ */
1065
+ const { citations } = contentPart;
1066
+ const incomingCitations = Array.isArray(citations) ? citations : void 0;
1067
+ if (partType.startsWith("text") && (incomingText !== void 0 || incomingCitations !== void 0)) {
1068
+ const currentContent = contentParts[index];
1060
1069
  const update = {
1061
1070
  type: "text",
1062
- text: (contentParts[index].text || "") + contentPart.text
1071
+ text: (currentContent.text || "") + (incomingText ?? "")
1063
1072
  };
1064
1073
  if (contentPart.tool_call_ids) update.tool_call_ids = contentPart.tool_call_ids;
1074
+ else if (incomingText === void 0 && currentContent.tool_call_ids)
1075
+ /** A citations-only delta must not drop ids already accumulated */
1076
+ update.tool_call_ids = currentContent.tool_call_ids;
1077
+ if (incomingCitations !== void 0) update.citations = currentContent.citations !== void 0 ? [...currentContent.citations, ...incomingCitations] : [...incomingCitations];
1078
+ else if (currentContent.citations !== void 0) update.citations = currentContent.citations;
1065
1079
  contentParts[index] = update;
1066
1080
  } else if (partType.startsWith("think") && "think" in contentPart && typeof contentPart.think === "string") contentParts[index] = {
1067
1081
  type: "think",