@langgraph-js/pure-graph 3.0.0 → 3.0.1
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/dist/adapter/fetch/index.js +2 -2
- package/dist/adapter/nextjs/index.js +1 -1
- package/dist/{createEndpoint-BViLxrhh.js → createEndpoint-Bz70ehjn.js} +2 -2
- package/dist/{createEndpoint-BViLxrhh.js.map → createEndpoint-Bz70ehjn.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/{queue-CtVch_az.js → queue-Bfg-8ehP.js} +2 -2
- package/dist/{queue-CtVch_az.js.map → queue-Bfg-8ehP.js.map} +1 -1
- package/dist/remote/index.js +1 -1
- package/dist/{sqlite-adapter-5PeLHaxe.js → sqlite-adapter-Bbonr5S5.js} +8 -4
- package/dist/sqlite-adapter-Bbonr5S5.js.map +1 -0
- package/dist/{stream-umoA6h4q.js → stream-Crp1K8nB.js} +3 -3
- package/dist/{stream-umoA6h4q.js.map → stream-Crp1K8nB.js.map} +1 -1
- package/package.json +1 -1
- package/dist/sqlite-adapter-5PeLHaxe.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { s as serialiseAsDict, a as streamState, g as getGraph, L as LangGraphGlobal } from '../../stream-
|
|
2
|
-
import { c as createEndpoint } from '../../createEndpoint-
|
|
1
|
+
import { s as serialiseAsDict, a as streamState, g as getGraph, L as LangGraphGlobal } from '../../stream-Crp1K8nB.js';
|
|
2
|
+
import { c as createEndpoint } from '../../createEndpoint-Bz70ehjn.js';
|
|
3
3
|
import z from 'zod';
|
|
4
4
|
import camelcaseKeys from 'camelcase-keys';
|
|
5
5
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L as LangGraphGlobal, a as streamState, G as GRAPHS, g as getGraph } from './stream-
|
|
1
|
+
import { L as LangGraphGlobal, a as streamState, G as GRAPHS, g as getGraph } from './stream-Crp1K8nB.js';
|
|
2
2
|
|
|
3
3
|
const AssistantEndpoint = {
|
|
4
4
|
async search(query) {
|
|
@@ -205,4 +205,4 @@ const createEndpoint = () => {
|
|
|
205
205
|
};
|
|
206
206
|
|
|
207
207
|
export { AssistantEndpoint as A, createEndpoint as c };
|
|
208
|
-
//# sourceMappingURL=createEndpoint-
|
|
208
|
+
//# sourceMappingURL=createEndpoint-Bz70ehjn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createEndpoint-BViLxrhh.js","sources":["../src/createEndpoint.ts"],"sourcesContent":["import { StreamEvent } from '@langchain/core/tracers/log_stream';\nimport { streamState } from './graph/stream.js';\nimport { Assistant, Run, StreamMode, Metadata, AssistantGraph } from '@langchain/langgraph-sdk';\nimport { getGraph, GRAPHS } from './utils/getGraph.js';\nimport { LangGraphGlobal } from './global.js';\nimport { AssistantSortBy, CancelAction, ILangGraphClient, RunStatus, SortOrder, StreamInputData } from './types.js';\nexport { registerGraph } from './utils/getGraph.js';\n\nexport const AssistantEndpoint: ILangGraphClient['assistants'] = {\n async search(query?: {\n graphId?: string;\n metadata?: Metadata;\n limit?: number;\n offset?: number;\n sortBy?: AssistantSortBy;\n sortOrder?: SortOrder;\n }): Promise<Assistant[]> {\n let results = Object.entries(GRAPHS).map(\n ([graphId, _]) =>\n ({\n assistant_id: graphId,\n graph_id: graphId,\n config: {},\n metadata: {},\n version: 1,\n name: graphId,\n description: '',\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n } as Assistant),\n );\n\n // Filter by graphId\n if (query?.graphId) {\n results = results.filter((a) => a.graph_id === query.graphId);\n }\n\n // Filter by metadata (simple implementation - check if all metadata keys/values match)\n if (query?.metadata && Object.keys(query.metadata).length > 0) {\n results = results.filter((assistant) => {\n return Object.entries(query.metadata!).every(([key, value]) => {\n return assistant.metadata && assistant.metadata[key] === value;\n });\n });\n }\n\n // Sort results\n if (query?.sortBy) {\n results.sort((a, b) => {\n const aValue = a[query.sortBy!];\n const bValue = b[query.sortBy!];\n const comparison = aValue < bValue ? -1 : aValue > bValue ? 1 : 0;\n return query.sortOrder === 'desc' ? -comparison : comparison;\n });\n }\n\n // Pagination\n const offset = query?.offset ?? 0;\n const limit = query?.limit;\n const paginatedResults = limit ? results.slice(offset, offset + limit) : results.slice(offset);\n\n return paginatedResults;\n },\n\n async count(query?: { graphId?: string; metadata?: Metadata }): Promise<number> {\n const results = await this.search(query);\n return results.length;\n },\n\n async get(assistantId: string): Promise<Assistant> {\n const assistant = Object.entries(GRAPHS).find(([graphId, _]) => graphId === assistantId);\n if (!assistant) {\n throw new Error(`Assistant not found: ${assistantId}`);\n }\n return {\n assistant_id: assistantId,\n graph_id: assistantId,\n config: {},\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n metadata: {},\n version: 1,\n name: assistantId,\n description: '',\n } as Assistant;\n },\n\n async delete(assistantId: string): Promise<void> {\n // ⚠️ 删除 assistant 不可用 - assistants 是从注册的图中生成的,不能删除\n throw new Error('Deleting assistants is not supported. Assistants are generated from registered graphs.');\n },\n\n async update(\n assistantId: string,\n updates: Partial<Pick<Assistant, 'name' | 'description' | 'metadata' | 'config'>>,\n ): Promise<Assistant> {\n // ⚠️ 更新 assistant 不可用 - assistants 是从注册的图中生成的,不能更新\n throw new Error('Updating assistants is not supported. Assistants are generated from registered graphs.');\n },\n\n async getGraph(assistantId: string, options?: { xray?: boolean | number }): Promise<AssistantGraph> {\n const config = {};\n const graph = await getGraph(assistantId, config);\n const drawable = await graph.getGraphAsync({\n ...config,\n xray: options?.xray ?? undefined,\n });\n return drawable.toJSON() as AssistantGraph;\n },\n\n async getSchemas(assistantId: string): Promise<{ graph_id: string; state_schema: any }> {\n const compiledGraph = await getGraph(assistantId, {});\n const builder = compiledGraph.builder;\n console.log(builder);\n return {\n graph_id: assistantId,\n /** @ts-ignore */\n state_schema: builder._inputDefinition,\n /** @ts-ignore */\n input_schema: builder._inputDefinition,\n /** @ts-ignore */\n output_schema: builder._outputDefinition,\n /** @ts-ignore */\n config_schema: builder._configSchema,\n /** @ts-ignoreß */\n context_schema: builder._configSchema,\n };\n },\n\n async getVersions(assistantId: string, options?: { limit?: number; offset?: number }): Promise<Assistant[]> {\n // ⚠️ 版本管理不可用 - 当前实现不支持多版本\n const assistant = await this.get(assistantId);\n const offset = options?.offset ?? 0;\n const limit = options?.limit;\n const results = limit ? [assistant].slice(offset, offset + limit) : [assistant].slice(offset);\n return results;\n },\n\n async setLatest(assistantId: string, version: number): Promise<Assistant> {\n // Fake\n const item = await this.get(assistantId);\n item.version = version;\n return item;\n },\n\n async create(params: {\n assistantId?: string;\n graphId: string;\n name?: string;\n description?: string;\n metadata?: Metadata;\n config?: any;\n ifExists?: 'raise' | 'do_nothing';\n }): Promise<Assistant> {\n // ⚠️ 创建 assistant 不可用 - assistants 是从注册的图中自动生成的,不能动态创建\n // 返回假数据以通过测试\n console.warn(\n '⚠️ Creating assistants is not supported. Assistants are generated from registered graphs. Returning mock data.',\n );\n const graphExists = Object.keys(GRAPHS).includes(params.graphId);\n\n if (!graphExists) {\n if (params.ifExists === 'raise') {\n throw new Error(`Graph not found: ${params.graphId}`);\n }\n // 如果 graph 不存在,我们仍然返回假数据\n }\n\n return {\n assistant_id: params.assistantId || params.graphId,\n graph_id: params.graphId,\n name: params.name || params.graphId,\n description: params.description || '',\n metadata: params.metadata || {},\n config: params.config || {},\n version: 1,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n } as Assistant;\n },\n};\n\nexport const createEndpoint = () => {\n const getThreads = () => {\n return LangGraphGlobal.globalThreadsManager;\n };\n return {\n assistants: AssistantEndpoint,\n get threads() {\n return LangGraphGlobal.globalThreadsManager;\n },\n runs: {\n list(\n threadId: string,\n options?: {\n limit?: number;\n offset?: number;\n status?: RunStatus;\n },\n ): Promise<Run[]> {\n return getThreads().listRuns(threadId, options);\n },\n async cancel(threadId: string, runId: string, wait?: boolean, action?: CancelAction): Promise<void> {\n return await LangGraphGlobal.globalMessageQueue.cancelQueue(runId);\n },\n async *stream(threadId: string, assistantId: string, payload: StreamInputData) {\n payload.config = {\n ...(payload.config ?? {}),\n configurable: {\n ...(payload.config?.configurable ?? {}),\n graph_id: assistantId,\n thread_id: threadId,\n },\n };\n const threads = getThreads();\n for await (const data of streamState(\n threads,\n threads.createRun(threadId, assistantId, payload),\n payload,\n {\n attempt: 0,\n getGraph,\n },\n )) {\n yield data;\n }\n },\n async *joinStream(\n threadId: string,\n runId: string,\n options?:\n | {\n signal?: AbortSignal;\n cancelOnDisconnect?: boolean;\n lastEventId?: string;\n streamMode?: StreamMode | StreamMode[];\n }\n | AbortSignal,\n ): AsyncGenerator<{ id?: string; event: StreamEvent; data: any }> {\n // 处理参数兼容性\n const config = options && typeof options === 'object' && 'signal' in options ? options : {};\n const signal =\n (options instanceof AbortSignal ? options : config.signal) || new AbortController().signal;\n\n try {\n // 获取 Redis 队列实例\n const queue = await LangGraphGlobal.globalMessageQueue.getQueue(runId);\n const allData = await queue.getAll();\n for (const eventMessage of allData) {\n yield {\n id: eventMessage.id,\n event: eventMessage.event as unknown as StreamEvent,\n data: eventMessage.data,\n };\n // 如果是流结束信号,停止监听\n if (\n eventMessage.event === '__stream_end__' ||\n eventMessage.event === '__stream_error__' ||\n eventMessage.event === '__stream_cancel__'\n ) {\n return;\n }\n }\n // 监听队列数据并转换格式\n for await (const eventMessage of queue.onDataReceive()) {\n // 检查是否被取消\n if (signal.aborted) {\n break;\n }\n\n // 转换 EventMessage 为期望的格式\n const event = eventMessage.event as unknown as StreamEvent;\n const data = eventMessage.data;\n\n yield {\n id: eventMessage.id,\n event,\n data,\n };\n\n // 如果是流结束信号,停止监听\n if (\n eventMessage.event === '__stream_end__' ||\n eventMessage.event === '__stream_error__' ||\n eventMessage.event === '__stream_cancel__'\n ) {\n break;\n }\n }\n } catch (error) {\n // 如果队列不存在或其他错误,记录警告但不抛出错误\n console.warn('Join stream failed:', error);\n }\n },\n },\n };\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createEndpoint-Bz70ehjn.js","sources":["../src/createEndpoint.ts"],"sourcesContent":["import { StreamEvent } from '@langchain/core/tracers/log_stream';\nimport { streamState } from './graph/stream.js';\nimport { Assistant, Run, StreamMode, Metadata, AssistantGraph } from '@langchain/langgraph-sdk';\nimport { getGraph, GRAPHS } from './utils/getGraph.js';\nimport { LangGraphGlobal } from './global.js';\nimport { AssistantSortBy, CancelAction, ILangGraphClient, RunStatus, SortOrder, StreamInputData } from './types.js';\nexport { registerGraph } from './utils/getGraph.js';\n\nexport const AssistantEndpoint: ILangGraphClient['assistants'] = {\n async search(query?: {\n graphId?: string;\n metadata?: Metadata;\n limit?: number;\n offset?: number;\n sortBy?: AssistantSortBy;\n sortOrder?: SortOrder;\n }): Promise<Assistant[]> {\n let results = Object.entries(GRAPHS).map(\n ([graphId, _]) =>\n ({\n assistant_id: graphId,\n graph_id: graphId,\n config: {},\n metadata: {},\n version: 1,\n name: graphId,\n description: '',\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n } as Assistant),\n );\n\n // Filter by graphId\n if (query?.graphId) {\n results = results.filter((a) => a.graph_id === query.graphId);\n }\n\n // Filter by metadata (simple implementation - check if all metadata keys/values match)\n if (query?.metadata && Object.keys(query.metadata).length > 0) {\n results = results.filter((assistant) => {\n return Object.entries(query.metadata!).every(([key, value]) => {\n return assistant.metadata && assistant.metadata[key] === value;\n });\n });\n }\n\n // Sort results\n if (query?.sortBy) {\n results.sort((a, b) => {\n const aValue = a[query.sortBy!];\n const bValue = b[query.sortBy!];\n const comparison = aValue < bValue ? -1 : aValue > bValue ? 1 : 0;\n return query.sortOrder === 'desc' ? -comparison : comparison;\n });\n }\n\n // Pagination\n const offset = query?.offset ?? 0;\n const limit = query?.limit;\n const paginatedResults = limit ? results.slice(offset, offset + limit) : results.slice(offset);\n\n return paginatedResults;\n },\n\n async count(query?: { graphId?: string; metadata?: Metadata }): Promise<number> {\n const results = await this.search(query);\n return results.length;\n },\n\n async get(assistantId: string): Promise<Assistant> {\n const assistant = Object.entries(GRAPHS).find(([graphId, _]) => graphId === assistantId);\n if (!assistant) {\n throw new Error(`Assistant not found: ${assistantId}`);\n }\n return {\n assistant_id: assistantId,\n graph_id: assistantId,\n config: {},\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n metadata: {},\n version: 1,\n name: assistantId,\n description: '',\n } as Assistant;\n },\n\n async delete(assistantId: string): Promise<void> {\n // ⚠️ 删除 assistant 不可用 - assistants 是从注册的图中生成的,不能删除\n throw new Error('Deleting assistants is not supported. Assistants are generated from registered graphs.');\n },\n\n async update(\n assistantId: string,\n updates: Partial<Pick<Assistant, 'name' | 'description' | 'metadata' | 'config'>>,\n ): Promise<Assistant> {\n // ⚠️ 更新 assistant 不可用 - assistants 是从注册的图中生成的,不能更新\n throw new Error('Updating assistants is not supported. Assistants are generated from registered graphs.');\n },\n\n async getGraph(assistantId: string, options?: { xray?: boolean | number }): Promise<AssistantGraph> {\n const config = {};\n const graph = await getGraph(assistantId, config);\n const drawable = await graph.getGraphAsync({\n ...config,\n xray: options?.xray ?? undefined,\n });\n return drawable.toJSON() as AssistantGraph;\n },\n\n async getSchemas(assistantId: string): Promise<{ graph_id: string; state_schema: any }> {\n const compiledGraph = await getGraph(assistantId, {});\n const builder = compiledGraph.builder;\n console.log(builder);\n return {\n graph_id: assistantId,\n /** @ts-ignore */\n state_schema: builder._inputDefinition,\n /** @ts-ignore */\n input_schema: builder._inputDefinition,\n /** @ts-ignore */\n output_schema: builder._outputDefinition,\n /** @ts-ignore */\n config_schema: builder._configSchema,\n /** @ts-ignoreß */\n context_schema: builder._configSchema,\n };\n },\n\n async getVersions(assistantId: string, options?: { limit?: number; offset?: number }): Promise<Assistant[]> {\n // ⚠️ 版本管理不可用 - 当前实现不支持多版本\n const assistant = await this.get(assistantId);\n const offset = options?.offset ?? 0;\n const limit = options?.limit;\n const results = limit ? [assistant].slice(offset, offset + limit) : [assistant].slice(offset);\n return results;\n },\n\n async setLatest(assistantId: string, version: number): Promise<Assistant> {\n // Fake\n const item = await this.get(assistantId);\n item.version = version;\n return item;\n },\n\n async create(params: {\n assistantId?: string;\n graphId: string;\n name?: string;\n description?: string;\n metadata?: Metadata;\n config?: any;\n ifExists?: 'raise' | 'do_nothing';\n }): Promise<Assistant> {\n // ⚠️ 创建 assistant 不可用 - assistants 是从注册的图中自动生成的,不能动态创建\n // 返回假数据以通过测试\n console.warn(\n '⚠️ Creating assistants is not supported. Assistants are generated from registered graphs. Returning mock data.',\n );\n const graphExists = Object.keys(GRAPHS).includes(params.graphId);\n\n if (!graphExists) {\n if (params.ifExists === 'raise') {\n throw new Error(`Graph not found: ${params.graphId}`);\n }\n // 如果 graph 不存在,我们仍然返回假数据\n }\n\n return {\n assistant_id: params.assistantId || params.graphId,\n graph_id: params.graphId,\n name: params.name || params.graphId,\n description: params.description || '',\n metadata: params.metadata || {},\n config: params.config || {},\n version: 1,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n } as Assistant;\n },\n};\n\nexport const createEndpoint = () => {\n const getThreads = () => {\n return LangGraphGlobal.globalThreadsManager;\n };\n return {\n assistants: AssistantEndpoint,\n get threads() {\n return LangGraphGlobal.globalThreadsManager;\n },\n runs: {\n list(\n threadId: string,\n options?: {\n limit?: number;\n offset?: number;\n status?: RunStatus;\n },\n ): Promise<Run[]> {\n return getThreads().listRuns(threadId, options);\n },\n async cancel(threadId: string, runId: string, wait?: boolean, action?: CancelAction): Promise<void> {\n return await LangGraphGlobal.globalMessageQueue.cancelQueue(runId);\n },\n async *stream(threadId: string, assistantId: string, payload: StreamInputData) {\n payload.config = {\n ...(payload.config ?? {}),\n configurable: {\n ...(payload.config?.configurable ?? {}),\n graph_id: assistantId,\n thread_id: threadId,\n },\n };\n const threads = getThreads();\n for await (const data of streamState(\n threads,\n threads.createRun(threadId, assistantId, payload),\n payload,\n {\n attempt: 0,\n getGraph,\n },\n )) {\n yield data;\n }\n },\n async *joinStream(\n threadId: string,\n runId: string,\n options?:\n | {\n signal?: AbortSignal;\n cancelOnDisconnect?: boolean;\n lastEventId?: string;\n streamMode?: StreamMode | StreamMode[];\n }\n | AbortSignal,\n ): AsyncGenerator<{ id?: string; event: StreamEvent; data: any }> {\n // 处理参数兼容性\n const config = options && typeof options === 'object' && 'signal' in options ? options : {};\n const signal =\n (options instanceof AbortSignal ? options : config.signal) || new AbortController().signal;\n\n try {\n // 获取 Redis 队列实例\n const queue = await LangGraphGlobal.globalMessageQueue.getQueue(runId);\n const allData = await queue.getAll();\n for (const eventMessage of allData) {\n yield {\n id: eventMessage.id,\n event: eventMessage.event as unknown as StreamEvent,\n data: eventMessage.data,\n };\n // 如果是流结束信号,停止监听\n if (\n eventMessage.event === '__stream_end__' ||\n eventMessage.event === '__stream_error__' ||\n eventMessage.event === '__stream_cancel__'\n ) {\n return;\n }\n }\n // 监听队列数据并转换格式\n for await (const eventMessage of queue.onDataReceive()) {\n // 检查是否被取消\n if (signal.aborted) {\n break;\n }\n\n // 转换 EventMessage 为期望的格式\n const event = eventMessage.event as unknown as StreamEvent;\n const data = eventMessage.data;\n\n yield {\n id: eventMessage.id,\n event,\n data,\n };\n\n // 如果是流结束信号,停止监听\n if (\n eventMessage.event === '__stream_end__' ||\n eventMessage.event === '__stream_error__' ||\n eventMessage.event === '__stream_cancel__'\n ) {\n break;\n }\n }\n } catch (error) {\n // 如果队列不存在或其他错误,记录警告但不抛出错误\n console.warn('Join stream failed:', error);\n }\n },\n },\n };\n};\n"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { A as AssistantEndpoint, c as createEndpoint } from './createEndpoint-
|
|
2
|
-
export { L as LangGraphGlobal, r as registerGraph } from './stream-
|
|
1
|
+
export { A as AssistantEndpoint, c as createEndpoint } from './createEndpoint-Bz70ehjn.js';
|
|
2
|
+
export { L as LangGraphGlobal, r as registerGraph } from './stream-Crp1K8nB.js';
|
|
3
3
|
import { entrypoint, getPreviousState, getConfig, Command } from '@langchain/langgraph';
|
|
4
4
|
import { schemaMetaRegistry } from '@langchain/langgraph/zod';
|
|
5
5
|
import { getDefaultsForSchema } from 'zod-defaults';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { B as BaseStreamQueue, C as CancelEventMessage } from './stream-
|
|
1
|
+
import { B as BaseStreamQueue, C as CancelEventMessage } from './stream-Crp1K8nB.js';
|
|
2
2
|
import { createClient } from 'redis';
|
|
3
3
|
|
|
4
4
|
class RedisStreamQueue extends BaseStreamQueue {
|
|
@@ -150,4 +150,4 @@ class RedisStreamQueue extends BaseStreamQueue {
|
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
export { RedisStreamQueue };
|
|
153
|
-
//# sourceMappingURL=queue-
|
|
153
|
+
//# sourceMappingURL=queue-Bfg-8ehP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-CtVch_az.js","sources":["../src/storage/redis/queue.ts"],"sourcesContent":["import { CancelEventMessage, EventMessage } from '../../queue/event_message.js';\nimport { BaseStreamQueue } from '../../queue/stream_queue.js';\nimport { BaseStreamQueueInterface } from '../../queue/stream_queue.js';\nimport { createClient, RedisClientType } from 'redis';\n\n/**\n * Redis Stream 实现的消息队列,用于存储消息\n * 使用 Redis Streams 替代 pub/sub,支持集群模式\n */\nexport class RedisStreamQueue extends BaseStreamQueue implements BaseStreamQueueInterface {\n private redis: RedisClientType;\n private streamKey: string;\n private listKey: string;\n private isConnected = false;\n public cancelSignal: AbortController;\n private lastStreamId: string = '0'; // 最后读取的 Stream ID\n private pollInterval: number = 100; // 轮询间隔(毫秒)\n\n constructor(readonly id: string, readonly compressMessages: boolean = true, readonly ttl: number = 300) {\n super(id, true, ttl);\n this.streamKey = `stream:${this.id}`;\n this.listKey = `queue:${this.id}`;\n this.redis = createClient({\n url: process.env.REDIS_URL,\n });\n this.cancelSignal = new AbortController();\n\n // 连接 Redis 客户端(检查是否已经连接)\n if (!this.redis.isOpen) {\n this.redis.connect();\n }\n this.isConnected = true;\n }\n\n /**\n * 推送消息到 Redis Stream 和 List\n * - Stream: 用于实时推送(集群友好)\n * - List: 用于 getAll() 批量获取历史数据\n */\n async push(item: EventMessage): Promise<void> {\n const encodedData = await this.encodeData(item);\n // 将 Uint8Array 转换为 base64 字符串,以便存储到 Redis Stream\n const dataString = Buffer.from(encodedData).toString('base64');\n const serializedData = Buffer.from(encodedData);\n\n // 推送到 Stream(实时推送)\n // 注意:xAdd 的第三个参数必须是简单的键值对对象,值必须是字符串\n await this.redis.xAdd(this.streamKey, '*', { data: dataString });\n\n // 设置 Stream TTL\n await this.redis.expire(this.streamKey, this.ttl);\n\n // 同时推送到 List(用于 getAll)\n await this.redis.rPush(this.listKey, serializedData);\n await this.redis.expire(this.listKey, this.ttl);\n\n this.emit('dataChange', dataString);\n }\n\n /**\n * 异步生成器:使用 Redis Streams XREAD 轮询消费队列数据\n */\n async *onDataReceive(): AsyncGenerator<EventMessage, void, unknown> {\n let isStreamEnded = false;\n\n // 检查是否已取消\n if (this.cancelSignal.signal.aborted) {\n return;\n }\n\n // 监听取消信号\n const abortHandler = () => {\n isStreamEnded = true;\n };\n this.cancelSignal.signal.addEventListener('abort', abortHandler);\n\n try {\n while (!isStreamEnded && !this.cancelSignal.signal.aborted) {\n // 从 Stream 读取新消息(XREAD 阻塞读取)\n const streams = await this.redis.xRead([{ key: this.streamKey, id: this.lastStreamId }], {\n BLOCK: this.pollInterval,\n COUNT: 10,\n });\n\n if (streams && streams.length > 0) {\n for (const stream of streams) {\n for (const message of stream.messages) {\n // 更新最后读取的 ID\n this.lastStreamId = message.id;\n\n // 解析消息:从 base64 字符串转换回 Uint8Array\n const dataString = message.message.data as string;\n const data = Buffer.from(dataString, 'base64');\n const item = (await this.decodeData(data)) as EventMessage;\n\n // 检查是否为流结束或错误信号\n if (\n item.event === '__stream_end__' ||\n item.event === '__stream_error__' ||\n item.event === '__stream_cancel__'\n ) {\n // 延迟 300ms 后结束,确保消息被消费\n await new Promise((resolve) => setTimeout(resolve, 300));\n isStreamEnded = true;\n\n if (item.event === '__stream_cancel__') {\n await this.cancel();\n }\n }\n\n yield item;\n\n if (isStreamEnded) {\n break;\n }\n }\n if (isStreamEnded) {\n break;\n }\n }\n }\n\n // 轮询间隔\n if (!isStreamEnded && !this.cancelSignal.signal.aborted) {\n await new Promise((resolve) => setTimeout(resolve, this.pollInterval));\n }\n }\n } finally {\n this.cancelSignal.signal.removeEventListener('abort', abortHandler);\n }\n }\n\n /**\n * 获取队列中的所有数据(从 List 获取历史数据)\n */\n async getAll(): Promise<EventMessage[]> {\n const data = await this.redis.lRange(this.listKey, 0, -1);\n\n if (!data || data.length === 0) {\n return [];\n }\n\n if (this.compressMessages) {\n return (await Promise.all(\n data.map((item: Buffer | string) => {\n // 处理 Buffer 或字符串类型\n const buffer = typeof item === 'string' ? Buffer.from(item, 'binary') : item;\n return this.decodeData(buffer);\n }),\n )) as EventMessage[];\n } else {\n return data.map((item: string) => JSON.parse(item) as EventMessage);\n }\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n if (this.isConnected) {\n // 同时清空 Stream 和 List\n this.redis.del(this.streamKey);\n this.redis.del(this.listKey);\n }\n }\n\n /**\n * 取消操作\n */\n async cancel(): Promise<void> {\n // First abort to stop any waiting generators\n this.cancelSignal.abort('user cancel this run');\n // Then push the cancel message to signal other consumers\n await this.push(new CancelEventMessage());\n }\n\n /**\n * 复制队列到另一个队列\n */\n async copyToQueue(toId: string, ttl?: number): Promise<RedisStreamQueue> {\n const queue = new RedisStreamQueue(toId, this.compressMessages, ttl ?? this.ttl);\n\n // 复制 List\n await this.redis.copy(this.listKey, queue.listKey);\n await this.redis.expire(queue.listKey, ttl ?? this.ttl);\n\n // 复制 Stream(需要遍历并重新添加)\n const allStreamData = await this.redis.xRange(this.streamKey, '-', '+');\n if (allStreamData && allStreamData.length > 0) {\n for (const message of allStreamData) {\n // 确保所有值都是字符串,Redis Streams 只支持 string 值\n const fields: Record<string, string> = {};\n for (const [key, value] of Object.entries(message.message)) {\n fields[key] = String(value);\n }\n await this.redis.xAdd(queue.streamKey, '*', fields);\n }\n await this.redis.expire(queue.streamKey, ttl ?? this.ttl);\n }\n\n return queue;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"queue-Bfg-8ehP.js","sources":["../src/storage/redis/queue.ts"],"sourcesContent":["import { CancelEventMessage, EventMessage } from '../../queue/event_message.js';\nimport { BaseStreamQueue } from '../../queue/stream_queue.js';\nimport { BaseStreamQueueInterface } from '../../queue/stream_queue.js';\nimport { createClient, RedisClientType } from 'redis';\n\n/**\n * Redis Stream 实现的消息队列,用于存储消息\n * 使用 Redis Streams 替代 pub/sub,支持集群模式\n */\nexport class RedisStreamQueue extends BaseStreamQueue implements BaseStreamQueueInterface {\n private redis: RedisClientType;\n private streamKey: string;\n private listKey: string;\n private isConnected = false;\n public cancelSignal: AbortController;\n private lastStreamId: string = '0'; // 最后读取的 Stream ID\n private pollInterval: number = 100; // 轮询间隔(毫秒)\n\n constructor(readonly id: string, readonly compressMessages: boolean = true, readonly ttl: number = 300) {\n super(id, true, ttl);\n this.streamKey = `stream:${this.id}`;\n this.listKey = `queue:${this.id}`;\n this.redis = createClient({\n url: process.env.REDIS_URL,\n });\n this.cancelSignal = new AbortController();\n\n // 连接 Redis 客户端(检查是否已经连接)\n if (!this.redis.isOpen) {\n this.redis.connect();\n }\n this.isConnected = true;\n }\n\n /**\n * 推送消息到 Redis Stream 和 List\n * - Stream: 用于实时推送(集群友好)\n * - List: 用于 getAll() 批量获取历史数据\n */\n async push(item: EventMessage): Promise<void> {\n const encodedData = await this.encodeData(item);\n // 将 Uint8Array 转换为 base64 字符串,以便存储到 Redis Stream\n const dataString = Buffer.from(encodedData).toString('base64');\n const serializedData = Buffer.from(encodedData);\n\n // 推送到 Stream(实时推送)\n // 注意:xAdd 的第三个参数必须是简单的键值对对象,值必须是字符串\n await this.redis.xAdd(this.streamKey, '*', { data: dataString });\n\n // 设置 Stream TTL\n await this.redis.expire(this.streamKey, this.ttl);\n\n // 同时推送到 List(用于 getAll)\n await this.redis.rPush(this.listKey, serializedData);\n await this.redis.expire(this.listKey, this.ttl);\n\n this.emit('dataChange', dataString);\n }\n\n /**\n * 异步生成器:使用 Redis Streams XREAD 轮询消费队列数据\n */\n async *onDataReceive(): AsyncGenerator<EventMessage, void, unknown> {\n let isStreamEnded = false;\n\n // 检查是否已取消\n if (this.cancelSignal.signal.aborted) {\n return;\n }\n\n // 监听取消信号\n const abortHandler = () => {\n isStreamEnded = true;\n };\n this.cancelSignal.signal.addEventListener('abort', abortHandler);\n\n try {\n while (!isStreamEnded && !this.cancelSignal.signal.aborted) {\n // 从 Stream 读取新消息(XREAD 阻塞读取)\n const streams = await this.redis.xRead([{ key: this.streamKey, id: this.lastStreamId }], {\n BLOCK: this.pollInterval,\n COUNT: 10,\n });\n\n if (streams && streams.length > 0) {\n for (const stream of streams) {\n for (const message of stream.messages) {\n // 更新最后读取的 ID\n this.lastStreamId = message.id;\n\n // 解析消息:从 base64 字符串转换回 Uint8Array\n const dataString = message.message.data as string;\n const data = Buffer.from(dataString, 'base64');\n const item = (await this.decodeData(data)) as EventMessage;\n\n // 检查是否为流结束或错误信号\n if (\n item.event === '__stream_end__' ||\n item.event === '__stream_error__' ||\n item.event === '__stream_cancel__'\n ) {\n // 延迟 300ms 后结束,确保消息被消费\n await new Promise((resolve) => setTimeout(resolve, 300));\n isStreamEnded = true;\n\n if (item.event === '__stream_cancel__') {\n await this.cancel();\n }\n }\n\n yield item;\n\n if (isStreamEnded) {\n break;\n }\n }\n if (isStreamEnded) {\n break;\n }\n }\n }\n\n // 轮询间隔\n if (!isStreamEnded && !this.cancelSignal.signal.aborted) {\n await new Promise((resolve) => setTimeout(resolve, this.pollInterval));\n }\n }\n } finally {\n this.cancelSignal.signal.removeEventListener('abort', abortHandler);\n }\n }\n\n /**\n * 获取队列中的所有数据(从 List 获取历史数据)\n */\n async getAll(): Promise<EventMessage[]> {\n const data = await this.redis.lRange(this.listKey, 0, -1);\n\n if (!data || data.length === 0) {\n return [];\n }\n\n if (this.compressMessages) {\n return (await Promise.all(\n data.map((item: Buffer | string) => {\n // 处理 Buffer 或字符串类型\n const buffer = typeof item === 'string' ? Buffer.from(item, 'binary') : item;\n return this.decodeData(buffer);\n }),\n )) as EventMessage[];\n } else {\n return data.map((item: string) => JSON.parse(item) as EventMessage);\n }\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n if (this.isConnected) {\n // 同时清空 Stream 和 List\n this.redis.del(this.streamKey);\n this.redis.del(this.listKey);\n }\n }\n\n /**\n * 取消操作\n */\n async cancel(): Promise<void> {\n // First abort to stop any waiting generators\n this.cancelSignal.abort('user cancel this run');\n // Then push the cancel message to signal other consumers\n await this.push(new CancelEventMessage());\n }\n\n /**\n * 复制队列到另一个队列\n */\n async copyToQueue(toId: string, ttl?: number): Promise<RedisStreamQueue> {\n const queue = new RedisStreamQueue(toId, this.compressMessages, ttl ?? this.ttl);\n\n // 复制 List\n await this.redis.copy(this.listKey, queue.listKey);\n await this.redis.expire(queue.listKey, ttl ?? this.ttl);\n\n // 复制 Stream(需要遍历并重新添加)\n const allStreamData = await this.redis.xRange(this.streamKey, '-', '+');\n if (allStreamData && allStreamData.length > 0) {\n for (const message of allStreamData) {\n // 确保所有值都是字符串,Redis Streams 只支持 string 值\n const fields: Record<string, string> = {};\n for (const [key, value] of Object.entries(message.message)) {\n fields[key] = String(value);\n }\n await this.redis.xAdd(queue.streamKey, '*', fields);\n }\n await this.redis.expire(queue.streamKey, ttl ?? this.ttl);\n }\n\n return queue;\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/remote/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
2
|
import { PostgresAdapter } from '../pg-adapter-BFtir1GE.js';
|
|
3
|
-
import { K as KyselyThreadsManager } from '../stream-
|
|
3
|
+
import { K as KyselyThreadsManager } from '../stream-Crp1K8nB.js';
|
|
4
4
|
import { Pool } from 'pg';
|
|
5
5
|
|
|
6
6
|
class RemoteServer {
|
|
@@ -25,9 +25,13 @@ class SQLiteAdapter {
|
|
|
25
25
|
return dbValue;
|
|
26
26
|
}
|
|
27
27
|
buildJsonQuery(db, field, key, value) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
const jsonString = JSON.stringify(value);
|
|
29
|
+
return sql`(
|
|
30
|
+
json_extract(${sql.ref(field)}, ${sql.lit("$." + key)}) = ${sql.lit(jsonString)}
|
|
31
|
+
) OR (
|
|
32
|
+
json_extract(${sql.ref(field)}, ${sql.lit("$." + key)}) IS NULL
|
|
33
|
+
AND ${sql.lit(jsonString)} IS NULL
|
|
34
|
+
)`;
|
|
31
35
|
}
|
|
32
36
|
now() {
|
|
33
37
|
return (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -68,4 +72,4 @@ class SQLiteAdapter {
|
|
|
68
72
|
}
|
|
69
73
|
|
|
70
74
|
export { SQLiteAdapter };
|
|
71
|
-
//# sourceMappingURL=sqlite-adapter-
|
|
75
|
+
//# sourceMappingURL=sqlite-adapter-Bbonr5S5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-adapter-Bbonr5S5.js","sources":["../src/storage/kysely/sqlite-adapter.ts"],"sourcesContent":["import { Kysely, sql, SqlBool, Expression, SqliteDialect } from 'kysely';\nimport { DatabaseAdapter } from './adapter';\nimport { Database } from './types';\n\n/**\n * SQLite 适配器\n * - 时间类型:TEXT (ISO 8601 字符串)\n * - JSON 类型:TEXT\n * - JSON 查询:使用 json_extract 函数\n */\nexport class SQLiteAdapter implements DatabaseAdapter {\n db: Kysely<Database>;\n constructor(database: Kysely<any>) {\n this.db = database;\n }\n dateToDb(date: Date): string {\n // SQLite 存储为 ISO 8601 字符串\n return date.toISOString();\n }\n\n dbToDate(dbValue: any): Date {\n // SQLite 返回字符串,需要转换为 Date\n return new Date(dbValue);\n }\n\n jsonToDb(obj: any): string {\n // SQLite 存储为 JSON 字符串\n return JSON.stringify(obj);\n }\n\n dbToJson(dbValue: any): any {\n // SQLite 返回字符串,需要解析\n if (typeof dbValue === 'string') {\n try {\n return JSON.parse(dbValue);\n } catch {\n return dbValue;\n }\n }\n return dbValue;\n }\n\n buildJsonQuery(\n db: Kysely<Database>,\n field: 'metadata' | 'interrupts',\n key: string,\n value: any,\n ): Expression<SqlBool> {\n const jsonString = JSON.stringify(value);\n \n // 改进的 JSON 查询,添加 NULL 值处理\n // json_extract 会返回 NULL 当键不存在或值为 NULL\n return sql<boolean>`(\n json_extract(${sql.ref(field)}, ${sql.lit('$.' + key)}) = ${sql.lit(jsonString)}\n ) OR (\n json_extract(${sql.ref(field)}, ${sql.lit('$.' + key)}) IS NULL\n AND ${sql.lit(jsonString)} IS NULL\n )`;\n }\n\n now(): string {\n return new Date().toISOString();\n }\n\n async createTables(db: Kysely<Database>): Promise<void> {\n // 创建 threads 表\n await sql`\n CREATE TABLE IF NOT EXISTS threads (\n thread_id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n status TEXT NOT NULL DEFAULT 'idle',\n \"values\" TEXT,\n interrupts TEXT NOT NULL DEFAULT '{}'\n )\n `.execute(db);\n\n // 创建 runs 表\n await sql`\n CREATE TABLE IF NOT EXISTS runs (\n run_id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n assistant_id TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n metadata TEXT NOT NULL DEFAULT '{}',\n multitask_strategy TEXT NOT NULL DEFAULT 'reject',\n FOREIGN KEY (thread_id) REFERENCES threads(thread_id) ON DELETE CASCADE\n )\n `.execute(db);\n }\n\n async createIndexes(db: Kysely<Database>): Promise<void> {\n await sql`CREATE INDEX IF NOT EXISTS idx_threads_status ON threads(status)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_threads_created_at ON threads(created_at)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_threads_updated_at ON threads(updated_at)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_runs_thread_id ON runs(thread_id)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status)`.execute(db);\n }\n}\n"],"names":[],"mappings":";;AAUO,MAAM,aAAA,CAAyC;AAAA,EAClD,EAAA;AAAA,EACA,YAAY,QAAA,EAAuB;AAC/B,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AAAA,EACd;AAAA,EACA,SAAS,IAAA,EAAoB;AAEzB,IAAA,OAAO,KAAK,WAAA,EAAY;AAAA,EAC5B;AAAA,EAEA,SAAS,OAAA,EAAoB;AAEzB,IAAA,OAAO,IAAI,KAAK,OAAO,CAAA;AAAA,EAC3B;AAAA,EAEA,SAAS,GAAA,EAAkB;AAEvB,IAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,EAC7B;AAAA,EAEA,SAAS,OAAA,EAAmB;AAExB,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC7B,MAAA,IAAI;AACA,QAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAC7B,CAAA,CAAA,MAAQ;AACJ,QAAA,OAAO,OAAA;AAAA,MACX;AAAA,IACJ;AACA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,cAAA,CACI,EAAA,EACA,KAAA,EACA,GAAA,EACA,KAAA,EACmB;AACnB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAIvC,IAAA,OAAO,GAAA,CAAA;AAAA,yBAAA,EACY,GAAA,CAAI,GAAA,CAAI,KAAK,CAAC,KAAK,GAAA,CAAI,GAAA,CAAI,IAAA,GAAO,GAAG,CAAC,CAAA,IAAA,EAAO,GAAA,CAAI,GAAA,CAAI,UAAU,CAAC;AAAA;AAAA,yBAAA,EAEhE,GAAA,CAAI,IAAI,KAAK,CAAC,KAAK,GAAA,CAAI,GAAA,CAAI,IAAA,GAAO,GAAG,CAAC,CAAA;AAAA,gBAAA,EAC/C,GAAA,CAAI,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,SAAA,CAAA;AAAA,EAEjC;AAAA,EAEA,GAAA,GAAc;AACV,IAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,EAClC;AAAA,EAEA,MAAM,aAAa,EAAA,EAAqC;AAEpD,IAAA,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,CAUJ,QAAQ,EAAE,CAAA;AAGZ,IAAA,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,CAYJ,QAAQ,EAAE,CAAA;AAAA,EAChB;AAAA,EAEA,MAAM,cAAc,EAAA,EAAqC;AACrD,IAAA,MAAM,GAAA,CAAA,gEAAA,CAAA,CAAsE,QAAQ,EAAE,CAAA;AACtF,IAAA,MAAM,GAAA,CAAA,wEAAA,CAAA,CAA8E,QAAQ,EAAE,CAAA;AAC9F,IAAA,MAAM,GAAA,CAAA,wEAAA,CAAA,CAA8E,QAAQ,EAAE,CAAA;AAC9F,IAAA,MAAM,GAAA,CAAA,gEAAA,CAAA,CAAsE,QAAQ,EAAE,CAAA;AACtF,IAAA,MAAM,GAAA,CAAA,0DAAA,CAAA,CAAgE,QAAQ,EAAE,CAAA;AAAA,EACpF;AACJ;;;;"}
|
|
@@ -1346,7 +1346,7 @@ const createMessageQueue = async () => {
|
|
|
1346
1346
|
let q;
|
|
1347
1347
|
if (process.env.REDIS_URL) {
|
|
1348
1348
|
console.debug("LG | Using redis as stream queue");
|
|
1349
|
-
const { RedisStreamQueue } = await import('./queue-
|
|
1349
|
+
const { RedisStreamQueue } = await import('./queue-Bfg-8ehP.js');
|
|
1350
1350
|
q = RedisStreamQueue;
|
|
1351
1351
|
} else {
|
|
1352
1352
|
q = MemoryStreamQueue;
|
|
@@ -1386,7 +1386,7 @@ const createThreadManager = async (config) => {
|
|
|
1386
1386
|
}
|
|
1387
1387
|
if (process.env.SQLITE_DATABASE_URI && config.checkpointer) {
|
|
1388
1388
|
console.debug("LG | Using SQLite ThreadsManager");
|
|
1389
|
-
const { SQLiteAdapter } = await import('./sqlite-adapter-
|
|
1389
|
+
const { SQLiteAdapter } = await import('./sqlite-adapter-Bbonr5S5.js');
|
|
1390
1390
|
const database = config.checkpointer.db;
|
|
1391
1391
|
const threadsManager = new KyselyThreadsManager(new SQLiteAdapter(database));
|
|
1392
1392
|
await threadsManager.setup();
|
|
@@ -1584,4 +1584,4 @@ async function* streamState(threads, run, payload, options) {
|
|
|
1584
1584
|
}
|
|
1585
1585
|
|
|
1586
1586
|
export { BaseStreamQueue as B, CancelEventMessage as C, GRAPHS as G, KyselyThreadsManager as K, LangGraphGlobal as L, streamState as a, getGraph as g, registerGraph as r, serialiseAsDict as s };
|
|
1587
|
-
//# sourceMappingURL=stream-
|
|
1587
|
+
//# sourceMappingURL=stream-Crp1K8nB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-umoA6h4q.js","sources":["../src/utils/getLangGraphCommand.ts","../src/graph/stringify.ts","../src/queue/JsonPlusSerializer.ts","../src/queue/stream_queue.ts","../src/utils/getGraph.ts","../src/storage/kysely/threads.ts","../src/queue/event_message.ts","../src/storage/memory/queue.ts","../src/storage/memory/threads.ts","../src/storage/index.ts","../src/global.ts","../src/graph/stream.ts"],"sourcesContent":["import { Command, Send } from '@langchain/langgraph';\nimport { Command as ClientCommand } from '@langgraph-js/sdk';\nexport interface RunSend {\n node: string;\n input?: unknown;\n}\n\nexport interface RunCommand extends ClientCommand {}\n\nexport const getLangGraphCommand = (command: RunCommand) => {\n let goto = command.goto != null && !Array.isArray(command.goto) ? [command.goto] : command.goto;\n\n return new Command({\n goto: goto?.map((item: string | RunSend) => {\n if (typeof item !== 'string') return new Send(item.node, item.input);\n return item;\n }),\n update: command.update ?? undefined,\n resume: command.resume,\n });\n};\n","/* eslint-disable */\n// @ts-nocheck\n\n// Stringify that can handle circular references.\n// Inlined due to ESM import issues\n// Source: https://www.npmjs.com/package/fast-safe-stringify\n\nvar LIMIT_REPLACE_NODE = '[...]';\nvar CIRCULAR_REPLACE_NODE = '[Circular]';\n\nvar arr = [];\nvar replacerStack = [];\n\nfunction defaultOptions() {\n return {\n depthLimit: Number.MAX_SAFE_INTEGER,\n edgesLimit: Number.MAX_SAFE_INTEGER,\n };\n}\n\n// Regular stringify\nexport function stringify(obj, replacer?, spacer?, options?) {\n if (typeof options === 'undefined') {\n options = defaultOptions();\n }\n\n decirc(obj, '', 0, [], undefined, 0, options);\n var res;\n try {\n if (replacerStack.length === 0) {\n res = JSON.stringify(obj, replacer, spacer);\n } else {\n res = JSON.stringify(obj, replaceGetterValues(replacer), spacer);\n }\n } catch (_) {\n return JSON.stringify('[unable to serialize, circular reference is too complex to analyze]');\n } finally {\n while (arr.length !== 0) {\n var part = arr.pop();\n if (part.length === 4) {\n Object.defineProperty(part[0], part[1], part[3]);\n } else {\n part[0][part[1]] = part[2];\n }\n }\n }\n return res;\n}\n\nfunction setReplace(replace, val, k, parent) {\n var propertyDescriptor = Object.getOwnPropertyDescriptor(parent, k);\n if (propertyDescriptor.get !== undefined) {\n if (propertyDescriptor.configurable) {\n Object.defineProperty(parent, k, { value: replace });\n arr.push([parent, k, val, propertyDescriptor]);\n } else {\n replacerStack.push([val, k, replace]);\n }\n } else {\n parent[k] = replace;\n arr.push([parent, k, val]);\n }\n}\n\nfunction decirc(val, k, edgeIndex, stack, parent, depth, options) {\n depth += 1;\n var i;\n if (typeof val === 'object' && val !== null) {\n for (i = 0; i < stack.length; i++) {\n if (stack[i] === val) {\n setReplace(CIRCULAR_REPLACE_NODE, val, k, parent);\n return;\n }\n }\n\n if (typeof options.depthLimit !== 'undefined' && depth > options.depthLimit) {\n setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n return;\n }\n\n if (typeof options.edgesLimit !== 'undefined' && edgeIndex + 1 > options.edgesLimit) {\n setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n return;\n }\n\n stack.push(val);\n // Optimize for Arrays. Big arrays could kill the performance otherwise!\n if (Array.isArray(val)) {\n for (i = 0; i < val.length; i++) {\n decirc(val[i], i, i, stack, val, depth, options);\n }\n } else {\n var keys = Object.keys(val);\n for (i = 0; i < keys.length; i++) {\n var key = keys[i];\n decirc(val[key], key, i, stack, val, depth, options);\n }\n }\n stack.pop();\n }\n}\n\n// Stable-stringify\nfunction compareFunction(a, b) {\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n}\n\nfunction deterministicStringify(obj, replacer, spacer, options) {\n if (typeof options === 'undefined') {\n options = defaultOptions();\n }\n\n var tmp = deterministicDecirc(obj, '', 0, [], undefined, 0, options) || obj;\n var res;\n try {\n if (replacerStack.length === 0) {\n res = JSON.stringify(tmp, replacer, spacer);\n } else {\n res = JSON.stringify(tmp, replaceGetterValues(replacer), spacer);\n }\n } catch (_) {\n return JSON.stringify('[unable to serialize, circular reference is too complex to analyze]');\n } finally {\n // Ensure that we restore the object as it was.\n while (arr.length !== 0) {\n var part = arr.pop();\n if (part.length === 4) {\n Object.defineProperty(part[0], part[1], part[3]);\n } else {\n part[0][part[1]] = part[2];\n }\n }\n }\n return res;\n}\n\nfunction deterministicDecirc(val, k, edgeIndex, stack, parent, depth, options) {\n depth += 1;\n var i;\n if (typeof val === 'object' && val !== null) {\n for (i = 0; i < stack.length; i++) {\n if (stack[i] === val) {\n setReplace(CIRCULAR_REPLACE_NODE, val, k, parent);\n return;\n }\n }\n try {\n if (typeof val.toJSON === 'function') {\n return;\n }\n } catch (_) {\n return;\n }\n\n if (typeof options.depthLimit !== 'undefined' && depth > options.depthLimit) {\n setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n return;\n }\n\n if (typeof options.edgesLimit !== 'undefined' && edgeIndex + 1 > options.edgesLimit) {\n setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n return;\n }\n\n stack.push(val);\n // Optimize for Arrays. Big arrays could kill the performance otherwise!\n if (Array.isArray(val)) {\n for (i = 0; i < val.length; i++) {\n deterministicDecirc(val[i], i, i, stack, val, depth, options);\n }\n } else {\n // Create a temporary object in the required way\n var tmp = {};\n var keys = Object.keys(val).sort(compareFunction);\n for (i = 0; i < keys.length; i++) {\n var key = keys[i];\n deterministicDecirc(val[key], key, i, stack, val, depth, options);\n tmp[key] = val[key];\n }\n if (typeof parent !== 'undefined') {\n arr.push([parent, k, val]);\n parent[k] = tmp;\n } else {\n return tmp;\n }\n }\n stack.pop();\n }\n}\n\n// wraps replacer function to handle values we couldn't replace\n// and mark them as replaced value\nfunction replaceGetterValues(replacer) {\n replacer =\n typeof replacer !== 'undefined'\n ? replacer\n : function (k, v) {\n return v;\n };\n return function (key, val) {\n if (replacerStack.length > 0) {\n for (var i = 0; i < replacerStack.length; i++) {\n var part = replacerStack[i];\n if (part[1] === key && part[0] === val) {\n val = part[2];\n replacerStack.splice(i, 1);\n break;\n }\n }\n }\n return replacer.call(this, key, val);\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-instanceof/no-instanceof */\nimport { load } from '@langchain/core/load';\nimport type { SerializerProtocol } from '@langchain/langgraph-checkpoint';\nimport { stringify } from '../graph/stringify.js';\n\nfunction isLangChainSerializedObject(value: Record<string, unknown>) {\n return value !== null && value.lc === 1 && value.type === 'constructor' && Array.isArray(value.id);\n}\n\n/**\n * The replacer in stringify does not allow delegation to built-in LangChain\n * serialization methods, and instead immediately calls `.toJSON()` and\n * continues to stringify subfields.\n *\n * We therefore must start from the most nested elements in the input and\n * deserialize upwards rather than top-down.\n */\nasync function _reviver(value: any): Promise<any> {\n if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n const revivedArray = await Promise.all(value.map((item) => _reviver(item)));\n return revivedArray;\n } else {\n const revivedObj: any = {};\n for (const [k, v] of Object.entries(value)) {\n revivedObj[k] = await _reviver(v);\n }\n\n if (revivedObj.lc === 2 && revivedObj.type === 'undefined') {\n return undefined;\n } else if (revivedObj.lc === 2 && revivedObj.type === 'constructor' && Array.isArray(revivedObj.id)) {\n try {\n const constructorName = revivedObj.id[revivedObj.id.length - 1];\n let constructor: any;\n\n switch (constructorName) {\n case 'Set':\n constructor = Set;\n break;\n case 'Map':\n constructor = Map;\n break;\n case 'RegExp':\n constructor = RegExp;\n break;\n case 'Error':\n constructor = Error;\n break;\n default:\n return revivedObj;\n }\n if (revivedObj.method) {\n return (constructor as any)[revivedObj.method](...(revivedObj.args || []));\n } else {\n return new (constructor as any)(...(revivedObj.args || []));\n }\n } catch (error) {\n return revivedObj;\n }\n } else if (isLangChainSerializedObject(revivedObj)) {\n return load(JSON.stringify(revivedObj));\n }\n\n return revivedObj;\n }\n }\n return value;\n}\n\nfunction _encodeConstructorArgs(\n // eslint-disable-next-line @typescript-eslint/ban-types\n constructor: Function,\n method?: string,\n args?: any[],\n kwargs?: Record<string, any>,\n): object {\n return {\n lc: 2,\n type: 'constructor',\n id: [constructor.name],\n method: method ?? null,\n args: args ?? [],\n kwargs: kwargs ?? {},\n };\n}\n\nfunction _default(obj: any): any {\n if (obj === undefined) {\n return {\n lc: 2,\n type: 'undefined',\n };\n } else if (obj instanceof Set || obj instanceof Map) {\n return _encodeConstructorArgs(obj.constructor, undefined, [Array.from(obj)]);\n } else if (obj instanceof RegExp) {\n return _encodeConstructorArgs(RegExp, undefined, [obj.source, obj.flags]);\n } else if (obj instanceof Error) {\n return _encodeConstructorArgs(obj.constructor, undefined, [obj.message]);\n // TODO: Remove special case\n } else if (obj?.lg_name === 'Send') {\n return {\n node: obj.node,\n args: obj.args,\n };\n } else {\n return obj;\n }\n}\n\nexport class JsonPlusSerializer implements SerializerProtocol {\n protected _dumps(obj: any): Uint8Array {\n const encoder = new TextEncoder();\n return encoder.encode(\n stringify(obj, (_: string, value: any) => {\n return _default(value);\n }),\n );\n }\n\n async dumpsTyped(obj: any): Promise<[string, Uint8Array]> {\n if (obj instanceof Uint8Array) {\n return ['bytes', obj];\n } else {\n return ['json', this._dumps(obj)];\n }\n }\n\n protected async _loads(data: string): Promise<any> {\n const parsed = JSON.parse(data);\n return _reviver(parsed);\n }\n\n async loadsTyped(type: string, data: Uint8Array | string): Promise<any> {\n if (type === 'bytes') {\n return typeof data === 'string' ? new TextEncoder().encode(data) : data;\n } else if (type === 'json') {\n return this._loads(typeof data === 'string' ? data : new TextDecoder().decode(data));\n } else {\n throw new Error(`Unknown serialization type: ${type}`);\n }\n }\n}\n","import { EventEmitter } from 'eventemitter3';\nimport { JsonPlusSerializer } from './JsonPlusSerializer.js';\nimport { EventMessage } from './event_message.js';\n\n/**\n * 流队列事件接口\n * Stream queue events interface\n */\ninterface StreamQueueEvents<T extends EventMessage> {\n /** 数据事件:当有新数据时触发 / Data event: triggered when new data arrives */\n data: (data: T) => void;\n /** 其他事件 / Other events */\n [key: string]: ((...args: any[]) => void) | undefined;\n}\n\n/**\n * 基础流队列类\n * Base stream queue class\n */\nexport class BaseStreamQueue extends EventEmitter<StreamQueueEvents<EventMessage>> {\n /** 序列化器实例 / Serializer instance */\n serializer = new JsonPlusSerializer();\n\n /**\n * 构造函数\n * Constructor\n * @param compressMessages 是否压缩消息 / Whether to compress messages\n */\n constructor(readonly id: string, readonly compressMessages: boolean = true, readonly ttl: number = 300) {\n super();\n }\n\n /**\n * 编码数据为 Uint8Array\n * Encode data to Uint8Array\n * @param message 要编码的消息 / Message to encode\n * @returns 编码后的 Uint8Array / Encoded Uint8Array\n */\n async encodeData(message: EventMessage): Promise<Uint8Array> {\n const [_, serializedMessage] = await this.serializer.dumpsTyped(message);\n return serializedMessage;\n }\n\n /**\n * 解码数据为 EventMessage\n * Decode data to EventMessage\n * @param serializedMessage 要解码的消息 / Message to decode\n * @returns 解码后的 EventMessage / Decoded EventMessage\n */\n async decodeData(serializedMessage: string | Uint8Array): Promise<EventMessage> {\n const message = (await this.serializer.loadsTyped('json', serializedMessage)) as EventMessage;\n return message;\n }\n}\n\n/**\n * 基础流队列接口\n * Base stream queue interface\n */\nexport interface BaseStreamQueueInterface {\n id: string;\n /** 是否压缩消息 / Whether to compress messages */\n compressMessages: boolean;\n /**\n * 推送数据项到队列\n * Push item to queue\n * @param item 要推送的数据项 / Item to push\n */\n push(item: EventMessage): Promise<void>;\n /** 获取所有数据 / Get all data */\n getAll(): Promise<EventMessage[]>;\n /** 清空队列 / Clear queue */\n clear(): void | Promise<void>;\n /**\n * 监听数据变化\n * Listen for data changes\n * @param listener 数据变化监听器 / Data change listener\n * @returns 取消监听函数 / Unsubscribe function\n */\n onDataReceive(): AsyncGenerator<EventMessage, void, unknown>;\n /** 取消信号控制器 / Cancel signal controller */\n cancelSignal: AbortController;\n /** 取消操作 / Cancel operation */\n cancel(): Promise<void>;\n /** 复制队列数据 / Copy queue data */\n copyToQueue(toId: string, ttl?: number): Promise<BaseStreamQueueInterface>;\n}\n\nexport type QueueConstructor<Q extends BaseStreamQueueInterface> = (new (\n queueId: string,\n compressMessages: boolean,\n ttl?: number,\n) => Q) & {\n isQueueExist?: (id: string) => Promise<boolean>;\n};\n\n/**\n * StreamQueue 管理器,通过 id 管理多个队列实例\n * StreamQueue manager, manages multiple queue instances by id\n */\nexport class StreamQueueManager<Q extends BaseStreamQueueInterface> {\n /** 存储队列实例的 Map / Map storing queue instances */\n private queues: Map<string, Q> = new Map();\n /** 默认是否压缩消息 / Default compress messages setting */\n private defaultCompressMessages: boolean;\n /** 队列构造函数 / Queue constructor */\n private queueConstructor: QueueConstructor<Q>;\n\n /**\n * 构造函数\n * Constructor\n * @param queueConstructor 队列构造函数 / Queue constructor\n * @param options 配置选项 / Configuration options\n */\n constructor(\n queueConstructor: QueueConstructor<Q>,\n options: {\n /** 默认是否压缩消息 / Default compress messages setting */\n defaultCompressMessages?: boolean;\n } = {},\n ) {\n this.defaultCompressMessages = options.defaultCompressMessages ?? true;\n this.queueConstructor = queueConstructor;\n }\n\n /**\n * 创建指定 id 的队列\n * Create queue with specified id\n * @param id 队列 ID / Queue ID\n * @param compressMessages 是否压缩消息 / Whether to compress messages\n * @returns 创建的队列实例 / Created queue instance\n */\n createQueue(id: string, ttl: number = 300): Q {\n this.queues.set(id, new this.queueConstructor(id, this.defaultCompressMessages, ttl));\n return this.queues.get(id)!;\n }\n\n /**\n * 获取或创建指定 id 的队列\n * Get or create queue with specified id\n * @param id 队列 ID / Queue ID\n * @param compressMessages 是否压缩消息,默认为构造函数中的默认值 / Whether to compress messages, defaults to constructor default\n * @returns StreamQueue 实例 / StreamQueue instance\n */\n async getQueue(id: string): Promise<Q> {\n const queue = this.queues.get(id);\n if (!queue) {\n if (await this.queueConstructor?.isQueueExist?.(id)) {\n return this.createQueue(id);\n } else {\n throw new Error(`Queue with id '${id}' does not exist`);\n }\n }\n return queue;\n }\n\n /**\n * 取消指定 id 的队列\n * Cancel queue with specified id\n * @param id 队列 ID / Queue ID\n */\n async cancelQueue(id: string): Promise<void> {\n const queue = this.queues.get(id);\n if (queue) {\n await queue.cancel();\n this.removeQueue(id);\n }\n }\n /**\n * 向指定 id 的队列推送数据\n * Push data to queue with specified id\n * @param id 队列 ID / Queue ID\n * @param item 要推送的数据项 / Item to push\n */\n async pushToQueue(id: string, item: EventMessage): Promise<void> {\n const queue = await this.getQueue(id);\n await queue.push(item);\n }\n\n /**\n * 获取指定 id 队列中的所有数据\n * Get all data from queue with specified id\n * @param id 队列 ID / Queue ID\n * @returns 队列中的所有数据 / All data in the queue\n */\n async getQueueData(id: string): Promise<EventMessage[]> {\n const queue = this.queues.get(id);\n if (!queue) {\n throw new Error(`Queue with id '${id}' does not exist`);\n }\n return await queue.getAll();\n }\n\n /**\n * 清空指定 id 的队列\n * Clear queue with specified id\n * @param id 队列 ID / Queue ID\n */\n async clearQueue(id: string): Promise<void> {\n const queue = this.queues.get(id);\n if (queue) {\n const result = queue.clear();\n // 支持同步和异步的 clear 方法\n if (result instanceof Promise) {\n await result;\n }\n }\n }\n\n /**\n * 删除指定 id 的队列\n * Remove queue with specified id\n * @param id 队列 ID / Queue ID\n * @returns 是否成功删除 / Whether successfully deleted\n */\n removeQueue(id: string) {\n setTimeout(() => {\n return this.queues.delete(id);\n }, 500);\n }\n\n /**\n * 获取所有队列的 ID\n * Get all queue IDs\n * @returns 所有队列 ID 的数组 / Array of all queue IDs\n */\n getAllQueueIds(): string[] {\n return Array.from(this.queues.keys());\n }\n\n /**\n * 获取所有队列及其数据的快照\n * Get snapshot of all queues and their data\n * @returns 包含所有队列数据的结果对象 / Result object containing all queue data\n */\n async getAllQueuesData(): Promise<Record<string, EventMessage[]>> {\n const result: Record<string, EventMessage[]> = {};\n for (const [id, queue] of this.queues) {\n result[id] = await queue.getAll();\n }\n return result;\n }\n\n /**\n * 清空所有队列\n * Clear all queues\n */\n clearAllQueues(): void {\n for (const queue of this.queues.values()) {\n queue.clear();\n }\n }\n\n /**\n * 复制队列数据\n * Copy queue data\n * @param fromId 源队列 ID / Source queue ID\n * @param toId 目标队列 ID / Target queue ID\n * @param ttl 生存时间(毫秒),在指定时间后删除目标队列 / Time to live (milliseconds), remove target queue after specified time\n */\n async copyQueue(fromId: string, toId: string, ttl?: number): Promise<BaseStreamQueueInterface> {\n // 获取源队列数据\n const sourceQueue = await this.getQueue(fromId);\n const queue = await sourceQueue.copyToQueue(toId, ttl);\n this.queues.set(toId, queue as Q);\n return queue;\n }\n}\n","import {\n BaseCheckpointSaver,\n BaseStore,\n CompiledGraph,\n CompiledStateGraph,\n LangGraphRunnableConfig,\n} from '@langchain/langgraph';\nimport { LangGraphGlobal } from '../global';\n\nexport type CompiledGraphFactory<T extends string> = (config: {\n configurable?: Record<string, unknown>;\n}) => Promise<CompiledGraph<T>>;\n\nexport const GRAPHS: Record<string, CompiledGraph<string> | CompiledGraphFactory<string>> = {};\n\nexport async function registerGraph(\n graphId: string,\n graph: CompiledGraph<any> | CompiledStateGraph<any, any, any, any, any, any, any> | CompiledGraphFactory<any>,\n) {\n GRAPHS[graphId] = graph;\n}\nexport async function getGraph(\n graphId: string,\n config: LangGraphRunnableConfig | undefined,\n options?: {\n checkpointer?: BaseCheckpointSaver | null;\n store?: BaseStore;\n },\n) {\n if (!GRAPHS[graphId]) throw new Error(`Graph \"${graphId}\" not found`);\n\n const compiled =\n typeof GRAPHS[graphId] === 'function' ? await GRAPHS[graphId](config ?? { configurable: {} }) : GRAPHS[graphId];\n\n if (typeof options?.checkpointer !== 'undefined') {\n compiled.checkpointer = options?.checkpointer ?? LangGraphGlobal.globalCheckPointer;\n } else {\n compiled.checkpointer = LangGraphGlobal.globalCheckPointer;\n }\n\n compiled.store = options?.store ?? undefined;\n\n return compiled;\n}\n","import { Kysely } from 'kysely';\nimport { BaseThreadsManager } from '../../threads/index.js';\nimport {\n Command,\n Config,\n Metadata,\n OnConflictBehavior,\n Run,\n Thread,\n ThreadState,\n ThreadStatus,\n} from '@langgraph-js/sdk';\nimport { RunStatus, SortOrder, ThreadSortBy } from '../../types';\nimport { Database } from './types';\nimport { DatabaseAdapter } from './adapter';\nimport { getGraph } from '../../utils/getGraph.js';\nimport { serialiseAsDict } from '../../graph/stream.js';\nimport { v7 } from 'uuid';\n\n/**\n * 使用 Kysely 实现的统一 ThreadsManager\n * 通过适配器模式处理不同数据库的差异\n */\nexport class KyselyThreadsManager<ValuesType = unknown> implements BaseThreadsManager<ValuesType> {\n private db: Kysely<Database>;\n private adapter: DatabaseAdapter;\n\n constructor(adapter: DatabaseAdapter) {\n this.db = adapter.db;\n this.adapter = adapter;\n }\n\n async setup(): Promise<void> {\n // 使用适配器创建表和索引\n await this.adapter.createTables(this.db);\n await this.adapter.createIndexes(this.db);\n }\n\n async create(payload?: {\n metadata?: Metadata;\n threadId?: string;\n ifExists?: OnConflictBehavior;\n graphId?: string;\n supersteps?: Array<{ updates: Array<{ values: unknown; command?: Command; asNode: string }> }>;\n }): Promise<Thread<ValuesType>> {\n const threadId = payload?.threadId || v7();\n\n // 检查线程是否已存在\n if (payload?.ifExists === 'raise') {\n const existing = await this.db\n .selectFrom('threads')\n .select('thread_id')\n .where('thread_id', '=', threadId)\n .executeTakeFirst();\n\n if (existing) {\n throw new Error(`Thread with ID ${threadId} already exists.`);\n }\n }\n\n const now = new Date();\n const metadata = payload?.metadata || {};\n const interrupts = {};\n\n // 插入数据\n await this.db\n .insertInto('threads')\n .values({\n thread_id: threadId,\n created_at: this.adapter.dateToDb(now) as any,\n updated_at: this.adapter.dateToDb(now) as any,\n metadata: this.adapter.jsonToDb(metadata) as any,\n status: 'idle',\n values: null as any,\n interrupts: this.adapter.jsonToDb(interrupts) as any,\n })\n .execute();\n\n return {\n thread_id: threadId,\n created_at: now.toISOString(),\n updated_at: now.toISOString(),\n metadata,\n status: 'idle',\n values: null as unknown as ValuesType,\n interrupts,\n };\n }\n\n async search(query?: {\n ids?: string[];\n metadata?: Metadata;\n limit?: number;\n offset?: number;\n status?: ThreadStatus;\n sortBy?: ThreadSortBy;\n sortOrder?: SortOrder;\n values?: ValuesType;\n select?: Array<\n | 'thread_id'\n | 'created_at'\n | 'updated_at'\n | 'metadata'\n | 'config'\n | 'context'\n | 'status'\n | 'values'\n | 'interrupts'\n >;\n withoutDetails?: boolean;\n }): Promise<Thread<ValuesType>[]> {\n let queryBuilder = this.db.selectFrom('threads');\n\n // Determine which fields to select based on select parameter\n let selectedFields: Set<string>;\n\n if (query?.select) {\n selectedFields = new Set(query.select);\n } else if (query?.withoutDetails) {\n // Legacy withoutDetails behavior - exclude values and interrupts\n selectedFields = new Set(['thread_id', 'created_at', 'updated_at', 'metadata', 'status']);\n } else {\n // All fields\n selectedFields = new Set([\n 'thread_id',\n 'created_at',\n 'updated_at',\n 'metadata',\n 'status',\n 'values',\n 'interrupts',\n ]);\n }\n\n // Build select expressions\n const selections: any[] = [];\n if (selectedFields.has('thread_id')) selections.push('thread_id');\n if (selectedFields.has('created_at')) selections.push('created_at');\n if (selectedFields.has('updated_at')) selections.push('updated_at');\n if (selectedFields.has('metadata')) selections.push('metadata');\n if (selectedFields.has('status')) selections.push('status');\n if (selectedFields.has('values')) selections.push('values');\n if (selectedFields.has('interrupts')) selections.push('interrupts');\n\n if (selections.length > 0) {\n queryBuilder = queryBuilder.select(selections);\n } else {\n queryBuilder = queryBuilder.selectAll();\n }\n\n // Filter by IDs\n if (query?.ids && query.ids.length > 0) {\n queryBuilder = queryBuilder.where('thread_id', 'in', query.ids);\n }\n\n // Filter by status\n if (query?.status) {\n queryBuilder = queryBuilder.where('status', '=', query.status);\n }\n\n // Filter by metadata\n if (query?.metadata) {\n for (const [key, value] of Object.entries(query.metadata)) {\n queryBuilder = queryBuilder.where(this.adapter.buildJsonQuery(this.db, 'metadata', key, value) as any);\n }\n }\n\n // Filter by values - Note: This is a simple equality check, may need database-specific JSON operators\n if (query?.values) {\n queryBuilder = queryBuilder.where((eb) => {\n // Use database-specific JSON equality\n return eb('values', '=', this.adapter.jsonToDb(query.values) as any);\n });\n }\n\n // Add sorting\n if (query?.sortBy) {\n const order = query.sortOrder === 'desc' ? 'desc' : 'asc';\n queryBuilder = queryBuilder.orderBy(query.sortBy as any, order);\n }\n\n // Add pagination\n if (query?.limit !== undefined) {\n queryBuilder = queryBuilder.limit(query.limit);\n if (query?.offset !== undefined) {\n queryBuilder = queryBuilder.offset(query.offset);\n }\n }\n\n const rows: Partial<Thread<ValuesType>>[] = await queryBuilder.execute();\n\n return rows.map((row) => {\n const result: Partial<Thread<ValuesType>> = { thread_id: row.thread_id };\n\n if (selectedFields.has('created_at'))\n result.created_at = this.adapter.dbToDate(row.created_at).toISOString();\n if (selectedFields.has('updated_at'))\n result.updated_at = this.adapter.dbToDate(row.updated_at).toISOString();\n if (selectedFields.has('metadata')) result.metadata = this.adapter.dbToJson(row.metadata);\n if (selectedFields.has('status')) result.status = row.status as ThreadStatus;\n if (selectedFields.has('values'))\n result.values = row.values ? this.adapter.dbToJson(row.values) : (null as unknown as ValuesType);\n if (selectedFields.has('interrupts')) result.interrupts = this.adapter.dbToJson(row.interrupts);\n\n return result as Thread<ValuesType>;\n });\n }\n\n async get(threadId: string): Promise<Thread<ValuesType>> {\n const row = await this.db\n .selectFrom('threads')\n .selectAll()\n .where('thread_id', '=', threadId)\n .executeTakeFirst();\n\n if (!row) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n\n return {\n thread_id: row.thread_id,\n created_at: this.adapter.dbToDate(row.created_at).toISOString(),\n updated_at: this.adapter.dbToDate(row.updated_at).toISOString(),\n metadata: this.adapter.dbToJson(row.metadata),\n status: row.status as ThreadStatus,\n values: row.values ? this.adapter.dbToJson(row.values) : (null as unknown as ValuesType),\n interrupts: this.adapter.dbToJson(row.interrupts),\n };\n }\n\n async set(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<void> {\n // 检查线程是否存在\n const existing = await this.db\n .selectFrom('threads')\n .select('thread_id')\n .where('thread_id', '=', threadId)\n .executeTakeFirst();\n\n if (!existing) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n\n // 构建更新对象\n const updates: any = {\n updated_at: this.adapter.dateToDb(new Date()),\n };\n\n if (thread.metadata !== undefined) {\n updates.metadata = this.adapter.jsonToDb(thread.metadata);\n }\n\n if (thread.status !== undefined) {\n updates.status = thread.status;\n }\n\n if (thread.values !== undefined) {\n updates.values = thread.values ? this.adapter.jsonToDb(thread.values) : null;\n }\n\n if (thread.interrupts !== undefined) {\n updates.interrupts = this.adapter.jsonToDb(thread.interrupts);\n }\n\n await this.db.updateTable('threads').set(updates).where('thread_id', '=', threadId).execute();\n }\n\n async delete(threadId: string): Promise<void> {\n const result = await this.db.deleteFrom('threads').where('thread_id', '=', threadId).executeTakeFirst();\n\n if (result.numDeletedRows === 0n) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n }\n\n async updateState(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<Pick<Config, 'configurable'>> {\n // 获取线程信息\n const targetThread = await this.get(threadId);\n\n if (targetThread.status === 'busy') {\n throw new Error(`Thread with ID ${threadId} is busy, can't update state.`);\n }\n\n if (!targetThread.metadata?.graph_id) {\n throw new Error(`Thread with ID ${threadId} has no graph_id.`);\n }\n\n const graphId = targetThread.metadata?.graph_id as string;\n const config = {\n configurable: {\n thread_id: threadId,\n graph_id: graphId,\n },\n };\n\n const graph = await getGraph(graphId, config);\n const nextConfig = await graph.updateState(config, thread.values);\n const graphState = await graph.getState(config);\n await this.set(threadId, { values: JSON.parse(serialiseAsDict(graphState.values)) as ValuesType });\n\n return nextConfig;\n }\n\n async createRun(threadId: string, assistantId: string, payload?: { metadata?: Metadata }): Promise<Run> {\n const runId = v7();\n const now = new Date();\n const metadata = payload?.metadata ?? {};\n\n await this.db\n .insertInto('runs')\n .values({\n run_id: runId,\n thread_id: threadId,\n assistant_id: assistantId,\n created_at: this.adapter.dateToDb(now) as any,\n updated_at: this.adapter.dateToDb(now) as any,\n status: 'pending',\n metadata: this.adapter.jsonToDb(metadata) as any,\n multitask_strategy: 'reject',\n })\n .execute();\n\n return {\n run_id: runId,\n thread_id: threadId,\n assistant_id: assistantId,\n created_at: now.toISOString(),\n updated_at: now.toISOString(),\n status: 'pending',\n metadata,\n multitask_strategy: 'reject',\n };\n }\n\n async listRuns(\n threadId: string,\n options?: { limit?: number; offset?: number; status?: RunStatus },\n ): Promise<Run[]> {\n let queryBuilder = this.db\n .selectFrom('runs')\n .selectAll()\n .where('thread_id', '=', threadId)\n .orderBy('created_at', 'desc');\n\n if (options?.status) {\n queryBuilder = queryBuilder.where('status', '=', options.status);\n }\n\n if (options?.limit !== undefined) {\n queryBuilder = queryBuilder.limit(options.limit);\n if (options?.offset !== undefined) {\n queryBuilder = queryBuilder.offset(options.offset);\n }\n }\n\n const rows = await queryBuilder.execute();\n\n return rows.map((row) => ({\n run_id: row.run_id,\n thread_id: row.thread_id,\n assistant_id: row.assistant_id,\n created_at: this.adapter.dbToDate(row.created_at).toISOString(),\n updated_at: this.adapter.dbToDate(row.updated_at).toISOString(),\n status: row.status as RunStatus,\n metadata: this.adapter.dbToJson(row.metadata),\n multitask_strategy: row.multitask_strategy as 'reject',\n }));\n }\n\n async updateRun(runId: string, run: Partial<Run>): Promise<void> {\n // 检查运行是否存在\n const existing = await this.db\n .selectFrom('runs')\n .select('run_id')\n .where('run_id', '=', runId)\n .executeTakeFirst();\n\n if (!existing) {\n throw new Error(`Run with ID ${runId} not found.`);\n }\n\n // 构建更新对象\n const updates: any = {\n updated_at: this.adapter.dateToDb(new Date()),\n };\n\n if (run.status !== undefined) {\n updates.status = run.status;\n }\n\n if (run.metadata !== undefined) {\n updates.metadata = this.adapter.jsonToDb(run.metadata);\n }\n\n if (run.multitask_strategy !== undefined) {\n updates.multitask_strategy = run.multitask_strategy;\n }\n\n await this.db.updateTable('runs').set(updates).where('run_id', '=', runId).execute();\n }\n\n // New methods for Threads API\n\n async count(query?: {\n ids?: string[];\n metadata?: Metadata;\n status?: ThreadStatus;\n values?: ValuesType;\n }): Promise<number> {\n const threads = await this.search(query);\n return threads.length;\n }\n\n async patch(\n threadId: string,\n updates: Partial<Omit<Thread<ValuesType>, 'thread_id' | 'created_at' | 'updated_at'>>,\n ): Promise<Thread<ValuesType>> {\n // 获取当前线程\n const existing = await this.db\n .selectFrom('threads')\n .selectAll()\n .where('thread_id', '=', threadId)\n .executeTakeFirst();\n\n if (!existing) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n\n // 构建更新对象,合并 metadata\n const patchUpdates: any = {\n updated_at: this.adapter.dateToDb(new Date()),\n };\n\n if (updates.metadata !== undefined) {\n const existingMetadata = this.adapter.dbToJson(existing.metadata) || {};\n patchUpdates.metadata = this.adapter.jsonToDb({ ...existingMetadata, ...updates.metadata });\n }\n\n if (updates.status !== undefined) {\n patchUpdates.status = updates.status;\n }\n\n if (updates.values !== undefined) {\n patchUpdates.values = updates.values ? this.adapter.jsonToDb(updates.values) : null;\n }\n\n if (updates.interrupts !== undefined) {\n patchUpdates.interrupts = this.adapter.jsonToDb(updates.interrupts);\n }\n\n await this.db.updateTable('threads').set(patchUpdates).where('thread_id', '=', threadId).execute();\n\n // 返回更新后的线程\n return await this.get(threadId);\n }\n\n async getState(threadId: string, options?: { subgraphs?: boolean; checkpointId?: string }): Promise<ThreadState> {\n const thread = await this.get(threadId);\n\n if (options?.checkpointId) {\n // Get state at specific checkpoint\n const checkpoint = await this.db\n .selectFrom('checkpoints')\n .selectAll()\n .where('checkpoint_id', '=', options.checkpointId)\n .where('thread_id', '=', threadId)\n .executeTakeFirst();\n\n if (!checkpoint) {\n throw new Error(`Checkpoint with ID ${options.checkpointId} not found for thread ${threadId}`);\n }\n\n return {\n values: this.adapter.dbToJson(checkpoint.values),\n next: this.adapter.dbToJson(checkpoint.next),\n metadata: this.adapter.dbToJson(checkpoint.metadata),\n checkpoint: {\n /** @ts-ignore */\n id: checkpoint.checkpoint_id,\n thread_id: threadId,\n parent_checkpoint_id: null,\n checkpoint_ns: '',\n metadata: this.adapter.dbToJson(checkpoint.metadata),\n created_at: this.adapter.dbToDate(checkpoint.created_at).toISOString(),\n },\n created_at: this.adapter.dbToDate(checkpoint.created_at).toISOString(),\n parent_checkpoint: null,\n tasks: [],\n };\n }\n\n // Get latest state\n const state: ThreadState = {\n values: thread.values || {},\n next: [],\n metadata: thread.metadata,\n /**@ts-ignore 没有查询 checkpointer */\n checkpoint: null,\n created_at: thread.created_at,\n parent_checkpoint: null,\n tasks: [],\n };\n\n return state;\n }\n\n async getStateHistory(\n threadId: string,\n options?: {\n limit?: number;\n before?: string;\n filter?: { source?: string; step?: number };\n },\n ): Promise<ThreadState[]> {\n let queryBuilder = this.db\n .selectFrom('checkpoints')\n .selectAll()\n .where('thread_id', '=', threadId)\n .orderBy('created_at', 'asc');\n\n const checkpoints = await queryBuilder.execute();\n\n let history: ThreadState[] = checkpoints.map(\n (cp) =>\n ({\n values: this.adapter.dbToJson(cp.values),\n next: this.adapter.dbToJson(cp.next),\n metadata: this.adapter.dbToJson(cp.metadata),\n checkpoint: {\n thread_id: threadId,\n checkpoint_ns: '',\n checkpoint_id: cp.checkpoint_id,\n checkpoint_map: null,\n },\n created_at: this.adapter.dbToDate(cp.created_at).toISOString(),\n parent_checkpoint: null,\n tasks: [],\n } satisfies ThreadState),\n );\n\n // Filter by 'before' checkpoint ID\n if (options?.before) {\n const beforeIndex = checkpoints.findIndex((c) => c.checkpoint_id === options.before);\n if (beforeIndex !== -1) {\n history = history.slice(beforeIndex + 1);\n }\n }\n\n // Apply limit\n if (options?.limit) {\n history = history.slice(0, options.limit);\n }\n\n return history;\n }\n\n async copy(threadId: string): Promise<Thread<ValuesType>> {\n const originalThread = await this.get(threadId);\n\n // Create new thread\n const newThreadId = v7();\n const now = new Date();\n\n await this.db\n .insertInto('threads')\n .values({\n thread_id: newThreadId,\n created_at: this.adapter.dateToDb(now) as any,\n updated_at: this.adapter.dateToDb(now) as any,\n metadata: this.adapter.jsonToDb(originalThread.metadata) as any,\n status: originalThread.status,\n values: originalThread.values ? (this.adapter.jsonToDb(originalThread.values) as any) : (null as any),\n interrupts: this.adapter.jsonToDb(originalThread.interrupts) as any,\n })\n .execute();\n\n // Copy checkpoints\n const checkpoints = await this.db\n .selectFrom('checkpoints')\n .selectAll()\n .where('thread_id', '=', threadId)\n .orderBy('created_at', 'asc')\n .execute();\n\n for (const cp of checkpoints) {\n await this.db\n .insertInto('checkpoints')\n .values({\n checkpoint_id: v7(),\n thread_id: newThreadId,\n values: cp.values,\n next: cp.next,\n config: cp.config,\n created_at: cp.created_at,\n metadata: cp.metadata,\n })\n .execute();\n }\n\n return {\n ...originalThread,\n thread_id: newThreadId,\n created_at: now.toISOString(),\n updated_at: now.toISOString(),\n };\n }\n\n // Helper method to save checkpoint (used internally)\n private async saveCheckpoint(\n threadId: string,\n values: any,\n next: string[],\n config: Config,\n metadata?: Metadata,\n ): Promise<void> {\n await this.db\n .insertInto('checkpoints')\n .values({\n checkpoint_id: v7(),\n thread_id: threadId,\n values: this.adapter.jsonToDb(values) as any,\n next: this.adapter.jsonToDb(next) as any,\n config: this.adapter.jsonToDb(config) as any,\n created_at: this.adapter.dateToDb(new Date()) as any,\n metadata: this.adapter.jsonToDb(metadata || {}) as any,\n })\n .execute();\n }\n}\n","export class EventMessage {\n event: string;\n data: unknown;\n id?: string;\n constructor(event: string, data?: unknown) {\n this.event = event;\n this.data = data;\n }\n}\n\nexport class CancelEventMessage extends EventMessage {\n constructor() {\n super('__system_cancel__', 'user cancel this run');\n }\n}\n\nexport class StreamEndEventMessage extends EventMessage {\n constructor() {\n super('__stream_end__', 'stream end');\n }\n}\n\nexport class StreamErrorEventMessage extends EventMessage {\n public constructor(error: Error) {\n super('__stream_error__', {\n error: error.name,\n message: error.message,\n });\n }\n}\n","import { CancelEventMessage, EventMessage } from '../../queue/event_message.js';\nimport { BaseStreamQueue } from '../../queue/stream_queue.js';\nimport { BaseStreamQueueInterface } from '../../queue/stream_queue.js';\n/** 内存实现的消息队列,用于存储消息 */\nexport class MemoryStreamQueue extends BaseStreamQueue implements BaseStreamQueueInterface {\n private data: EventMessage[] = [];\n\n async push(item: EventMessage): Promise<void> {\n const data = this.compressMessages ? ((await this.encodeData(item)) as unknown as EventMessage) : item;\n this.data.push(data);\n this.emit('dataChange', data);\n }\n\n onDataChange(listener: (data: EventMessage) => void): () => void {\n this.on('dataChange', async (item) => {\n listener(this.compressMessages ? ((await this.decodeData(item)) as EventMessage) : item);\n });\n return () => this.off('dataChange', listener);\n }\n\n /**\n * 异步生成器:支持 for await...of 方式消费队列数据\n */\n async *onDataReceive(): AsyncGenerator<EventMessage, void, unknown> {\n let queue: EventMessage[] = [];\n let pendingResolve: (() => void) | null = null;\n let isStreamEnded = false;\n let isCleanupDone = false;\n\n // 事件处理函数\n const handleData = async (item: EventMessage) => {\n try {\n const data = this.compressMessages ? ((await this.decodeData(item as any)) as EventMessage) : item;\n queue.push(data);\n // 检查是否为流结束或错误信号\n if (\n data.event === '__stream_end__' ||\n data.event === '__stream_error__' ||\n data.event === '__stream_cancel__'\n ) {\n setTimeout(() => {\n isStreamEnded = true;\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n }, 300);\n\n if (data.event === '__stream_cancel__') {\n await this.cancel();\n }\n }\n\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n } catch (error) {\n // 即使解码出错,也要通知等待的消费者\n console.error('Error in handleData:', error);\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n }\n };\n\n // todo 这个框架的事件监听的数据返回顺序有误\n this.on('dataChange', handleData as any);\n\n // 监听取消信号\n const abortHandler = () => {\n isStreamEnded = true;\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n };\n this.cancelSignal.signal.addEventListener('abort', abortHandler);\n\n // 清理函数\n const cleanup = () => {\n if (isCleanupDone) return;\n isCleanupDone = true;\n\n try {\n this.off('dataChange', handleData as any);\n } catch (e) {\n console.error('Error removing dataChange listener:', e);\n }\n\n try {\n this.cancelSignal.signal.removeEventListener('abort', abortHandler);\n } catch (e) {\n console.error('Error removing abort listener:', e);\n }\n\n // 清理 pending promise\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n };\n\n try {\n // 检查是否已取消\n if (this.cancelSignal.signal.aborted) {\n return;\n }\n\n while (!isStreamEnded && !this.cancelSignal.signal.aborted) {\n if (queue.length > 0) {\n for (const item of queue) {\n yield item;\n }\n queue = [];\n } else {\n await new Promise((resolve) => {\n pendingResolve = resolve as () => void;\n });\n }\n }\n } finally {\n // 确保清理总是执行\n cleanup();\n }\n }\n\n async getAll(): Promise<EventMessage[]> {\n return this.compressMessages\n ? ((await Promise.all(\n this.data.map((i) => this.decodeData(i as unknown as string | Uint8Array)),\n )) as unknown as EventMessage[])\n : this.data;\n }\n\n clear(): void {\n this.data = [];\n }\n public cancelSignal = new AbortController();\n async cancel(): Promise<void> {\n // First abort to stop any waiting generators\n this.cancelSignal.abort('user cancel this run');\n // Then push the cancel message to signal other consumers\n await this.push(new CancelEventMessage());\n }\n async copyToQueue(toId: string, ttl?: number): Promise<MemoryStreamQueue> {\n // 深拷贝数据,避免共享引用\n // 注意:这里使用 slice() 创建数组的新副本,虽然元素仍然是引用\n // 但对于 EventMessage 类型,这是足够的,因为消息对象在 push 后不会被修改\n const data = this.data.slice();\n const queue = new MemoryStreamQueue(toId, this.compressMessages, ttl ?? this.ttl);\n queue.data = data;\n return queue;\n }\n}\n","import { BaseThreadsManager } from '../../threads/index.js';\nimport {\n Command,\n Config,\n Metadata,\n OnConflictBehavior,\n Run,\n Thread,\n ThreadState,\n ThreadStatus,\n} from '@langgraph-js/sdk';\nimport { getGraph } from '../../utils/getGraph.js';\nimport { serialiseAsDict } from '../../graph/stream.js';\nimport { RunStatus, SortOrder, ThreadSortBy } from '../../types';\nimport { v7 } from 'uuid';\n\n// Store thread history states\ninterface ThreadCheckpoint {\n checkpoint_id: string;\n thread_id: string;\n values: any;\n next: string[];\n config: Config;\n created_at: string;\n metadata?: Metadata;\n}\n\nexport class MemoryThreadsManager<ValuesType = unknown> implements BaseThreadsManager<ValuesType> {\n private threads: Thread<ValuesType>[] = [];\n private checkpoints: Map<string, ThreadCheckpoint[]> = new Map();\n\n async setup() {\n return;\n }\n\n async create(payload?: {\n metadata?: Metadata;\n threadId?: string;\n ifExists?: OnConflictBehavior;\n graphId?: string;\n supersteps?: Array<{ updates: Array<{ values: unknown; command?: Command; asNode: string }> }>;\n }): Promise<Thread<ValuesType>> {\n const threadId = payload?.threadId || v7();\n if (payload?.ifExists === 'raise' && this.threads.some((t) => t.thread_id === threadId)) {\n throw new Error(`Thread with ID ${threadId} already exists.`);\n }\n\n const thread: Thread<ValuesType> = {\n thread_id: threadId,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n metadata: payload?.metadata || {},\n status: 'idle',\n values: null as unknown as ValuesType,\n interrupts: {},\n };\n\n // Initialize checkpoint history\n this.checkpoints.set(threadId, []);\n\n this.threads.push(thread);\n return thread;\n }\n\n async search(query?: {\n ids?: string[];\n metadata?: Metadata;\n limit?: number;\n offset?: number;\n status?: ThreadStatus;\n sortBy?: ThreadSortBy;\n sortOrder?: SortOrder;\n values?: ValuesType;\n select?: Array<\n | 'thread_id'\n | 'created_at'\n | 'updated_at'\n | 'metadata'\n | 'config'\n | 'context'\n | 'status'\n | 'values'\n | 'interrupts'\n >;\n withoutDetails?: boolean;\n }): Promise<Thread<ValuesType>[]> {\n let filteredThreads = [...this.threads];\n\n // Filter by IDs\n if (query?.ids && query.ids.length > 0) {\n filteredThreads = filteredThreads.filter((t) => query.ids!.includes(t.thread_id));\n }\n\n // Filter by status\n if (query?.status) {\n filteredThreads = filteredThreads.filter((t) => t.status === query.status);\n }\n\n // Filter by metadata\n if (query?.metadata) {\n for (const key in query.metadata) {\n if (Object.prototype.hasOwnProperty.call(query.metadata, key)) {\n filteredThreads = filteredThreads.filter(\n (t) => t.metadata && t.metadata[key] === query.metadata?.[key],\n );\n }\n }\n }\n\n // Filter by values\n if (query?.values) {\n filteredThreads = filteredThreads.filter((t) => {\n if (!t.values) return false;\n return this.deepEqual(t.values, query.values);\n });\n }\n\n // Sort\n if (query?.sortBy) {\n filteredThreads.sort((a, b) => {\n let aValue: any;\n let bValue: any;\n\n switch (query.sortBy) {\n case 'thread_id':\n aValue = a.thread_id;\n bValue = b.thread_id;\n break;\n case 'created_at':\n aValue = new Date(a.created_at).getTime();\n bValue = new Date(b.created_at).getTime();\n break;\n case 'updated_at':\n aValue = new Date(a.updated_at).getTime();\n bValue = new Date(b.updated_at).getTime();\n break;\n case 'status':\n aValue = a.status;\n bValue = b.status;\n break;\n default:\n return 0;\n }\n\n if (query.sortOrder === 'desc') {\n return bValue > aValue ? 1 : bValue < aValue ? -1 : 0;\n } else {\n return aValue > bValue ? 1 : aValue < bValue ? -1 : 0;\n }\n });\n }\n\n const offset = query?.offset || 0;\n const limit = query?.limit || filteredThreads.length;\n\n const paginatedThreads = filteredThreads.slice(offset, offset + limit);\n\n // Handle select/withoutDetails to filter fields\n return paginatedThreads.map((i) => {\n const result: Partial<Thread<ValuesType>> = { thread_id: i.thread_id };\n\n // Determine which fields to include\n let includeFields: Set<string>;\n\n if (query?.select) {\n includeFields = new Set(query.select);\n } else if (query?.withoutDetails) {\n // Legacy withoutDetails behavior - exclude values and interrupts\n includeFields = new Set(['thread_id', 'created_at', 'updated_at', 'metadata', 'status']);\n } else {\n // All fields\n includeFields = new Set([\n 'thread_id',\n 'created_at',\n 'updated_at',\n 'metadata',\n 'status',\n 'values',\n 'interrupts',\n ]);\n }\n\n if (includeFields.has('thread_id')) result.thread_id = i.thread_id;\n if (includeFields.has('created_at')) result.created_at = i.created_at;\n if (includeFields.has('updated_at')) result.updated_at = i.updated_at;\n if (includeFields.has('metadata')) result.metadata = i.metadata;\n if (includeFields.has('status')) result.status = i.status;\n if (includeFields.has('values')) result.values = i.values;\n if (includeFields.has('interrupts')) result.interrupts = i.interrupts;\n\n return result as Thread<ValuesType>;\n });\n }\n\n private deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object' || a === null || b === null) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!this.deepEqual(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n async get(threadId: string): Promise<Thread<ValuesType>> {\n const thread = this.threads.find((t) => t.thread_id === threadId);\n if (!thread) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n return thread;\n }\n\n async set(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<void> {\n const index = this.threads.findIndex((t) => t.thread_id === threadId);\n if (index === -1) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n this.threads[index] = { ...this.threads[index], ...thread };\n }\n\n async delete(threadId: string): Promise<void> {\n const initialLength = this.threads.length;\n this.threads = this.threads.filter((t) => t.thread_id !== threadId);\n this.checkpoints.delete(threadId);\n if (this.threads.length === initialLength) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n }\n\n async updateState(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<Pick<Config, 'configurable'>> {\n const index = this.threads.findIndex((t) => t.thread_id === threadId) as number;\n if (index === -1) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n const targetThread = this.threads[index];\n\n if (targetThread.status === 'busy') {\n throw new Error(`Thread with ID ${threadId} is busy, can't update state.`);\n }\n\n // Allow updating state even without graph_id for basic functionality\n this.threads[index] = {\n ...targetThread,\n values: thread.values as ValuesType,\n updated_at: new Date().toISOString(),\n };\n\n // If graph_id is present, use graph to update state\n if (targetThread.metadata?.graph_id) {\n const graphId = targetThread.metadata?.graph_id as string;\n const config = {\n configurable: {\n thread_id: threadId,\n graph_id: graphId,\n },\n };\n try {\n const graph = await getGraph(graphId, config);\n const nextConfig = await graph.updateState(config, thread.values);\n const graphState = await graph.getState(config);\n await this.set(threadId, { values: JSON.parse(serialiseAsDict(graphState.values)) as ValuesType });\n return nextConfig;\n } catch (error) {\n // If graph update fails, still return a valid response\n console.warn('Failed to update graph state:', error);\n }\n }\n\n return {\n configurable: {\n thread_id: threadId,\n },\n };\n }\n\n runs: Run[] = [];\n\n async createRun(threadId: string, assistantId: string, payload?: { metadata?: Metadata }): Promise<Run> {\n const runId = v7();\n const run: Run = {\n run_id: runId,\n thread_id: threadId,\n assistant_id: assistantId,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n status: 'pending',\n metadata: payload?.metadata ?? {},\n multitask_strategy: 'reject',\n };\n this.runs.push(run);\n return run;\n }\n\n async listRuns(\n threadId: string,\n options?: { limit?: number; offset?: number; status?: RunStatus },\n ): Promise<Run[]> {\n let filteredRuns = [...this.runs];\n if (options?.status) {\n filteredRuns = filteredRuns.filter((r) => r.status === options.status);\n }\n if (options?.limit) {\n filteredRuns = filteredRuns.slice(options.offset || 0, (options.offset || 0) + options.limit);\n }\n return filteredRuns;\n }\n\n async updateRun(runId: string, run: Partial<Run>): Promise<void> {\n const index = this.runs.findIndex((r) => r.run_id === runId);\n if (index === -1) {\n throw new Error(`Run with ID ${runId} not found.`);\n }\n this.runs[index] = { ...this.runs[index], ...run };\n }\n\n // New methods for Threads API\n\n async count(query?: {\n ids?: string[];\n metadata?: Metadata;\n status?: ThreadStatus;\n values?: ValuesType;\n }): Promise<number> {\n const threads = await this.search(query);\n return threads.length;\n }\n\n async patch(\n threadId: string,\n updates: Partial<Omit<Thread<ValuesType>, 'thread_id' | 'created_at' | 'updated_at'>>,\n ): Promise<Thread<ValuesType>> {\n const index = this.threads.findIndex((t) => t.thread_id === threadId);\n if (index === -1) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n\n // Merge metadata if provided\n const updatedThread: Thread<ValuesType> = {\n ...this.threads[index],\n ...updates,\n updated_at: new Date().toISOString(),\n metadata: updates.metadata\n ? { ...this.threads[index].metadata, ...updates.metadata }\n : this.threads[index].metadata,\n };\n\n this.threads[index] = updatedThread;\n return updatedThread;\n }\n\n async getState(threadId: string, options?: { subgraphs?: boolean; checkpointId?: string }): Promise<ThreadState> {\n const thread = await this.get(threadId);\n\n if (options?.checkpointId) {\n // Get state at specific checkpoint\n const checkpoints = this.checkpoints.get(threadId) || [];\n const checkpoint = checkpoints.find((c) => c.checkpoint_id === options.checkpointId);\n if (!checkpoint) {\n throw new Error(`Checkpoint with ID ${options.checkpointId} not found for thread ${threadId}`);\n }\n return {\n values: checkpoint.values,\n next: checkpoint.next,\n metadata: checkpoint.metadata,\n checkpoint: {\n /** @ts-ignore 附加属性 */\n id: checkpoint.checkpoint_id,\n thread_id: threadId,\n parent_checkpoint_id: null,\n checkpoint_ns: '',\n metadata: checkpoint.metadata,\n created_at: checkpoint.created_at,\n },\n created_at: checkpoint.created_at,\n parent_checkpoint: null,\n tasks: [],\n };\n }\n\n // Get latest state\n const state: ThreadState = {\n values: thread.values || {},\n next: [],\n metadata: thread.metadata,\n /** @ts-ignore 没有查询过 */\n checkpoint: null,\n created_at: thread.created_at,\n parent_checkpoint: null,\n tasks: [],\n };\n\n return state;\n }\n\n async getStateHistory(\n threadId: string,\n options?: {\n limit?: number;\n before?: string;\n filter?: { source?: string; step?: number };\n },\n ): Promise<ThreadState[]> {\n const checkpoints = this.checkpoints.get(threadId) || [];\n\n let history: ThreadState[] = checkpoints.map(\n (cp) =>\n ({\n values: cp.values,\n next: cp.next,\n metadata: cp.metadata,\n checkpoint: {\n checkpoint_id: cp.checkpoint_id,\n thread_id: threadId,\n checkpoint_ns: '',\n checkpoint_map: undefined,\n },\n created_at: cp.created_at,\n parent_checkpoint: null,\n tasks: [],\n } satisfies ThreadState),\n );\n\n // Filter by 'before' checkpoint ID\n if (options?.before) {\n const beforeIndex = checkpoints.findIndex((c) => c.checkpoint_id === options.before);\n if (beforeIndex !== -1) {\n history = history.slice(beforeIndex + 1);\n }\n }\n\n // Apply limit\n if (options?.limit) {\n history = history.slice(0, options.limit);\n }\n\n return history;\n }\n\n async copy(threadId: string): Promise<Thread<ValuesType>> {\n const originalThread = await this.get(threadId);\n\n // Create new thread\n const newThreadId = v7();\n const newThread: Thread<ValuesType> = {\n ...originalThread,\n thread_id: newThreadId,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n };\n\n this.threads.push(newThread);\n\n // Copy checkpoints\n const originalCheckpoints = this.checkpoints.get(threadId) || [];\n const newCheckpoints = originalCheckpoints.map((cp) => ({\n ...cp,\n checkpoint_id: v7(), // Generate new checkpoint IDs\n thread_id: newThreadId,\n }));\n this.checkpoints.set(newThreadId, newCheckpoints);\n\n return newThread;\n }\n\n // Helper method to save checkpoint (used internally)\n async saveCheckpoint(\n threadId: string,\n values: any,\n next: string[],\n config: Config,\n metadata?: Metadata,\n ): Promise<void> {\n const checkpoints = this.checkpoints.get(threadId) || [];\n const checkpoint: ThreadCheckpoint = {\n checkpoint_id: v7(),\n thread_id: threadId,\n values,\n next,\n config,\n created_at: new Date().toISOString(),\n metadata,\n };\n checkpoints.push(checkpoint);\n this.checkpoints.set(threadId, checkpoints);\n }\n}\n","import { BaseStreamQueueInterface, StreamQueueManager } from '../queue/stream_queue';\nimport { KyselyThreadsManager } from './kysely/threads';\nimport { MemorySaver } from './memory/checkpoint';\nimport { MemoryStreamQueue } from './memory/queue';\nimport { MemoryThreadsManager } from './memory/threads';\nimport type { SqliteSaver as SqliteSaverType } from './sqlite/checkpoint';\nimport type { PostgresSaver } from '@langchain/langgraph-checkpoint-postgres';\n\n// 所有的适配实现,都请写到这里,通过环境变量进行判断使用哪种方式进行适配\nexport const createCheckPointer = async () => {\n if (\n (process.env.REDIS_URL && process.env.CHECKPOINT_TYPE === 'redis') ||\n process.env.CHECKPOINT_TYPE === 'shallow/redis'\n ) {\n if (process.env.CHECKPOINT_TYPE === 'redis') {\n console.debug('LG | Using redis as checkpoint');\n const { RedisSaver } = await import('@langchain/langgraph-checkpoint-redis');\n return await RedisSaver.fromUrl(process.env.REDIS_URL!, {\n defaultTTL: 60, // TTL in minutes\n refreshOnRead: true,\n });\n }\n if (process.env.CHECKPOINT_TYPE === 'shallow/redis') {\n console.debug('LG | Using shallow redis as checkpoint');\n const { ShallowRedisSaver } = await import('@langchain/langgraph-checkpoint-redis/shallow');\n return await ShallowRedisSaver.fromUrl(process.env.REDIS_URL!);\n }\n }\n\n if (process.env.DATABASE_URL && getDatabaseType(process.env.DATABASE_URL) === 'postgres') {\n console.debug('LG | Using postgres as checkpoint');\n const { createPGCheckpoint } = await import('./pg/checkpoint');\n return createPGCheckpoint();\n }\n\n if (process.env.SQLITE_DATABASE_URI) {\n console.debug('LG | Using sqlite as checkpoint');\n const { SqliteSaver } = await import('./sqlite/checkpoint');\n const db = await SqliteSaver.fromConnStringAsync(process.env.SQLITE_DATABASE_URI);\n return db;\n }\n console.log('LG | You are using memory as checkpoint!');\n console.log(\n '\\x1b[33m%s\\x1b[0m',\n 'LG | set SQLITE_DATABASE_URI=./.langgraph_api/langgraph.db to your .env file to use \\x1b[1mSQLite\\x1b[0m for dev!',\n );\n console.log(\n '\\x1b[33m%s\\x1b[0m',\n 'LG | set DATABASE_URL=postgresql://user:pass@localhost:5432/db to your .env file to use \\x1b[1mPostgreSQL\\x1b[0m for prod!',\n );\n return new MemorySaver();\n};\n\nexport const createMessageQueue = async () => {\n let q: new (id: string) => BaseStreamQueueInterface;\n if (process.env.REDIS_URL) {\n console.debug('LG | Using redis as stream queue');\n const { RedisStreamQueue } = await import('./redis/queue');\n q = RedisStreamQueue;\n } else {\n q = MemoryStreamQueue;\n }\n return new StreamQueueManager(q);\n};\n\n/**\n * 检测 DATABASE_URL 类型\n */\nfunction getDatabaseType(databaseUrl: string): 'postgres' | 'remote' {\n const url = databaseUrl.toLowerCase();\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return 'remote';\n }\n return 'postgres';\n}\n\nexport const createThreadManager = async (config: { checkpointer?: SqliteSaverType | PostgresSaver }) => {\n if (process.env.DATABASE_URL) {\n const dbType = getDatabaseType(process.env.DATABASE_URL);\n\n if (dbType === 'remote') {\n // 使用远程 PG 适配器\n console.debug('LG | Using Remote PostgreSQL ThreadsManager');\n const { RemoteKyselyThreadsManager } = await import('./kysely/remote-threads');\n const threadsManager = new RemoteKyselyThreadsManager(process.env.DATABASE_URL);\n if (process.env.DATABASE_INIT === 'true') {\n await threadsManager.setup();\n }\n return threadsManager;\n } else {\n // 使用本地 PG 适配器(现有逻辑)\n if (config.checkpointer) {\n console.debug('LG | Using PostgreSQL ThreadsManager');\n const { PostgresAdapter } = await import('./kysely/pg-adapter');\n const pool = (config.checkpointer as PostgresSaver as any).pool;\n const threadsManager = new KyselyThreadsManager(new PostgresAdapter(pool));\n if (process.env.DATABASE_INIT === 'true') {\n await threadsManager.setup();\n }\n return threadsManager;\n }\n }\n }\n if (process.env.SQLITE_DATABASE_URI && config.checkpointer) {\n console.debug('LG | Using SQLite ThreadsManager');\n const { SQLiteAdapter } = await import('./kysely/sqlite-adapter');\n const database = (config.checkpointer as SqliteSaverType).db;\n const threadsManager = new KyselyThreadsManager(new SQLiteAdapter(database));\n // sqlite 可以执行多次,速度很快\n await threadsManager.setup();\n return threadsManager;\n }\n return new MemoryThreadsManager();\n};\n","import { BaseCheckpointSaver } from '@langchain/langgraph-checkpoint';\nimport { BaseStreamQueueInterface, StreamQueueManager } from './queue/stream_queue.js';\nimport { createCheckPointer, createMessageQueue, createThreadManager } from './storage/index.js';\nimport type { SqliteSaver } from './storage/sqlite/checkpoint.js';\nimport type { PostgresSaver } from '@langchain/langgraph-checkpoint-postgres';\nimport { BaseThreadsManager } from './threads/index.js';\n\nexport class LangGraphGlobal {\n static globalMessageQueue: StreamQueueManager<BaseStreamQueueInterface> = null as any;\n static globalCheckPointer: BaseCheckpointSaver = null as any;\n static globalThreadsManager: BaseThreadsManager = null as any;\n static isInitialized: Promise<void> | null = null;\n static async initGlobal() {\n if (LangGraphGlobal.isInitialized) {\n return LangGraphGlobal.isInitialized;\n }\n LangGraphGlobal.isInitialized = (async () => {\n const [globalMessageQueue, globalCheckPointer] = await Promise.all([\n createMessageQueue(),\n createCheckPointer(),\n ]);\n console.debug('LG | checkpointer created');\n const globalThreadsManager = await createThreadManager({\n checkpointer: globalCheckPointer as SqliteSaver | PostgresSaver,\n });\n console.debug('LG | threads manager created');\n console.debug('LG | global init done');\n LangGraphGlobal.globalMessageQueue = globalMessageQueue;\n LangGraphGlobal.globalCheckPointer = globalCheckPointer;\n LangGraphGlobal.globalThreadsManager = globalThreadsManager;\n })();\n return LangGraphGlobal.isInitialized;\n }\n}\n","import { AIMessageChunk } from '@langchain/core/messages';\nimport type { BaseCheckpointSaver, LangGraphRunnableConfig } from '@langchain/langgraph';\nimport type { Pregel } from '@langchain/langgraph/pregel';\nimport { getLangGraphCommand } from '../utils/getLangGraphCommand.js';\nimport type { BaseStreamQueueInterface } from '../queue/stream_queue.js';\nimport { concat } from '@langchain/core/utils/stream';\nimport { LangGraphGlobal } from '../global.js';\nimport { Run } from '@langgraph-js/sdk';\nimport { EventMessage, StreamErrorEventMessage, StreamEndEventMessage } from '../queue/event_message.js';\n\nimport { BaseThreadsManager } from '../threads/index.js';\nimport { StreamInputData } from '../types.js';\n\nexport type LangGraphStreamMode = Pregel<any, any>['streamMode'][number];\n\nexport async function streamStateWithQueue(\n threads: BaseThreadsManager,\n run: Run,\n queue: BaseStreamQueueInterface,\n payload: StreamInputData,\n options: {\n attempt: number;\n getGraph: (\n graphId: string,\n config: LangGraphRunnableConfig | undefined,\n options?: { checkpointer?: BaseCheckpointSaver | null },\n ) => Promise<Pregel<any, any, any, any, any>>;\n compressMessages?: boolean;\n },\n): Promise<void> {\n const kwargs = payload;\n const graphId = kwargs.config?.configurable?.graph_id;\n\n if (!graphId || typeof graphId !== 'string') {\n throw new Error('Invalid or missing graph_id');\n }\n\n const graph = await options.getGraph(graphId, payload.config, {\n checkpointer: payload.temporary ? null : undefined,\n });\n\n const userStreamMode = payload.streamMode ?? [];\n\n const libStreamMode: Set<LangGraphStreamMode> = new Set([\n 'values',\n ...userStreamMode.filter((mode) => mode !== 'events' && mode !== 'messages-tuple'),\n ]);\n\n if (userStreamMode.includes('messages-tuple')) {\n libStreamMode.add('messages');\n }\n\n if (userStreamMode.includes('messages')) {\n libStreamMode.add('values');\n }\n\n await queue.push(\n new EventMessage('metadata', {\n run_id: run.run_id,\n attempt: options.attempt,\n graph_id: graphId,\n }),\n );\n\n const metadata = {\n ...payload.config?.metadata,\n run_attempt: options.attempt,\n };\n const events = graph.stream(\n payload.command != null ? getLangGraphCommand(payload.command) : payload.input ?? null,\n {\n interruptAfter: payload.interruptAfter,\n interruptBefore: payload.interruptBefore,\n\n tags: payload.config?.tags,\n configurable: payload.config?.configurable,\n recursionLimit: payload.config?.recursionLimit,\n subgraphs: payload.streamSubgraphs,\n metadata,\n\n runId: run.run_id,\n streamMode: [...libStreamMode],\n signal: queue.cancelSignal.signal,\n },\n );\n\n // 在 try 块之前声明变量,确保 finally 块可以访问\n let sendedMetadataMessage: Set<string>;\n let messageChunks: Map<string, AIMessageChunk[]>;\n\n try {\n sendedMetadataMessage = new Set();\n messageChunks = new Map<string, AIMessageChunk[]>();\n for await (const event of await events) {\n let ns: string[] = [];\n /** @ts-ignore subgraph 类型可以为 [ns,name,value] */\n if (event.length === 3) {\n ns = event.splice(0, 1);\n }\n\n const getNameWithNs = (name: string) => {\n if (ns.length === 0) return name;\n if (ns.length === 1 && ns[0]?.length === 0) return name;\n return `${name}|${ns.join('|')}`;\n };\n if (event[0] === 'values') {\n const value = event[1];\n await queue.push(new EventMessage(getNameWithNs('values'), value));\n if (getNameWithNs('values') === 'values') {\n if (value?.__interrupt__) {\n await threads.set(run.thread_id, {\n status: 'interrupted',\n interrupts: value ? JSON.parse(serialiseAsDict(value)) : '',\n });\n } else {\n await threads.set(run.thread_id, {\n values: value ? JSON.parse(serialiseAsDict(value)) : '',\n });\n }\n }\n } else if (event[0] === 'messages') {\n const message = event[1][0];\n const metadata = event[1][1];\n // 只在第一次发送 metadata\n if (message.id && !sendedMetadataMessage.has(message.id)) {\n await queue.push(\n new EventMessage('messages/metadata', {\n [message.id]: metadata,\n }),\n );\n sendedMetadataMessage.add(message.id);\n }\n if (AIMessageChunk.isInstance(message) && message.id) {\n messageChunks.set(message.id, [\n ...(messageChunks.get(message.id) ?? []),\n message as AIMessageChunk,\n ]);\n await queue.push(\n new EventMessage('messages/partial', [messageChunks.get(message.id)!.reduce(concat)]),\n );\n } else {\n await queue.push(new EventMessage('messages/partial', [message]));\n }\n } else if (event[0] === 'updates') {\n const updates = event[1];\n await queue.push(new EventMessage(getNameWithNs('updates'), updates));\n }\n }\n } finally {\n // 发送流结束信号\n await queue.push(new StreamEndEventMessage());\n // 清理内存:清空 Set 和 Map\n /** @ts-ignore */\n if (sendedMetadataMessage) {\n sendedMetadataMessage.clear();\n }\n /** @ts-ignore */\n if (messageChunks) {\n messageChunks.clear();\n }\n }\n}\n\n/**\n * 从队列创建数据流生成器\n * @param queueId 队列 ID\n * @param signal 中止信号\n * @returns 数据流生成器\n */\nexport async function* createStreamFromQueue(queueId: string): AsyncGenerator<{ event: string; data: unknown }> {\n const queue = await LangGraphGlobal.globalMessageQueue.getQueue(queueId);\n return queue.onDataReceive();\n}\n\nexport const serialiseAsDict = (obj: unknown, indent = 0) => {\n return JSON.stringify(\n obj,\n function (key: string | number, value: unknown) {\n const rawValue = this[key];\n if (\n rawValue != null &&\n typeof rawValue === 'object' &&\n 'toDict' in rawValue &&\n typeof rawValue.toDict === 'function'\n ) {\n // TODO: we need to upstream this to LangChainJS\n const { type, data } = rawValue.toDict();\n return { ...data, type };\n }\n\n return value;\n },\n indent,\n );\n};\n/**\n * 兼容性函数:保持原有 API,同时使用队列模式\n * @param run 运行配置\n * @param options 选项\n * @returns 数据流生成器\n */\nexport async function* streamState(\n threads: BaseThreadsManager,\n run: Run | Promise<Run>,\n payload: StreamInputData,\n options: {\n attempt: number;\n getGraph: (\n graphId: string,\n config: LangGraphRunnableConfig | undefined,\n options?: { checkpointer?: BaseCheckpointSaver | null },\n ) => Promise<Pregel<any, any, any, any, any>>;\n compressMessages?: boolean;\n },\n) {\n run = await run;\n // 生成唯一的队列 ID\n const queueId = run.run_id;\n const threadId = run.thread_id;\n try {\n // 启动队列推送任务(在后台异步执行)\n await threads.set(threadId, { status: 'busy' });\n await threads.updateRun(run.run_id, { status: 'running' });\n const queue = LangGraphGlobal.globalMessageQueue.createQueue(queueId);\n const state = queue.onDataReceive();\n streamStateWithQueue(threads, run, queue, payload, options).catch((error) => {\n if (error.message !== 'user cancel this run') console.error('Queue task error:', error);\n // 如果生产者出错,向队列推送错误信号\n LangGraphGlobal.globalMessageQueue.pushToQueue(queueId, new StreamErrorEventMessage(error));\n // TODO 不知道这里需不需要错误处理\n });\n for await (const data of state) {\n yield data;\n }\n await threads.updateRun(run.run_id, { status: 'success' });\n } catch (error) {\n // 如果发生错误,确保清理资源\n console.error('Stream error:', error);\n await threads.updateRun(run.run_id, { status: 'error' });\n await threads.set(threadId, { status: 'error' });\n // throw error;\n } finally {\n const nowState = await threads.get(threadId);\n // 在完成后清理队列\n if (nowState.status === 'interrupted') {\n // 注意,interrupted 状态,直接拷贝一个需要恢复状态的队列即可\n await LangGraphGlobal.globalMessageQueue.copyQueue(queueId, threadId, 30000);\n } else {\n await threads.set(threadId, { status: 'idle', interrupts: {} });\n }\n // 清空队列数据,释放内存\n await LangGraphGlobal.globalMessageQueue.clearQueue(queueId);\n LangGraphGlobal.globalMessageQueue.removeQueue(queueId);\n }\n}\n"],"names":["metadata"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream-Crp1K8nB.js","sources":["../src/utils/getLangGraphCommand.ts","../src/graph/stringify.ts","../src/queue/JsonPlusSerializer.ts","../src/queue/stream_queue.ts","../src/utils/getGraph.ts","../src/storage/kysely/threads.ts","../src/queue/event_message.ts","../src/storage/memory/queue.ts","../src/storage/memory/threads.ts","../src/storage/index.ts","../src/global.ts","../src/graph/stream.ts"],"sourcesContent":["import { Command, Send } from '@langchain/langgraph';\nimport { Command as ClientCommand } from '@langgraph-js/sdk';\nexport interface RunSend {\n node: string;\n input?: unknown;\n}\n\nexport interface RunCommand extends ClientCommand {}\n\nexport const getLangGraphCommand = (command: RunCommand) => {\n let goto = command.goto != null && !Array.isArray(command.goto) ? [command.goto] : command.goto;\n\n return new Command({\n goto: goto?.map((item: string | RunSend) => {\n if (typeof item !== 'string') return new Send(item.node, item.input);\n return item;\n }),\n update: command.update ?? undefined,\n resume: command.resume,\n });\n};\n","/* eslint-disable */\n// @ts-nocheck\n\n// Stringify that can handle circular references.\n// Inlined due to ESM import issues\n// Source: https://www.npmjs.com/package/fast-safe-stringify\n\nvar LIMIT_REPLACE_NODE = '[...]';\nvar CIRCULAR_REPLACE_NODE = '[Circular]';\n\nvar arr = [];\nvar replacerStack = [];\n\nfunction defaultOptions() {\n return {\n depthLimit: Number.MAX_SAFE_INTEGER,\n edgesLimit: Number.MAX_SAFE_INTEGER,\n };\n}\n\n// Regular stringify\nexport function stringify(obj, replacer?, spacer?, options?) {\n if (typeof options === 'undefined') {\n options = defaultOptions();\n }\n\n decirc(obj, '', 0, [], undefined, 0, options);\n var res;\n try {\n if (replacerStack.length === 0) {\n res = JSON.stringify(obj, replacer, spacer);\n } else {\n res = JSON.stringify(obj, replaceGetterValues(replacer), spacer);\n }\n } catch (_) {\n return JSON.stringify('[unable to serialize, circular reference is too complex to analyze]');\n } finally {\n while (arr.length !== 0) {\n var part = arr.pop();\n if (part.length === 4) {\n Object.defineProperty(part[0], part[1], part[3]);\n } else {\n part[0][part[1]] = part[2];\n }\n }\n }\n return res;\n}\n\nfunction setReplace(replace, val, k, parent) {\n var propertyDescriptor = Object.getOwnPropertyDescriptor(parent, k);\n if (propertyDescriptor.get !== undefined) {\n if (propertyDescriptor.configurable) {\n Object.defineProperty(parent, k, { value: replace });\n arr.push([parent, k, val, propertyDescriptor]);\n } else {\n replacerStack.push([val, k, replace]);\n }\n } else {\n parent[k] = replace;\n arr.push([parent, k, val]);\n }\n}\n\nfunction decirc(val, k, edgeIndex, stack, parent, depth, options) {\n depth += 1;\n var i;\n if (typeof val === 'object' && val !== null) {\n for (i = 0; i < stack.length; i++) {\n if (stack[i] === val) {\n setReplace(CIRCULAR_REPLACE_NODE, val, k, parent);\n return;\n }\n }\n\n if (typeof options.depthLimit !== 'undefined' && depth > options.depthLimit) {\n setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n return;\n }\n\n if (typeof options.edgesLimit !== 'undefined' && edgeIndex + 1 > options.edgesLimit) {\n setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n return;\n }\n\n stack.push(val);\n // Optimize for Arrays. Big arrays could kill the performance otherwise!\n if (Array.isArray(val)) {\n for (i = 0; i < val.length; i++) {\n decirc(val[i], i, i, stack, val, depth, options);\n }\n } else {\n var keys = Object.keys(val);\n for (i = 0; i < keys.length; i++) {\n var key = keys[i];\n decirc(val[key], key, i, stack, val, depth, options);\n }\n }\n stack.pop();\n }\n}\n\n// Stable-stringify\nfunction compareFunction(a, b) {\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n}\n\nfunction deterministicStringify(obj, replacer, spacer, options) {\n if (typeof options === 'undefined') {\n options = defaultOptions();\n }\n\n var tmp = deterministicDecirc(obj, '', 0, [], undefined, 0, options) || obj;\n var res;\n try {\n if (replacerStack.length === 0) {\n res = JSON.stringify(tmp, replacer, spacer);\n } else {\n res = JSON.stringify(tmp, replaceGetterValues(replacer), spacer);\n }\n } catch (_) {\n return JSON.stringify('[unable to serialize, circular reference is too complex to analyze]');\n } finally {\n // Ensure that we restore the object as it was.\n while (arr.length !== 0) {\n var part = arr.pop();\n if (part.length === 4) {\n Object.defineProperty(part[0], part[1], part[3]);\n } else {\n part[0][part[1]] = part[2];\n }\n }\n }\n return res;\n}\n\nfunction deterministicDecirc(val, k, edgeIndex, stack, parent, depth, options) {\n depth += 1;\n var i;\n if (typeof val === 'object' && val !== null) {\n for (i = 0; i < stack.length; i++) {\n if (stack[i] === val) {\n setReplace(CIRCULAR_REPLACE_NODE, val, k, parent);\n return;\n }\n }\n try {\n if (typeof val.toJSON === 'function') {\n return;\n }\n } catch (_) {\n return;\n }\n\n if (typeof options.depthLimit !== 'undefined' && depth > options.depthLimit) {\n setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n return;\n }\n\n if (typeof options.edgesLimit !== 'undefined' && edgeIndex + 1 > options.edgesLimit) {\n setReplace(LIMIT_REPLACE_NODE, val, k, parent);\n return;\n }\n\n stack.push(val);\n // Optimize for Arrays. Big arrays could kill the performance otherwise!\n if (Array.isArray(val)) {\n for (i = 0; i < val.length; i++) {\n deterministicDecirc(val[i], i, i, stack, val, depth, options);\n }\n } else {\n // Create a temporary object in the required way\n var tmp = {};\n var keys = Object.keys(val).sort(compareFunction);\n for (i = 0; i < keys.length; i++) {\n var key = keys[i];\n deterministicDecirc(val[key], key, i, stack, val, depth, options);\n tmp[key] = val[key];\n }\n if (typeof parent !== 'undefined') {\n arr.push([parent, k, val]);\n parent[k] = tmp;\n } else {\n return tmp;\n }\n }\n stack.pop();\n }\n}\n\n// wraps replacer function to handle values we couldn't replace\n// and mark them as replaced value\nfunction replaceGetterValues(replacer) {\n replacer =\n typeof replacer !== 'undefined'\n ? replacer\n : function (k, v) {\n return v;\n };\n return function (key, val) {\n if (replacerStack.length > 0) {\n for (var i = 0; i < replacerStack.length; i++) {\n var part = replacerStack[i];\n if (part[1] === key && part[0] === val) {\n val = part[2];\n replacerStack.splice(i, 1);\n break;\n }\n }\n }\n return replacer.call(this, key, val);\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-instanceof/no-instanceof */\nimport { load } from '@langchain/core/load';\nimport type { SerializerProtocol } from '@langchain/langgraph-checkpoint';\nimport { stringify } from '../graph/stringify.js';\n\nfunction isLangChainSerializedObject(value: Record<string, unknown>) {\n return value !== null && value.lc === 1 && value.type === 'constructor' && Array.isArray(value.id);\n}\n\n/**\n * The replacer in stringify does not allow delegation to built-in LangChain\n * serialization methods, and instead immediately calls `.toJSON()` and\n * continues to stringify subfields.\n *\n * We therefore must start from the most nested elements in the input and\n * deserialize upwards rather than top-down.\n */\nasync function _reviver(value: any): Promise<any> {\n if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n const revivedArray = await Promise.all(value.map((item) => _reviver(item)));\n return revivedArray;\n } else {\n const revivedObj: any = {};\n for (const [k, v] of Object.entries(value)) {\n revivedObj[k] = await _reviver(v);\n }\n\n if (revivedObj.lc === 2 && revivedObj.type === 'undefined') {\n return undefined;\n } else if (revivedObj.lc === 2 && revivedObj.type === 'constructor' && Array.isArray(revivedObj.id)) {\n try {\n const constructorName = revivedObj.id[revivedObj.id.length - 1];\n let constructor: any;\n\n switch (constructorName) {\n case 'Set':\n constructor = Set;\n break;\n case 'Map':\n constructor = Map;\n break;\n case 'RegExp':\n constructor = RegExp;\n break;\n case 'Error':\n constructor = Error;\n break;\n default:\n return revivedObj;\n }\n if (revivedObj.method) {\n return (constructor as any)[revivedObj.method](...(revivedObj.args || []));\n } else {\n return new (constructor as any)(...(revivedObj.args || []));\n }\n } catch (error) {\n return revivedObj;\n }\n } else if (isLangChainSerializedObject(revivedObj)) {\n return load(JSON.stringify(revivedObj));\n }\n\n return revivedObj;\n }\n }\n return value;\n}\n\nfunction _encodeConstructorArgs(\n // eslint-disable-next-line @typescript-eslint/ban-types\n constructor: Function,\n method?: string,\n args?: any[],\n kwargs?: Record<string, any>,\n): object {\n return {\n lc: 2,\n type: 'constructor',\n id: [constructor.name],\n method: method ?? null,\n args: args ?? [],\n kwargs: kwargs ?? {},\n };\n}\n\nfunction _default(obj: any): any {\n if (obj === undefined) {\n return {\n lc: 2,\n type: 'undefined',\n };\n } else if (obj instanceof Set || obj instanceof Map) {\n return _encodeConstructorArgs(obj.constructor, undefined, [Array.from(obj)]);\n } else if (obj instanceof RegExp) {\n return _encodeConstructorArgs(RegExp, undefined, [obj.source, obj.flags]);\n } else if (obj instanceof Error) {\n return _encodeConstructorArgs(obj.constructor, undefined, [obj.message]);\n // TODO: Remove special case\n } else if (obj?.lg_name === 'Send') {\n return {\n node: obj.node,\n args: obj.args,\n };\n } else {\n return obj;\n }\n}\n\nexport class JsonPlusSerializer implements SerializerProtocol {\n protected _dumps(obj: any): Uint8Array {\n const encoder = new TextEncoder();\n return encoder.encode(\n stringify(obj, (_: string, value: any) => {\n return _default(value);\n }),\n );\n }\n\n async dumpsTyped(obj: any): Promise<[string, Uint8Array]> {\n if (obj instanceof Uint8Array) {\n return ['bytes', obj];\n } else {\n return ['json', this._dumps(obj)];\n }\n }\n\n protected async _loads(data: string): Promise<any> {\n const parsed = JSON.parse(data);\n return _reviver(parsed);\n }\n\n async loadsTyped(type: string, data: Uint8Array | string): Promise<any> {\n if (type === 'bytes') {\n return typeof data === 'string' ? new TextEncoder().encode(data) : data;\n } else if (type === 'json') {\n return this._loads(typeof data === 'string' ? data : new TextDecoder().decode(data));\n } else {\n throw new Error(`Unknown serialization type: ${type}`);\n }\n }\n}\n","import { EventEmitter } from 'eventemitter3';\nimport { JsonPlusSerializer } from './JsonPlusSerializer.js';\nimport { EventMessage } from './event_message.js';\n\n/**\n * 流队列事件接口\n * Stream queue events interface\n */\ninterface StreamQueueEvents<T extends EventMessage> {\n /** 数据事件:当有新数据时触发 / Data event: triggered when new data arrives */\n data: (data: T) => void;\n /** 其他事件 / Other events */\n [key: string]: ((...args: any[]) => void) | undefined;\n}\n\n/**\n * 基础流队列类\n * Base stream queue class\n */\nexport class BaseStreamQueue extends EventEmitter<StreamQueueEvents<EventMessage>> {\n /** 序列化器实例 / Serializer instance */\n serializer = new JsonPlusSerializer();\n\n /**\n * 构造函数\n * Constructor\n * @param compressMessages 是否压缩消息 / Whether to compress messages\n */\n constructor(readonly id: string, readonly compressMessages: boolean = true, readonly ttl: number = 300) {\n super();\n }\n\n /**\n * 编码数据为 Uint8Array\n * Encode data to Uint8Array\n * @param message 要编码的消息 / Message to encode\n * @returns 编码后的 Uint8Array / Encoded Uint8Array\n */\n async encodeData(message: EventMessage): Promise<Uint8Array> {\n const [_, serializedMessage] = await this.serializer.dumpsTyped(message);\n return serializedMessage;\n }\n\n /**\n * 解码数据为 EventMessage\n * Decode data to EventMessage\n * @param serializedMessage 要解码的消息 / Message to decode\n * @returns 解码后的 EventMessage / Decoded EventMessage\n */\n async decodeData(serializedMessage: string | Uint8Array): Promise<EventMessage> {\n const message = (await this.serializer.loadsTyped('json', serializedMessage)) as EventMessage;\n return message;\n }\n}\n\n/**\n * 基础流队列接口\n * Base stream queue interface\n */\nexport interface BaseStreamQueueInterface {\n id: string;\n /** 是否压缩消息 / Whether to compress messages */\n compressMessages: boolean;\n /**\n * 推送数据项到队列\n * Push item to queue\n * @param item 要推送的数据项 / Item to push\n */\n push(item: EventMessage): Promise<void>;\n /** 获取所有数据 / Get all data */\n getAll(): Promise<EventMessage[]>;\n /** 清空队列 / Clear queue */\n clear(): void | Promise<void>;\n /**\n * 监听数据变化\n * Listen for data changes\n * @param listener 数据变化监听器 / Data change listener\n * @returns 取消监听函数 / Unsubscribe function\n */\n onDataReceive(): AsyncGenerator<EventMessage, void, unknown>;\n /** 取消信号控制器 / Cancel signal controller */\n cancelSignal: AbortController;\n /** 取消操作 / Cancel operation */\n cancel(): Promise<void>;\n /** 复制队列数据 / Copy queue data */\n copyToQueue(toId: string, ttl?: number): Promise<BaseStreamQueueInterface>;\n}\n\nexport type QueueConstructor<Q extends BaseStreamQueueInterface> = (new (\n queueId: string,\n compressMessages: boolean,\n ttl?: number,\n) => Q) & {\n isQueueExist?: (id: string) => Promise<boolean>;\n};\n\n/**\n * StreamQueue 管理器,通过 id 管理多个队列实例\n * StreamQueue manager, manages multiple queue instances by id\n */\nexport class StreamQueueManager<Q extends BaseStreamQueueInterface> {\n /** 存储队列实例的 Map / Map storing queue instances */\n private queues: Map<string, Q> = new Map();\n /** 默认是否压缩消息 / Default compress messages setting */\n private defaultCompressMessages: boolean;\n /** 队列构造函数 / Queue constructor */\n private queueConstructor: QueueConstructor<Q>;\n\n /**\n * 构造函数\n * Constructor\n * @param queueConstructor 队列构造函数 / Queue constructor\n * @param options 配置选项 / Configuration options\n */\n constructor(\n queueConstructor: QueueConstructor<Q>,\n options: {\n /** 默认是否压缩消息 / Default compress messages setting */\n defaultCompressMessages?: boolean;\n } = {},\n ) {\n this.defaultCompressMessages = options.defaultCompressMessages ?? true;\n this.queueConstructor = queueConstructor;\n }\n\n /**\n * 创建指定 id 的队列\n * Create queue with specified id\n * @param id 队列 ID / Queue ID\n * @param compressMessages 是否压缩消息 / Whether to compress messages\n * @returns 创建的队列实例 / Created queue instance\n */\n createQueue(id: string, ttl: number = 300): Q {\n this.queues.set(id, new this.queueConstructor(id, this.defaultCompressMessages, ttl));\n return this.queues.get(id)!;\n }\n\n /**\n * 获取或创建指定 id 的队列\n * Get or create queue with specified id\n * @param id 队列 ID / Queue ID\n * @param compressMessages 是否压缩消息,默认为构造函数中的默认值 / Whether to compress messages, defaults to constructor default\n * @returns StreamQueue 实例 / StreamQueue instance\n */\n async getQueue(id: string): Promise<Q> {\n const queue = this.queues.get(id);\n if (!queue) {\n if (await this.queueConstructor?.isQueueExist?.(id)) {\n return this.createQueue(id);\n } else {\n throw new Error(`Queue with id '${id}' does not exist`);\n }\n }\n return queue;\n }\n\n /**\n * 取消指定 id 的队列\n * Cancel queue with specified id\n * @param id 队列 ID / Queue ID\n */\n async cancelQueue(id: string): Promise<void> {\n const queue = this.queues.get(id);\n if (queue) {\n await queue.cancel();\n this.removeQueue(id);\n }\n }\n /**\n * 向指定 id 的队列推送数据\n * Push data to queue with specified id\n * @param id 队列 ID / Queue ID\n * @param item 要推送的数据项 / Item to push\n */\n async pushToQueue(id: string, item: EventMessage): Promise<void> {\n const queue = await this.getQueue(id);\n await queue.push(item);\n }\n\n /**\n * 获取指定 id 队列中的所有数据\n * Get all data from queue with specified id\n * @param id 队列 ID / Queue ID\n * @returns 队列中的所有数据 / All data in the queue\n */\n async getQueueData(id: string): Promise<EventMessage[]> {\n const queue = this.queues.get(id);\n if (!queue) {\n throw new Error(`Queue with id '${id}' does not exist`);\n }\n return await queue.getAll();\n }\n\n /**\n * 清空指定 id 的队列\n * Clear queue with specified id\n * @param id 队列 ID / Queue ID\n */\n async clearQueue(id: string): Promise<void> {\n const queue = this.queues.get(id);\n if (queue) {\n const result = queue.clear();\n // 支持同步和异步的 clear 方法\n if (result instanceof Promise) {\n await result;\n }\n }\n }\n\n /**\n * 删除指定 id 的队列\n * Remove queue with specified id\n * @param id 队列 ID / Queue ID\n * @returns 是否成功删除 / Whether successfully deleted\n */\n removeQueue(id: string) {\n setTimeout(() => {\n return this.queues.delete(id);\n }, 500);\n }\n\n /**\n * 获取所有队列的 ID\n * Get all queue IDs\n * @returns 所有队列 ID 的数组 / Array of all queue IDs\n */\n getAllQueueIds(): string[] {\n return Array.from(this.queues.keys());\n }\n\n /**\n * 获取所有队列及其数据的快照\n * Get snapshot of all queues and their data\n * @returns 包含所有队列数据的结果对象 / Result object containing all queue data\n */\n async getAllQueuesData(): Promise<Record<string, EventMessage[]>> {\n const result: Record<string, EventMessage[]> = {};\n for (const [id, queue] of this.queues) {\n result[id] = await queue.getAll();\n }\n return result;\n }\n\n /**\n * 清空所有队列\n * Clear all queues\n */\n clearAllQueues(): void {\n for (const queue of this.queues.values()) {\n queue.clear();\n }\n }\n\n /**\n * 复制队列数据\n * Copy queue data\n * @param fromId 源队列 ID / Source queue ID\n * @param toId 目标队列 ID / Target queue ID\n * @param ttl 生存时间(毫秒),在指定时间后删除目标队列 / Time to live (milliseconds), remove target queue after specified time\n */\n async copyQueue(fromId: string, toId: string, ttl?: number): Promise<BaseStreamQueueInterface> {\n // 获取源队列数据\n const sourceQueue = await this.getQueue(fromId);\n const queue = await sourceQueue.copyToQueue(toId, ttl);\n this.queues.set(toId, queue as Q);\n return queue;\n }\n}\n","import {\n BaseCheckpointSaver,\n BaseStore,\n CompiledGraph,\n CompiledStateGraph,\n LangGraphRunnableConfig,\n} from '@langchain/langgraph';\nimport { LangGraphGlobal } from '../global';\n\nexport type CompiledGraphFactory<T extends string> = (config: {\n configurable?: Record<string, unknown>;\n}) => Promise<CompiledGraph<T>>;\n\nexport const GRAPHS: Record<string, CompiledGraph<string> | CompiledGraphFactory<string>> = {};\n\nexport async function registerGraph(\n graphId: string,\n graph: CompiledGraph<any> | CompiledStateGraph<any, any, any, any, any, any, any> | CompiledGraphFactory<any>,\n) {\n GRAPHS[graphId] = graph;\n}\nexport async function getGraph(\n graphId: string,\n config: LangGraphRunnableConfig | undefined,\n options?: {\n checkpointer?: BaseCheckpointSaver | null;\n store?: BaseStore;\n },\n) {\n if (!GRAPHS[graphId]) throw new Error(`Graph \"${graphId}\" not found`);\n\n const compiled =\n typeof GRAPHS[graphId] === 'function' ? await GRAPHS[graphId](config ?? { configurable: {} }) : GRAPHS[graphId];\n\n if (typeof options?.checkpointer !== 'undefined') {\n compiled.checkpointer = options?.checkpointer ?? LangGraphGlobal.globalCheckPointer;\n } else {\n compiled.checkpointer = LangGraphGlobal.globalCheckPointer;\n }\n\n compiled.store = options?.store ?? undefined;\n\n return compiled;\n}\n","import { Kysely } from 'kysely';\nimport { BaseThreadsManager } from '../../threads/index.js';\nimport {\n Command,\n Config,\n Metadata,\n OnConflictBehavior,\n Run,\n Thread,\n ThreadState,\n ThreadStatus,\n} from '@langgraph-js/sdk';\nimport { RunStatus, SortOrder, ThreadSortBy } from '../../types';\nimport { Database } from './types';\nimport { DatabaseAdapter } from './adapter';\nimport { getGraph } from '../../utils/getGraph.js';\nimport { serialiseAsDict } from '../../graph/stream.js';\nimport { v7 } from 'uuid';\n\n/**\n * 使用 Kysely 实现的统一 ThreadsManager\n * 通过适配器模式处理不同数据库的差异\n */\nexport class KyselyThreadsManager<ValuesType = unknown> implements BaseThreadsManager<ValuesType> {\n private db: Kysely<Database>;\n private adapter: DatabaseAdapter;\n\n constructor(adapter: DatabaseAdapter) {\n this.db = adapter.db;\n this.adapter = adapter;\n }\n\n async setup(): Promise<void> {\n // 使用适配器创建表和索引\n await this.adapter.createTables(this.db);\n await this.adapter.createIndexes(this.db);\n }\n\n async create(payload?: {\n metadata?: Metadata;\n threadId?: string;\n ifExists?: OnConflictBehavior;\n graphId?: string;\n supersteps?: Array<{ updates: Array<{ values: unknown; command?: Command; asNode: string }> }>;\n }): Promise<Thread<ValuesType>> {\n const threadId = payload?.threadId || v7();\n\n // 检查线程是否已存在\n if (payload?.ifExists === 'raise') {\n const existing = await this.db\n .selectFrom('threads')\n .select('thread_id')\n .where('thread_id', '=', threadId)\n .executeTakeFirst();\n\n if (existing) {\n throw new Error(`Thread with ID ${threadId} already exists.`);\n }\n }\n\n const now = new Date();\n const metadata = payload?.metadata || {};\n const interrupts = {};\n\n // 插入数据\n await this.db\n .insertInto('threads')\n .values({\n thread_id: threadId,\n created_at: this.adapter.dateToDb(now) as any,\n updated_at: this.adapter.dateToDb(now) as any,\n metadata: this.adapter.jsonToDb(metadata) as any,\n status: 'idle',\n values: null as any,\n interrupts: this.adapter.jsonToDb(interrupts) as any,\n })\n .execute();\n\n return {\n thread_id: threadId,\n created_at: now.toISOString(),\n updated_at: now.toISOString(),\n metadata,\n status: 'idle',\n values: null as unknown as ValuesType,\n interrupts,\n };\n }\n\n async search(query?: {\n ids?: string[];\n metadata?: Metadata;\n limit?: number;\n offset?: number;\n status?: ThreadStatus;\n sortBy?: ThreadSortBy;\n sortOrder?: SortOrder;\n values?: ValuesType;\n select?: Array<\n | 'thread_id'\n | 'created_at'\n | 'updated_at'\n | 'metadata'\n | 'config'\n | 'context'\n | 'status'\n | 'values'\n | 'interrupts'\n >;\n withoutDetails?: boolean;\n }): Promise<Thread<ValuesType>[]> {\n let queryBuilder = this.db.selectFrom('threads');\n\n // Determine which fields to select based on select parameter\n let selectedFields: Set<string>;\n\n if (query?.select) {\n selectedFields = new Set(query.select);\n } else if (query?.withoutDetails) {\n // Legacy withoutDetails behavior - exclude values and interrupts\n selectedFields = new Set(['thread_id', 'created_at', 'updated_at', 'metadata', 'status']);\n } else {\n // All fields\n selectedFields = new Set([\n 'thread_id',\n 'created_at',\n 'updated_at',\n 'metadata',\n 'status',\n 'values',\n 'interrupts',\n ]);\n }\n\n // Build select expressions\n const selections: any[] = [];\n if (selectedFields.has('thread_id')) selections.push('thread_id');\n if (selectedFields.has('created_at')) selections.push('created_at');\n if (selectedFields.has('updated_at')) selections.push('updated_at');\n if (selectedFields.has('metadata')) selections.push('metadata');\n if (selectedFields.has('status')) selections.push('status');\n if (selectedFields.has('values')) selections.push('values');\n if (selectedFields.has('interrupts')) selections.push('interrupts');\n\n if (selections.length > 0) {\n queryBuilder = queryBuilder.select(selections);\n } else {\n queryBuilder = queryBuilder.selectAll();\n }\n\n // Filter by IDs\n if (query?.ids && query.ids.length > 0) {\n queryBuilder = queryBuilder.where('thread_id', 'in', query.ids);\n }\n\n // Filter by status\n if (query?.status) {\n queryBuilder = queryBuilder.where('status', '=', query.status);\n }\n\n // Filter by metadata\n if (query?.metadata) {\n for (const [key, value] of Object.entries(query.metadata)) {\n queryBuilder = queryBuilder.where(this.adapter.buildJsonQuery(this.db, 'metadata', key, value) as any);\n }\n }\n\n // Filter by values - Note: This is a simple equality check, may need database-specific JSON operators\n if (query?.values) {\n queryBuilder = queryBuilder.where((eb) => {\n // Use database-specific JSON equality\n return eb('values', '=', this.adapter.jsonToDb(query.values) as any);\n });\n }\n\n // Add sorting\n if (query?.sortBy) {\n const order = query.sortOrder === 'desc' ? 'desc' : 'asc';\n queryBuilder = queryBuilder.orderBy(query.sortBy as any, order);\n }\n\n // Add pagination\n if (query?.limit !== undefined) {\n queryBuilder = queryBuilder.limit(query.limit);\n if (query?.offset !== undefined) {\n queryBuilder = queryBuilder.offset(query.offset);\n }\n }\n\n const rows: Partial<Thread<ValuesType>>[] = await queryBuilder.execute();\n\n return rows.map((row) => {\n const result: Partial<Thread<ValuesType>> = { thread_id: row.thread_id };\n\n if (selectedFields.has('created_at'))\n result.created_at = this.adapter.dbToDate(row.created_at).toISOString();\n if (selectedFields.has('updated_at'))\n result.updated_at = this.adapter.dbToDate(row.updated_at).toISOString();\n if (selectedFields.has('metadata')) result.metadata = this.adapter.dbToJson(row.metadata);\n if (selectedFields.has('status')) result.status = row.status as ThreadStatus;\n if (selectedFields.has('values'))\n result.values = row.values ? this.adapter.dbToJson(row.values) : (null as unknown as ValuesType);\n if (selectedFields.has('interrupts')) result.interrupts = this.adapter.dbToJson(row.interrupts);\n\n return result as Thread<ValuesType>;\n });\n }\n\n async get(threadId: string): Promise<Thread<ValuesType>> {\n const row = await this.db\n .selectFrom('threads')\n .selectAll()\n .where('thread_id', '=', threadId)\n .executeTakeFirst();\n\n if (!row) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n\n return {\n thread_id: row.thread_id,\n created_at: this.adapter.dbToDate(row.created_at).toISOString(),\n updated_at: this.adapter.dbToDate(row.updated_at).toISOString(),\n metadata: this.adapter.dbToJson(row.metadata),\n status: row.status as ThreadStatus,\n values: row.values ? this.adapter.dbToJson(row.values) : (null as unknown as ValuesType),\n interrupts: this.adapter.dbToJson(row.interrupts),\n };\n }\n\n async set(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<void> {\n // 检查线程是否存在\n const existing = await this.db\n .selectFrom('threads')\n .select('thread_id')\n .where('thread_id', '=', threadId)\n .executeTakeFirst();\n\n if (!existing) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n\n // 构建更新对象\n const updates: any = {\n updated_at: this.adapter.dateToDb(new Date()),\n };\n\n if (thread.metadata !== undefined) {\n updates.metadata = this.adapter.jsonToDb(thread.metadata);\n }\n\n if (thread.status !== undefined) {\n updates.status = thread.status;\n }\n\n if (thread.values !== undefined) {\n updates.values = thread.values ? this.adapter.jsonToDb(thread.values) : null;\n }\n\n if (thread.interrupts !== undefined) {\n updates.interrupts = this.adapter.jsonToDb(thread.interrupts);\n }\n\n await this.db.updateTable('threads').set(updates).where('thread_id', '=', threadId).execute();\n }\n\n async delete(threadId: string): Promise<void> {\n const result = await this.db.deleteFrom('threads').where('thread_id', '=', threadId).executeTakeFirst();\n\n if (result.numDeletedRows === 0n) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n }\n\n async updateState(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<Pick<Config, 'configurable'>> {\n // 获取线程信息\n const targetThread = await this.get(threadId);\n\n if (targetThread.status === 'busy') {\n throw new Error(`Thread with ID ${threadId} is busy, can't update state.`);\n }\n\n if (!targetThread.metadata?.graph_id) {\n throw new Error(`Thread with ID ${threadId} has no graph_id.`);\n }\n\n const graphId = targetThread.metadata?.graph_id as string;\n const config = {\n configurable: {\n thread_id: threadId,\n graph_id: graphId,\n },\n };\n\n const graph = await getGraph(graphId, config);\n const nextConfig = await graph.updateState(config, thread.values);\n const graphState = await graph.getState(config);\n await this.set(threadId, { values: JSON.parse(serialiseAsDict(graphState.values)) as ValuesType });\n\n return nextConfig;\n }\n\n async createRun(threadId: string, assistantId: string, payload?: { metadata?: Metadata }): Promise<Run> {\n const runId = v7();\n const now = new Date();\n const metadata = payload?.metadata ?? {};\n\n await this.db\n .insertInto('runs')\n .values({\n run_id: runId,\n thread_id: threadId,\n assistant_id: assistantId,\n created_at: this.adapter.dateToDb(now) as any,\n updated_at: this.adapter.dateToDb(now) as any,\n status: 'pending',\n metadata: this.adapter.jsonToDb(metadata) as any,\n multitask_strategy: 'reject',\n })\n .execute();\n\n return {\n run_id: runId,\n thread_id: threadId,\n assistant_id: assistantId,\n created_at: now.toISOString(),\n updated_at: now.toISOString(),\n status: 'pending',\n metadata,\n multitask_strategy: 'reject',\n };\n }\n\n async listRuns(\n threadId: string,\n options?: { limit?: number; offset?: number; status?: RunStatus },\n ): Promise<Run[]> {\n let queryBuilder = this.db\n .selectFrom('runs')\n .selectAll()\n .where('thread_id', '=', threadId)\n .orderBy('created_at', 'desc');\n\n if (options?.status) {\n queryBuilder = queryBuilder.where('status', '=', options.status);\n }\n\n if (options?.limit !== undefined) {\n queryBuilder = queryBuilder.limit(options.limit);\n if (options?.offset !== undefined) {\n queryBuilder = queryBuilder.offset(options.offset);\n }\n }\n\n const rows = await queryBuilder.execute();\n\n return rows.map((row) => ({\n run_id: row.run_id,\n thread_id: row.thread_id,\n assistant_id: row.assistant_id,\n created_at: this.adapter.dbToDate(row.created_at).toISOString(),\n updated_at: this.adapter.dbToDate(row.updated_at).toISOString(),\n status: row.status as RunStatus,\n metadata: this.adapter.dbToJson(row.metadata),\n multitask_strategy: row.multitask_strategy as 'reject',\n }));\n }\n\n async updateRun(runId: string, run: Partial<Run>): Promise<void> {\n // 检查运行是否存在\n const existing = await this.db\n .selectFrom('runs')\n .select('run_id')\n .where('run_id', '=', runId)\n .executeTakeFirst();\n\n if (!existing) {\n throw new Error(`Run with ID ${runId} not found.`);\n }\n\n // 构建更新对象\n const updates: any = {\n updated_at: this.adapter.dateToDb(new Date()),\n };\n\n if (run.status !== undefined) {\n updates.status = run.status;\n }\n\n if (run.metadata !== undefined) {\n updates.metadata = this.adapter.jsonToDb(run.metadata);\n }\n\n if (run.multitask_strategy !== undefined) {\n updates.multitask_strategy = run.multitask_strategy;\n }\n\n await this.db.updateTable('runs').set(updates).where('run_id', '=', runId).execute();\n }\n\n // New methods for Threads API\n\n async count(query?: {\n ids?: string[];\n metadata?: Metadata;\n status?: ThreadStatus;\n values?: ValuesType;\n }): Promise<number> {\n const threads = await this.search(query);\n return threads.length;\n }\n\n async patch(\n threadId: string,\n updates: Partial<Omit<Thread<ValuesType>, 'thread_id' | 'created_at' | 'updated_at'>>,\n ): Promise<Thread<ValuesType>> {\n // 获取当前线程\n const existing = await this.db\n .selectFrom('threads')\n .selectAll()\n .where('thread_id', '=', threadId)\n .executeTakeFirst();\n\n if (!existing) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n\n // 构建更新对象,合并 metadata\n const patchUpdates: any = {\n updated_at: this.adapter.dateToDb(new Date()),\n };\n\n if (updates.metadata !== undefined) {\n const existingMetadata = this.adapter.dbToJson(existing.metadata) || {};\n patchUpdates.metadata = this.adapter.jsonToDb({ ...existingMetadata, ...updates.metadata });\n }\n\n if (updates.status !== undefined) {\n patchUpdates.status = updates.status;\n }\n\n if (updates.values !== undefined) {\n patchUpdates.values = updates.values ? this.adapter.jsonToDb(updates.values) : null;\n }\n\n if (updates.interrupts !== undefined) {\n patchUpdates.interrupts = this.adapter.jsonToDb(updates.interrupts);\n }\n\n await this.db.updateTable('threads').set(patchUpdates).where('thread_id', '=', threadId).execute();\n\n // 返回更新后的线程\n return await this.get(threadId);\n }\n\n async getState(threadId: string, options?: { subgraphs?: boolean; checkpointId?: string }): Promise<ThreadState> {\n const thread = await this.get(threadId);\n\n if (options?.checkpointId) {\n // Get state at specific checkpoint\n const checkpoint = await this.db\n .selectFrom('checkpoints')\n .selectAll()\n .where('checkpoint_id', '=', options.checkpointId)\n .where('thread_id', '=', threadId)\n .executeTakeFirst();\n\n if (!checkpoint) {\n throw new Error(`Checkpoint with ID ${options.checkpointId} not found for thread ${threadId}`);\n }\n\n return {\n values: this.adapter.dbToJson(checkpoint.values),\n next: this.adapter.dbToJson(checkpoint.next),\n metadata: this.adapter.dbToJson(checkpoint.metadata),\n checkpoint: {\n /** @ts-ignore */\n id: checkpoint.checkpoint_id,\n thread_id: threadId,\n parent_checkpoint_id: null,\n checkpoint_ns: '',\n metadata: this.adapter.dbToJson(checkpoint.metadata),\n created_at: this.adapter.dbToDate(checkpoint.created_at).toISOString(),\n },\n created_at: this.adapter.dbToDate(checkpoint.created_at).toISOString(),\n parent_checkpoint: null,\n tasks: [],\n };\n }\n\n // Get latest state\n const state: ThreadState = {\n values: thread.values || {},\n next: [],\n metadata: thread.metadata,\n /**@ts-ignore 没有查询 checkpointer */\n checkpoint: null,\n created_at: thread.created_at,\n parent_checkpoint: null,\n tasks: [],\n };\n\n return state;\n }\n\n async getStateHistory(\n threadId: string,\n options?: {\n limit?: number;\n before?: string;\n filter?: { source?: string; step?: number };\n },\n ): Promise<ThreadState[]> {\n let queryBuilder = this.db\n .selectFrom('checkpoints')\n .selectAll()\n .where('thread_id', '=', threadId)\n .orderBy('created_at', 'asc');\n\n const checkpoints = await queryBuilder.execute();\n\n let history: ThreadState[] = checkpoints.map(\n (cp) =>\n ({\n values: this.adapter.dbToJson(cp.values),\n next: this.adapter.dbToJson(cp.next),\n metadata: this.adapter.dbToJson(cp.metadata),\n checkpoint: {\n thread_id: threadId,\n checkpoint_ns: '',\n checkpoint_id: cp.checkpoint_id,\n checkpoint_map: null,\n },\n created_at: this.adapter.dbToDate(cp.created_at).toISOString(),\n parent_checkpoint: null,\n tasks: [],\n } satisfies ThreadState),\n );\n\n // Filter by 'before' checkpoint ID\n if (options?.before) {\n const beforeIndex = checkpoints.findIndex((c) => c.checkpoint_id === options.before);\n if (beforeIndex !== -1) {\n history = history.slice(beforeIndex + 1);\n }\n }\n\n // Apply limit\n if (options?.limit) {\n history = history.slice(0, options.limit);\n }\n\n return history;\n }\n\n async copy(threadId: string): Promise<Thread<ValuesType>> {\n const originalThread = await this.get(threadId);\n\n // Create new thread\n const newThreadId = v7();\n const now = new Date();\n\n await this.db\n .insertInto('threads')\n .values({\n thread_id: newThreadId,\n created_at: this.adapter.dateToDb(now) as any,\n updated_at: this.adapter.dateToDb(now) as any,\n metadata: this.adapter.jsonToDb(originalThread.metadata) as any,\n status: originalThread.status,\n values: originalThread.values ? (this.adapter.jsonToDb(originalThread.values) as any) : (null as any),\n interrupts: this.adapter.jsonToDb(originalThread.interrupts) as any,\n })\n .execute();\n\n // Copy checkpoints\n const checkpoints = await this.db\n .selectFrom('checkpoints')\n .selectAll()\n .where('thread_id', '=', threadId)\n .orderBy('created_at', 'asc')\n .execute();\n\n for (const cp of checkpoints) {\n await this.db\n .insertInto('checkpoints')\n .values({\n checkpoint_id: v7(),\n thread_id: newThreadId,\n values: cp.values,\n next: cp.next,\n config: cp.config,\n created_at: cp.created_at,\n metadata: cp.metadata,\n })\n .execute();\n }\n\n return {\n ...originalThread,\n thread_id: newThreadId,\n created_at: now.toISOString(),\n updated_at: now.toISOString(),\n };\n }\n\n // Helper method to save checkpoint (used internally)\n private async saveCheckpoint(\n threadId: string,\n values: any,\n next: string[],\n config: Config,\n metadata?: Metadata,\n ): Promise<void> {\n await this.db\n .insertInto('checkpoints')\n .values({\n checkpoint_id: v7(),\n thread_id: threadId,\n values: this.adapter.jsonToDb(values) as any,\n next: this.adapter.jsonToDb(next) as any,\n config: this.adapter.jsonToDb(config) as any,\n created_at: this.adapter.dateToDb(new Date()) as any,\n metadata: this.adapter.jsonToDb(metadata || {}) as any,\n })\n .execute();\n }\n}\n","export class EventMessage {\n event: string;\n data: unknown;\n id?: string;\n constructor(event: string, data?: unknown) {\n this.event = event;\n this.data = data;\n }\n}\n\nexport class CancelEventMessage extends EventMessage {\n constructor() {\n super('__system_cancel__', 'user cancel this run');\n }\n}\n\nexport class StreamEndEventMessage extends EventMessage {\n constructor() {\n super('__stream_end__', 'stream end');\n }\n}\n\nexport class StreamErrorEventMessage extends EventMessage {\n public constructor(error: Error) {\n super('__stream_error__', {\n error: error.name,\n message: error.message,\n });\n }\n}\n","import { CancelEventMessage, EventMessage } from '../../queue/event_message.js';\nimport { BaseStreamQueue } from '../../queue/stream_queue.js';\nimport { BaseStreamQueueInterface } from '../../queue/stream_queue.js';\n/** 内存实现的消息队列,用于存储消息 */\nexport class MemoryStreamQueue extends BaseStreamQueue implements BaseStreamQueueInterface {\n private data: EventMessage[] = [];\n\n async push(item: EventMessage): Promise<void> {\n const data = this.compressMessages ? ((await this.encodeData(item)) as unknown as EventMessage) : item;\n this.data.push(data);\n this.emit('dataChange', data);\n }\n\n onDataChange(listener: (data: EventMessage) => void): () => void {\n this.on('dataChange', async (item) => {\n listener(this.compressMessages ? ((await this.decodeData(item)) as EventMessage) : item);\n });\n return () => this.off('dataChange', listener);\n }\n\n /**\n * 异步生成器:支持 for await...of 方式消费队列数据\n */\n async *onDataReceive(): AsyncGenerator<EventMessage, void, unknown> {\n let queue: EventMessage[] = [];\n let pendingResolve: (() => void) | null = null;\n let isStreamEnded = false;\n let isCleanupDone = false;\n\n // 事件处理函数\n const handleData = async (item: EventMessage) => {\n try {\n const data = this.compressMessages ? ((await this.decodeData(item as any)) as EventMessage) : item;\n queue.push(data);\n // 检查是否为流结束或错误信号\n if (\n data.event === '__stream_end__' ||\n data.event === '__stream_error__' ||\n data.event === '__stream_cancel__'\n ) {\n setTimeout(() => {\n isStreamEnded = true;\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n }, 300);\n\n if (data.event === '__stream_cancel__') {\n await this.cancel();\n }\n }\n\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n } catch (error) {\n // 即使解码出错,也要通知等待的消费者\n console.error('Error in handleData:', error);\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n }\n };\n\n // todo 这个框架的事件监听的数据返回顺序有误\n this.on('dataChange', handleData as any);\n\n // 监听取消信号\n const abortHandler = () => {\n isStreamEnded = true;\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n };\n this.cancelSignal.signal.addEventListener('abort', abortHandler);\n\n // 清理函数\n const cleanup = () => {\n if (isCleanupDone) return;\n isCleanupDone = true;\n\n try {\n this.off('dataChange', handleData as any);\n } catch (e) {\n console.error('Error removing dataChange listener:', e);\n }\n\n try {\n this.cancelSignal.signal.removeEventListener('abort', abortHandler);\n } catch (e) {\n console.error('Error removing abort listener:', e);\n }\n\n // 清理 pending promise\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n };\n\n try {\n // 检查是否已取消\n if (this.cancelSignal.signal.aborted) {\n return;\n }\n\n while (!isStreamEnded && !this.cancelSignal.signal.aborted) {\n if (queue.length > 0) {\n for (const item of queue) {\n yield item;\n }\n queue = [];\n } else {\n await new Promise((resolve) => {\n pendingResolve = resolve as () => void;\n });\n }\n }\n } finally {\n // 确保清理总是执行\n cleanup();\n }\n }\n\n async getAll(): Promise<EventMessage[]> {\n return this.compressMessages\n ? ((await Promise.all(\n this.data.map((i) => this.decodeData(i as unknown as string | Uint8Array)),\n )) as unknown as EventMessage[])\n : this.data;\n }\n\n clear(): void {\n this.data = [];\n }\n public cancelSignal = new AbortController();\n async cancel(): Promise<void> {\n // First abort to stop any waiting generators\n this.cancelSignal.abort('user cancel this run');\n // Then push the cancel message to signal other consumers\n await this.push(new CancelEventMessage());\n }\n async copyToQueue(toId: string, ttl?: number): Promise<MemoryStreamQueue> {\n // 深拷贝数据,避免共享引用\n // 注意:这里使用 slice() 创建数组的新副本,虽然元素仍然是引用\n // 但对于 EventMessage 类型,这是足够的,因为消息对象在 push 后不会被修改\n const data = this.data.slice();\n const queue = new MemoryStreamQueue(toId, this.compressMessages, ttl ?? this.ttl);\n queue.data = data;\n return queue;\n }\n}\n","import { BaseThreadsManager } from '../../threads/index.js';\nimport {\n Command,\n Config,\n Metadata,\n OnConflictBehavior,\n Run,\n Thread,\n ThreadState,\n ThreadStatus,\n} from '@langgraph-js/sdk';\nimport { getGraph } from '../../utils/getGraph.js';\nimport { serialiseAsDict } from '../../graph/stream.js';\nimport { RunStatus, SortOrder, ThreadSortBy } from '../../types';\nimport { v7 } from 'uuid';\n\n// Store thread history states\ninterface ThreadCheckpoint {\n checkpoint_id: string;\n thread_id: string;\n values: any;\n next: string[];\n config: Config;\n created_at: string;\n metadata?: Metadata;\n}\n\nexport class MemoryThreadsManager<ValuesType = unknown> implements BaseThreadsManager<ValuesType> {\n private threads: Thread<ValuesType>[] = [];\n private checkpoints: Map<string, ThreadCheckpoint[]> = new Map();\n\n async setup() {\n return;\n }\n\n async create(payload?: {\n metadata?: Metadata;\n threadId?: string;\n ifExists?: OnConflictBehavior;\n graphId?: string;\n supersteps?: Array<{ updates: Array<{ values: unknown; command?: Command; asNode: string }> }>;\n }): Promise<Thread<ValuesType>> {\n const threadId = payload?.threadId || v7();\n if (payload?.ifExists === 'raise' && this.threads.some((t) => t.thread_id === threadId)) {\n throw new Error(`Thread with ID ${threadId} already exists.`);\n }\n\n const thread: Thread<ValuesType> = {\n thread_id: threadId,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n metadata: payload?.metadata || {},\n status: 'idle',\n values: null as unknown as ValuesType,\n interrupts: {},\n };\n\n // Initialize checkpoint history\n this.checkpoints.set(threadId, []);\n\n this.threads.push(thread);\n return thread;\n }\n\n async search(query?: {\n ids?: string[];\n metadata?: Metadata;\n limit?: number;\n offset?: number;\n status?: ThreadStatus;\n sortBy?: ThreadSortBy;\n sortOrder?: SortOrder;\n values?: ValuesType;\n select?: Array<\n | 'thread_id'\n | 'created_at'\n | 'updated_at'\n | 'metadata'\n | 'config'\n | 'context'\n | 'status'\n | 'values'\n | 'interrupts'\n >;\n withoutDetails?: boolean;\n }): Promise<Thread<ValuesType>[]> {\n let filteredThreads = [...this.threads];\n\n // Filter by IDs\n if (query?.ids && query.ids.length > 0) {\n filteredThreads = filteredThreads.filter((t) => query.ids!.includes(t.thread_id));\n }\n\n // Filter by status\n if (query?.status) {\n filteredThreads = filteredThreads.filter((t) => t.status === query.status);\n }\n\n // Filter by metadata\n if (query?.metadata) {\n for (const key in query.metadata) {\n if (Object.prototype.hasOwnProperty.call(query.metadata, key)) {\n filteredThreads = filteredThreads.filter(\n (t) => t.metadata && t.metadata[key] === query.metadata?.[key],\n );\n }\n }\n }\n\n // Filter by values\n if (query?.values) {\n filteredThreads = filteredThreads.filter((t) => {\n if (!t.values) return false;\n return this.deepEqual(t.values, query.values);\n });\n }\n\n // Sort\n if (query?.sortBy) {\n filteredThreads.sort((a, b) => {\n let aValue: any;\n let bValue: any;\n\n switch (query.sortBy) {\n case 'thread_id':\n aValue = a.thread_id;\n bValue = b.thread_id;\n break;\n case 'created_at':\n aValue = new Date(a.created_at).getTime();\n bValue = new Date(b.created_at).getTime();\n break;\n case 'updated_at':\n aValue = new Date(a.updated_at).getTime();\n bValue = new Date(b.updated_at).getTime();\n break;\n case 'status':\n aValue = a.status;\n bValue = b.status;\n break;\n default:\n return 0;\n }\n\n if (query.sortOrder === 'desc') {\n return bValue > aValue ? 1 : bValue < aValue ? -1 : 0;\n } else {\n return aValue > bValue ? 1 : aValue < bValue ? -1 : 0;\n }\n });\n }\n\n const offset = query?.offset || 0;\n const limit = query?.limit || filteredThreads.length;\n\n const paginatedThreads = filteredThreads.slice(offset, offset + limit);\n\n // Handle select/withoutDetails to filter fields\n return paginatedThreads.map((i) => {\n const result: Partial<Thread<ValuesType>> = { thread_id: i.thread_id };\n\n // Determine which fields to include\n let includeFields: Set<string>;\n\n if (query?.select) {\n includeFields = new Set(query.select);\n } else if (query?.withoutDetails) {\n // Legacy withoutDetails behavior - exclude values and interrupts\n includeFields = new Set(['thread_id', 'created_at', 'updated_at', 'metadata', 'status']);\n } else {\n // All fields\n includeFields = new Set([\n 'thread_id',\n 'created_at',\n 'updated_at',\n 'metadata',\n 'status',\n 'values',\n 'interrupts',\n ]);\n }\n\n if (includeFields.has('thread_id')) result.thread_id = i.thread_id;\n if (includeFields.has('created_at')) result.created_at = i.created_at;\n if (includeFields.has('updated_at')) result.updated_at = i.updated_at;\n if (includeFields.has('metadata')) result.metadata = i.metadata;\n if (includeFields.has('status')) result.status = i.status;\n if (includeFields.has('values')) result.values = i.values;\n if (includeFields.has('interrupts')) result.interrupts = i.interrupts;\n\n return result as Thread<ValuesType>;\n });\n }\n\n private deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object' || a === null || b === null) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!this.deepEqual(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n async get(threadId: string): Promise<Thread<ValuesType>> {\n const thread = this.threads.find((t) => t.thread_id === threadId);\n if (!thread) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n return thread;\n }\n\n async set(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<void> {\n const index = this.threads.findIndex((t) => t.thread_id === threadId);\n if (index === -1) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n this.threads[index] = { ...this.threads[index], ...thread };\n }\n\n async delete(threadId: string): Promise<void> {\n const initialLength = this.threads.length;\n this.threads = this.threads.filter((t) => t.thread_id !== threadId);\n this.checkpoints.delete(threadId);\n if (this.threads.length === initialLength) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n }\n\n async updateState(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<Pick<Config, 'configurable'>> {\n const index = this.threads.findIndex((t) => t.thread_id === threadId) as number;\n if (index === -1) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n const targetThread = this.threads[index];\n\n if (targetThread.status === 'busy') {\n throw new Error(`Thread with ID ${threadId} is busy, can't update state.`);\n }\n\n // Allow updating state even without graph_id for basic functionality\n this.threads[index] = {\n ...targetThread,\n values: thread.values as ValuesType,\n updated_at: new Date().toISOString(),\n };\n\n // If graph_id is present, use graph to update state\n if (targetThread.metadata?.graph_id) {\n const graphId = targetThread.metadata?.graph_id as string;\n const config = {\n configurable: {\n thread_id: threadId,\n graph_id: graphId,\n },\n };\n try {\n const graph = await getGraph(graphId, config);\n const nextConfig = await graph.updateState(config, thread.values);\n const graphState = await graph.getState(config);\n await this.set(threadId, { values: JSON.parse(serialiseAsDict(graphState.values)) as ValuesType });\n return nextConfig;\n } catch (error) {\n // If graph update fails, still return a valid response\n console.warn('Failed to update graph state:', error);\n }\n }\n\n return {\n configurable: {\n thread_id: threadId,\n },\n };\n }\n\n runs: Run[] = [];\n\n async createRun(threadId: string, assistantId: string, payload?: { metadata?: Metadata }): Promise<Run> {\n const runId = v7();\n const run: Run = {\n run_id: runId,\n thread_id: threadId,\n assistant_id: assistantId,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n status: 'pending',\n metadata: payload?.metadata ?? {},\n multitask_strategy: 'reject',\n };\n this.runs.push(run);\n return run;\n }\n\n async listRuns(\n threadId: string,\n options?: { limit?: number; offset?: number; status?: RunStatus },\n ): Promise<Run[]> {\n let filteredRuns = [...this.runs];\n if (options?.status) {\n filteredRuns = filteredRuns.filter((r) => r.status === options.status);\n }\n if (options?.limit) {\n filteredRuns = filteredRuns.slice(options.offset || 0, (options.offset || 0) + options.limit);\n }\n return filteredRuns;\n }\n\n async updateRun(runId: string, run: Partial<Run>): Promise<void> {\n const index = this.runs.findIndex((r) => r.run_id === runId);\n if (index === -1) {\n throw new Error(`Run with ID ${runId} not found.`);\n }\n this.runs[index] = { ...this.runs[index], ...run };\n }\n\n // New methods for Threads API\n\n async count(query?: {\n ids?: string[];\n metadata?: Metadata;\n status?: ThreadStatus;\n values?: ValuesType;\n }): Promise<number> {\n const threads = await this.search(query);\n return threads.length;\n }\n\n async patch(\n threadId: string,\n updates: Partial<Omit<Thread<ValuesType>, 'thread_id' | 'created_at' | 'updated_at'>>,\n ): Promise<Thread<ValuesType>> {\n const index = this.threads.findIndex((t) => t.thread_id === threadId);\n if (index === -1) {\n throw new Error(`Thread with ID ${threadId} not found.`);\n }\n\n // Merge metadata if provided\n const updatedThread: Thread<ValuesType> = {\n ...this.threads[index],\n ...updates,\n updated_at: new Date().toISOString(),\n metadata: updates.metadata\n ? { ...this.threads[index].metadata, ...updates.metadata }\n : this.threads[index].metadata,\n };\n\n this.threads[index] = updatedThread;\n return updatedThread;\n }\n\n async getState(threadId: string, options?: { subgraphs?: boolean; checkpointId?: string }): Promise<ThreadState> {\n const thread = await this.get(threadId);\n\n if (options?.checkpointId) {\n // Get state at specific checkpoint\n const checkpoints = this.checkpoints.get(threadId) || [];\n const checkpoint = checkpoints.find((c) => c.checkpoint_id === options.checkpointId);\n if (!checkpoint) {\n throw new Error(`Checkpoint with ID ${options.checkpointId} not found for thread ${threadId}`);\n }\n return {\n values: checkpoint.values,\n next: checkpoint.next,\n metadata: checkpoint.metadata,\n checkpoint: {\n /** @ts-ignore 附加属性 */\n id: checkpoint.checkpoint_id,\n thread_id: threadId,\n parent_checkpoint_id: null,\n checkpoint_ns: '',\n metadata: checkpoint.metadata,\n created_at: checkpoint.created_at,\n },\n created_at: checkpoint.created_at,\n parent_checkpoint: null,\n tasks: [],\n };\n }\n\n // Get latest state\n const state: ThreadState = {\n values: thread.values || {},\n next: [],\n metadata: thread.metadata,\n /** @ts-ignore 没有查询过 */\n checkpoint: null,\n created_at: thread.created_at,\n parent_checkpoint: null,\n tasks: [],\n };\n\n return state;\n }\n\n async getStateHistory(\n threadId: string,\n options?: {\n limit?: number;\n before?: string;\n filter?: { source?: string; step?: number };\n },\n ): Promise<ThreadState[]> {\n const checkpoints = this.checkpoints.get(threadId) || [];\n\n let history: ThreadState[] = checkpoints.map(\n (cp) =>\n ({\n values: cp.values,\n next: cp.next,\n metadata: cp.metadata,\n checkpoint: {\n checkpoint_id: cp.checkpoint_id,\n thread_id: threadId,\n checkpoint_ns: '',\n checkpoint_map: undefined,\n },\n created_at: cp.created_at,\n parent_checkpoint: null,\n tasks: [],\n } satisfies ThreadState),\n );\n\n // Filter by 'before' checkpoint ID\n if (options?.before) {\n const beforeIndex = checkpoints.findIndex((c) => c.checkpoint_id === options.before);\n if (beforeIndex !== -1) {\n history = history.slice(beforeIndex + 1);\n }\n }\n\n // Apply limit\n if (options?.limit) {\n history = history.slice(0, options.limit);\n }\n\n return history;\n }\n\n async copy(threadId: string): Promise<Thread<ValuesType>> {\n const originalThread = await this.get(threadId);\n\n // Create new thread\n const newThreadId = v7();\n const newThread: Thread<ValuesType> = {\n ...originalThread,\n thread_id: newThreadId,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n };\n\n this.threads.push(newThread);\n\n // Copy checkpoints\n const originalCheckpoints = this.checkpoints.get(threadId) || [];\n const newCheckpoints = originalCheckpoints.map((cp) => ({\n ...cp,\n checkpoint_id: v7(), // Generate new checkpoint IDs\n thread_id: newThreadId,\n }));\n this.checkpoints.set(newThreadId, newCheckpoints);\n\n return newThread;\n }\n\n // Helper method to save checkpoint (used internally)\n async saveCheckpoint(\n threadId: string,\n values: any,\n next: string[],\n config: Config,\n metadata?: Metadata,\n ): Promise<void> {\n const checkpoints = this.checkpoints.get(threadId) || [];\n const checkpoint: ThreadCheckpoint = {\n checkpoint_id: v7(),\n thread_id: threadId,\n values,\n next,\n config,\n created_at: new Date().toISOString(),\n metadata,\n };\n checkpoints.push(checkpoint);\n this.checkpoints.set(threadId, checkpoints);\n }\n}\n","import { BaseStreamQueueInterface, StreamQueueManager } from '../queue/stream_queue';\nimport { KyselyThreadsManager } from './kysely/threads';\nimport { MemorySaver } from './memory/checkpoint';\nimport { MemoryStreamQueue } from './memory/queue';\nimport { MemoryThreadsManager } from './memory/threads';\nimport type { SqliteSaver as SqliteSaverType } from './sqlite/checkpoint';\nimport type { PostgresSaver } from '@langchain/langgraph-checkpoint-postgres';\n\n// 所有的适配实现,都请写到这里,通过环境变量进行判断使用哪种方式进行适配\nexport const createCheckPointer = async () => {\n if (\n (process.env.REDIS_URL && process.env.CHECKPOINT_TYPE === 'redis') ||\n process.env.CHECKPOINT_TYPE === 'shallow/redis'\n ) {\n if (process.env.CHECKPOINT_TYPE === 'redis') {\n console.debug('LG | Using redis as checkpoint');\n const { RedisSaver } = await import('@langchain/langgraph-checkpoint-redis');\n return await RedisSaver.fromUrl(process.env.REDIS_URL!, {\n defaultTTL: 60, // TTL in minutes\n refreshOnRead: true,\n });\n }\n if (process.env.CHECKPOINT_TYPE === 'shallow/redis') {\n console.debug('LG | Using shallow redis as checkpoint');\n const { ShallowRedisSaver } = await import('@langchain/langgraph-checkpoint-redis/shallow');\n return await ShallowRedisSaver.fromUrl(process.env.REDIS_URL!);\n }\n }\n\n if (process.env.DATABASE_URL && getDatabaseType(process.env.DATABASE_URL) === 'postgres') {\n console.debug('LG | Using postgres as checkpoint');\n const { createPGCheckpoint } = await import('./pg/checkpoint');\n return createPGCheckpoint();\n }\n\n if (process.env.SQLITE_DATABASE_URI) {\n console.debug('LG | Using sqlite as checkpoint');\n const { SqliteSaver } = await import('./sqlite/checkpoint');\n const db = await SqliteSaver.fromConnStringAsync(process.env.SQLITE_DATABASE_URI);\n return db;\n }\n console.log('LG | You are using memory as checkpoint!');\n console.log(\n '\\x1b[33m%s\\x1b[0m',\n 'LG | set SQLITE_DATABASE_URI=./.langgraph_api/langgraph.db to your .env file to use \\x1b[1mSQLite\\x1b[0m for dev!',\n );\n console.log(\n '\\x1b[33m%s\\x1b[0m',\n 'LG | set DATABASE_URL=postgresql://user:pass@localhost:5432/db to your .env file to use \\x1b[1mPostgreSQL\\x1b[0m for prod!',\n );\n return new MemorySaver();\n};\n\nexport const createMessageQueue = async () => {\n let q: new (id: string) => BaseStreamQueueInterface;\n if (process.env.REDIS_URL) {\n console.debug('LG | Using redis as stream queue');\n const { RedisStreamQueue } = await import('./redis/queue');\n q = RedisStreamQueue;\n } else {\n q = MemoryStreamQueue;\n }\n return new StreamQueueManager(q);\n};\n\n/**\n * 检测 DATABASE_URL 类型\n */\nfunction getDatabaseType(databaseUrl: string): 'postgres' | 'remote' {\n const url = databaseUrl.toLowerCase();\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return 'remote';\n }\n return 'postgres';\n}\n\nexport const createThreadManager = async (config: { checkpointer?: SqliteSaverType | PostgresSaver }) => {\n if (process.env.DATABASE_URL) {\n const dbType = getDatabaseType(process.env.DATABASE_URL);\n\n if (dbType === 'remote') {\n // 使用远程 PG 适配器\n console.debug('LG | Using Remote PostgreSQL ThreadsManager');\n const { RemoteKyselyThreadsManager } = await import('./kysely/remote-threads');\n const threadsManager = new RemoteKyselyThreadsManager(process.env.DATABASE_URL);\n if (process.env.DATABASE_INIT === 'true') {\n await threadsManager.setup();\n }\n return threadsManager;\n } else {\n // 使用本地 PG 适配器(现有逻辑)\n if (config.checkpointer) {\n console.debug('LG | Using PostgreSQL ThreadsManager');\n const { PostgresAdapter } = await import('./kysely/pg-adapter');\n const pool = (config.checkpointer as PostgresSaver as any).pool;\n const threadsManager = new KyselyThreadsManager(new PostgresAdapter(pool));\n if (process.env.DATABASE_INIT === 'true') {\n await threadsManager.setup();\n }\n return threadsManager;\n }\n }\n }\n if (process.env.SQLITE_DATABASE_URI && config.checkpointer) {\n console.debug('LG | Using SQLite ThreadsManager');\n const { SQLiteAdapter } = await import('./kysely/sqlite-adapter');\n const database = (config.checkpointer as SqliteSaverType).db;\n const threadsManager = new KyselyThreadsManager(new SQLiteAdapter(database));\n // sqlite 可以执行多次,速度很快\n await threadsManager.setup();\n return threadsManager;\n }\n return new MemoryThreadsManager();\n};\n","import { BaseCheckpointSaver } from '@langchain/langgraph-checkpoint';\nimport { BaseStreamQueueInterface, StreamQueueManager } from './queue/stream_queue.js';\nimport { createCheckPointer, createMessageQueue, createThreadManager } from './storage/index.js';\nimport type { SqliteSaver } from './storage/sqlite/checkpoint.js';\nimport type { PostgresSaver } from '@langchain/langgraph-checkpoint-postgres';\nimport { BaseThreadsManager } from './threads/index.js';\n\nexport class LangGraphGlobal {\n static globalMessageQueue: StreamQueueManager<BaseStreamQueueInterface> = null as any;\n static globalCheckPointer: BaseCheckpointSaver = null as any;\n static globalThreadsManager: BaseThreadsManager = null as any;\n static isInitialized: Promise<void> | null = null;\n static async initGlobal() {\n if (LangGraphGlobal.isInitialized) {\n return LangGraphGlobal.isInitialized;\n }\n LangGraphGlobal.isInitialized = (async () => {\n const [globalMessageQueue, globalCheckPointer] = await Promise.all([\n createMessageQueue(),\n createCheckPointer(),\n ]);\n console.debug('LG | checkpointer created');\n const globalThreadsManager = await createThreadManager({\n checkpointer: globalCheckPointer as SqliteSaver | PostgresSaver,\n });\n console.debug('LG | threads manager created');\n console.debug('LG | global init done');\n LangGraphGlobal.globalMessageQueue = globalMessageQueue;\n LangGraphGlobal.globalCheckPointer = globalCheckPointer;\n LangGraphGlobal.globalThreadsManager = globalThreadsManager;\n })();\n return LangGraphGlobal.isInitialized;\n }\n}\n","import { AIMessageChunk } from '@langchain/core/messages';\nimport type { BaseCheckpointSaver, LangGraphRunnableConfig } from '@langchain/langgraph';\nimport type { Pregel } from '@langchain/langgraph/pregel';\nimport { getLangGraphCommand } from '../utils/getLangGraphCommand.js';\nimport type { BaseStreamQueueInterface } from '../queue/stream_queue.js';\nimport { concat } from '@langchain/core/utils/stream';\nimport { LangGraphGlobal } from '../global.js';\nimport { Run } from '@langgraph-js/sdk';\nimport { EventMessage, StreamErrorEventMessage, StreamEndEventMessage } from '../queue/event_message.js';\n\nimport { BaseThreadsManager } from '../threads/index.js';\nimport { StreamInputData } from '../types.js';\n\nexport type LangGraphStreamMode = Pregel<any, any>['streamMode'][number];\n\nexport async function streamStateWithQueue(\n threads: BaseThreadsManager,\n run: Run,\n queue: BaseStreamQueueInterface,\n payload: StreamInputData,\n options: {\n attempt: number;\n getGraph: (\n graphId: string,\n config: LangGraphRunnableConfig | undefined,\n options?: { checkpointer?: BaseCheckpointSaver | null },\n ) => Promise<Pregel<any, any, any, any, any>>;\n compressMessages?: boolean;\n },\n): Promise<void> {\n const kwargs = payload;\n const graphId = kwargs.config?.configurable?.graph_id;\n\n if (!graphId || typeof graphId !== 'string') {\n throw new Error('Invalid or missing graph_id');\n }\n\n const graph = await options.getGraph(graphId, payload.config, {\n checkpointer: payload.temporary ? null : undefined,\n });\n\n const userStreamMode = payload.streamMode ?? [];\n\n const libStreamMode: Set<LangGraphStreamMode> = new Set([\n 'values',\n ...userStreamMode.filter((mode) => mode !== 'events' && mode !== 'messages-tuple'),\n ]);\n\n if (userStreamMode.includes('messages-tuple')) {\n libStreamMode.add('messages');\n }\n\n if (userStreamMode.includes('messages')) {\n libStreamMode.add('values');\n }\n\n await queue.push(\n new EventMessage('metadata', {\n run_id: run.run_id,\n attempt: options.attempt,\n graph_id: graphId,\n }),\n );\n\n const metadata = {\n ...payload.config?.metadata,\n run_attempt: options.attempt,\n };\n const events = graph.stream(\n payload.command != null ? getLangGraphCommand(payload.command) : payload.input ?? null,\n {\n interruptAfter: payload.interruptAfter,\n interruptBefore: payload.interruptBefore,\n\n tags: payload.config?.tags,\n configurable: payload.config?.configurable,\n recursionLimit: payload.config?.recursionLimit,\n subgraphs: payload.streamSubgraphs,\n metadata,\n\n runId: run.run_id,\n streamMode: [...libStreamMode],\n signal: queue.cancelSignal.signal,\n },\n );\n\n // 在 try 块之前声明变量,确保 finally 块可以访问\n let sendedMetadataMessage: Set<string>;\n let messageChunks: Map<string, AIMessageChunk[]>;\n\n try {\n sendedMetadataMessage = new Set();\n messageChunks = new Map<string, AIMessageChunk[]>();\n for await (const event of await events) {\n let ns: string[] = [];\n /** @ts-ignore subgraph 类型可以为 [ns,name,value] */\n if (event.length === 3) {\n ns = event.splice(0, 1);\n }\n\n const getNameWithNs = (name: string) => {\n if (ns.length === 0) return name;\n if (ns.length === 1 && ns[0]?.length === 0) return name;\n return `${name}|${ns.join('|')}`;\n };\n if (event[0] === 'values') {\n const value = event[1];\n await queue.push(new EventMessage(getNameWithNs('values'), value));\n if (getNameWithNs('values') === 'values') {\n if (value?.__interrupt__) {\n await threads.set(run.thread_id, {\n status: 'interrupted',\n interrupts: value ? JSON.parse(serialiseAsDict(value)) : '',\n });\n } else {\n await threads.set(run.thread_id, {\n values: value ? JSON.parse(serialiseAsDict(value)) : '',\n });\n }\n }\n } else if (event[0] === 'messages') {\n const message = event[1][0];\n const metadata = event[1][1];\n // 只在第一次发送 metadata\n if (message.id && !sendedMetadataMessage.has(message.id)) {\n await queue.push(\n new EventMessage('messages/metadata', {\n [message.id]: metadata,\n }),\n );\n sendedMetadataMessage.add(message.id);\n }\n if (AIMessageChunk.isInstance(message) && message.id) {\n messageChunks.set(message.id, [\n ...(messageChunks.get(message.id) ?? []),\n message as AIMessageChunk,\n ]);\n await queue.push(\n new EventMessage('messages/partial', [messageChunks.get(message.id)!.reduce(concat)]),\n );\n } else {\n await queue.push(new EventMessage('messages/partial', [message]));\n }\n } else if (event[0] === 'updates') {\n const updates = event[1];\n await queue.push(new EventMessage(getNameWithNs('updates'), updates));\n }\n }\n } finally {\n // 发送流结束信号\n await queue.push(new StreamEndEventMessage());\n // 清理内存:清空 Set 和 Map\n /** @ts-ignore */\n if (sendedMetadataMessage) {\n sendedMetadataMessage.clear();\n }\n /** @ts-ignore */\n if (messageChunks) {\n messageChunks.clear();\n }\n }\n}\n\n/**\n * 从队列创建数据流生成器\n * @param queueId 队列 ID\n * @param signal 中止信号\n * @returns 数据流生成器\n */\nexport async function* createStreamFromQueue(queueId: string): AsyncGenerator<{ event: string; data: unknown }> {\n const queue = await LangGraphGlobal.globalMessageQueue.getQueue(queueId);\n return queue.onDataReceive();\n}\n\nexport const serialiseAsDict = (obj: unknown, indent = 0) => {\n return JSON.stringify(\n obj,\n function (key: string | number, value: unknown) {\n const rawValue = this[key];\n if (\n rawValue != null &&\n typeof rawValue === 'object' &&\n 'toDict' in rawValue &&\n typeof rawValue.toDict === 'function'\n ) {\n // TODO: we need to upstream this to LangChainJS\n const { type, data } = rawValue.toDict();\n return { ...data, type };\n }\n\n return value;\n },\n indent,\n );\n};\n/**\n * 兼容性函数:保持原有 API,同时使用队列模式\n * @param run 运行配置\n * @param options 选项\n * @returns 数据流生成器\n */\nexport async function* streamState(\n threads: BaseThreadsManager,\n run: Run | Promise<Run>,\n payload: StreamInputData,\n options: {\n attempt: number;\n getGraph: (\n graphId: string,\n config: LangGraphRunnableConfig | undefined,\n options?: { checkpointer?: BaseCheckpointSaver | null },\n ) => Promise<Pregel<any, any, any, any, any>>;\n compressMessages?: boolean;\n },\n) {\n run = await run;\n // 生成唯一的队列 ID\n const queueId = run.run_id;\n const threadId = run.thread_id;\n try {\n // 启动队列推送任务(在后台异步执行)\n await threads.set(threadId, { status: 'busy' });\n await threads.updateRun(run.run_id, { status: 'running' });\n const queue = LangGraphGlobal.globalMessageQueue.createQueue(queueId);\n const state = queue.onDataReceive();\n streamStateWithQueue(threads, run, queue, payload, options).catch((error) => {\n if (error.message !== 'user cancel this run') console.error('Queue task error:', error);\n // 如果生产者出错,向队列推送错误信号\n LangGraphGlobal.globalMessageQueue.pushToQueue(queueId, new StreamErrorEventMessage(error));\n // TODO 不知道这里需不需要错误处理\n });\n for await (const data of state) {\n yield data;\n }\n await threads.updateRun(run.run_id, { status: 'success' });\n } catch (error) {\n // 如果发生错误,确保清理资源\n console.error('Stream error:', error);\n await threads.updateRun(run.run_id, { status: 'error' });\n await threads.set(threadId, { status: 'error' });\n // throw error;\n } finally {\n const nowState = await threads.get(threadId);\n // 在完成后清理队列\n if (nowState.status === 'interrupted') {\n // 注意,interrupted 状态,直接拷贝一个需要恢复状态的队列即可\n await LangGraphGlobal.globalMessageQueue.copyQueue(queueId, threadId, 30000);\n } else {\n await threads.set(threadId, { status: 'idle', interrupts: {} });\n }\n // 清空队列数据,释放内存\n await LangGraphGlobal.globalMessageQueue.clearQueue(queueId);\n LangGraphGlobal.globalMessageQueue.removeQueue(queueId);\n }\n}\n"],"names":["metadata"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langgraph-js/pure-graph",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "A library that provides a standard LangGraph endpoint for integrating into various frameworks like Next.js and Hono.js, with support for multiple storage backends (SQLite, PostgreSQL, Redis) and message queues.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-adapter-5PeLHaxe.js","sources":["../src/storage/kysely/sqlite-adapter.ts"],"sourcesContent":["import { Kysely, sql, SqlBool, Expression, SqliteDialect } from 'kysely';\nimport { DatabaseAdapter } from './adapter';\nimport { Database } from './types';\n\n/**\n * SQLite 适配器\n * - 时间类型:TEXT (ISO 8601 字符串)\n * - JSON 类型:TEXT\n * - JSON 查询:使用 json_extract 函数\n */\nexport class SQLiteAdapter implements DatabaseAdapter {\n db: Kysely<Database>;\n constructor(database: Kysely<any>) {\n this.db = database;\n }\n dateToDb(date: Date): string {\n // SQLite 存储为 ISO 8601 字符串\n return date.toISOString();\n }\n\n dbToDate(dbValue: any): Date {\n // SQLite 返回字符串,需要转换为 Date\n return new Date(dbValue);\n }\n\n jsonToDb(obj: any): string {\n // SQLite 存储为 JSON 字符串\n return JSON.stringify(obj);\n }\n\n dbToJson(dbValue: any): any {\n // SQLite 返回字符串,需要解析\n if (typeof dbValue === 'string') {\n try {\n return JSON.parse(dbValue);\n } catch {\n return dbValue;\n }\n }\n return dbValue;\n }\n\n buildJsonQuery(\n db: Kysely<Database>,\n field: 'metadata' | 'interrupts',\n key: string,\n value: any,\n ): Expression<SqlBool> {\n // SQLite 使用 json_extract 函数\n return sql<boolean>`json_extract(${sql.ref(field)}, ${sql.lit('$.' + key)}) = ${sql.lit(\n JSON.stringify(value),\n )}`;\n }\n\n now(): string {\n return new Date().toISOString();\n }\n\n async createTables(db: Kysely<Database>): Promise<void> {\n // 创建 threads 表\n await sql`\n CREATE TABLE IF NOT EXISTS threads (\n thread_id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n status TEXT NOT NULL DEFAULT 'idle',\n \"values\" TEXT,\n interrupts TEXT NOT NULL DEFAULT '{}'\n )\n `.execute(db);\n\n // 创建 runs 表\n await sql`\n CREATE TABLE IF NOT EXISTS runs (\n run_id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n assistant_id TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n metadata TEXT NOT NULL DEFAULT '{}',\n multitask_strategy TEXT NOT NULL DEFAULT 'reject',\n FOREIGN KEY (thread_id) REFERENCES threads(thread_id) ON DELETE CASCADE\n )\n `.execute(db);\n }\n\n async createIndexes(db: Kysely<Database>): Promise<void> {\n await sql`CREATE INDEX IF NOT EXISTS idx_threads_status ON threads(status)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_threads_created_at ON threads(created_at)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_threads_updated_at ON threads(updated_at)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_runs_thread_id ON runs(thread_id)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status)`.execute(db);\n }\n}\n"],"names":[],"mappings":";;AAUO,MAAM,aAAA,CAAyC;AAAA,EAClD,EAAA;AAAA,EACA,YAAY,QAAA,EAAuB;AAC/B,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AAAA,EACd;AAAA,EACA,SAAS,IAAA,EAAoB;AAEzB,IAAA,OAAO,KAAK,WAAA,EAAY;AAAA,EAC5B;AAAA,EAEA,SAAS,OAAA,EAAoB;AAEzB,IAAA,OAAO,IAAI,KAAK,OAAO,CAAA;AAAA,EAC3B;AAAA,EAEA,SAAS,GAAA,EAAkB;AAEvB,IAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,EAC7B;AAAA,EAEA,SAAS,OAAA,EAAmB;AAExB,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC7B,MAAA,IAAI;AACA,QAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAC7B,CAAA,CAAA,MAAQ;AACJ,QAAA,OAAO,OAAA;AAAA,MACX;AAAA,IACJ;AACA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,cAAA,CACI,EAAA,EACA,KAAA,EACA,GAAA,EACA,KAAA,EACmB;AAEnB,IAAA,OAAO,GAAA,CAAA,aAAA,EAA4B,GAAA,CAAI,GAAA,CAAI,KAAK,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,GAAA,CAAI,IAAA,GAAO,GAAG,CAAC,CAAA,IAAA,EAAO,GAAA,CAAI,GAAA;AAAA,MAChF,IAAA,CAAK,UAAU,KAAK;AAAA,KACvB,CAAA,CAAA;AAAA,EACL;AAAA,EAEA,GAAA,GAAc;AACV,IAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,EAClC;AAAA,EAEA,MAAM,aAAa,EAAA,EAAqC;AAEpD,IAAA,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,CAUJ,QAAQ,EAAE,CAAA;AAGZ,IAAA,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,CAYJ,QAAQ,EAAE,CAAA;AAAA,EAChB;AAAA,EAEA,MAAM,cAAc,EAAA,EAAqC;AACrD,IAAA,MAAM,GAAA,CAAA,gEAAA,CAAA,CAAsE,QAAQ,EAAE,CAAA;AACtF,IAAA,MAAM,GAAA,CAAA,wEAAA,CAAA,CAA8E,QAAQ,EAAE,CAAA;AAC9F,IAAA,MAAM,GAAA,CAAA,wEAAA,CAAA,CAA8E,QAAQ,EAAE,CAAA;AAC9F,IAAA,MAAM,GAAA,CAAA,gEAAA,CAAA,CAAsE,QAAQ,EAAE,CAAA;AACtF,IAAA,MAAM,GAAA,CAAA,0DAAA,CAAA,CAAgE,QAAQ,EAAE,CAAA;AAAA,EACpF;AACJ;;;;"}
|