@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.
- package/README.md +69 -0
- package/dist/cjs/events.cjs +23 -0
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +133 -18
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +251 -53
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/init.cjs +1 -5
- package/dist/cjs/llm/init.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +113 -24
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +3 -1
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +18 -5
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/openai/index.cjs +253 -0
- package/dist/cjs/openai/index.cjs.map +1 -0
- package/dist/cjs/responses/index.cjs +448 -0
- package/dist/cjs/responses/index.cjs.map +1 -0
- package/dist/cjs/run.cjs +108 -7
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/AgentSession.cjs +1057 -0
- package/dist/cjs/session/AgentSession.cjs.map +1 -0
- package/dist/cjs/session/JsonlSessionStore.cjs +425 -0
- package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -0
- package/dist/cjs/session/handlers.cjs +221 -0
- package/dist/cjs/session/handlers.cjs.map +1 -0
- package/dist/cjs/session/ids.cjs +22 -0
- package/dist/cjs/session/ids.cjs.map +1 -0
- package/dist/cjs/session/messageSerialization.cjs +179 -0
- package/dist/cjs/session/messageSerialization.cjs.map +1 -0
- package/dist/cjs/stream.cjs +475 -11
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +1 -1
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +177 -59
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/eagerEventExecution.cjs +113 -0
- package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -0
- package/dist/cjs/tools/handlers.cjs +1 -1
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/streamedToolCallSeals.cjs +42 -0
- package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -0
- package/dist/esm/events.mjs +23 -1
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +133 -18
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +251 -53
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/init.mjs +1 -5
- package/dist/esm/llm/init.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +113 -25
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +4 -2
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/main.mjs +5 -1
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/openai/index.mjs +246 -0
- package/dist/esm/openai/index.mjs.map +1 -0
- package/dist/esm/responses/index.mjs +440 -0
- package/dist/esm/responses/index.mjs.map +1 -0
- package/dist/esm/run.mjs +108 -7
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/AgentSession.mjs +1054 -0
- package/dist/esm/session/AgentSession.mjs.map +1 -0
- package/dist/esm/session/JsonlSessionStore.mjs +422 -0
- package/dist/esm/session/JsonlSessionStore.mjs.map +1 -0
- package/dist/esm/session/handlers.mjs +219 -0
- package/dist/esm/session/handlers.mjs.map +1 -0
- package/dist/esm/session/ids.mjs +17 -0
- package/dist/esm/session/ids.mjs.map +1 -0
- package/dist/esm/session/messageSerialization.mjs +173 -0
- package/dist/esm/session/messageSerialization.mjs.map +1 -0
- package/dist/esm/stream.mjs +476 -12
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +1 -1
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +177 -59
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/eagerEventExecution.mjs +107 -0
- package/dist/esm/tools/eagerEventExecution.mjs.map +1 -0
- package/dist/esm/tools/handlers.mjs +1 -1
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/streamedToolCallSeals.mjs +36 -0
- package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -0
- package/dist/types/events.d.ts +1 -0
- package/dist/types/graphs/Graph.d.ts +24 -9
- package/dist/types/index.d.ts +1 -0
- package/dist/types/llm/openai/index.d.ts +1 -0
- package/dist/types/openai/index.d.ts +75 -0
- package/dist/types/responses/index.d.ts +97 -0
- package/dist/types/run.d.ts +2 -0
- package/dist/types/session/AgentSession.d.ts +32 -0
- package/dist/types/session/JsonlSessionStore.d.ts +67 -0
- package/dist/types/session/handlers.d.ts +8 -0
- package/dist/types/session/ids.d.ts +4 -0
- package/dist/types/session/index.d.ts +5 -0
- package/dist/types/session/messageSerialization.d.ts +7 -0
- package/dist/types/session/types.d.ts +191 -0
- package/dist/types/tools/ToolNode.d.ts +12 -1
- package/dist/types/tools/eagerEventExecution.d.ts +23 -0
- package/dist/types/tools/streamedToolCallSeals.d.ts +13 -0
- package/dist/types/types/hitl.d.ts +4 -0
- package/dist/types/types/run.d.ts +11 -1
- package/dist/types/types/tools.d.ts +36 -0
- package/package.json +19 -2
- package/src/__tests__/stream.eagerEventExecution.test.ts +2571 -0
- package/src/events.ts +29 -0
- package/src/graphs/Graph.ts +224 -50
- package/src/graphs/MultiAgentGraph.ts +1 -1
- package/src/graphs/__tests__/composition.smoke.test.ts +30 -0
- package/src/index.ts +3 -0
- package/src/llm/anthropic/index.ts +356 -84
- package/src/llm/anthropic/llm.spec.ts +64 -0
- package/src/llm/custom-chat-models.smoke.test.ts +175 -4
- package/src/llm/openai/contentBlocks.test.ts +35 -0
- package/src/llm/openai/deepseek.test.ts +201 -2
- package/src/llm/openai/index.ts +171 -26
- package/src/llm/openai/utils/index.ts +22 -0
- package/src/llm/openrouter/index.ts +4 -2
- package/src/openai/__tests__/openai.test.ts +337 -0
- package/src/openai/index.ts +404 -0
- package/src/responses/__tests__/responses.test.ts +652 -0
- package/src/responses/index.ts +677 -0
- package/src/run.ts +158 -8
- package/src/scripts/compare_pi_vs_ours.ts +592 -173
- package/src/scripts/session_live.ts +548 -0
- package/src/session/AgentSession.ts +1432 -0
- package/src/session/JsonlSessionStore.ts +572 -0
- package/src/session/__tests__/JsonlSessionStore.test.ts +1410 -0
- package/src/session/__tests__/handlers.test.ts +161 -0
- package/src/session/handlers.ts +272 -0
- package/src/session/ids.ts +17 -0
- package/src/session/index.ts +44 -0
- package/src/session/messageSerialization.ts +207 -0
- package/src/session/types.ts +275 -0
- package/src/specs/custom-event-await.test.ts +89 -0
- package/src/specs/summarization.test.ts +1 -1
- package/src/stream.ts +756 -48
- package/src/summarization/node.ts +1 -1
- package/src/tools/ToolNode.ts +299 -126
- package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +373 -0
- package/src/tools/__tests__/handlers.test.ts +2 -1
- package/src/tools/__tests__/hitl.test.ts +206 -110
- package/src/tools/eagerEventExecution.ts +153 -0
- package/src/tools/handlers.ts +8 -4
- package/src/tools/streamedToolCallSeals.ts +57 -0
- package/src/types/hitl.ts +4 -0
- package/src/types/run.ts +11 -0
- package/src/types/tools.ts +36 -0
- package/dist/cjs/llm/text.cjs +0 -69
- package/dist/cjs/llm/text.cjs.map +0 -1
- package/dist/esm/llm/text.mjs +0 -67
- 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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"}
|