@langgraph-js/pure-graph 3.2.5 → 3.3.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 +4 -3
- package/dist/adapter/fetch/index.js.map +1 -1
- package/dist/adapter/nextjs/index.js +1 -1
- package/dist/adapter/zod.d.ts +1 -0
- package/dist/{createEndpoint-Cz6LSXYH.js → createEndpoint-D27R5Yhn.js} +53 -11
- package/dist/createEndpoint-D27R5Yhn.js.map +1 -0
- package/dist/createEndpoint.d.ts +2 -1
- package/dist/global.d.ts +15 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -2
- package/dist/{queue-swFecaQs.js → queue-CS3K-zd_.js} +2 -2
- package/dist/{queue-swFecaQs.js.map → queue-CS3K-zd_.js.map} +1 -1
- package/dist/remote/index.js +1 -1
- package/dist/{remote-threads-CrG03ZS7.js → remote-threads-UpSB8X-e.js} +19 -1
- package/dist/remote-threads-UpSB8X-e.js.map +1 -0
- package/dist/{sqlite-adapter-CJXgit1j.js → sqlite-adapter-D5g0LbUq.js} +15 -2
- package/dist/sqlite-adapter-D5g0LbUq.js.map +1 -0
- package/dist/storage/kysely/remote-threads.d.ts +4 -0
- package/dist/storage/kysely/sqlite-adapter.d.ts +5 -0
- package/dist/storage/kysely/threads.d.ts +3 -2
- package/dist/storage/kysely/types.d.ts +1 -0
- package/dist/storage/memory/threads.d.ts +4 -3
- package/dist/{stream-Dm5628RW.js → stream-Bleed1lp.js} +104 -13
- package/dist/stream-Bleed1lp.js.map +1 -0
- package/dist/threads/index.d.ts +9 -3
- package/dist/types.d.ts +10 -2
- package/dist/utils/titleGenerator.d.ts +20 -0
- package/dist/utils/titleGeneratorHelper.d.ts +17 -0
- package/package.json +87 -86
- package/dist/createEndpoint-Cz6LSXYH.js.map +0 -1
- package/dist/remote-threads-CrG03ZS7.js.map +0 -1
- package/dist/sqlite-adapter-CJXgit1j.js.map +0 -1
- package/dist/stream-Dm5628RW.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,87 +1,88 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
"
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
2
|
+
"name": "@langgraph-js/pure-graph",
|
|
3
|
+
"version": "3.3.1",
|
|
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
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md",
|
|
10
|
+
"LICENSE"
|
|
11
|
+
],
|
|
12
|
+
"type": "module",
|
|
13
|
+
"scripts": {
|
|
14
|
+
"dev": "bun run --port 8123 test/hono.ts",
|
|
15
|
+
"ui": "bunx @langgraph-js/ui",
|
|
16
|
+
"dev:docs": "bunx --bun xyd-js@0.1.0-alpha.5",
|
|
17
|
+
"build": " vite build && tsc",
|
|
18
|
+
"docs:build": "pnpx xyd-js@0.1.0-alpha.5 build",
|
|
19
|
+
"prepublish": "pnpm build",
|
|
20
|
+
"test": "vitest",
|
|
21
|
+
"test:run": "vitest run",
|
|
22
|
+
"test:coverage": "vitest run --coverage"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"langgraph",
|
|
26
|
+
"langchain",
|
|
27
|
+
"nextjs",
|
|
28
|
+
"hono",
|
|
29
|
+
"framework",
|
|
30
|
+
"api",
|
|
31
|
+
"endpoint",
|
|
32
|
+
"storage",
|
|
33
|
+
"sqlite",
|
|
34
|
+
"postgres",
|
|
35
|
+
"redis",
|
|
36
|
+
"typescript"
|
|
37
|
+
],
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://github.com/KonghaYao/open-langgraph-server.git"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/KonghaYao/open-langgraph-server",
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/KonghaYao/open-langgraph-server/issues"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=18.0.0"
|
|
48
|
+
},
|
|
49
|
+
"author": "KonghaYao<3446798488@qq.com>",
|
|
50
|
+
"license": "MIT",
|
|
51
|
+
"packageManager": "pnpm@10.22.0",
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@langchain/core": "^1.0.6",
|
|
54
|
+
"@langchain/langgraph": "^1.0.2",
|
|
55
|
+
"@langchain/langgraph-checkpoint": "^1.0.0",
|
|
56
|
+
"@langgraph-js/pro": "^2.0.0",
|
|
57
|
+
"camelcase-keys": "^10.0.0",
|
|
58
|
+
"eventemitter3": "^5.0.1",
|
|
59
|
+
"kysely": "^0.28.8",
|
|
60
|
+
"langchain": "^1.0.6",
|
|
61
|
+
"uuid": "^13.0.0",
|
|
62
|
+
"zod": "^4",
|
|
63
|
+
"zod-defaults": "^0.2.3"
|
|
64
|
+
},
|
|
65
|
+
"optionalDependencies": {
|
|
66
|
+
"@hono/zod-validator": "^0.7.3",
|
|
67
|
+
"@langchain/langgraph-checkpoint-postgres": "^1.0.0",
|
|
68
|
+
"@langchain/langgraph-checkpoint-redis": "^1.0.0",
|
|
69
|
+
"hono": "^4.9.9",
|
|
70
|
+
"kysely-bun-worker": "^1.2.1",
|
|
71
|
+
"kysely-wasm": "^1.2.1",
|
|
72
|
+
"node-sqlite3-wasm": "^0.8.51",
|
|
73
|
+
"pg": "^8.16.3",
|
|
74
|
+
"redis": "^5.8.3"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@langchain/langgraph-sdk": "^1.0.0",
|
|
78
|
+
"@langchain/openai": "^1.2.1",
|
|
79
|
+
"@langgraph-js/sdk": "^3.3.1",
|
|
80
|
+
"@types/node": "^22.13.5",
|
|
81
|
+
"@types/pg": "^8.15.5",
|
|
82
|
+
"@vitest/coverage-v8": "4.0.18",
|
|
83
|
+
"rollup-plugin-node-externals": "^8.1.1",
|
|
84
|
+
"typescript": "^5.9.2",
|
|
85
|
+
"vite": "^7.1.12",
|
|
86
|
+
"vitest": "4.0.18"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createEndpoint-Cz6LSXYH.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';\nimport type { BaseStreamQueueInterface } from './queue/stream_queue.js';\nimport type { EventMessage } from './queue/event_message.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 let queue: BaseStreamQueueInterface | null = null;\n let generator: AsyncGenerator<EventMessage, void, unknown> | null = null;\n\n try {\n // 获取队列实例\n queue = await LangGraphGlobal.globalMessageQueue.getQueue(runId);\n\n // 获取历史数据\n const allData = await queue.getAll();\n for (const eventMessage of allData) {\n // 检查是否被取消\n if (signal.aborted) {\n return;\n }\n\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 // 监听队列数据并转换格式\n generator = queue.onDataReceive();\n for await (const eventMessage of generator) {\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 if (!(error instanceof Error) || !error.message.includes('does not exist')) {\n console.warn('Join stream failed:', error);\n }\n } finally {\n // 清理生成器,释放资源\n if (generator) {\n try {\n await generator.return(undefined);\n } catch (e) {\n // 忽略生成器清理错误\n }\n }\n // 注意:不在这里清理队列,队列由 streamState 在运行完成时统一清理\n }\n },\n },\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remote-threads-CrG03ZS7.js","sources":["../src/storage/remote/types.ts","../src/storage/remote/fetch.ts","../src/storage/kysely/remote-threads.ts"],"sourcesContent":["/**\n * Remote PostgreSQL Adapter 类型定义\n * 定义 API 请求/响应格式和错误类型\n */\n\nimport { Metadata, OnConflictBehavior, Run, Thread, ThreadStatus, Command } from '@langgraph-js/sdk';\nimport { RunStatus, SortOrder, ThreadSortBy } from '../../types';\n\n/**\n * API 响应通用格式\n */\nexport interface RemoteResponse<T = any> {\n success: boolean;\n data?: T;\n error?: {\n code: string;\n message: string;\n };\n}\n\n/**\n * 错误码枚举\n */\nexport enum RemoteErrorCode {\n // 网络错误\n NETWORK_ERROR = 'NETWORK_ERROR',\n CONNECTION_TIMEOUT = 'CONNECTION_TIMEOUT',\n\n // 服务器错误\n INTERNAL_ERROR = 'INTERNAL_ERROR',\n\n // 业务错误\n THREAD_NOT_FOUND = 'THREAD_NOT_FOUND',\n THREAD_BUSY = 'THREAD_BUSY',\n RUN_NOT_FOUND = 'RUN_NOT_FOUND',\n GRAPH_NOT_FOUND = 'GRAPH_NOT_FOUND',\n INVALID_REQUEST = 'INVALID_REQUEST',\n}\n\n/**\n * 远程 API 错误类\n */\nexport class RemoteApiError extends Error {\n constructor(\n public code: string,\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = 'RemoteApiError';\n }\n}\n\n/**\n * Setup API 响应\n */\nexport interface SetupResponse {\n message: string;\n}\n\n/**\n * Create Thread API 请求\n */\nexport interface CreateThreadRequest {\n metadata?: Metadata;\n threadId?: string;\n ifExists?: OnConflictBehavior;\n graphId?: string;\n supersteps?: Array<{ updates: Array<{ values: unknown; command?: Command; asNode: string }> }>;\n}\n\n/**\n * Search Threads API 请求\n */\nexport interface SearchThreadsRequest {\n ids?: string[];\n metadata?: Metadata;\n limit?: number;\n offset?: number;\n status?: ThreadStatus;\n sortBy?: ThreadSortBy;\n sortOrder?: SortOrder;\n values?: unknown;\n select?: Array<'thread_id' | 'created_at' | 'updated_at' | 'metadata' | 'config' | 'context' | 'status' | 'values' | 'interrupts'>;\n /**\n * @deprecated Use `select` parameter instead for fine-grained field control\n */\n withoutDetails?: boolean;\n}\n\n/**\n * Update Thread API 请求\n */\nexport interface UpdateThreadRequest {\n metadata?: Metadata;\n status?: ThreadStatus;\n values?: any;\n interrupts?: Record<string, any>;\n}\n\n/**\n * Update State API 请求\n */\nexport interface UpdateStateRequest {\n values?: any;\n}\n\n/**\n * Update State API 响应\n */\nexport interface UpdateStateResponse {\n configurable: Record<string, any>;\n}\n\n/**\n * Create Run API 请求\n */\nexport interface CreateRunRequest {\n metadata?: Metadata;\n}\n\n/**\n * List Runs API 请求\n */\nexport interface ListRunsRequest {\n limit?: number;\n offset?: number;\n status?: RunStatus;\n}\n\n/**\n * Update Run API 请求\n */\nexport interface UpdateRunRequest {\n status?: RunStatus;\n metadata?: Metadata;\n multitask_strategy?: 'reject' | 'interrupt' | 'rollback';\n}\n","/**\n * Remote PostgreSQL Adapter - 简化的 Fetch 工具函数\n */\n\nimport { RemoteResponse } from './types';\nimport { RemoteApiError, RemoteErrorCode } from './types';\n\n/**\n * 发起 HTTP 请求的简化函数\n */\nasync function request<T>(\n url: string,\n method: string,\n options?: {\n query?: Record<string, string | number | boolean>;\n body?: any;\n },\n): Promise<RemoteResponse<T>> {\n try {\n // 添加查询参数\n let requestUrl = url;\n if (options?.query) {\n const searchParams = new URLSearchParams();\n Object.entries(options.query).forEach(([key, value]) => {\n searchParams.append(key, String(value));\n });\n requestUrl += `?${searchParams.toString()}`;\n }\n\n // 发起请求\n const response = await fetch(requestUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n },\n body: options?.body ? JSON.stringify(options.body) : undefined,\n });\n\n // 解析响应\n const data: RemoteResponse<T> = (await response.json()) as any;\n\n // 检查响应状态\n if (!response.ok || !data.success) {\n throw new RemoteApiError(\n data.error?.code || RemoteErrorCode.INTERNAL_ERROR,\n data.error?.message || 'Unknown error',\n response.status,\n );\n }\n\n return data;\n } catch (error) {\n // 如果是 RemoteApiError,直接抛出\n if (error instanceof RemoteApiError) {\n throw error;\n }\n\n // 网络错误转换为 RemoteApiError\n throw new RemoteApiError(\n RemoteErrorCode.NETWORK_ERROR,\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n\n/**\n * GET 请求\n */\nexport async function remoteGet<T>(\n url: string,\n query?: Record<string, string | number | boolean>,\n): Promise<RemoteResponse<T>> {\n return request<T>(url, 'GET', { query });\n}\n\n/**\n * POST 请求\n */\nexport async function remotePost<T>(\n url: string,\n body?: any,\n query?: Record<string, string | number | boolean>,\n): Promise<RemoteResponse<T>> {\n return request<T>(url, 'POST', { body, query });\n}\n\n/**\n * PUT 请求\n */\nexport async function remotePut<T>(\n url: string,\n body?: any,\n query?: Record<string, string | number | boolean>,\n): Promise<RemoteResponse<T>> {\n return request<T>(url, 'PUT', { body, query });\n}\n\n/**\n * DELETE 请求\n */\nexport async function remoteDelete<T>(\n url: string,\n query?: Record<string, string | number | boolean>,\n): Promise<RemoteResponse<T>> {\n return request<T>(url, 'DELETE', { query });\n}\n","/**\n * Remote Kysely Threads Manager\n * 通过 HTTP/REST API 与远程 PostgreSQL 服务器通信\n */\n\nimport { BaseThreadsManager } from '../../threads';\nimport { Metadata, OnConflictBehavior, Run, Thread, ThreadState } from '@langgraph-js/sdk';\nimport { RunStatus, SortOrder, ThreadSortBy } from '../../types';\nimport { remoteGet, remotePost, remotePut, remoteDelete } from '../remote/fetch';\nimport { RemoteApiError, RemoteErrorCode } from '../remote/types';\n\n/**\n * 远程 Kysely Threads Manager\n */\nexport class RemoteKyselyThreadsManager<ValuesType = unknown> implements BaseThreadsManager<ValuesType> {\n constructor(private serverUrl: string, private httpClient?: typeof fetch) {\n // 确保服务器 URL 没有尾部斜杠\n this.serverUrl = serverUrl.replace(/\\/$/, '');\n this.httpClient = httpClient || fetch;\n }\n\n /**\n * 初始化数据库\n */\n async setup(): Promise<void> {\n await remotePost(`${this.serverUrl}/setup`);\n }\n\n /**\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?: any; asNode: string }> }>;\n }): Promise<Thread<ValuesType>> {\n const response = await remotePost<Thread<ValuesType>>(`${this.serverUrl}/threads`, payload);\n return response.data as Thread<ValuesType>;\n }\n\n /**\n * 搜索线程\n */\n async search(query?: {\n ids?: string[];\n metadata?: Metadata;\n limit?: number;\n offset?: number;\n status?: any;\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 /**\n * @deprecated Use `select` parameter instead for fine-grained field control\n */\n withoutDetails?: boolean;\n }): Promise<Thread<ValuesType>[]> {\n const params: Record<string, string | number | boolean> = {};\n\n if (query?.ids !== undefined && query.ids.length > 0) {\n params.ids = JSON.stringify(query.ids);\n }\n if (query?.metadata !== undefined) {\n params.metadata = JSON.stringify(query.metadata);\n }\n if (query?.limit !== undefined) {\n params.limit = query.limit;\n }\n if (query?.offset !== undefined) {\n params.offset = query.offset;\n }\n if (query?.status !== undefined) {\n params.status = query.status;\n }\n if (query?.sortBy !== undefined) {\n params.sortBy = query.sortBy;\n }\n if (query?.sortOrder !== undefined) {\n params.sortOrder = query.sortOrder;\n }\n if (query?.values !== undefined) {\n params.values = JSON.stringify(query.values);\n }\n if (query?.select !== undefined) {\n params.select = JSON.stringify(query.select);\n }\n if (query?.withoutDetails !== undefined) {\n params.withoutDetails = query.withoutDetails;\n }\n\n const response = await remoteGet<Thread<ValuesType>[]>(`${this.serverUrl}/threads`, params);\n return response.data as Thread<ValuesType>[];\n }\n\n /**\n * 获取线程\n */\n async get(threadId: string): Promise<Thread<ValuesType>> {\n const response = await remoteGet<Thread<ValuesType>>(`${this.serverUrl}/threads/${threadId}`);\n return response.data as Thread<ValuesType>;\n }\n\n /**\n * 更新线程\n */\n async set(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<void> {\n await remotePut(`${this.serverUrl}/threads/${threadId}`, thread);\n }\n\n /**\n * 删除线程\n */\n async delete(threadId: string): Promise<void> {\n await remoteDelete(`${this.serverUrl}/threads/${threadId}`);\n }\n\n /**\n * 更新状态\n */\n async updateState(\n threadId: string,\n thread: Partial<Thread<ValuesType>>,\n ): Promise<{ configurable: Record<string, any> }> {\n const response = await remotePost<{ configurable: Record<string, any> }>(\n `${this.serverUrl}/threads/${threadId}/state`,\n thread,\n );\n return response.data as { configurable: Record<string, any> };\n }\n\n /**\n * 创建运行\n */\n async createRun(threadId: string, assistantId: string, payload?: { metadata?: Metadata }): Promise<Run> {\n const response = await remotePost<Run>(`${this.serverUrl}/threads/${threadId}/runs`, payload || {}, {\n assistantId,\n });\n return response.data as Run;\n }\n\n /**\n * 列出运行\n */\n async listRuns(\n threadId: string,\n options?: { limit?: number; offset?: number; status?: RunStatus },\n ): Promise<Run[]> {\n const params: Record<string, string | number> = {};\n\n if (options?.limit !== undefined) {\n params.limit = options.limit;\n }\n if (options?.offset !== undefined) {\n params.offset = options.offset;\n }\n if (options?.status !== undefined) {\n params.status = options.status;\n }\n\n const response = await remoteGet<Run[]>(`${this.serverUrl}/threads/${threadId}/runs`, params);\n return response.data as Run[];\n }\n\n /**\n * 更新运行\n */\n async updateRun(runId: string, run: Partial<Run>): Promise<void> {\n await remotePut(`${this.serverUrl}/runs/${runId}`, run);\n }\n\n // New methods for Threads API\n\n /**\n * 计算线程数量\n */\n async count(query?: { ids?: string[]; metadata?: Metadata; status?: any; values?: ValuesType }): Promise<number> {\n const params: Record<string, string> = {};\n\n if (query?.ids !== undefined && query.ids.length > 0) {\n params.ids = JSON.stringify(query.ids);\n }\n if (query?.metadata !== undefined) {\n params.metadata = JSON.stringify(query.metadata);\n }\n if (query?.status !== undefined) {\n params.status = query.status;\n }\n if (query?.values !== undefined) {\n params.values = JSON.stringify(query.values);\n }\n\n const response = await remoteGet<number>(`${this.serverUrl}/threads/count`, params);\n return response.data as number;\n }\n\n /**\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 response = await remotePost<Thread<ValuesType>>(`${this.serverUrl}/threads/${threadId}`, updates);\n return response.data as Thread<ValuesType>;\n }\n\n /**\n * 获取线程状态\n */\n async getState(threadId: string, options?: { subgraphs?: boolean; checkpointId?: string }): Promise<ThreadState> {\n const params: Record<string, boolean | string> = {};\n\n if (options?.subgraphs !== undefined) {\n params.subgraphs = options.subgraphs;\n }\n if (options?.checkpointId !== undefined) {\n params.checkpointId = options.checkpointId;\n }\n\n const response = await remotePost<ThreadState>(`${this.serverUrl}/threads/${threadId}/state`, params);\n return response.data as ThreadState;\n }\n\n /**\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 params: Record<string, number | string> = {};\n\n if (options?.limit !== undefined) {\n params.limit = options.limit;\n }\n if (options?.before !== undefined) {\n params.before = options.before;\n }\n\n const response = await remotePost<ThreadState[]>(`${this.serverUrl}/threads/${threadId}/history`, params);\n return response.data as ThreadState[];\n }\n\n /**\n * 复制线程\n */\n async copy(threadId: string): Promise<Thread<ValuesType>> {\n const response = await remotePost<Thread<ValuesType>>(`${this.serverUrl}/threads/${threadId}/copy`);\n return response.data as Thread<ValuesType>;\n }\n}\n"],"names":["RemoteErrorCode"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-adapter-CJXgit1j.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 private pragmaPromise: Promise<void> | null = null;\n\n constructor(database: Kysely<any>) {\n this.db = database;\n }\n\n /**\n * 设置 SQLite PRAGMA 配置,解决锁问题\n * 使用 Promise 缓存确保并发安全且只执行一次\n */\n private ensurePragma(): Promise<void> {\n if (!this.pragmaPromise) {\n this.pragmaPromise = this.doEnsurePragma();\n }\n return this.pragmaPromise;\n }\n\n private async doEnsurePragma(): Promise<void> {\n // 锁等待超时 5 秒\n await sql`PRAGMA busy_timeout = 5000`.execute(this.db);\n // WAL 模式 - 读写并发\n await sql`PRAGMA journal_mode = WAL`.execute(this.db);\n // 平衡安全与性能\n await sql`PRAGMA synchronous = NORMAL`.execute(this.db);\n // 自动清理 WAL\n await sql`PRAGMA wal_autocheckpoint = 1000`.execute(this.db);\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 // - 字符串: 返回不带引号的文本\n // - 数字: 返回数字\n // - 布尔值: 返回 1/0\n // - null: 返回 NULL\n // 所以比较时需要根据类型处理\n\n // 构建 JSON 路径\n // 在 SQLite 中,所有键都需要用双引号括起来以确保正确解析\n // json_extract 语法: $.key 或 $.\"key-with-special\"\n const jsonPath = `$.${JSON.stringify(key)}`;\n\n // 构建 NULL 处理条件\n // 注意:SQLite 中 json_extract 对键不存在和值为 null 都返回 NULL\n // 使用 json_type 函数区分:\n // - 键不存在:json_type 返回 NULL\n // - 值为 null:json_type 返回 'null' 字符串\n if (value === null) {\n return sql<boolean>`\n json_type(${sql.ref(field)}, ${sql.lit(jsonPath)}) = 'null'\n `;\n }\n\n // 处理其他类型的值\n let compareValue: any;\n if (typeof value === 'string') {\n // 字符串: json_extract 返回不带引号的字符串,直接比较\n compareValue = value;\n } else if (typeof value === 'number') {\n // 数字: json_extract 返回数字\n compareValue = value;\n } else if (typeof value === 'boolean') {\n // 布尔值: json_extract 返回 1/0\n compareValue = value ? 1 : 0;\n } else {\n // 其他类型(对象、数组): 使用 JSON 字符串\n compareValue = JSON.stringify(value);\n }\n\n // 构建普通比较条件\n return sql<boolean>`json_extract(${sql.ref(field)}, ${sql.lit(jsonPath)}) = ${sql.lit(compareValue)}`;\n }\n\n now(): string {\n return new Date().toISOString();\n }\n\n async createTables(db: Kysely<Database>): Promise<void> {\n // 先设置 PRAGMA\n await this.ensurePragma();\n\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,EACQ,aAAA,GAAsC,IAAA;AAAA,EAE9C,YAAY,QAAA,EAAuB;AAC/B,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAA,GAA8B;AAClC,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACrB,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,cAAA,EAAe;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAChB;AAAA,EAEA,MAAc,cAAA,GAAgC;AAE1C,IAAA,MAAM,GAAA,CAAA,0BAAA,CAAA,CAAgC,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA;AAErD,IAAA,MAAM,GAAA,CAAA,yBAAA,CAAA,CAA+B,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA;AAEpD,IAAA,MAAM,GAAA,CAAA,2BAAA,CAAA,CAAiC,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA;AAEtD,IAAA,MAAM,GAAA,CAAA,gCAAA,CAAA,CAAsC,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA;AAAA,EAC/D;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;AAWnB,IAAA,MAAM,QAAA,GAAW,CAAA,EAAA,EAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA;AAOzC,IAAA,IAAI,UAAU,IAAA,EAAM;AAChB,MAAA,OAAO,GAAA;AAAA,0BAAA,EACS,GAAA,CAAI,IAAI,KAAK,CAAC,KAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,YAAA,CAAA;AAAA,IAExD;AAGA,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE3B,MAAA,YAAA,GAAe,KAAA;AAAA,IACnB,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AAElC,MAAA,YAAA,GAAe,KAAA;AAAA,IACnB,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,SAAA,EAAW;AAEnC,MAAA,YAAA,GAAe,QAAQ,CAAA,GAAI,CAAA;AAAA,IAC/B,CAAA,MAAO;AAEH,MAAA,YAAA,GAAe,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,IACvC;AAGA,IAAA,OAAO,GAAA,CAAA,aAAA,EAA4B,GAAA,CAAI,GAAA,CAAI,KAAK,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAC,CAAA,IAAA,EAAO,GAAA,CAAI,GAAA,CAAI,YAAY,CAAC,CAAA,CAAA;AAAA,EACvG;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,KAAK,YAAA,EAAa;AAGxB,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;;;;"}
|