@langgraph-js/pure-graph 2.7.3 → 2.8.0

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.
@@ -1,5 +1,5 @@
1
- import { s as serialiseAsDict, L as LangGraphGlobal } from './stream-Blquv56P.js';
2
- import { c as createEndpoint } from './createEndpoint-BEEfOyPg.js';
1
+ import { s as serialiseAsDict, L as LangGraphGlobal } from '../../stream-BkrtqGvX.js';
2
+ import { c as createEndpoint } from '../../createEndpoint-u2dnG_xt.js';
3
3
  import z from 'zod';
4
4
  import camelcaseKeys from 'camelcase-keys';
5
5
 
@@ -79,8 +79,8 @@ const RunStreamPayloadSchema = z.object({
79
79
  langsmith_tracer: z.unknown().optional()
80
80
  }).describe("Payload for creating a stateful run.");
81
81
  const RunListQuerySchema = z.object({
82
- limit: z.coerce.number().int().optional(),
83
- offset: z.coerce.number().int().optional(),
82
+ limit: z.coerce.number().int().optional().default(10),
83
+ offset: z.coerce.number().int().optional().default(0),
84
84
  status: z.enum(["pending", "running", "error", "success", "timeout", "interrupted"]).optional()
85
85
  });
86
86
  const RunCancelQuerySchema = z.object({
@@ -104,7 +104,8 @@ const ThreadSearchPayloadSchema = z.object({
104
104
  limit: z.number().int().gte(1).lte(1e3).describe("Maximum number to return.").optional(),
105
105
  offset: z.number().int().gte(0).describe("Offset to start from.").optional(),
106
106
  sort_by: z.enum(["thread_id", "status", "created_at", "updated_at"]).describe("Sort by field.").optional(),
107
- sort_order: z.enum(["asc", "desc"]).describe("Sort order.").optional()
107
+ sort_order: z.enum(["asc", "desc"]).describe("Sort order.").optional(),
108
+ without_details: z.boolean().describe("Whether to return values.").optional()
108
109
  }).describe("Payload for listing threads.");
109
110
  const ThreadStateUpdate = z.object({
110
111
  values: z.union([z.record(z.string(), z.unknown()), z.array(z.record(z.string(), z.unknown()))]).nullish()
@@ -569,5 +570,5 @@ async function handleRequest(req, context = {}) {
569
570
  }
570
571
  }
571
572
 
572
- export { handleRequest as h };
573
- //# sourceMappingURL=index-D1vhtuku.js.map
573
+ export { cancelRun, createThread, deleteThread, getAssistantGraph, getThread, handleRequest, joinRunStream, listRuns, searchAssistants, searchThreads, streamRun, updateThreadState };
574
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/adapter/fetch/endpoint.ts","../../../src/adapter/zod.ts","../../../src/adapter/fetch/utils.ts","../../../src/adapter/fetch/assistants.ts","../../../src/adapter/fetch/threads.ts","../../../src/adapter/fetch/runs.ts","../../../src/adapter/fetch/index.ts"],"sourcesContent":["import { createEndpoint } from '../../createEndpoint.js';\n\nexport const client = createEndpoint();\n","import z from 'zod';\n\nexport const AssistantConfigurable = z\n .object({\n thread_id: z.string().optional(),\n thread_ts: z.string().optional(),\n })\n .catchall(z.unknown());\n\nexport const AssistantConfig = z\n .object({\n tags: z.array(z.string()).optional(),\n recursion_limit: z.number().int().optional(),\n configurable: AssistantConfigurable.optional(),\n })\n .catchall(z.unknown())\n .describe('The configuration of an assistant.');\n\nexport const Assistant = z.object({\n assistant_id: z.string().uuid(),\n graph_id: z.string(),\n config: AssistantConfig,\n created_at: z.string(),\n updated_at: z.string(),\n metadata: z.object({}).catchall(z.any()),\n});\n\nexport const MetadataSchema = z\n .object({\n source: z.union([z.literal('input'), z.literal('loop'), z.literal('update'), z.string()]).optional(),\n step: z.number().optional(),\n writes: z.any().nullable().optional(),\n parents: z.any().optional(),\n })\n .catchall(z.unknown());\n\nexport const SendSchema = z.object({\n node: z.string(),\n input: z.unknown().optional(),\n});\n\nexport const CommandSchema = z.object({\n update: z\n .union([z.any(), z.array(z.tuple([z.string(), z.any()]))])\n .nullable()\n .optional(),\n resume: z.unknown().optional(),\n goto: z.union([SendSchema, z.array(SendSchema), z.string(), z.array(z.string())]).optional(),\n});\n\n// 公共的查询参数验证 schema\nexport const PaginationQuerySchema = z.object({\n limit: z.number().int().optional(),\n offset: z.number().int().optional(),\n});\n\nexport const ThreadIdParamSchema = z.object({\n thread_id: z.string().uuid(),\n});\n\nexport const RunIdParamSchema = z.object({\n thread_id: z.string().uuid(),\n run_id: z.string().uuid(),\n});\n\n// Assistants 相关的 schema\nexport const AssistantsSearchSchema = z.object({\n graph_id: z.string().optional(),\n metadata: MetadataSchema.optional(),\n limit: z.number().int().optional(),\n offset: z.number().int().optional(),\n});\n\nexport const AssistantGraphQuerySchema = z.object({\n xray: z.string().optional(),\n});\n\n// Runs 相关的 schema\nexport const RunStreamPayloadSchema = z\n .object({\n assistant_id: z.union([z.string().uuid(), z.string()]),\n checkpoint_id: z.string().optional(),\n input: z.any().optional(),\n command: CommandSchema.optional(),\n metadata: MetadataSchema.optional(),\n config: AssistantConfig.optional(),\n webhook: z.string().optional(),\n interrupt_before: z.union([z.literal('*'), z.array(z.string())]).optional(),\n interrupt_after: z.union([z.literal('*'), z.array(z.string())]).optional(),\n on_disconnect: z.enum(['cancel', 'continue']).optional().default('continue'),\n multitask_strategy: z.enum(['reject', 'rollback', 'interrupt', 'enqueue']).optional(),\n stream_mode: z\n .array(z.enum(['values', 'messages', 'messages-tuple', 'updates', 'events', 'debug', 'custom']))\n .optional(),\n stream_subgraphs: z.boolean().optional(),\n stream_resumable: z.boolean().optional(),\n after_seconds: z.number().optional(),\n if_not_exists: z.enum(['create', 'reject']).optional(),\n on_completion: z.enum(['complete', 'continue']).optional(),\n feedback_keys: z.array(z.string()).optional(),\n langsmith_tracer: z.unknown().optional(),\n })\n .describe('Payload for creating a stateful run.');\n\nexport const RunListQuerySchema = z.object({\n limit: z.coerce.number().int().optional().default(10),\n offset: z.coerce.number().int().optional().default(0),\n status: z.enum(['pending', 'running', 'error', 'success', 'timeout', 'interrupted']).optional(),\n});\n\nexport const RunCancelQuerySchema = z.object({\n wait: z.coerce.boolean().optional().default(false),\n action: z.enum(['interrupt', 'rollback']).optional().default('interrupt'),\n});\n\nexport const RunJoinStreamQuerySchema = z.object({\n cancel_on_disconnect: z.coerce.boolean().optional().default(false),\n last_event_id: z.string().optional(),\n stream_mode: z.enum(['values', 'messages', 'messages-tuple', 'updates', 'events', 'debug', 'custom']).optional(),\n});\n\n// Threads 相关的 schema\nexport const ThreadCreatePayloadSchema = z\n .object({\n thread_id: z.string().uuid().describe('The ID of the thread. If not provided, an ID is generated.').optional(),\n metadata: MetadataSchema.optional(),\n if_exists: z.union([z.literal('raise'), z.literal('do_nothing')]).optional(),\n })\n .describe('Payload for creating a thread.');\n\nexport const ThreadSearchPayloadSchema = z\n .object({\n metadata: MetadataSchema.describe('Metadata to search for.').optional(),\n status: z.enum(['idle', 'busy', 'interrupted', 'error']).describe('Filter by thread status.').optional(),\n values: z.any().describe('Filter by thread values.').optional(),\n limit: z.number().int().gte(1).lte(1000).describe('Maximum number to return.').optional(),\n offset: z.number().int().gte(0).describe('Offset to start from.').optional(),\n sort_by: z.enum(['thread_id', 'status', 'created_at', 'updated_at']).describe('Sort by field.').optional(),\n sort_order: z.enum(['asc', 'desc']).describe('Sort order.').optional(),\n without_details: z.boolean().describe('Whether to return values.').optional(),\n })\n .describe('Payload for listing threads.');\n\nexport const ThreadStateUpdate = z\n .object({\n values: z.union([z.record(z.string(), z.unknown()), z.array(z.record(z.string(), z.unknown()))]).nullish(),\n // as_node: z.string().optional(),\n // checkpoint_id: z.string().optional(),\n // checkpoint: CheckpointSchema.nullish(),\n })\n .describe('Payload for adding state to a thread.');\n","import z from 'zod';\n\n/**\n * 解析 URL 路径参数\n */\nexport function parsePathParams(url: string, pattern: string): Record<string, string> {\n const patternParts = pattern.split('/').filter((p) => p);\n const urlParts = new URL(url).pathname.split('/').filter((p) => p);\n const params: Record<string, string> = {};\n\n patternParts.forEach((part, index) => {\n if (part.startsWith(':')) {\n const paramName = part.slice(1);\n params[paramName] = urlParts[index];\n }\n });\n\n return params;\n}\n\n/**\n * 解析查询参数并转换类型\n */\nexport function parseQueryParams(url: string): Record<string, string | number | boolean> {\n const searchParams = new URL(url).searchParams;\n const params: Record<string, string | number | boolean> = {};\n\n searchParams.forEach((value, key) => {\n // 尝试转换为数字\n if (!isNaN(Number(value)) && value !== '') {\n params[key] = Number(value);\n }\n // 尝试转换为布尔值\n else if (value === 'true' || value === 'false') {\n params[key] = value === 'true';\n }\n // 保持字符串\n else {\n params[key] = value;\n }\n });\n\n return params;\n}\n\n/**\n * 验证数据\n */\nexport function validate<T>(schema: z.ZodSchema<T>, data: unknown): T {\n const result = schema.safeParse(data);\n if (!result.success) {\n throw new ValidationError(result.error.issues);\n }\n return result.data;\n}\n\n/**\n * 验证错误\n */\nexport class ValidationError extends Error {\n public errors: z.ZodIssue[];\n\n constructor(errors: z.ZodIssue[]) {\n super('Validation failed');\n this.name = 'ValidationError';\n this.errors = errors;\n }\n}\n\n/**\n * 创建 JSON 响应\n */\nexport function jsonResponse(data: any, status = 200, headers?: Record<string, string>): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n}\n\n/**\n * 创建错误响应\n */\nexport function errorResponse(error: unknown, status = 500): Response {\n if (error instanceof ValidationError) {\n return jsonResponse(\n {\n error: 'Validation Error',\n details: error.errors,\n },\n 400,\n );\n }\n\n return jsonResponse(\n {\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n status,\n );\n}\n\n/**\n * 创建 SSE 流响应\n */\nexport function createSSEStream(streamFn: (writer: SSEWriter) => Promise<void>): Response {\n let controller: ReadableStreamDefaultController<Uint8Array>;\n let isClosed = false;\n\n const stream = new ReadableStream<Uint8Array>({\n async start(ctrl) {\n controller = ctrl;\n const encoder = new TextEncoder();\n\n const writer: SSEWriter = {\n writeSSE: async ({ data, event, id }) => {\n // 检查流是否已关闭\n if (isClosed) {\n return;\n }\n\n try {\n let message = '';\n\n if (id) {\n message += `id: ${id}\\n`;\n }\n if (event) {\n message += `event: ${event}\\n`;\n }\n message += `data: ${data}\\n\\n`;\n\n controller.enqueue(encoder.encode(message));\n } catch (error) {\n // 忽略写入已关闭流的错误\n if (!isClosed) {\n throw error;\n }\n }\n },\n close: () => {\n if (!isClosed) {\n isClosed = true;\n try {\n controller.close();\n } catch (error) {\n // 流可能已经关闭\n }\n }\n },\n };\n\n try {\n await streamFn(writer);\n } catch (error) {\n console.error('SSE stream error:', error);\n } finally {\n if (!isClosed) {\n isClosed = true;\n try {\n controller.close();\n } catch (error) {\n // 流可能已经关闭\n }\n }\n }\n },\n cancel() {\n isClosed = true;\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n },\n });\n}\n\nexport interface SSEWriter {\n writeSSE: (data: { data: string; event?: string; id?: string }) => Promise<void>;\n close: () => void;\n}\n\n/**\n * 为 SSE 流添加心跳功能\n */\nexport function withHeartbeat(\n streamFn: (writer: SSEWriter) => Promise<void>,\n heartbeatInterval: number = process.env.HEARTBEAT_INTERVAL ? parseInt(process.env.HEARTBEAT_INTERVAL) : 1500,\n): (writer: SSEWriter) => Promise<void> {\n return async (writer: SSEWriter) => {\n let heartbeatTimer: NodeJS.Timeout | null = null;\n\n const startHeartbeat = () => {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n }\n heartbeatTimer = setInterval(async () => {\n try {\n await writer.writeSSE({ event: 'ping', data: '{}' });\n } catch (error) {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n heartbeatTimer = null;\n }\n }\n }, heartbeatInterval);\n };\n\n const stopHeartbeat = () => {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n heartbeatTimer = null;\n }\n };\n\n const proxiedWriter: SSEWriter = {\n writeSSE: async (data) => {\n stopHeartbeat();\n await writer.writeSSE(data);\n startHeartbeat();\n },\n close: () => {\n stopHeartbeat();\n writer.close();\n },\n };\n\n startHeartbeat();\n\n try {\n await streamFn(proxiedWriter);\n } finally {\n stopHeartbeat();\n }\n };\n}\n","import { client } from './endpoint';\nimport { AssistantsSearchSchema, AssistantGraphQuerySchema } from '../zod';\nimport camelcaseKeys from 'camelcase-keys';\nimport { parseQueryParams, validate, jsonResponse, errorResponse } from './utils';\nimport { LangGraphServerContext } from './context';\n\n/**\n * POST /assistants/search\n */\nexport async function searchAssistants(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const body = await req.json();\n const payload = validate(AssistantsSearchSchema, body);\n\n const data = await client.assistants.search(camelcaseKeys(payload));\n\n return jsonResponse(data, 200, {\n 'X-Pagination-Total': '0',\n });\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * GET /assistants/:assistant_id/graph\n */\nexport async function getAssistantGraph(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const url = new URL(req.url);\n const pathParts = url.pathname.split('/').filter((p) => p);\n const assistant_id = pathParts[1]; // assistants/:assistant_id/graph\n\n const queryParams = parseQueryParams(req.url);\n const { xray } = validate(AssistantGraphQuerySchema, queryParams);\n\n const data = await client.assistants.getGraph(assistant_id, {\n xray: xray !== undefined ? xray === 'true' : undefined,\n });\n\n return jsonResponse(data);\n } catch (error) {\n return errorResponse(error);\n }\n}\n","import { client } from './endpoint';\nimport { ThreadIdParamSchema, ThreadCreatePayloadSchema, ThreadSearchPayloadSchema } from '../zod';\nimport camelcaseKeys from 'camelcase-keys';\nimport { parsePathParams, validate, jsonResponse, errorResponse } from './utils';\nimport { LangGraphServerContext } from './context';\n\n/**\n * POST /threads\n */\nexport async function createThread(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const body = await req.json();\n const payload = validate(ThreadCreatePayloadSchema, body);\n\n const thread = await client.threads.create(camelcaseKeys(payload));\n\n return jsonResponse(thread);\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * POST /threads/search\n */\nexport async function searchThreads(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const body = await req.json();\n const payload = validate(ThreadSearchPayloadSchema, body);\n\n const result = await client.threads.search(camelcaseKeys(payload));\n\n return jsonResponse(result, 200, {\n 'X-Pagination-Total': result.length.toString(),\n });\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * GET /threads/:thread_id\n */\nexport async function getThread(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id');\n const { thread_id } = validate(ThreadIdParamSchema, params);\n\n const thread = await client.threads.get(thread_id);\n\n return jsonResponse(thread);\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * DELETE /threads/:thread_id\n */\nexport async function deleteThread(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id');\n const { thread_id } = validate(ThreadIdParamSchema, params);\n\n await client.threads.delete(thread_id);\n\n return new Response(null, { status: 204 });\n } catch (error) {\n return errorResponse(error);\n }\n}\n","import { client } from './endpoint';\nimport {\n ThreadIdParamSchema,\n RunIdParamSchema,\n RunStreamPayloadSchema,\n RunListQuerySchema,\n RunCancelQuerySchema,\n RunJoinStreamQuerySchema,\n ThreadStateUpdate,\n} from '../zod';\nimport { serialiseAsDict } from '../../graph/stream';\nimport z from 'zod';\nimport camelcaseKeys from 'camelcase-keys';\nimport {\n parsePathParams,\n parseQueryParams,\n validate,\n jsonResponse,\n errorResponse,\n createSSEStream,\n withHeartbeat,\n} from './utils';\nimport { LangGraphServerContext } from './context';\n\n/**\n * POST /threads/:thread_id/runs/stream\n */\nexport async function streamRun(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id/runs/stream');\n const { thread_id } = validate(ThreadIdParamSchema, params);\n\n const body = await req.json();\n const payload = validate(RunStreamPayloadSchema, body);\n\n return createSSEStream(\n withHeartbeat(async (writer) => {\n payload.config = payload.config || {};\n payload.config.configurable = payload.config.configurable || {};\n\n const langgraphContext = context?.langgraph_context;\n if (langgraphContext) {\n Object.assign(payload.config.configurable, langgraphContext);\n }\n\n for await (const { event, data } of client.runs.stream(\n thread_id,\n payload.assistant_id,\n camelcaseKeys(payload) as any,\n )) {\n await writer.writeSSE({ data: serialiseAsDict(data) ?? '', event });\n }\n }),\n );\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * GET /threads/:thread_id/runs/:run_id/stream\n */\nexport async function joinRunStream(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id/runs/:run_id/stream');\n const { thread_id, run_id } = validate(RunIdParamSchema, params);\n\n const queryParams = parseQueryParams(req.url);\n const { cancel_on_disconnect, last_event_id, stream_mode } = validate(RunJoinStreamQuerySchema, queryParams);\n\n return createSSEStream(\n withHeartbeat(async (writer) => {\n const controller = new AbortController();\n\n if (cancel_on_disconnect) {\n const cleanup = () => {\n controller.abort('Client disconnected');\n };\n\n // 监听请求的 abort 信号\n req.signal?.addEventListener('abort', cleanup);\n }\n\n try {\n for await (const { event, data, id } of client.runs.joinStream(thread_id, run_id, {\n signal: controller.signal,\n cancelOnDisconnect: cancel_on_disconnect,\n lastEventId: last_event_id,\n streamMode: stream_mode ? [stream_mode] : undefined,\n })) {\n await writer.writeSSE({\n data: serialiseAsDict(data) ?? '',\n event: event as unknown as string,\n id,\n });\n }\n } catch (error) {\n if (!(error instanceof Error) || !error.message.includes('user cancel')) {\n console.error('Join stream error:', error);\n await writer.writeSSE({\n event: 'error',\n data: JSON.stringify({\n error: error instanceof Error ? error.message : 'Unknown error',\n }),\n });\n }\n }\n }),\n );\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * GET /threads/:thread_id/runs\n */\nexport async function listRuns(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id/runs');\n const { thread_id } = validate(ThreadIdParamSchema, params);\n\n const queryParams = parseQueryParams(req.url);\n const { limit, offset, status } = validate(RunListQuerySchema, queryParams);\n\n const runs = await client.runs.list(thread_id, { limit, offset, status });\n\n return jsonResponse(runs);\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * POST /threads/:thread_id/runs/:run_id/cancel\n */\nexport async function cancelRun(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id/runs/:run_id/cancel');\n const { thread_id, run_id } = validate(RunIdParamSchema, params);\n\n const queryParams = parseQueryParams(req.url);\n const { wait, action } = validate(RunCancelQuerySchema, queryParams);\n\n const cancel = client.runs.cancel(thread_id, run_id, wait, action);\n\n if (wait) {\n await cancel;\n }\n\n return new Response(null, { status: wait ? 204 : 202 });\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * POST /threads/:thread_id/state\n */\nexport async function updateThreadState(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id/state');\n const { thread_id } = validate(z.object({ thread_id: z.string().uuid() }), params);\n\n const body = await req.json();\n const payload = validate(ThreadStateUpdate, body);\n\n const inserted = await client.threads.updateState(thread_id, payload);\n\n return jsonResponse(inserted);\n } catch (error) {\n return errorResponse(error);\n }\n}\n","import { LangGraphGlobal } from '../../global';\nimport { searchAssistants, getAssistantGraph } from './assistants';\nimport { createThread, searchThreads, getThread, deleteThread } from './threads';\nimport { streamRun, joinRunStream, listRuns, cancelRun, updateThreadState } from './runs';\nimport { errorResponse } from './utils';\nimport type { LangGraphServerContext } from './context';\n/**\n * 路由匹配器\n */\ninterface Route {\n method: string;\n pattern: RegExp;\n handler: (req: Request, context: LangGraphServerContext) => Promise<Response>;\n}\n\nconst routes: Route[] = [\n // Assistants\n {\n method: 'POST',\n pattern: /^\\/assistants\\/search$/,\n handler: searchAssistants,\n },\n {\n method: 'GET',\n pattern: /^\\/assistants\\/[^/]+\\/graph$/,\n handler: getAssistantGraph,\n },\n\n // Threads\n {\n method: 'POST',\n pattern: /^\\/threads$/,\n handler: createThread,\n },\n {\n method: 'POST',\n pattern: /^\\/threads\\/search$/,\n handler: searchThreads,\n },\n {\n method: 'GET',\n pattern: /^\\/threads\\/[^/]+$/,\n handler: getThread,\n },\n {\n method: 'DELETE',\n pattern: /^\\/threads\\/[^/]+$/,\n handler: deleteThread,\n },\n\n // Runs\n {\n method: 'POST',\n pattern: /^\\/threads\\/[^/]+\\/runs\\/stream$/,\n handler: streamRun,\n },\n {\n method: 'GET',\n pattern: /^\\/threads\\/[^/]+\\/runs\\/[^/]+\\/stream$/,\n handler: joinRunStream,\n },\n {\n method: 'GET',\n pattern: /^\\/threads\\/[^/]+\\/runs$/,\n handler: listRuns,\n },\n {\n method: 'POST',\n pattern: /^\\/threads\\/[^/]+\\/runs\\/[^/]+\\/cancel$/,\n handler: cancelRun,\n },\n {\n method: 'POST',\n pattern: /^\\/threads\\/[^/]+\\/state$/,\n handler: updateThreadState,\n },\n];\n\nconst replaceRequest = (req: Request) => {\n const path = new URL(req.url).pathname.toString();\n let basePath = '';\n if (path.includes('/threads')) {\n basePath = path.split('/threads')[0];\n } else if (path.includes('/assistants')) {\n basePath = path.split('/assistants')[0];\n }\n return new Request(req.url.replace(basePath, ''), {\n method: req.method,\n headers: req.headers,\n body: req.body,\n duplex: req.duplex,\n });\n};\n\n/**\n * 主路由处理器\n */\nexport async function handleRequest(req: Request, context: LangGraphServerContext = {}): Promise<Response> {\n req = replaceRequest(req);\n try {\n // 初始化全局配置\n await LangGraphGlobal.initGlobal();\n\n const url = new URL(req.url);\n const pathname = url.pathname;\n const method = req.method;\n\n // 查找匹配的路由\n for (const route of routes) {\n if (route.method === method && route.pattern.test(pathname)) {\n return await route.handler(req, context);\n }\n }\n\n // 未找到路由\n return new Response('Not Found', { status: 404 });\n } catch (error) {\n console.error('Request error:', error);\n return errorResponse(error);\n }\n}\n\n// 导出所有处理函数供直接使用\nexport * from './assistants';\nexport * from './threads';\nexport * from './runs';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Hono } from 'hono';
2
- import { h as handleRequest } from '../../index-D1vhtuku.js';
2
+ import { handleRequest } from '../fetch/index.js';
3
3
 
4
4
  const app = new Hono();
5
5
  app.all("*", async (c) => {
@@ -1,11 +1,11 @@
1
- import { L as LangGraphGlobal } from '../../stream-Blquv56P.js';
1
+ import { L as LangGraphGlobal } from '../../stream-BkrtqGvX.js';
2
2
 
3
3
  async function ensureInitialized(attachGraphPromise) {
4
4
  if (globalThis.LG_INIT_PROMISE === void 0) {
5
5
  globalThis.LG_INIT_PROMISE = (async () => {
6
6
  await LangGraphGlobal.initGlobal();
7
7
  await attachGraphPromise();
8
- const { GET, POST, DELETE } = await import('../../router-CUCtgsPJ.js');
8
+ const { GET, POST, DELETE } = await import('../../router-DOW8vigV.js');
9
9
  return {
10
10
  GET,
11
11
  POST,
@@ -138,8 +138,8 @@ export declare const RunStreamPayloadSchema: z.ZodObject<{
138
138
  langsmith_tracer: z.ZodOptional<z.ZodUnknown>;
139
139
  }, z.core.$strip>;
140
140
  export declare const RunListQuerySchema: z.ZodObject<{
141
- limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
142
- offset: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
141
+ limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
142
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
143
143
  status: z.ZodOptional<z.ZodEnum<{
144
144
  pending: "pending";
145
145
  running: "running";
@@ -205,6 +205,7 @@ export declare const ThreadSearchPayloadSchema: z.ZodObject<{
205
205
  asc: "asc";
206
206
  desc: "desc";
207
207
  }>>;
208
+ without_details: z.ZodOptional<z.ZodBoolean>;
208
209
  }, z.core.$strip>;
209
210
  export declare const ThreadStateUpdate: z.ZodObject<{
210
211
  values: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>]>>>;
@@ -1,4 +1,4 @@
1
- import { L as LangGraphGlobal, a as streamState, g as getGraph, G as GRAPHS } from './stream-Blquv56P.js';
1
+ import { L as LangGraphGlobal, a as streamState, g as getGraph, G as GRAPHS } from './stream-BkrtqGvX.js';
2
2
 
3
3
  const AssistantEndpoint = {
4
4
  async search(query) {
@@ -83,7 +83,18 @@ const createEndpoint = () => {
83
83
  const config = options && typeof options === "object" && "signal" in options ? options : {};
84
84
  const signal = (options instanceof AbortSignal ? options : config.signal) || new AbortController().signal;
85
85
  try {
86
- const queue = LangGraphGlobal.globalMessageQueue.getQueue(runId);
86
+ const queue = await LangGraphGlobal.globalMessageQueue.getQueue(runId);
87
+ const allData = await queue.getAll();
88
+ for (const eventMessage of allData) {
89
+ yield {
90
+ id: eventMessage.id,
91
+ event: eventMessage.event,
92
+ data: eventMessage.data
93
+ };
94
+ if (eventMessage.event === "__stream_end__" || eventMessage.event === "__stream_error__" || eventMessage.event === "__stream_cancel__") {
95
+ return;
96
+ }
97
+ }
87
98
  for await (const eventMessage of queue.onDataReceive()) {
88
99
  if (signal.aborted) {
89
100
  break;
@@ -108,4 +119,4 @@ const createEndpoint = () => {
108
119
  };
109
120
 
110
121
  export { AssistantEndpoint as A, createEndpoint as c };
111
- //# sourceMappingURL=createEndpoint-BEEfOyPg.js.map
122
+ //# sourceMappingURL=createEndpoint-u2dnG_xt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createEndpoint-u2dnG_xt.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 if (query?.graphId) {\n return [\n {\n assistant_id: query.graphId,\n graph_id: query.graphId,\n config: {},\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n metadata: {},\n version: 1,\n name: query.graphId,\n description: '',\n } as Assistant,\n ];\n }\n return 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 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\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 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-BEEfOyPg.js';
2
- export { L as LangGraphGlobal, r as registerGraph } from './stream-Blquv56P.js';
1
+ export { A as AssistantEndpoint, c as createEndpoint } from './createEndpoint-u2dnG_xt.js';
2
+ export { L as LangGraphGlobal, r as registerGraph } from './stream-BkrtqGvX.js';
3
3
  import { StateGraph, entrypoint, getPreviousState, getConfig } from '@langchain/langgraph';
4
4
  import { schemaMetaRegistry } from '@langchain/langgraph/zod';
5
5
  import { getDefaultsForSchema } from 'zod-defaults';
@@ -18,6 +18,7 @@ interface StreamQueueEvents<T extends EventMessage> {
18
18
  export declare class BaseStreamQueue extends EventEmitter<StreamQueueEvents<EventMessage>> {
19
19
  readonly id: string;
20
20
  readonly compressMessages: boolean;
21
+ readonly ttl: number;
21
22
  /** 序列化器实例 / Serializer instance */
22
23
  serializer: JsonPlusSerializer;
23
24
  /**
@@ -25,7 +26,7 @@ export declare class BaseStreamQueue extends EventEmitter<StreamQueueEvents<Even
25
26
  * Constructor
26
27
  * @param compressMessages 是否压缩消息 / Whether to compress messages
27
28
  */
28
- constructor(id: string, compressMessages?: boolean);
29
+ constructor(id: string, compressMessages?: boolean, ttl?: number);
29
30
  /**
30
31
  * 编码数据为 Uint8Array
31
32
  * Encode data to Uint8Array
@@ -70,7 +71,12 @@ export interface BaseStreamQueueInterface {
70
71
  cancelSignal: AbortController;
71
72
  /** 取消操作 / Cancel operation */
72
73
  cancel(): void;
74
+ /** 复制队列数据 / Copy queue data */
75
+ copyToQueue(toId: string, ttl?: number): Promise<BaseStreamQueueInterface>;
73
76
  }
77
+ export type QueueConstructor<Q extends BaseStreamQueueInterface> = (new (queueId: string, compressMessages: boolean, ttl?: number) => Q) & {
78
+ isQueueExist?: (id: string) => Promise<boolean>;
79
+ };
74
80
  /**
75
81
  * StreamQueue 管理器,通过 id 管理多个队列实例
76
82
  * StreamQueue manager, manages multiple queue instances by id
@@ -88,7 +94,7 @@ export declare class StreamQueueManager<Q extends BaseStreamQueueInterface> {
88
94
  * @param queueConstructor 队列构造函数 / Queue constructor
89
95
  * @param options 配置选项 / Configuration options
90
96
  */
91
- constructor(queueConstructor: new (id: string) => Q, options?: {
97
+ constructor(queueConstructor: QueueConstructor<Q>, options?: {
92
98
  /** 默认是否压缩消息 / Default compress messages setting */
93
99
  defaultCompressMessages?: boolean;
94
100
  });
@@ -99,7 +105,7 @@ export declare class StreamQueueManager<Q extends BaseStreamQueueInterface> {
99
105
  * @param compressMessages 是否压缩消息 / Whether to compress messages
100
106
  * @returns 创建的队列实例 / Created queue instance
101
107
  */
102
- createQueue(id: string, compressMessages?: boolean): Q;
108
+ createQueue(id: string, ttl?: number): Q;
103
109
  /**
104
110
  * 获取或创建指定 id 的队列
105
111
  * Get or create queue with specified id
@@ -107,7 +113,7 @@ export declare class StreamQueueManager<Q extends BaseStreamQueueInterface> {
107
113
  * @param compressMessages 是否压缩消息,默认为构造函数中的默认值 / Whether to compress messages, defaults to constructor default
108
114
  * @returns StreamQueue 实例 / StreamQueue instance
109
115
  */
110
- getQueue(id: string): Q;
116
+ getQueue(id: string): Promise<Q>;
111
117
  /**
112
118
  * 取消指定 id 的队列
113
119
  * Cancel queue with specified id
@@ -119,9 +125,8 @@ export declare class StreamQueueManager<Q extends BaseStreamQueueInterface> {
119
125
  * Push data to queue with specified id
120
126
  * @param id 队列 ID / Queue ID
121
127
  * @param item 要推送的数据项 / Item to push
122
- * @param compressMessages 是否压缩消息,默认为构造函数中的默认值 / Whether to compress messages, defaults to constructor default
123
128
  */
124
- pushToQueue(id: string, item: EventMessage, compressMessages?: boolean): Promise<void>;
129
+ pushToQueue(id: string, item: EventMessage): Promise<void>;
125
130
  /**
126
131
  * 获取指定 id 队列中的所有数据
127
132
  * Get all data from queue with specified id
@@ -159,5 +164,13 @@ export declare class StreamQueueManager<Q extends BaseStreamQueueInterface> {
159
164
  * Clear all queues
160
165
  */
161
166
  clearAllQueues(): void;
167
+ /**
168
+ * 复制队列数据
169
+ * Copy queue data
170
+ * @param fromId 源队列 ID / Source queue ID
171
+ * @param toId 目标队列 ID / Target queue ID
172
+ * @param ttl 生存时间(毫秒),在指定时间后删除目标队列 / Time to live (milliseconds), remove target queue after specified time
173
+ */
174
+ copyQueue(fromId: string, toId: string, ttl?: number): Promise<BaseStreamQueueInterface>;
162
175
  }
163
176
  export {};
@@ -1,10 +1,12 @@
1
- import { B as BaseStreamQueue, C as CancelEventMessage } from './stream-Blquv56P.js';
1
+ import { B as BaseStreamQueue, C as CancelEventMessage } from './stream-BkrtqGvX.js';
2
2
  import { createClient } from 'redis';
3
3
 
4
4
  class RedisStreamQueue extends BaseStreamQueue {
5
- constructor(id = "default") {
6
- super(id, true);
5
+ constructor(id, compressMessages = true, ttl = 300) {
6
+ super(id, true, ttl);
7
7
  this.id = id;
8
+ this.compressMessages = compressMessages;
9
+ this.ttl = ttl;
8
10
  this.queueKey = `queue:${this.id}`;
9
11
  this.channelKey = `channel:${this.id}`;
10
12
  this.redis = RedisStreamQueue.redis;
@@ -20,6 +22,9 @@ class RedisStreamQueue extends BaseStreamQueue {
20
22
  }
21
23
  static redis = createClient({ url: process.env.REDIS_URL });
22
24
  static subscriberRedis = createClient({ url: process.env.REDIS_URL });
25
+ static isQueueExist(id) {
26
+ return this.redis.exists(`queue:${id}`).then((exists) => exists > 0);
27
+ }
23
28
  redis;
24
29
  subscriberRedis;
25
30
  queueKey;
@@ -32,8 +37,8 @@ class RedisStreamQueue extends BaseStreamQueue {
32
37
  async push(item) {
33
38
  const data = await this.encodeData(item);
34
39
  const serializedData = Buffer.from(data);
35
- await this.redis.lPush(this.queueKey, serializedData);
36
- await this.redis.expire(this.queueKey, 300);
40
+ await this.redis.rPush(this.queueKey, serializedData);
41
+ await this.redis.expire(this.queueKey, this.ttl);
37
42
  await this.redis.publish(this.channelKey, serializedData);
38
43
  this.emit("dataChange", data);
39
44
  }
@@ -94,9 +99,8 @@ class RedisStreamQueue extends BaseStreamQueue {
94
99
  }
95
100
  if (this.compressMessages) {
96
101
  return await Promise.all(
97
- data.map(async (item) => {
98
- const parsed = JSON.parse(item);
99
- return await this.decodeData(parsed);
102
+ data.map((item) => {
103
+ return this.decodeData(item);
100
104
  })
101
105
  );
102
106
  } else {
@@ -118,7 +122,13 @@ class RedisStreamQueue extends BaseStreamQueue {
118
122
  this.push(new CancelEventMessage());
119
123
  this.cancelSignal.abort("user cancel this run");
120
124
  }
125
+ async copyToQueue(toId, ttl) {
126
+ const queue = new RedisStreamQueue(toId, this.compressMessages, ttl ?? this.ttl);
127
+ await this.redis.copy(this.queueKey, queue.queueKey);
128
+ await this.redis.expire(queue.queueKey, ttl ?? this.ttl);
129
+ return queue;
130
+ }
121
131
  }
122
132
 
123
133
  export { RedisStreamQueue };
124
- //# sourceMappingURL=queue-g6fOz7D5.js.map
134
+ //# sourceMappingURL=queue-kaJOJdKs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-kaJOJdKs.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 实现的消息队列,用于存储消息\n */\nexport class RedisStreamQueue extends BaseStreamQueue implements BaseStreamQueueInterface {\n static redis: RedisClientType = createClient({ url: process.env.REDIS_URL! });\n static subscriberRedis: RedisClientType = createClient({ url: process.env.REDIS_URL! });\n static isQueueExist(id: string): Promise<boolean> {\n return this.redis.exists(`queue:${id}`).then((exists) => exists > 0);\n }\n private redis: RedisClientType;\n private subscriberRedis: RedisClientType;\n private queueKey: string;\n private channelKey: string;\n private isConnected = false;\n public cancelSignal: AbortController;\n\n constructor(readonly id: string, readonly compressMessages: boolean = true, readonly ttl: number = 300) {\n super(id, true, ttl);\n this.queueKey = `queue:${this.id}`;\n this.channelKey = `channel:${this.id}`;\n this.redis = RedisStreamQueue.redis;\n this.subscriberRedis = RedisStreamQueue.subscriberRedis;\n this.cancelSignal = new AbortController();\n\n // 连接 Redis 客户端(检查是否已经连接)\n if (!this.redis.isOpen) {\n this.redis.connect();\n }\n if (!this.subscriberRedis.isOpen) {\n this.subscriberRedis.connect();\n }\n this.isConnected = true;\n }\n\n /**\n * 推送消息到 Redis 队列\n */\n async push(item: EventMessage): Promise<void> {\n const data = await this.encodeData(item);\n const serializedData = Buffer.from(data);\n\n // 推送到队列\n await this.redis.rPush(this.queueKey, serializedData);\n\n // 设置队列 TTL 为 300 秒\n await this.redis.expire(this.queueKey, this.ttl);\n\n // 发布到频道通知有新数据\n await this.redis.publish(this.channelKey, serializedData);\n\n this.emit('dataChange', data);\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 const handleMessage = async (message: string) => {\n const data = (await this.decodeData(message)) as EventMessage;\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 this.cancel();\n }\n }\n\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n };\n\n // 订阅 Redis 频道\n await this.subscriberRedis.subscribe(this.channelKey, (message) => {\n handleMessage(message);\n });\n\n try {\n while (!isStreamEnded) {\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 await this.subscriberRedis.unsubscribe(this.channelKey);\n }\n }\n\n /**\n * 获取队列中的所有数据\n */\n async getAll(): Promise<EventMessage[]> {\n const data = await this.redis.lRange(this.queueKey, 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: string) => {\n return this.decodeData(item);\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 this.redis.del(this.queueKey);\n }\n }\n\n /**\n * 取消操作\n */\n cancel(): void {\n this.push(new CancelEventMessage());\n this.cancelSignal.abort('user cancel this run');\n }\n async copyToQueue(toId: string, ttl?: number): Promise<RedisStreamQueue> {\n const queue = new RedisStreamQueue(toId, this.compressMessages, ttl ?? this.ttl);\n await this.redis.copy(this.queueKey, queue.queueKey);\n await this.redis.expire(queue.queueKey, ttl ?? this.ttl);\n return queue;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { h as handleRequest } from './index-D1vhtuku.js';
1
+ import { handleRequest } from './adapter/fetch/index.js';
2
2
 
3
3
  function extractContext(req) {
4
4
  const langgraphContextHeader = req.headers.get("x-langgraph-context");
@@ -27,4 +27,4 @@ async function DELETE(req) {
27
27
  }
28
28
 
29
29
  export { DELETE, GET, POST };
30
- //# sourceMappingURL=router-CUCtgsPJ.js.map
30
+ //# sourceMappingURL=router-DOW8vigV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"router-CUCtgsPJ.js","sources":["../src/adapter/nextjs/router.ts"],"sourcesContent":["/** @ts-ignore */\nimport { NextRequest } from 'next/server';\nimport { handleRequest } from '../fetch';\n\n/**\n * 从 NextRequest 提取 langgraph context\n */\nfunction extractContext(req: NextRequest) {\n const langgraphContextHeader = req.headers.get('x-langgraph-context');\n if (langgraphContextHeader) {\n try {\n return {\n langgraph_context: JSON.parse(decodeURIComponent(langgraphContextHeader)),\n };\n } catch (error) {\n console.error('Failed to parse x-langgraph-context header:', error);\n }\n }\n return {};\n}\n\n// 统一路由处理器\nexport async function GET(req: NextRequest) {\n const context = extractContext(req);\n return await handleRequest(req, context);\n}\n\nexport async function POST(req: NextRequest) {\n const context = extractContext(req);\n return await handleRequest(req, context);\n}\n\nexport async function DELETE(req: NextRequest) {\n const context = extractContext(req);\n return await handleRequest(req, context);\n}\n"],"names":[],"mappings":";;AAOA,SAAS,eAAe,GAAA,EAAkB;AACtC,EAAA,MAAM,sBAAA,GAAyB,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA;AACpE,EAAA,IAAI,sBAAA,EAAwB;AACxB,IAAA,IAAI;AACA,MAAA,OAAO;AAAA,QACH,iBAAA,EAAmB,IAAA,CAAK,KAAA,CAAM,kBAAA,CAAmB,sBAAsB,CAAC;AAAA,OAC5E;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,KAAK,CAAA;AAAA,IACtE;AAAA,EACJ;AACA,EAAA,OAAO,EAAC;AACZ;AAGA,eAAsB,IAAI,GAAA,EAAkB;AACxC,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,OAAO,MAAM,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AAC3C;AAEA,eAAsB,KAAK,GAAA,EAAkB;AACzC,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,OAAO,MAAM,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AAC3C;AAEA,eAAsB,OAAO,GAAA,EAAkB;AAC3C,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,OAAO,MAAM,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AAC3C;;;;"}
1
+ {"version":3,"file":"router-DOW8vigV.js","sources":["../src/adapter/nextjs/router.ts"],"sourcesContent":["/** @ts-ignore */\nimport { NextRequest } from 'next/server';\nimport { handleRequest } from '../fetch';\n\n/**\n * 从 NextRequest 提取 langgraph context\n */\nfunction extractContext(req: NextRequest) {\n const langgraphContextHeader = req.headers.get('x-langgraph-context');\n if (langgraphContextHeader) {\n try {\n return {\n langgraph_context: JSON.parse(decodeURIComponent(langgraphContextHeader)),\n };\n } catch (error) {\n console.error('Failed to parse x-langgraph-context header:', error);\n }\n }\n return {};\n}\n\n// 统一路由处理器\nexport async function GET(req: NextRequest) {\n const context = extractContext(req);\n return await handleRequest(req, context);\n}\n\nexport async function POST(req: NextRequest) {\n const context = extractContext(req);\n return await handleRequest(req, context);\n}\n\nexport async function DELETE(req: NextRequest) {\n const context = extractContext(req);\n return await handleRequest(req, context);\n}\n"],"names":[],"mappings":";;AAOA,SAAS,eAAe,GAAA,EAAkB;AACtC,EAAA,MAAM,sBAAA,GAAyB,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA;AACpE,EAAA,IAAI,sBAAA,EAAwB;AACxB,IAAA,IAAI;AACA,MAAA,OAAO;AAAA,QACH,iBAAA,EAAmB,IAAA,CAAK,KAAA,CAAM,kBAAA,CAAmB,sBAAsB,CAAC;AAAA,OAC5E;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,KAAK,CAAA;AAAA,IACtE;AAAA,EACJ;AACA,EAAA,OAAO,EAAC;AACZ;AAGA,eAAsB,IAAI,GAAA,EAAkB;AACxC,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,OAAO,MAAM,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AAC3C;AAEA,eAAsB,KAAK,GAAA,EAAkB;AACzC,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,OAAO,MAAM,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AAC3C;AAEA,eAAsB,OAAO,GAAA,EAAkB;AAC3C,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,OAAO,MAAM,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AAC3C;;;;"}
@@ -31,6 +31,7 @@ export declare class KyselyThreadsManager<ValuesType = unknown> implements BaseT
31
31
  status?: ThreadStatus;
32
32
  sortBy?: ThreadSortBy;
33
33
  sortOrder?: SortOrder;
34
+ withoutDetails?: boolean;
34
35
  }): Promise<Thread<ValuesType>[]>;
35
36
  get(threadId: string): Promise<Thread<ValuesType>>;
36
37
  set(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<void>;
@@ -14,4 +14,5 @@ export declare class MemoryStreamQueue extends BaseStreamQueue implements BaseSt
14
14
  clear(): void;
15
15
  cancelSignal: AbortController;
16
16
  cancel(): void;
17
+ copyToQueue(toId: string, ttl?: number): Promise<MemoryStreamQueue>;
17
18
  }
@@ -24,6 +24,7 @@ export declare class MemoryThreadsManager<ValuesType = unknown> implements BaseT
24
24
  status?: ThreadStatus;
25
25
  sortBy?: ThreadSortBy;
26
26
  sortOrder?: SortOrder;
27
+ withoutDetails?: boolean;
27
28
  }): Promise<Thread<ValuesType>[]>;
28
29
  get(threadId: string): Promise<Thread<ValuesType>>;
29
30
  set(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<void>;
@@ -7,15 +7,18 @@ import { RedisClientType } from 'redis';
7
7
  */
8
8
  export declare class RedisStreamQueue extends BaseStreamQueue implements BaseStreamQueueInterface {
9
9
  readonly id: string;
10
+ readonly compressMessages: boolean;
11
+ readonly ttl: number;
10
12
  static redis: RedisClientType;
11
13
  static subscriberRedis: RedisClientType;
14
+ static isQueueExist(id: string): Promise<boolean>;
12
15
  private redis;
13
16
  private subscriberRedis;
14
17
  private queueKey;
15
18
  private channelKey;
16
19
  private isConnected;
17
20
  cancelSignal: AbortController;
18
- constructor(id?: string);
21
+ constructor(id: string, compressMessages?: boolean, ttl?: number);
19
22
  /**
20
23
  * 推送消息到 Redis 队列
21
24
  */
@@ -36,4 +39,5 @@ export declare class RedisStreamQueue extends BaseStreamQueue implements BaseStr
36
39
  * 取消操作
37
40
  */
38
41
  cancel(): void;
42
+ copyToQueue(toId: string, ttl?: number): Promise<RedisStreamQueue>;
39
43
  }