@librechat/agents 3.1.86 → 3.1.88

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 (160) hide show
  1. package/README.md +69 -0
  2. package/dist/cjs/events.cjs +23 -0
  3. package/dist/cjs/events.cjs.map +1 -1
  4. package/dist/cjs/graphs/Graph.cjs +133 -18
  5. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  6. package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -1
  7. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  8. package/dist/cjs/llm/anthropic/index.cjs +251 -53
  9. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  10. package/dist/cjs/llm/init.cjs +1 -5
  11. package/dist/cjs/llm/init.cjs.map +1 -1
  12. package/dist/cjs/llm/openai/index.cjs +113 -24
  13. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  14. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  15. package/dist/cjs/llm/openrouter/index.cjs +3 -1
  16. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  17. package/dist/cjs/main.cjs +18 -5
  18. package/dist/cjs/main.cjs.map +1 -1
  19. package/dist/cjs/openai/index.cjs +253 -0
  20. package/dist/cjs/openai/index.cjs.map +1 -0
  21. package/dist/cjs/responses/index.cjs +448 -0
  22. package/dist/cjs/responses/index.cjs.map +1 -0
  23. package/dist/cjs/run.cjs +108 -7
  24. package/dist/cjs/run.cjs.map +1 -1
  25. package/dist/cjs/session/AgentSession.cjs +1057 -0
  26. package/dist/cjs/session/AgentSession.cjs.map +1 -0
  27. package/dist/cjs/session/JsonlSessionStore.cjs +425 -0
  28. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -0
  29. package/dist/cjs/session/handlers.cjs +221 -0
  30. package/dist/cjs/session/handlers.cjs.map +1 -0
  31. package/dist/cjs/session/ids.cjs +22 -0
  32. package/dist/cjs/session/ids.cjs.map +1 -0
  33. package/dist/cjs/session/messageSerialization.cjs +179 -0
  34. package/dist/cjs/session/messageSerialization.cjs.map +1 -0
  35. package/dist/cjs/stream.cjs +475 -11
  36. package/dist/cjs/stream.cjs.map +1 -1
  37. package/dist/cjs/summarization/node.cjs +1 -1
  38. package/dist/cjs/summarization/node.cjs.map +1 -1
  39. package/dist/cjs/tools/ToolNode.cjs +177 -59
  40. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  41. package/dist/cjs/tools/eagerEventExecution.cjs +113 -0
  42. package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -0
  43. package/dist/cjs/tools/handlers.cjs +1 -1
  44. package/dist/cjs/tools/handlers.cjs.map +1 -1
  45. package/dist/cjs/tools/streamedToolCallSeals.cjs +42 -0
  46. package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -0
  47. package/dist/esm/events.mjs +23 -1
  48. package/dist/esm/events.mjs.map +1 -1
  49. package/dist/esm/graphs/Graph.mjs +133 -18
  50. package/dist/esm/graphs/Graph.mjs.map +1 -1
  51. package/dist/esm/graphs/MultiAgentGraph.mjs +1 -1
  52. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  53. package/dist/esm/llm/anthropic/index.mjs +251 -53
  54. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  55. package/dist/esm/llm/init.mjs +1 -5
  56. package/dist/esm/llm/init.mjs.map +1 -1
  57. package/dist/esm/llm/openai/index.mjs +113 -25
  58. package/dist/esm/llm/openai/index.mjs.map +1 -1
  59. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  60. package/dist/esm/llm/openrouter/index.mjs +4 -2
  61. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  62. package/dist/esm/main.mjs +5 -1
  63. package/dist/esm/main.mjs.map +1 -1
  64. package/dist/esm/openai/index.mjs +246 -0
  65. package/dist/esm/openai/index.mjs.map +1 -0
  66. package/dist/esm/responses/index.mjs +440 -0
  67. package/dist/esm/responses/index.mjs.map +1 -0
  68. package/dist/esm/run.mjs +108 -7
  69. package/dist/esm/run.mjs.map +1 -1
  70. package/dist/esm/session/AgentSession.mjs +1054 -0
  71. package/dist/esm/session/AgentSession.mjs.map +1 -0
  72. package/dist/esm/session/JsonlSessionStore.mjs +422 -0
  73. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -0
  74. package/dist/esm/session/handlers.mjs +219 -0
  75. package/dist/esm/session/handlers.mjs.map +1 -0
  76. package/dist/esm/session/ids.mjs +17 -0
  77. package/dist/esm/session/ids.mjs.map +1 -0
  78. package/dist/esm/session/messageSerialization.mjs +173 -0
  79. package/dist/esm/session/messageSerialization.mjs.map +1 -0
  80. package/dist/esm/stream.mjs +476 -12
  81. package/dist/esm/stream.mjs.map +1 -1
  82. package/dist/esm/summarization/node.mjs +1 -1
  83. package/dist/esm/summarization/node.mjs.map +1 -1
  84. package/dist/esm/tools/ToolNode.mjs +177 -59
  85. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  86. package/dist/esm/tools/eagerEventExecution.mjs +107 -0
  87. package/dist/esm/tools/eagerEventExecution.mjs.map +1 -0
  88. package/dist/esm/tools/handlers.mjs +1 -1
  89. package/dist/esm/tools/handlers.mjs.map +1 -1
  90. package/dist/esm/tools/streamedToolCallSeals.mjs +36 -0
  91. package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -0
  92. package/dist/types/events.d.ts +1 -0
  93. package/dist/types/graphs/Graph.d.ts +24 -9
  94. package/dist/types/index.d.ts +1 -0
  95. package/dist/types/llm/openai/index.d.ts +1 -0
  96. package/dist/types/openai/index.d.ts +75 -0
  97. package/dist/types/responses/index.d.ts +97 -0
  98. package/dist/types/run.d.ts +2 -0
  99. package/dist/types/session/AgentSession.d.ts +32 -0
  100. package/dist/types/session/JsonlSessionStore.d.ts +67 -0
  101. package/dist/types/session/handlers.d.ts +8 -0
  102. package/dist/types/session/ids.d.ts +4 -0
  103. package/dist/types/session/index.d.ts +5 -0
  104. package/dist/types/session/messageSerialization.d.ts +7 -0
  105. package/dist/types/session/types.d.ts +191 -0
  106. package/dist/types/tools/ToolNode.d.ts +12 -1
  107. package/dist/types/tools/eagerEventExecution.d.ts +23 -0
  108. package/dist/types/tools/streamedToolCallSeals.d.ts +13 -0
  109. package/dist/types/types/hitl.d.ts +4 -0
  110. package/dist/types/types/run.d.ts +11 -1
  111. package/dist/types/types/tools.d.ts +36 -0
  112. package/package.json +19 -2
  113. package/src/__tests__/stream.eagerEventExecution.test.ts +2571 -0
  114. package/src/events.ts +29 -0
  115. package/src/graphs/Graph.ts +224 -50
  116. package/src/graphs/MultiAgentGraph.ts +1 -1
  117. package/src/graphs/__tests__/composition.smoke.test.ts +30 -0
  118. package/src/index.ts +3 -0
  119. package/src/llm/anthropic/index.ts +356 -84
  120. package/src/llm/anthropic/llm.spec.ts +64 -0
  121. package/src/llm/custom-chat-models.smoke.test.ts +175 -4
  122. package/src/llm/openai/contentBlocks.test.ts +35 -0
  123. package/src/llm/openai/deepseek.test.ts +201 -2
  124. package/src/llm/openai/index.ts +171 -26
  125. package/src/llm/openai/utils/index.ts +22 -0
  126. package/src/llm/openrouter/index.ts +4 -2
  127. package/src/openai/__tests__/openai.test.ts +337 -0
  128. package/src/openai/index.ts +404 -0
  129. package/src/responses/__tests__/responses.test.ts +652 -0
  130. package/src/responses/index.ts +677 -0
  131. package/src/run.ts +158 -8
  132. package/src/scripts/compare_pi_vs_ours.ts +592 -173
  133. package/src/scripts/session_live.ts +548 -0
  134. package/src/session/AgentSession.ts +1432 -0
  135. package/src/session/JsonlSessionStore.ts +572 -0
  136. package/src/session/__tests__/JsonlSessionStore.test.ts +1410 -0
  137. package/src/session/__tests__/handlers.test.ts +161 -0
  138. package/src/session/handlers.ts +272 -0
  139. package/src/session/ids.ts +17 -0
  140. package/src/session/index.ts +44 -0
  141. package/src/session/messageSerialization.ts +207 -0
  142. package/src/session/types.ts +275 -0
  143. package/src/specs/custom-event-await.test.ts +89 -0
  144. package/src/specs/summarization.test.ts +1 -1
  145. package/src/stream.ts +756 -48
  146. package/src/summarization/node.ts +1 -1
  147. package/src/tools/ToolNode.ts +299 -126
  148. package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +373 -0
  149. package/src/tools/__tests__/handlers.test.ts +2 -1
  150. package/src/tools/__tests__/hitl.test.ts +206 -110
  151. package/src/tools/eagerEventExecution.ts +153 -0
  152. package/src/tools/handlers.ts +8 -4
  153. package/src/tools/streamedToolCallSeals.ts +57 -0
  154. package/src/types/hitl.ts +4 -0
  155. package/src/types/run.ts +11 -0
  156. package/src/types/tools.ts +36 -0
  157. package/dist/cjs/llm/text.cjs +0 -69
  158. package/dist/cjs/llm/text.cjs.map +0 -1
  159. package/dist/esm/llm/text.mjs +0 -67
  160. package/dist/esm/llm/text.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonlSessionStore.cjs","sources":["../../../src/session/JsonlSessionStore.ts"],"sourcesContent":["import { homedir } from 'os';\nimport { createHash } from 'crypto';\nimport { basename, dirname, isAbsolute, join, resolve } from 'path';\nimport {\n access,\n appendFile,\n mkdir,\n readFile,\n readdir,\n stat,\n writeFile,\n} from 'fs/promises';\nimport type {\n CreateSessionFileOptions,\n SessionBranchOptions,\n SessionEntry,\n SessionForkOptions,\n SessionHeader,\n SessionLabelEntry,\n SessionListItem,\n SessionMessageEntry,\n SessionCheckpointEntry,\n SessionCompactionEntry,\n SessionRunEventEntry,\n SessionSummaryEntry,\n SessionStateEntry,\n SessionTreeNode,\n} from './types';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport { SystemMessage } from '@langchain/core/messages';\nimport { createEntryId, createSessionId, createTimestamp } from './ids';\nimport {\n deserializeMessage,\n getMessageRole,\n serializeMessage,\n toJsonValue,\n} from './messageSerialization';\n\nconst SESSION_VERSION = 1;\nconst DEFAULT_SESSION_ROOT = join(\n homedir(),\n '.librechat',\n 'agents',\n 'sessions'\n);\n\nfunction sanitizeCwd(cwd: string): string {\n const normalized = resolve(cwd);\n return createHash('sha256').update(normalized).digest('hex');\n}\n\nfunction createSessionPath(options: CreateSessionFileOptions): string {\n const sessionId = options.sessionId ?? createSessionId();\n const fileName = `${new Date().toISOString().replace(/[:.]/g, '-')}_${sessionId}.jsonl`;\n return join(DEFAULT_SESSION_ROOT, sanitizeCwd(options.cwd), fileName);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction parseLine(line: string): SessionHeader | SessionEntry | undefined {\n if (line.trim() === '') {\n return undefined;\n }\n try {\n const parsed = JSON.parse(line) as SessionHeader | SessionEntry;\n if (parsed.type === 'session') {\n return parsed;\n }\n if ('id' in parsed && 'parentId' in parsed && 'data' in parsed) {\n return parsed;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction createHeader(options: CreateSessionFileOptions): SessionHeader {\n return {\n type: 'session',\n version: SESSION_VERSION,\n id: options.sessionId ?? createSessionId(),\n timestamp: createTimestamp(),\n cwd: resolve(options.cwd),\n ...(options.name != null && options.name !== ''\n ? { name: options.name }\n : {}),\n ...(options.parentSession != null && options.parentSession !== ''\n ? { parentSession: options.parentSession }\n : {}),\n };\n}\n\nfunction sortEntries(entries: SessionEntry[]): SessionEntry[] {\n return [...entries].sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n}\n\nexport class JsonlSessionStore {\n readonly path: string;\n readonly header: SessionHeader;\n private entries: SessionEntry[];\n\n private constructor(params: {\n path: string;\n header: SessionHeader;\n entries: SessionEntry[];\n }) {\n this.path = params.path;\n this.header = params.header;\n this.entries = sortEntries(params.entries);\n }\n\n static getDefaultRoot(): string {\n return DEFAULT_SESSION_ROOT;\n }\n\n static async create(\n options: CreateSessionFileOptions & { path?: string }\n ): Promise<JsonlSessionStore> {\n const sessionId = options.sessionId ?? createSessionId();\n const path =\n options.path != null && options.path !== ''\n ? resolve(options.path)\n : createSessionPath({ ...options, sessionId });\n const header = createHeader({ ...options, sessionId });\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(header)}\\n`, {\n encoding: 'utf8',\n flag: 'wx',\n });\n return new JsonlSessionStore({ path, header, entries: [] });\n }\n\n static async open(pathOrId: string): Promise<JsonlSessionStore> {\n const path = await JsonlSessionStore.resolvePath(pathOrId);\n return JsonlSessionStore.openPath(path);\n }\n\n static async openPath(path: string): Promise<JsonlSessionStore> {\n const resolved = resolve(path);\n const raw = await readFile(resolved, 'utf8');\n const parsed = raw\n .split('\\n')\n .map((line) => parseLine(line))\n .filter((line): line is SessionHeader | SessionEntry => line != null);\n const header = parsed.find(\n (line): line is SessionHeader => line.type === 'session'\n );\n if (!header) {\n throw new Error(`Invalid session file: ${resolved}`);\n }\n const entries = parsed.filter(\n (line): line is SessionEntry => line.type !== 'session'\n );\n return new JsonlSessionStore({ path: resolved, header, entries });\n }\n\n static async resolvePath(pathOrId: string): Promise<string> {\n const candidate = isAbsolute(pathOrId) ? pathOrId : resolve(pathOrId);\n if (await pathExists(candidate)) {\n return candidate;\n }\n const sessions = await JsonlSessionStore.listAll();\n const matches = sessions.filter(\n (item) =>\n item.id.startsWith(pathOrId) || basename(item.path).includes(pathOrId)\n );\n if (matches.length === 1) {\n return matches[0].path;\n }\n if (matches.length > 1) {\n throw new Error(`Session id \"${pathOrId}\" is ambiguous`);\n }\n throw new Error(`Session not found: ${pathOrId}`);\n }\n\n static async list(cwd: string): Promise<SessionListItem[]> {\n const dir = join(DEFAULT_SESSION_ROOT, sanitizeCwd(cwd));\n return JsonlSessionStore.listDirectory(dir);\n }\n\n static async listAll(\n root: string = DEFAULT_SESSION_ROOT\n ): Promise<SessionListItem[]> {\n if (!(await pathExists(root))) {\n return [];\n }\n const dirs = await readdir(root, { withFileTypes: true });\n const lists = await Promise.all(\n dirs\n .filter((entry) => entry.isDirectory())\n .map((entry) => JsonlSessionStore.listDirectory(join(root, entry.name)))\n );\n return lists.flat().sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n }\n\n private static async listDirectory(dir: string): Promise<SessionListItem[]> {\n if (!(await pathExists(dir))) {\n return [];\n }\n const files = await readdir(dir, { withFileTypes: true });\n const candidates = files\n .filter((entry) => entry.isFile() && entry.name.endsWith('.jsonl'))\n .map((entry) => join(dir, entry.name));\n const items = await Promise.all(\n candidates.map(async (path): Promise<SessionListItem | undefined> => {\n try {\n const store = await JsonlSessionStore.open(path);\n return {\n id: store.header.id,\n path,\n cwd: store.header.cwd,\n timestamp: store.header.timestamp,\n name: store.header.name,\n leafId: store.getLeafEntry()?.id ?? null,\n };\n } catch {\n return undefined;\n }\n })\n );\n return items\n .filter((item): item is SessionListItem => item != null)\n .sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n }\n\n getEntries(): SessionEntry[] {\n return [...this.entries];\n }\n\n getEntry(id: string): SessionEntry | undefined {\n return this.entries.find((entry) => entry.id === id);\n }\n\n getChildren(id: string): SessionEntry[] {\n return this.entries.filter((entry) => entry.parentId === id);\n }\n\n getTree(): SessionTreeNode[] {\n const byParent = new Map<string | null, SessionEntry[]>();\n for (const entry of this.entries) {\n const siblings = byParent.get(entry.parentId) ?? [];\n siblings.push(entry);\n byParent.set(entry.parentId, siblings);\n }\n const build = (parentId: string | null): SessionTreeNode[] =>\n (byParent.get(parentId) ?? []).map((entry) => ({\n entry,\n children: build(entry.id),\n }));\n return build(null);\n }\n\n getLeafEntry(): SessionEntry | undefined {\n const state = [...this.entries]\n .reverse()\n .find(\n (entry): entry is SessionStateEntry => entry.type === 'session_state'\n );\n if (state) {\n return state.data.leafId == null\n ? undefined\n : this.getEntry(state.data.leafId);\n }\n return [...this.entries]\n .reverse()\n .find((entry) => entry.type === 'message' || entry.type === 'summary');\n }\n\n getPath(\n entryId: string | undefined = this.getLeafEntry()?.id\n ): SessionEntry[] {\n if (entryId == null || entryId === '') {\n return [];\n }\n const byId = new Map(this.entries.map((entry) => [entry.id, entry]));\n const path: SessionEntry[] = [];\n let current: SessionEntry | undefined = byId.get(entryId);\n while (current) {\n path.push(current);\n current =\n current.parentId == null ? undefined : byId.get(current.parentId);\n }\n return path.reverse();\n }\n\n getMessages(entryId?: string): BaseMessage[] {\n const messages: BaseMessage[] = [];\n for (const entry of this.getPath(entryId)) {\n if (entry.type === 'message') {\n messages.push(deserializeMessage(entry.data.message));\n } else if (entry.type === 'summary') {\n messages.push(new SystemMessage(entry.data.text));\n }\n }\n return messages;\n }\n\n getForkPoints(): SessionMessageEntry[] {\n return this.entries.filter(\n (entry): entry is SessionMessageEntry =>\n entry.type === 'message' && entry.data.role === 'user'\n );\n }\n\n getLabel(entryId: string): string | undefined {\n return [...this.entries]\n .reverse()\n .find(\n (entry): entry is SessionLabelEntry =>\n entry.type === 'label' && entry.data.targetEntryId === entryId\n )?.data.label;\n }\n\n async setLabel(entryId: string, label: string): Promise<SessionLabelEntry> {\n return this.appendEntry<SessionLabelEntry>({\n type: 'label',\n parentId: this.getLeafEntry()?.id ?? null,\n data: { targetEntryId: entryId, label },\n });\n }\n\n async appendMessage(\n message: BaseMessage,\n parentId: string | null = this.getLeafEntry()?.id ?? null\n ): Promise<SessionMessageEntry> {\n const entry = await this.appendEntry<SessionMessageEntry>({\n type: 'message',\n parentId,\n data: {\n role: getMessageRole(message),\n message: serializeMessage(message),\n },\n });\n await this.setLeaf(entry.id);\n return entry;\n }\n\n async appendRunEvent(\n event: string,\n payload?: unknown,\n params?: { runId?: string; threadId?: string }\n ): Promise<SessionRunEventEntry> {\n return this.appendEntry<SessionRunEventEntry>({\n type: 'run_event',\n parentId: this.getLeafEntry()?.id ?? null,\n data: {\n event,\n ...(params?.runId != null && params.runId !== ''\n ? { runId: params.runId }\n : {}),\n ...(params?.threadId != null && params.threadId !== ''\n ? { threadId: params.threadId }\n : {}),\n ...(typeof payload !== 'undefined'\n ? { payload: toJsonValue(payload) }\n : {}),\n },\n });\n }\n\n async setLeaf(leafId: string | null): Promise<SessionStateEntry> {\n return this.appendEntry<SessionStateEntry>({\n type: 'session_state',\n parentId: leafId,\n data: { leafId },\n });\n }\n\n async appendEntryForCompaction(params: {\n text: string;\n tokenCount?: number;\n retainedEntryIds: string[];\n summarizedEntryIds: string[];\n instructions?: string;\n parentId?: string | null;\n }): Promise<SessionSummaryEntry> {\n const tokenCount =\n typeof params.tokenCount === 'number' &&\n Number.isFinite(params.tokenCount) &&\n params.tokenCount >= 0\n ? params.tokenCount\n : undefined;\n const entry = await this.appendEntry<SessionSummaryEntry>({\n type: 'summary',\n parentId:\n 'parentId' in params\n ? (params.parentId ?? null)\n : (this.getLeafEntry()?.id ?? null),\n data: {\n text: params.text,\n ...(tokenCount != null ? { tokenCount } : {}),\n retainedEntryIds: params.retainedEntryIds,\n summarizedEntryIds: params.summarizedEntryIds,\n ...(params.instructions != null && params.instructions !== ''\n ? { instructions: params.instructions }\n : {}),\n },\n });\n await this.setLeaf(entry.id);\n return entry;\n }\n\n async appendCompactionEntry(params: {\n summaryEntryId: string;\n retainedEntryIds: string[];\n summarizedEntryIds: string[];\n }): Promise<SessionCompactionEntry> {\n return this.appendEntry<SessionCompactionEntry>({\n type: 'compaction',\n parentId: this.getLeafEntry()?.id ?? null,\n data: {\n summaryEntryId: params.summaryEntryId,\n retainedEntryIds: params.retainedEntryIds,\n summarizedEntryIds: params.summarizedEntryIds,\n },\n });\n }\n\n async appendCheckpoint(params: {\n source: SessionCheckpointEntry['data']['source'];\n threadId: string;\n runId?: string;\n checkpointId?: string;\n checkpointNs?: string;\n parentCheckpointId?: string;\n reason?: string;\n }): Promise<SessionCheckpointEntry> {\n return this.appendEntry<SessionCheckpointEntry>({\n type: 'checkpoint',\n parentId: this.getLeafEntry()?.id ?? null,\n data: {\n provider: 'langgraph',\n source: params.source,\n threadId: params.threadId,\n ...(params.runId != null && params.runId !== ''\n ? { runId: params.runId }\n : {}),\n ...(params.checkpointId != null && params.checkpointId !== ''\n ? { checkpointId: params.checkpointId }\n : {}),\n ...(params.checkpointNs != null\n ? { checkpointNs: params.checkpointNs }\n : {}),\n ...(params.parentCheckpointId != null &&\n params.parentCheckpointId !== ''\n ? { parentCheckpointId: params.parentCheckpointId }\n : {}),\n ...(params.reason != null && params.reason !== ''\n ? { reason: params.reason }\n : {}),\n },\n });\n }\n\n getCheckpoints(threadId?: string): SessionCheckpointEntry[] {\n return this.entries.filter(\n (entry): entry is SessionCheckpointEntry =>\n entry.type === 'checkpoint' &&\n (threadId == null || entry.data.threadId === threadId)\n );\n }\n\n getLatestCheckpoint(threadId?: string): SessionCheckpointEntry | undefined {\n const checkpoints = this.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 return checkpoint;\n }\n return undefined;\n }\n\n async branch(\n entryId: string,\n options: SessionBranchOptions = {}\n ): Promise<SessionEntry | undefined> {\n const target = this.getBranchTarget(entryId, options.position ?? 'at');\n await this.setLeaf(target?.id ?? null);\n return target;\n }\n\n async createBranchedSession(\n entryId: string | undefined = this.getLeafEntry()?.id,\n options: SessionForkOptions = {}\n ): Promise<JsonlSessionStore> {\n const target =\n entryId != null && entryId !== ''\n ? this.getBranchTarget(entryId, options.position ?? 'at')\n : this.getLeafEntry();\n const newStore = await JsonlSessionStore.create({\n cwd: options.cwd ?? this.header.cwd,\n name: options.name ?? this.header.name,\n parentSession: this.path,\n });\n const pathEntries = target ? this.getPath(target.id) : [];\n for (const entry of pathEntries) {\n await newStore.appendExistingEntry(entry);\n }\n await newStore.setLeaf(target?.id ?? null);\n return newStore;\n }\n\n async clone(options: SessionForkOptions = {}): Promise<JsonlSessionStore> {\n return this.createBranchedSession(this.getLeafEntry()?.id, {\n ...options,\n position: 'at',\n });\n }\n\n async fork(\n entryId: string,\n options: SessionForkOptions = {}\n ): Promise<JsonlSessionStore> {\n return this.createBranchedSession(entryId, {\n ...options,\n position: options.position ?? 'before',\n });\n }\n\n private getBranchTarget(\n entryId: string,\n position: 'before' | 'at'\n ): SessionEntry | undefined {\n const entry = this.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 : this.getEntry(entry.parentId);\n }\n\n private async appendExistingEntry(entry: SessionEntry): Promise<void> {\n this.entries.push(entry);\n await appendFile(this.path, `${JSON.stringify(entry)}\\n`, 'utf8');\n }\n\n private async appendEntry<TEntry extends SessionEntry>(params: {\n type: TEntry['type'];\n parentId: string | null;\n data: TEntry['data'];\n }): Promise<TEntry> {\n const entry = {\n type: params.type,\n id: createEntryId(),\n parentId: params.parentId,\n timestamp: createTimestamp(),\n data: params.data,\n } as TEntry;\n this.entries.push(entry);\n await appendFile(this.path, `${JSON.stringify(entry)}\\n`, 'utf8');\n return entry;\n }\n\n async existsOnDisk(): Promise<boolean> {\n const fileStat = await stat(this.path).catch(() => undefined);\n return fileStat?.isFile() === true;\n }\n}\n\nexport const SessionManager = JsonlSessionStore;\n"],"names":["join","homedir","resolve","createHash","createSessionId","access","createTimestamp","path","mkdir","dirname","writeFile","readFile","isAbsolute","basename","readdir","messages","deserializeMessage","SystemMessage","getMessageRole","serializeMessage","toJsonValue","appendFile","createEntryId","stat"],"mappings":"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"}
@@ -0,0 +1,221 @@
1
+ 'use strict';
2
+
3
+ var _enum = require('../common/enum.cjs');
4
+ var events = require('../events.cjs');
5
+ var stream = require('../stream.cjs');
6
+ var ids = require('./ids.cjs');
7
+ var messageSerialization = require('./messageSerialization.cjs');
8
+
9
+ function isToolCompletion(result) {
10
+ return 'tool_call' in result;
11
+ }
12
+ function createEventFactory(params) {
13
+ let sequence = 0;
14
+ return (type, data) => ({
15
+ type,
16
+ sequence: sequence++,
17
+ runId: params.runId,
18
+ threadId: params.threadId,
19
+ timestamp: ids.createTimestamp(),
20
+ ...(typeof data !== 'undefined' ? { data: messageSerialization.toJsonValue(data) } : {}),
21
+ });
22
+ }
23
+ function getTokenCount(value) {
24
+ return typeof value === 'number' && Number.isFinite(value) ? value : 0;
25
+ }
26
+ function updateUsage(usage, data) {
27
+ const metadata = data?.output?.usage_metadata;
28
+ if (!metadata) {
29
+ return;
30
+ }
31
+ const inputTokens = getTokenCount(metadata.input_tokens);
32
+ const outputTokens = getTokenCount(metadata.output_tokens);
33
+ const totalTokens = metadata.total_tokens == null
34
+ ? inputTokens + outputTokens
35
+ : getTokenCount(metadata.total_tokens);
36
+ usage.inputTokens += inputTokens;
37
+ usage.outputTokens += outputTokens;
38
+ usage.totalTokens += totalTokens;
39
+ }
40
+ async function callUserHandler(params) {
41
+ const handler = params.userHandlers?.[params.event];
42
+ if (!handler) {
43
+ return;
44
+ }
45
+ await handler.handle(params.event, params.data, params.metadata, params.graph);
46
+ }
47
+ function createRunHandlers(params) {
48
+ const { contentParts, aggregateContent } = stream.createContentAggregator();
49
+ const steps = [];
50
+ const usage = {
51
+ inputTokens: 0,
52
+ outputTokens: 0,
53
+ totalTokens: 0,
54
+ };
55
+ const events$1 = [];
56
+ const createEvent = createEventFactory({
57
+ runId: params.runId,
58
+ threadId: params.threadId,
59
+ });
60
+ const emitEvent = (event) => {
61
+ events$1.push(event);
62
+ params.onEvent?.(event);
63
+ };
64
+ const toolEndHandler = new events.ToolEndHandler();
65
+ const modelEndHandler = new events.ModelEndHandler();
66
+ emitEvent(createEvent('run.started'));
67
+ const handlers = {
68
+ [_enum.GraphEvents.CHAT_MODEL_STREAM]: {
69
+ handle: async (event, data, metadata, graph) => {
70
+ await callUserHandler({
71
+ userHandlers: params.userHandlers,
72
+ event,
73
+ data,
74
+ metadata,
75
+ graph,
76
+ });
77
+ },
78
+ },
79
+ [_enum.GraphEvents.CHAT_MODEL_END]: {
80
+ handle: async (event, data, metadata, graph) => {
81
+ await modelEndHandler.handle(event, data, metadata, graph);
82
+ updateUsage(usage, data);
83
+ emitEvent(createEvent('usage.updated', usage));
84
+ await callUserHandler({
85
+ userHandlers: params.userHandlers,
86
+ event,
87
+ data,
88
+ metadata,
89
+ graph,
90
+ });
91
+ },
92
+ },
93
+ [_enum.GraphEvents.TOOL_END]: {
94
+ handle: async (event, data, metadata, graph) => {
95
+ await toolEndHandler.handle(event, data, metadata, graph);
96
+ await callUserHandler({
97
+ userHandlers: params.userHandlers,
98
+ event,
99
+ data,
100
+ metadata,
101
+ graph,
102
+ });
103
+ },
104
+ },
105
+ [_enum.GraphEvents.ON_RUN_STEP]: {
106
+ handle: async (event, data, metadata, graph) => {
107
+ const runStep = data;
108
+ steps.push(runStep);
109
+ aggregateContent({ event: _enum.GraphEvents.ON_RUN_STEP, data: runStep });
110
+ if (runStep.stepDetails.type === 'tool_calls') {
111
+ emitEvent(createEvent('tool.started', runStep));
112
+ }
113
+ await callUserHandler({
114
+ userHandlers: params.userHandlers,
115
+ event,
116
+ data,
117
+ metadata,
118
+ graph,
119
+ });
120
+ },
121
+ },
122
+ [_enum.GraphEvents.ON_RUN_STEP_DELTA]: {
123
+ handle: async (event, data, metadata, graph) => {
124
+ const delta = data;
125
+ aggregateContent({ event: _enum.GraphEvents.ON_RUN_STEP_DELTA, data: delta });
126
+ emitEvent(createEvent('tool.delta', delta));
127
+ await callUserHandler({
128
+ userHandlers: params.userHandlers,
129
+ event,
130
+ data,
131
+ metadata,
132
+ graph,
133
+ });
134
+ },
135
+ },
136
+ [_enum.GraphEvents.ON_RUN_STEP_COMPLETED]: {
137
+ handle: async (event, data, metadata, graph) => {
138
+ const completed = data;
139
+ aggregateContent({
140
+ event: _enum.GraphEvents.ON_RUN_STEP_COMPLETED,
141
+ data: completed,
142
+ });
143
+ if (isToolCompletion(completed.result)) {
144
+ emitEvent(createEvent('tool.completed', completed));
145
+ }
146
+ await callUserHandler({
147
+ userHandlers: params.userHandlers,
148
+ event,
149
+ data,
150
+ metadata,
151
+ graph,
152
+ });
153
+ },
154
+ },
155
+ [_enum.GraphEvents.ON_MESSAGE_DELTA]: {
156
+ handle: async (event, data, metadata, graph) => {
157
+ const delta = data;
158
+ aggregateContent({ event: _enum.GraphEvents.ON_MESSAGE_DELTA, data: delta });
159
+ emitEvent(createEvent('message.delta', delta));
160
+ await callUserHandler({
161
+ userHandlers: params.userHandlers,
162
+ event,
163
+ data,
164
+ metadata,
165
+ graph,
166
+ });
167
+ },
168
+ },
169
+ [_enum.GraphEvents.ON_REASONING_DELTA]: {
170
+ handle: async (event, data, metadata, graph) => {
171
+ const delta = data;
172
+ aggregateContent({
173
+ event: _enum.GraphEvents.ON_REASONING_DELTA,
174
+ data: delta,
175
+ });
176
+ emitEvent(createEvent('reasoning.delta', delta));
177
+ await callUserHandler({
178
+ userHandlers: params.userHandlers,
179
+ event,
180
+ data,
181
+ metadata,
182
+ graph,
183
+ });
184
+ },
185
+ },
186
+ [_enum.GraphEvents.ON_SUMMARIZE_DELTA]: {
187
+ handle: async (event, data, metadata, graph) => {
188
+ aggregateContent({
189
+ event: _enum.GraphEvents.ON_SUMMARIZE_DELTA,
190
+ data: data,
191
+ });
192
+ await callUserHandler({
193
+ userHandlers: params.userHandlers,
194
+ event,
195
+ data,
196
+ metadata,
197
+ graph,
198
+ });
199
+ },
200
+ },
201
+ [_enum.GraphEvents.ON_SUMMARIZE_COMPLETE]: {
202
+ handle: async (event, data, metadata, graph) => {
203
+ aggregateContent({
204
+ event: _enum.GraphEvents.ON_SUMMARIZE_COMPLETE,
205
+ data: data,
206
+ });
207
+ await callUserHandler({
208
+ userHandlers: params.userHandlers,
209
+ event,
210
+ data,
211
+ metadata,
212
+ graph,
213
+ });
214
+ },
215
+ },
216
+ };
217
+ return { contentParts, steps, usage, events: events$1, handlers };
218
+ }
219
+
220
+ exports.createRunHandlers = createRunHandlers;
221
+ //# sourceMappingURL=handlers.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.cjs","sources":["../../../src/session/handlers.ts"],"sourcesContent":["import type { UsageMetadata } from '@langchain/core/messages';\nimport { GraphEvents } from '@/common';\nimport { ModelEndHandler, ToolEndHandler } from '@/events';\nimport { createContentAggregator } from '@/stream';\nimport type * as t from '@/types';\nimport type {\n AgentSessionHandlersResult,\n AgentSessionStreamEvent,\n AgentSessionUsage,\n} from './types';\nimport { createTimestamp } from './ids';\nimport { toJsonValue } from './messageSerialization';\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 const handlers: Record<string, t.EventHandler> = {\n [GraphEvents.CHAT_MODEL_STREAM]: {\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 [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"],"names":["createTimestamp","toJsonValue","createContentAggregator","events","ToolEndHandler","ModelEndHandler","GraphEvents"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ var crypto = require('crypto');
4
+
5
+ function createSessionId() {
6
+ return crypto.randomUUID();
7
+ }
8
+ function createEntryId() {
9
+ return crypto.randomUUID().replace(/-/g, '').slice(0, 12);
10
+ }
11
+ function createRunId() {
12
+ return crypto.randomUUID();
13
+ }
14
+ function createTimestamp() {
15
+ return new Date().toISOString();
16
+ }
17
+
18
+ exports.createEntryId = createEntryId;
19
+ exports.createRunId = createRunId;
20
+ exports.createSessionId = createSessionId;
21
+ exports.createTimestamp = createTimestamp;
22
+ //# sourceMappingURL=ids.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.cjs","sources":["../../../src/session/ids.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\n\nexport function createSessionId(): string {\n return randomUUID();\n}\n\nexport function createEntryId(): string {\n return randomUUID().replace(/-/g, '').slice(0, 12);\n}\n\nexport function createRunId(): string {\n return randomUUID();\n}\n\nexport function createTimestamp(): string {\n return new Date().toISOString();\n}\n"],"names":["randomUUID"],"mappings":";;;;SAEgB,eAAe,GAAA;IAC7B,OAAOA,iBAAU,EAAE;AACrB;SAEgB,aAAa,GAAA;AAC3B,IAAA,OAAOA,iBAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AACpD;SAEgB,WAAW,GAAA;IACzB,OAAOA,iBAAU,EAAE;AACrB;SAEgB,eAAe,GAAA;AAC7B,IAAA,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACjC;;;;;;;"}
@@ -0,0 +1,179 @@
1
+ 'use strict';
2
+
3
+ var messages = require('@langchain/core/messages');
4
+
5
+ const CIRCULAR_REFERENCE = '[Circular]';
6
+ function isJsonPrimitive(value) {
7
+ return (value == null ||
8
+ typeof value === 'string' ||
9
+ typeof value === 'number' ||
10
+ typeof value === 'boolean');
11
+ }
12
+ function toJsonValueInternal(value, seen) {
13
+ if (isJsonPrimitive(value)) {
14
+ return Number.isNaN(value) ? null : value;
15
+ }
16
+ if (Array.isArray(value)) {
17
+ if (seen.has(value)) {
18
+ return CIRCULAR_REFERENCE;
19
+ }
20
+ seen.add(value);
21
+ const result = value.map((item) => toJsonValueInternal(item, seen));
22
+ seen.delete(value);
23
+ return result;
24
+ }
25
+ if (value instanceof Error) {
26
+ if (seen.has(value)) {
27
+ return CIRCULAR_REFERENCE;
28
+ }
29
+ seen.add(value);
30
+ const result = {
31
+ name: value.name,
32
+ message: value.message,
33
+ };
34
+ if (value.stack != null && value.stack !== '') {
35
+ result.stack = value.stack;
36
+ }
37
+ if ('cause' in value && typeof value.cause !== 'undefined') {
38
+ result.cause = toJsonValueInternal(value.cause, seen);
39
+ }
40
+ for (const [key, nested] of Object.entries(value)) {
41
+ if (typeof nested !== 'undefined') {
42
+ result[key] = toJsonValueInternal(nested, seen);
43
+ }
44
+ }
45
+ seen.delete(value);
46
+ return result;
47
+ }
48
+ if (value !== null && typeof value === 'object') {
49
+ if (seen.has(value)) {
50
+ return CIRCULAR_REFERENCE;
51
+ }
52
+ seen.add(value);
53
+ const result = {};
54
+ for (const [key, nested] of Object.entries(value)) {
55
+ if (typeof nested !== 'undefined') {
56
+ result[key] = toJsonValueInternal(nested, seen);
57
+ }
58
+ }
59
+ seen.delete(value);
60
+ return result;
61
+ }
62
+ return String(value);
63
+ }
64
+ function toJsonValue(value) {
65
+ return toJsonValueInternal(value, new WeakSet());
66
+ }
67
+ function toJsonObject(value) {
68
+ if (value == null || typeof value !== 'object' || Array.isArray(value)) {
69
+ return undefined;
70
+ }
71
+ return toJsonValue(value);
72
+ }
73
+ function fromJsonValue(value) {
74
+ return value;
75
+ }
76
+ function serializeMessage(message) {
77
+ const extras = message;
78
+ const serialized = {
79
+ messageType: message._getType(),
80
+ content: toJsonValue(message.content),
81
+ };
82
+ const additionalKwargs = toJsonObject(extras.additional_kwargs);
83
+ const responseMetadata = toJsonObject(extras.response_metadata);
84
+ const usageMetadata = toJsonObject(extras.usage_metadata);
85
+ if (additionalKwargs) {
86
+ serialized.additionalKwargs = additionalKwargs;
87
+ }
88
+ if (responseMetadata) {
89
+ serialized.responseMetadata = responseMetadata;
90
+ }
91
+ if (usageMetadata) {
92
+ serialized.usageMetadata = usageMetadata;
93
+ }
94
+ if (extras.id != null && extras.id !== '') {
95
+ serialized.id = extras.id;
96
+ }
97
+ if (extras.name != null && extras.name !== '') {
98
+ serialized.name = extras.name;
99
+ }
100
+ if (extras.tool_call_id != null && extras.tool_call_id !== '') {
101
+ serialized.toolCallId = extras.tool_call_id;
102
+ }
103
+ if (extras.tool_calls) {
104
+ serialized.toolCalls = toJsonValue(extras.tool_calls);
105
+ }
106
+ return serialized;
107
+ }
108
+ function deserializeMessage(serialized) {
109
+ const common = {
110
+ content: fromJsonValue(serialized.content),
111
+ additional_kwargs: serialized.additionalKwargs,
112
+ response_metadata: serialized.responseMetadata,
113
+ id: serialized.id,
114
+ name: serialized.name,
115
+ };
116
+ if (serialized.messageType === 'human') {
117
+ return new messages.HumanMessage(common);
118
+ }
119
+ if (serialized.messageType === 'ai') {
120
+ return new messages.AIMessage({
121
+ ...common,
122
+ tool_calls: serialized.toolCalls,
123
+ usage_metadata: serialized.usageMetadata,
124
+ });
125
+ }
126
+ if (serialized.messageType === 'system') {
127
+ return new messages.SystemMessage(common);
128
+ }
129
+ if (serialized.messageType === 'tool') {
130
+ return new messages.ToolMessage({
131
+ ...common,
132
+ tool_call_id: serialized.toolCallId ?? '',
133
+ });
134
+ }
135
+ if (serialized.messageType === 'remove') {
136
+ return new messages.RemoveMessage({
137
+ additional_kwargs: serialized.additionalKwargs,
138
+ response_metadata: serialized.responseMetadata,
139
+ id: serialized.id ?? '',
140
+ name: serialized.name,
141
+ });
142
+ }
143
+ return new messages.HumanMessage(common);
144
+ }
145
+ function getMessageRole(message) {
146
+ const type = message._getType();
147
+ if (type === 'human') {
148
+ return 'user';
149
+ }
150
+ if (type === 'ai') {
151
+ return 'assistant';
152
+ }
153
+ return type;
154
+ }
155
+ function extractTextFromContent(content) {
156
+ if (typeof content === 'string') {
157
+ return content;
158
+ }
159
+ if (!Array.isArray(content)) {
160
+ return '';
161
+ }
162
+ const chunks = [];
163
+ for (const part of content) {
164
+ if (part != null && typeof part === 'object' && !Array.isArray(part)) {
165
+ const text = part.text;
166
+ if (typeof text === 'string') {
167
+ chunks.push(text);
168
+ }
169
+ }
170
+ }
171
+ return chunks.join('');
172
+ }
173
+
174
+ exports.deserializeMessage = deserializeMessage;
175
+ exports.extractTextFromContent = extractTextFromContent;
176
+ exports.getMessageRole = getMessageRole;
177
+ exports.serializeMessage = serializeMessage;
178
+ exports.toJsonValue = toJsonValue;
179
+ //# sourceMappingURL=messageSerialization.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageSerialization.cjs","sources":["../../../src/session/messageSerialization.ts"],"sourcesContent":["import {\n AIMessage,\n HumanMessage,\n RemoveMessage,\n SystemMessage,\n ToolMessage,\n BaseMessage,\n} from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { UsageMetadata } from '@langchain/core/messages';\nimport type { JsonObject, JsonValue, SerializedSessionMessage } from './types';\n\ntype MessageExtras = {\n id?: string;\n name?: string;\n tool_call_id?: string;\n tool_calls?: ToolCall[];\n usage_metadata?: UsageMetadata;\n additional_kwargs?: unknown;\n response_metadata?: unknown;\n};\n\nconst CIRCULAR_REFERENCE = '[Circular]';\n\nfunction isJsonPrimitive(\n value: unknown\n): value is string | number | boolean | null {\n return (\n value == null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n );\n}\n\nfunction toJsonValueInternal(value: unknown, seen: WeakSet<object>): JsonValue {\n if (isJsonPrimitive(value)) {\n return Number.isNaN(value) ? null : value;\n }\n if (Array.isArray(value)) {\n if (seen.has(value)) {\n return CIRCULAR_REFERENCE;\n }\n seen.add(value);\n const result = value.map((item) => toJsonValueInternal(item, seen));\n seen.delete(value);\n return result;\n }\n if (value instanceof Error) {\n if (seen.has(value)) {\n return CIRCULAR_REFERENCE;\n }\n seen.add(value);\n const result: JsonObject = {\n name: value.name,\n message: value.message,\n };\n if (value.stack != null && value.stack !== '') {\n result.stack = value.stack;\n }\n if ('cause' in value && typeof value.cause !== 'undefined') {\n result.cause = toJsonValueInternal(value.cause, seen);\n }\n for (const [key, nested] of Object.entries(value)) {\n if (typeof nested !== 'undefined') {\n result[key] = toJsonValueInternal(nested, seen);\n }\n }\n seen.delete(value);\n return result;\n }\n if (value !== null && typeof value === 'object') {\n if (seen.has(value)) {\n return CIRCULAR_REFERENCE;\n }\n seen.add(value);\n const result: JsonObject = {};\n for (const [key, nested] of Object.entries(value)) {\n if (typeof nested !== 'undefined') {\n result[key] = toJsonValueInternal(nested, seen);\n }\n }\n seen.delete(value);\n return result;\n }\n return String(value);\n}\n\nexport function toJsonValue(value: unknown): JsonValue {\n return toJsonValueInternal(value, new WeakSet<object>());\n}\n\nfunction toJsonObject(value: unknown): JsonObject | undefined {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n return toJsonValue(value) as JsonObject;\n}\n\nfunction fromJsonValue(value: JsonValue): unknown {\n return value;\n}\n\nexport function serializeMessage(\n message: BaseMessage\n): SerializedSessionMessage {\n const extras = message as BaseMessage & MessageExtras;\n const serialized: SerializedSessionMessage = {\n messageType: message._getType(),\n content: toJsonValue(message.content),\n };\n const additionalKwargs = toJsonObject(extras.additional_kwargs);\n const responseMetadata = toJsonObject(extras.response_metadata);\n const usageMetadata = toJsonObject(extras.usage_metadata);\n if (additionalKwargs) {\n serialized.additionalKwargs = additionalKwargs;\n }\n if (responseMetadata) {\n serialized.responseMetadata = responseMetadata;\n }\n if (usageMetadata) {\n serialized.usageMetadata = usageMetadata;\n }\n if (extras.id != null && extras.id !== '') {\n serialized.id = extras.id;\n }\n if (extras.name != null && extras.name !== '') {\n serialized.name = extras.name;\n }\n if (extras.tool_call_id != null && extras.tool_call_id !== '') {\n serialized.toolCallId = extras.tool_call_id;\n }\n if (extras.tool_calls) {\n serialized.toolCalls = toJsonValue(extras.tool_calls);\n }\n return serialized;\n}\n\nexport function deserializeMessage(\n serialized: SerializedSessionMessage\n): BaseMessage {\n const common = {\n content: fromJsonValue(serialized.content) as BaseMessage['content'],\n additional_kwargs: serialized.additionalKwargs,\n response_metadata: serialized.responseMetadata,\n id: serialized.id,\n name: serialized.name,\n };\n if (serialized.messageType === 'human') {\n return new HumanMessage(common);\n }\n if (serialized.messageType === 'ai') {\n return new AIMessage({\n ...common,\n tool_calls: serialized.toolCalls as ToolCall[] | undefined,\n usage_metadata: serialized.usageMetadata as UsageMetadata | undefined,\n });\n }\n if (serialized.messageType === 'system') {\n return new SystemMessage(common);\n }\n if (serialized.messageType === 'tool') {\n return new ToolMessage({\n ...common,\n tool_call_id: serialized.toolCallId ?? '',\n });\n }\n if (serialized.messageType === 'remove') {\n return new RemoveMessage({\n additional_kwargs: serialized.additionalKwargs,\n response_metadata: serialized.responseMetadata,\n id: serialized.id ?? '',\n name: serialized.name,\n });\n }\n return new HumanMessage(common);\n}\n\nexport function getMessageRole(message: BaseMessage): string {\n const type = message._getType();\n if (type === 'human') {\n return 'user';\n }\n if (type === 'ai') {\n return 'assistant';\n }\n return type;\n}\n\nexport function extractTextFromContent(content: JsonValue): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n const chunks: string[] = [];\n for (const part of content) {\n if (part != null && typeof part === 'object' && !Array.isArray(part)) {\n const text = part.text;\n if (typeof text === 'string') {\n chunks.push(text);\n }\n }\n }\n return chunks.join('');\n}\n"],"names":["HumanMessage","AIMessage","SystemMessage","ToolMessage","RemoveMessage"],"mappings":"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"}