@axiom-lattice/gateway 2.1.9 → 2.1.11

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
1
 
2
- > @axiom-lattice/gateway@2.1.9 build /home/runner/work/agentic/agentic/packages/gateway
2
+ > @axiom-lattice/gateway@2.1.11 build /home/runner/work/agentic/agentic/packages/gateway
3
3
  > tsup src/index.ts --format cjs,esm --dts --clean --sourcemap
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -9,13 +9,13 @@
9
9
  CLI Cleaning output folder
10
10
  CJS Build start
11
11
  ESM Build start
12
- CJS dist/index.js 38.79 KB
13
- CJS dist/index.js.map 76.45 KB
14
- CJS ⚡️ Build success in 107ms
15
- ESM dist/index.mjs 36.55 KB
16
- ESM dist/index.mjs.map 76.36 KB
17
- ESM ⚡️ Build success in 112ms
12
+ CJS dist/index.js 38.70 KB
13
+ CJS dist/index.js.map 76.28 KB
14
+ CJS ⚡️ Build success in 134ms
15
+ ESM dist/index.mjs 36.46 KB
16
+ ESM dist/index.mjs.map 76.20 KB
17
+ ESM ⚡️ Build success in 134ms
18
18
  DTS Build start
19
- DTS ⚡️ Build success in 6607ms
19
+ DTS ⚡️ Build success in 6556ms
20
20
  DTS dist/index.d.ts 3.32 KB
21
21
  DTS dist/index.d.mts 3.32 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @axiom-lattice/gateway
2
2
 
3
+ ## 2.1.11
4
+
5
+ ### Patch Changes
6
+
7
+ - 548951e: fix files shared context
8
+ - Updated dependencies [548951e]
9
+ - @axiom-lattice/core@2.1.8
10
+
11
+ ## 2.1.10
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies [b0de3fe]
16
+ - @axiom-lattice/core@2.1.7
17
+
3
18
  ## 2.1.9
4
19
 
5
20
  ### Patch Changes
package/dist/index.js CHANGED
@@ -100,11 +100,10 @@ async function agent_stream({
100
100
  run_id
101
101
  }) {
102
102
  const runnable_agent = (0, import_core.getAgentClient)(assistant_id);
103
- const { files, message, ...rest } = input;
103
+ const { message, ...rest } = input;
104
104
  let messages = [];
105
105
  if (!command) {
106
106
  const humanMessage = new import_messages.HumanMessage(message);
107
- humanMessage.additional_kwargs = { files };
108
107
  messages = [humanMessage];
109
108
  }
110
109
  const chunkBuffer = getOrCreateChunkBuffer();
@@ -209,7 +208,6 @@ async function agent_messages({
209
208
  id: message.id,
210
209
  role: message.getType(),
211
210
  content: message.content,
212
- files: message.additional_kwargs.files,
213
211
  ...message.lc_kwargs
214
212
  }));
215
213
  const new_messages = messagesArray;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/services/agent_service.ts","../src/controllers/run.ts","../src/controllers/memory.ts","../src/controllers/assistant.ts","../src/controllers/agent_task.ts","../src/schemas/index.ts","../src/routes/index.ts","../src/logger/Logger.ts","../src/swagger.ts","../src/services/queue_service.ts","../src/services/agent_task_consumer.ts"],"sourcesContent":["import fastify from \"fastify\";\nimport cors from \"@fastify/cors\";\nimport sensible from \"@fastify/sensible\";\nimport { registerLatticeRoutes } from \"./routes\";\n// 导入自定义 Logger 类\nimport { Logger } from \"./logger/Logger\";\nimport { configureSwagger } from \"./swagger\";\nimport {\n setQueueServiceType,\n QueueServiceType,\n} from \"./services/queue_service\";\nimport { AgentTaskConsumer } from \"./services/agent_task_consumer\";\n\nprocess.on(\"unhandledRejection\", (reason, promise) => {\n console.error(\"未处理的Promise拒绝:\", reason);\n // 可以在这里进行日志记录或其他处理\n});\n\n// 创建自定义日志记录器\nconst logger = new Logger({\n serviceName: \"lattice-gateway\",\n name: \"fastify-server\",\n});\n\n// 创建 Fastify 应用\nconst app = fastify({\n logger: false, // 禁用内置日志记录器\n});\n\n// 添加自定义日志记录\napp.addHook(\"onRequest\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n done();\n});\n\napp.addHook(\"onResponse\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n done();\n});\n\n// cors\napp.register(cors, {\n origin: true,\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\"],\n allowedHeaders: [\n \"Content-Type\",\n \"Authorization\",\n \"X-Requested-With\",\n \"x-tenant-id\",\n \"x-request-id\",\n ],\n exposedHeaders: [\"Content-Type\"],\n credentials: true,\n});\napp.register(sensible);\n\n// 错误处理\napp.setErrorHandler((error, request, reply) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n logger.error(\n `请求错误: ${request.method} ${request.url} error:${error.message}`,\n {\n ...context,\n error: error.message,\n stack: error.stack,\n statusCode: error.statusCode || 500,\n }\n );\n reply.status(error.statusCode || 500).send({\n success: false,\n error: error.message || \"服务器内部错误\",\n });\n});\n\n// 将日志记录器添加到应用实例中,以便在路由中使用\napp.decorate(\"logger\", logger);\n\n// Gateway configuration interface\nexport interface LatticeGatewayConfig {\n port?: number;\n queueServiceConfig?: {\n type: QueueServiceType;\n defaultStartPollingQueue: boolean;\n };\n}\n\n// Start server\nconst start = async (config?: LatticeGatewayConfig) => {\n try {\n const target_port = config?.port || Number(process.env.PORT) || 4001;\n\n await app.listen({ port: target_port, host: \"0.0.0.0\" });\n logger.info(`Lattice Gateway is running on port: ${target_port}`);\n\n // Configure queue service\n const queueServiceConfig = config?.queueServiceConfig;\n if (queueServiceConfig) {\n setQueueServiceType(queueServiceConfig.type);\n if (queueServiceConfig.defaultStartPollingQueue) {\n const agentTaskConsumer = new AgentTaskConsumer(target_port);\n agentTaskConsumer.startPollingQueue();\n }\n }\n } catch (err) {\n logger.error(\"Server start failed\", { error: err });\n process.exit(1);\n }\n};\n\nconst LatticeGateway = {\n startAsHttpEndpoint: start,\n configureSwagger,\n registerLatticeRoutes,\n app,\n AgentTaskConsumer,\n};\n\nexport { LatticeGateway };\n","import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n filterMessages,\n HumanMessage,\n ToolMessage,\n ToolMessageChunk,\n} from \"@langchain/core/messages\";\nimport { Command, CommandParams } from \"@langchain/langgraph\";\nimport { v4 } from \"uuid\";\n// 修改导入路径,使用 lattice_core 包\nimport {\n getAgentClient,\n getAgentLattice,\n InMemoryChunkBuffer,\n registerChunkBuffer,\n getChunkBuffer,\n hasChunkBuffer,\n} from \"@axiom-lattice/core\";\n\n/**\n * Get or create the global ChunkBuffer instance\n */\nfunction getOrCreateChunkBuffer(): InMemoryChunkBuffer {\n if (!hasChunkBuffer(\"default\")) {\n const buffer = new InMemoryChunkBuffer({\n ttl: 60 * 60 * 1000, // 1 hour TTL\n cleanupInterval: 5 * 60 * 1000, // Clean every 5 minutes\n });\n registerChunkBuffer(\"default\", buffer);\n }\n return getChunkBuffer(\"default\") as InMemoryChunkBuffer;\n}\n\nexport async function agent_invoke({\n input,\n thread_id,\n assistant_id,\n tenant_id,\n command,\n run_id,\n}: {\n assistant_id: string;\n input: any;\n thread_id: string;\n tenant_id: string;\n run_id?: string;\n command?: CommandParams<any>;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n const { message, ...rest } = input;\n const humanMessage = new HumanMessage(message || \"\");\n const messages = [humanMessage];\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n\n const result = await runnable_agent.invoke(\n command\n ? new Command(command)\n : { ...rest, messages, \"x-tenant-id\": tenant_id },\n {\n configurable: {\n thread_id: thread_id,\n run_id: run_id || v4(),\n \"x-tenant-id\": tenant_id,\n \"x-request-id\": run_id,\n \"x-thread-id\": thread_id,\n },\n recursionLimit: 200,\n }\n );\n\n const data = result.messages.map((message: BaseMessage) => {\n const { type, data } = message.toDict();\n return {\n ...data,\n role: type,\n };\n });\n return { messages: data };\n}\n\nexport async function agent_stream({\n input,\n thread_id,\n command,\n tenant_id,\n assistant_id,\n run_id,\n}: {\n assistant_id: string;\n input: any;\n thread_id: string;\n command?: CommandParams<any>;\n tenant_id: string;\n run_id?: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id) as any; // TODO: fix this\n const { files, message, ...rest } = input;\n let messages: BaseMessage[] = [];\n if (!command) {\n const humanMessage = new HumanMessage(message);\n humanMessage.additional_kwargs = { files: files };\n messages = [humanMessage];\n }\n\n // Get ChunkBuffer instance\n const chunkBuffer = getOrCreateChunkBuffer();\n\n try {\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const agentStream = await runnable_agent.stream(\n command\n ? new Command(command)\n : {\n ...rest,\n messages,\n \"x-tenant-id\": tenant_id,\n },\n\n {\n configurable: {\n thread_id: thread_id,\n run_id: run_id || v4(),\n \"x-tenant-id\": tenant_id,\n \"x-request-id\": run_id,\n \"x-thread-id\": thread_id,\n },\n streamMode: [\"updates\", \"messages\"],\n subgraphs: false,\n recursionLimit: 200,\n }\n );\n\n // 创建一个可迭代的 ReadableStream with ChunkBuffer integration\n return {\n [Symbol.asyncIterator]: async function* () {\n try {\n for await (const chunk of agentStream) {\n let data;\n let chunkContent = \"\";\n\n if (chunk[0] === \"updates\") {\n const update = chunk[1];\n const values = Object.values(update);\n const messages = (values[0] as any)?.messages;\n if (messages?.[0]?.tool_call_id) {\n data = messages[0].toDict();\n }\n } else if (chunk[0] === \"messages\") {\n const messages = chunk[1];\n // console.log(messages);\n data = messages?.[0]?.toDict();\n }\n\n if ((chunk?.[1] as any)?.__interrupt__) {\n //data = chunk?.[1]?.[0]?.toDict();\n // 原有的中断消息处理\n data = {\n type: \"interrupt\",\n id: (chunk?.[1] as any)?.__interrupt__[0].id,\n data: { content: (chunk?.[1] as any)?.__interrupt__[0].value },\n };\n }\n\n if (data) {\n //console.log(data);\n if (data.type !== \"interrupt\") {\n await chunkBuffer.addChunk(thread_id, data);\n }\n yield data;\n }\n }\n\n // Mark thread as completed when streaming finishes successfully\n await chunkBuffer.completeThread(thread_id);\n } catch (error) {\n console.error(\"Stream error:\", error);\n // Mark thread as aborted on error\n await chunkBuffer.abortThread(thread_id);\n throw error;\n }\n },\n };\n } catch (error) {\n // Mark thread as aborted on initialization error\n await chunkBuffer.abortThread(thread_id);\n throw error;\n }\n}\n\nexport async function agent_state({\n thread_id,\n assistant_id,\n}: {\n assistant_id: string;\n thread_id: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const state = await runnable_agent.getState({\n configurable: { thread_id: thread_id, subgraphs: false },\n });\n return state;\n}\n\nexport async function agent_messages({\n thread_id,\n tenant_id,\n assistant_id,\n}: {\n assistant_id: string;\n thread_id: string;\n tenant_id: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const state = await runnable_agent.getState({\n configurable: { thread_id: thread_id, subgraphs: false },\n });\n\n const messages = state.values.messages || [];\n const filteredMessages = filterMessages(messages, {\n includeTypes: [\"ai\", \"human\", \"tool\"], //[\"human\", \"ai\", \"tool\"],\n });\n\n // console.log(filteredMessages);\n\n let messagesArray = filteredMessages.map((message: BaseMessage) => ({\n id: message.id,\n role: message.getType(),\n content: message.content,\n files: message.additional_kwargs.files,\n ...message.lc_kwargs,\n }));\n\n // const action_messages = state.tasks.flatMap((task) => {\n // return task.interrupts.map((interrupt) => {\n // return {\n // role: \"ai\",\n // content: interrupt.value,\n // type: \"action\",\n // };\n // });\n // });\n\n const new_messages = messagesArray;\n // console.log(messagesArray);\n\n return new_messages;\n}\n\nexport async function draw_graph(assistant_id: string) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const drawableGraph = await runnable_agent.getGraphAsync();\n const image = await drawableGraph.drawMermaid();\n return image;\n}\n\n/**\n * Resume streaming from a known position\n * Creates an async iterator that yields new chunks as they arrive\n *\n * @param thread_id - Thread identifier\n * @param message_id - Message identifier (usually run_id)\n * @param known_content - Content already received (used to find resume position)\n * @param poll_interval - Polling interval in milliseconds (default: 100ms)\n */\nexport async function resume_stream({\n thread_id,\n message_id,\n known_content,\n poll_interval = 100,\n}: {\n thread_id: string;\n message_id: string;\n known_content: string;\n poll_interval?: number;\n}) {\n const chunkBuffer = getOrCreateChunkBuffer();\n\n const stream = await chunkBuffer.getNewChunksSinceContentIterator(\n thread_id,\n message_id,\n known_content\n );\n return {\n [Symbol.asyncIterator]: async function* () {\n try {\n for await (const chunk of stream) {\n yield chunk;\n }\n } catch (error) {\n console.error(\"Resume stream error:\", error);\n throw error;\n }\n },\n };\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport * as agentService from \"../services/agent_service\";\nimport { CreateRunRequest } from \"../types\";\nimport { v4 } from \"uuid\";\n\ninterface ResumeStreamRequest {\n thread_id: string;\n message_id: string;\n known_content: string;\n poll_interval?: number;\n}\n\n// 创建运行\nexport const createRun = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const {\n assistant_id,\n thread_id,\n command,\n streaming,\n background,\n ...input\n } = request.body as CreateRunRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const x_request_id = (request.headers[\"x-request-id\"] as string) || v4();\n\n // 验证请求数据\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n // 如果请求streaming,则agent_stream\n if (streaming) {\n // 开始运行\n const stream = await agentService.agent_stream({\n assistant_id: assistant_id,\n input: input,\n thread_id: thread_id,\n command,\n tenant_id: tenant_id,\n run_id: x_request_id,\n });\n\n // 通知 Fastify 我们将手动处理响应\n reply.hijack();\n\n // 设置 SSE 响应头\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n for await (const chunk of stream) {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n } catch (error) {\n console.error(\"Stream processing error:\", error);\n } finally {\n reply.raw.end();\n }\n } else {\n // 后台运行的情况\n const result = await agentService.agent_invoke({\n assistant_id: assistant_id,\n input: input,\n command: command,\n thread_id: thread_id,\n tenant_id: tenant_id,\n run_id: x_request_id,\n });\n reply.status(200).send(result);\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `创建运行时发生错误: ${error.message}`,\n });\n }\n};\n\n// Resume stream from known position\nexport const resumeStream = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { thread_id, message_id, known_content, poll_interval } =\n request.body as ResumeStreamRequest;\n\n // Validate request data\n if (!thread_id || !message_id || known_content === undefined) {\n reply.status(400).send({\n success: false,\n error: \"thread_id, message_id, and known_content are required\",\n });\n return;\n }\n\n // Notify Fastify that we will manually handle the response\n reply.hijack();\n\n // Set SSE response headers\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n // Get the stream from agent service\n const stream = await agentService.resume_stream({\n thread_id,\n message_id,\n known_content: known_content,\n poll_interval: poll_interval || 100,\n });\n\n // Stream the chunks to the client\n for await (const chunk of stream) {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n } catch (error) {\n console.error(\"Resume stream processing error:\", error);\n } finally {\n reply.raw.end();\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Error resuming stream: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { agent_messages, agent_state } from \"../services/agent_service\";\n\n// 设置内存项\nexport const setMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n const value = request.body;\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n if (value === undefined) {\n reply.status(400).send({\n success: false,\n error: \"值是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.setMemoryItem(assistantId, key, value);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `设置内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取内存项\nexport const getMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.getMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(404).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取所有内存项\nexport const getAllMemoryItems = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const result = await agent_messages({\n assistant_id: assistantId,\n thread_id: thread_id,\n tenant_id: tenant_id,\n });\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取所有内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取助手状态\nexport const getAgentState = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const result = await agent_state({\n assistant_id: assistantId,\n thread_id: thread_id,\n });\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取助手状态时发生错误: ${error.message}`,\n });\n }\n};\n\n// 删除内存项\nexport const deleteMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.deleteMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `删除内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 清除内存\nexport const clearMemory = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId } = request.params as { assistantId: string };\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n let result: any; //= await memoryModel.clearMemory(assistantId);\n\n if (!result.success) {\n reply.status(500).send(result);\n return;\n }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `清除内存时发生错误: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { draw_graph } from \"../services/agent_service\";\n\nexport const getAgentGraph = async (\n request: FastifyRequest<{\n Params: { assistantId: string };\n }>,\n reply: FastifyReply\n) => {\n try {\n const { assistantId } = request.params;\n\n // 调用绘图服务获取图片数据\n const imageData = await draw_graph(assistantId);\n\n // 设置响应头并返回图片数据\n reply.header(\"Content-Type\", \"application/json\").send({\n image: imageData,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: error.message || \"获取代理图表失败\",\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { AgentManager } from \"@axiom-lattice/core\";\n\n/**\n * Request body interface for triggering agent task\n */\ninterface TriggerAgentTaskRequest {\n assistant_id: string;\n thread_id: string;\n input: any;\n command?: any;\n}\n\n/**\n * Trigger an agent task\n * This endpoint triggers an agent task through the AgentManager,\n * which publishes the task to the event bus for processing\n */\nexport const triggerAgentTask = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistant_id, thread_id, input, command } =\n request.body as TriggerAgentTaskRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n\n // Validate required fields\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"assistant_id is required\",\n });\n return;\n }\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"thread_id is required\",\n });\n return;\n }\n\n // Get AgentManager instance and trigger the task\n const agentManager = AgentManager.getInstance();\n const result = await agentManager.callAgentInQueue({\n assistant_id,\n thread_id,\n input,\n command,\n \"x-tenant-id\": tenant_id,\n });\n\n reply.status(200).send({\n success: true,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Failed to trigger agent task: ${error.message}`,\n });\n }\n};\n","import { FastifySchema } from \"fastify\";\n\n// Create Run Schemas\nexport const createRunSchema: FastifySchema = {\n description: \"Create a new agent run\",\n tags: [\"Runs\"],\n summary: \"Create Agent Run\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n assistant_id: { type: \"string\", description: \"Assistant ID\" },\n message: { type: \"string\", description: \"Message data for the run\" },\n command: {\n type: \"object\",\n description: \"Command data for the run\",\n nullable: true,\n },\n streaming: {\n type: \"boolean\",\n description: \"Whether to stream the response\",\n nullable: true,\n },\n background: {\n type: \"boolean\",\n description: \"Whether to run in background\",\n nullable: true,\n },\n },\n required: [\"thread_id\", \"assistant_id\", \"message\"],\n },\n response: {\n 200: {},\n 400: {},\n },\n};\n\n// Memory Schemas\nexport const getAllMemoryItemsSchema: FastifySchema = {\n description: \"Get all memory items for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get All Memory Items\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\nexport const getAgentStateSchema: FastifySchema = {\n description: \"Get agent state for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get Agent State\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const getMemoryItemSchema: FastifySchema = {\n description: \"Get a specific memory item by key\",\n tags: [\"Memory\"],\n summary: \"Get Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const setMemoryItemSchema: FastifySchema = {\n description: \"Set or update a memory item\",\n tags: [\"Memory\"],\n summary: \"Set Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n body: {\n type: \"object\",\n description: \"Memory item data\",\n },\n response: {\n 200: {},\n },\n};\n\nexport const deleteMemoryItemSchema: FastifySchema = {\n description: \"Delete a specific memory item\",\n tags: [\"Memory\"],\n summary: \"Delete Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const clearMemorySchema: FastifySchema = {\n description: \"Clear all memory items for an assistant\",\n tags: [\"Memory\"],\n summary: \"Clear Memory\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Graph Schema\nexport const getAgentGraphSchema: FastifySchema = {\n description: \"Get agent graph visualization\",\n tags: [\"Graph\"],\n summary: \"Get Agent Graph\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Resume Stream Schema\nexport const resumeStreamSchema: FastifySchema = {\n description: \"Resume streaming from a known position\",\n tags: [\"Streaming\"],\n summary: \"Resume Stream\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n message_id: {\n type: \"string\",\n description: \"Message ID (usually run_id)\",\n },\n known_content: {\n type: \"string\",\n description: \"Content already received\",\n },\n poll_interval: {\n type: \"number\",\n description: \"Polling interval in milliseconds\",\n nullable: true,\n default: 100,\n },\n },\n required: [\"thread_id\", \"message_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\n// Trigger Agent Task Schema\nexport const triggerAgentTaskSchema: FastifySchema = {\n description: \"Trigger an agent task\",\n tags: [\"Agent Tasks\"],\n summary: \"Trigger Agent Task\",\n body: {\n type: \"object\",\n properties: {\n assistant_id: {\n type: \"string\",\n description: \"Assistant ID\",\n },\n thread_id: {\n type: \"string\",\n description: \"Thread ID\",\n },\n input: {\n type: \"object\",\n description: \"Task input data\",\n },\n command: {\n type: \"object\",\n description: \"Command data for the task\",\n nullable: true,\n },\n },\n required: [\"assistant_id\", \"thread_id\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n result: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n","import { FastifyInstance } from \"fastify\";\n//import * as assistantController from \"../controllers/assistant\";\nimport * as runController from \"../controllers/run\";\nimport * as memoryController from \"../controllers/memory\";\nimport * as graphController from \"../controllers/assistant\";\nimport * as agentTaskController from \"../controllers/agent_task\";\nimport {\n createRunSchema,\n getAllMemoryItemsSchema,\n getAgentStateSchema,\n getMemoryItemSchema,\n setMemoryItemSchema,\n deleteMemoryItemSchema,\n clearMemorySchema,\n getAgentGraphSchema,\n resumeStreamSchema,\n triggerAgentTaskSchema,\n} from \"../schemas\";\n\nexport const registerLatticeRoutes = (app: FastifyInstance): void => {\n // 运行路由\n app.post<{\n Body: any;\n }>(\"/api/runs\", runController.createRun);\n\n // Resume stream route\n app.post<{\n Body: any;\n }>(\"/api/resume_stream\", runController.resumeStream);\n\n // app.get<{\n // Params: { id: string };\n // }>(\"/api/runs/:id\", runController.getRun);\n\n // app.get<{\n // Params: { assistantId: string };\n // }>(\"/api/assistants/:assistantId/runs\", runController.getRunsByAssistant);\n\n // app.post<{\n // Params: { id: string };\n // }>(\"/api/runs/:id/cancel\", runController.cancelRun);\n\n // 内存路由\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/memory\",\n { schema: getAllMemoryItemsSchema },\n memoryController.getAllMemoryItems\n );\n\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/state\",\n { schema: getAgentStateSchema },\n memoryController.getAgentState\n );\n\n app.get<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: getMemoryItemSchema },\n memoryController.getMemoryItem\n );\n\n app.put<{\n Params: { assistantId: string; key: string };\n Body: any;\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: setMemoryItemSchema },\n memoryController.setMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: deleteMemoryItemSchema },\n memoryController.deleteMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/memory\",\n { schema: clearMemorySchema },\n memoryController.clearMemory\n );\n\n // 图表路由\n app.get<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/graph\",\n { schema: getAgentGraphSchema },\n graphController.getAgentGraph\n );\n\n // Agent Task路由\n app.post<{\n Body: any;\n }>(\n \"/api/agent-tasks/trigger\",\n { schema: triggerAgentTaskSchema },\n agentTaskController.triggerAgentTask\n );\n};\n","import pino from \"pino\";\nimport \"pino-pretty\";\nimport \"pino-roll\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\nexport interface LoggerContext {\n \"x-user-id\"?: string;\n \"x-tenant-id\"?: string;\n \"x-request-id\"?: string;\n \"x-task-id\"?: string;\n \"x-thread-id\"?: string;\n}\n\nexport interface LoggerOptions {\n name?: string;\n serviceName?: string;\n context?: LoggerContext;\n}\n\n/**\n * 单例的Pino日志工厂类,管理底层pino实例\n */\nclass PinoLoggerFactory {\n private static instance: PinoLoggerFactory;\n private pinoLogger: pino.Logger;\n\n private constructor() {\n const isProd = process.env.NODE_ENV === \"production\";\n\n const loggerConfig: pino.LoggerOptions = {\n // 自定义时间戳格式\n timestamp: () => `,\"@timestamp\":\"${new Date().toISOString()}\"`,\n\n // 关闭默认的时间戳键\n base: {\n \"@version\": \"1\",\n app_name: \"lattice\",\n service_name: \"lattice/graph-server\",\n thread_name: \"main\",\n logger_name: \"lattice-graph-logger\",\n },\n\n formatters: {\n level: (label, number) => {\n return {\n level: label.toUpperCase(),\n level_value: number * 1000,\n };\n },\n },\n };\n\n // 生产环境使用文件日志\n if (isProd) {\n try {\n this.pinoLogger = pino(\n loggerConfig,\n pino.transport({\n target: \"pino-roll\",\n options: {\n file: \"./logs/fin_ai_graph_server\",\n frequency: \"daily\",\n mkdir: true,\n },\n })\n );\n } catch (error) {\n console.error(\n \"无法初始化 pino-roll 日志记录器,回退到控制台日志\",\n error\n );\n // 回退到开发环境的配置\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n } else {\n // 开发环境使用格式化输出\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n }\n\n public static getInstance(): PinoLoggerFactory {\n if (!PinoLoggerFactory.instance) {\n PinoLoggerFactory.instance = new PinoLoggerFactory();\n }\n return PinoLoggerFactory.instance;\n }\n\n public getPinoLogger(): pino.Logger {\n return this.pinoLogger;\n }\n}\n\n/**\n * Logger类,可以创建多个实例,每个实例有自己的上下文\n */\nexport class Logger {\n private context: LoggerContext;\n private name: string;\n private serviceName: string;\n\n constructor(options?: LoggerOptions) {\n this.context = options?.context || {};\n this.name = options?.name || \"lattice-graph-logger\";\n this.serviceName = options?.serviceName || \"lattice/graph-server\";\n }\n\n /**\n * 获取合并了上下文的日志对象\n * @param additionalContext 额外的上下文数据\n * @returns 带有上下文的pino日志对象\n */\n private getContextualLogger(additionalContext?: object): pino.Logger {\n const pinoLogger = PinoLoggerFactory.getInstance().getPinoLogger();\n\n // 合并Logger实例的上下文和额外上下文\n const contextObj = {\n \"x-user-id\": this.context[\"x-user-id\"] || \"\",\n \"x-tenant-id\": this.context[\"x-tenant-id\"] || \"\",\n \"x-request-id\": this.context[\"x-request-id\"] || \"\",\n \"x-task-id\": this.context[\"x-task-id\"] || \"\",\n \"x-thread-id\": this.context[\"x-thread-id\"] || \"\",\n service_name: this.serviceName,\n logger_name: this.name,\n ...additionalContext,\n };\n\n // 创建带有上下文的子日志记录器\n return pinoLogger.child(contextObj);\n }\n\n info(msg: string, obj?: object): void {\n this.getContextualLogger(obj).info(msg);\n }\n\n error(msg: string, obj?: object | Error): void {\n this.getContextualLogger(obj).error(msg);\n }\n\n warn(msg: string, obj?: object): void {\n this.getContextualLogger(obj).warn(msg);\n }\n\n debug(msg: string, obj?: object): void {\n this.getContextualLogger(obj).debug(msg);\n }\n\n /**\n * 更新Logger实例的上下文\n */\n updateContext(context: Partial<LoggerContext>): void {\n this.context = {\n ...this.context,\n ...context,\n };\n }\n\n /**\n * 创建一个新的Logger实例,继承当前Logger的上下文\n */\n child(options: Partial<LoggerOptions>): Logger {\n return new Logger({\n name: options.name || this.name,\n serviceName: options.serviceName || this.serviceName,\n context: {\n ...this.context,\n ...options.context,\n },\n });\n }\n}\n","import { FastifyInstance } from \"fastify\";\nimport swagger from \"@fastify/swagger\";\nimport swaggerUi from \"@fastify/swagger-ui\";\n// Example usage:\n// configureSwagger(app)\n// configureSwagger(app, { openapi: { info: { version: \"2.0.0\" } } })\n// configureSwagger(app, undefined, { routePrefix: \"/docs\" })\n\n// Default swagger configuration\nexport const defaultSwaggerConfig = {\n openapi: {\n openapi: \"3.0.0\",\n info: {\n title: \"Axiom Lattice Gateway API\",\n description: \"API Gateway for LangGraph agent-based applications\",\n version: \"1.0.0\",\n contact: {\n name: \"Axiom Lattice Team\",\n email: \"support@axiom-lattice.com\",\n },\n },\n servers: [\n {\n url: \"http://localhost:4001\",\n description: \"Development environment\",\n },\n ],\n components: {\n securitySchemes: {\n bearerAuth: {\n type: \"http\" as const,\n scheme: \"bearer\" as const,\n bearerFormat: \"JWT\",\n },\n },\n },\n security: [\n {\n bearerAuth: [],\n },\n ],\n tags: [\n { name: \"Runs\", description: \"Agent run management\" },\n { name: \"Memory\", description: \"Agent memory management\" },\n { name: \"Graph\", description: \"Agent graph visualization\" },\n { name: \"Health\", description: \"System health checks\" },\n ],\n },\n};\n\n// Default swagger UI configuration\nexport const defaultSwaggerUiConfig = {\n routePrefix: \"/api-docs\",\n uiConfig: {\n docExpansion: \"full\" as const,\n deepLinking: false,\n },\n staticCSP: true,\n transformStaticCSP: (header: string) => header,\n};\n\n// Configure Swagger with optional custom configuration\nexport const configureSwagger = async (\n app: FastifyInstance,\n customSwaggerConfig?: Partial<typeof defaultSwaggerConfig>,\n customSwaggerUiConfig?: Partial<typeof defaultSwaggerUiConfig>\n) => {\n // Merge default config with custom config\n const swaggerConfig = { ...defaultSwaggerConfig, ...customSwaggerConfig };\n const swaggerUiConfig = {\n ...defaultSwaggerUiConfig,\n ...customSwaggerUiConfig,\n };\n\n await app.register(swagger, swaggerConfig);\n await app.register(swaggerUi, swaggerUiConfig);\n};\n","// Queue service adapter that uses QueueLatticeManager from core package\n// Provides backward-compatible API for gateway services\n\nimport {\n queueLatticeManager,\n registerQueueLattice,\n getQueueLattice,\n} from \"@axiom-lattice/core\";\nimport { QueueType, QueueConfig, QueueClient } from \"@axiom-lattice/protocols\";\nimport { RedisQueueClient } from \"@axiom-lattice/queue-redis\";\n\nexport type QueueServiceType = \"memory\" | \"redis\";\n\n// Default queue key\nconst DEFAULT_QUEUE_KEY = \"default\";\n\n// Global configuration for queue service type\n// Can be set via environment variable QUEUE_SERVICE_TYPE or via LatticeGateway configuration\nlet queueServiceType: QueueServiceType =\n (process.env.QUEUE_SERVICE_TYPE as QueueServiceType) || \"memory\";\n\n/**\n * Configure the queue service type\n * This will register or update the default queue service\n * @param type - \"memory\" or \"redis\"\n */\nexport const setQueueServiceType = (type: QueueServiceType): void => {\n queueServiceType = type;\n console.log(`Queue service type set to: ${type}`);\n\n // Register or update the queue service\n const queueName = process.env.QUEUE_NAME || \"tasks\";\n const config: QueueConfig = {\n name: \"Default Queue Service\",\n description: `Default ${type} queue service`,\n type: type === \"redis\" ? QueueType.REDIS : QueueType.MEMORY,\n queueName,\n options:\n type === \"redis\"\n ? {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n }\n : undefined,\n };\n\n // Remove existing queue if it exists\n if (queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n queueLatticeManager.removeLattice(DEFAULT_QUEUE_KEY);\n }\n\n // Create client for Redis type\n let client: QueueClient | undefined;\n if (type === \"redis\") {\n client = new RedisQueueClient(queueName, {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n });\n }\n\n // Register the new queue service\n registerQueueLattice(DEFAULT_QUEUE_KEY, config, client);\n};\n\n/**\n * Get the current queue service type\n */\nexport const getQueueServiceType = (): QueueServiceType => {\n return queueServiceType;\n};\n\n/**\n * Get the default queue service\n * If not registered, register it with the current configuration\n */\nconst getQueueService = () => {\n // Check if queue is already registered\n if (!queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n // Auto-register with current configuration\n setQueueServiceType(queueServiceType);\n }\n\n return getQueueLattice(DEFAULT_QUEUE_KEY);\n};\n\n/**\n * Push agent task to queue\n * @param agentTask - Agent task to push\n */\nexport const pushAgentTaskToQueue = async (agentTask: any) => {\n const queue = getQueueService();\n const result = await queue.push(agentTask);\n return result;\n};\n\n/**\n * Pop agent task from queue\n */\nexport const popAgentTaskFromQueue = async () => {\n const queue = getQueueService();\n const result = await queue.pop();\n return result;\n};\n","import { eventBus, AGENT_TASK_EVENT } from \"@axiom-lattice/core\";\nimport { popAgentTaskFromQueue } from \"./queue_service\";\nimport { agent_state } from \"./agent_service\";\n\n// 任务请求结构\nexport interface AgentTaskRequest {\n assistant_id: string;\n input: any;\n thread_id: string;\n \"x-tenant-id\": string;\n command?: any;\n callback_event?: string; // 可选的回调事件名称\n}\n\n/**\n * 处理Agent任务事件\n * @param taskRequest 任务请求\n * @param retryCount 重试次数\n */\nconst handleAgentTask = async (\n taskRequest: AgentTaskRequest,\n retryCount: number = 0\n): Promise<boolean> => {\n const {\n assistant_id,\n input = {},\n thread_id,\n \"x-tenant-id\": tenant_id,\n command,\n callback_event,\n } = taskRequest;\n\n try {\n console.log(\n `开始处理任务 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n\n // 检查API服务器是否可用\n const apiUrl = AgentTaskConsumer.agent_run_endpoint;\n\n console.log(`apiUrl: ${apiUrl}`);\n\n const response = await fetch(apiUrl, {\n method: \"POST\",\n body: JSON.stringify({\n assistant_id,\n streaming: true,\n ...input,\n thread_id,\n command,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-tenant-id\": tenant_id,\n },\n }).catch((err) => {\n console.error(`fetch请求失败: ${err.message || String(err)}`);\n throw new Error(`fetch失败: ${err.message || String(err)}`);\n });\n\n if (!response.ok) {\n throw new Error(`API请求失败: ${response.status} ${response.statusText}`);\n }\n\n // Check if response is SSE stream\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"text/event-stream\")) {\n // Handle SSE stream\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n throw new Error(\"Response body is not readable\");\n }\n\n let buffer = \"\";\n let streamEnded = false;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Stream has ended\n streamEnded = true;\n console.log(\n `SSE流已结束 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n break;\n }\n\n // // Decode the chunk and process SSE events\n // buffer += decoder.decode(value, { stream: true });\n // const lines = buffer.split(\"\\n\");\n // buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n // for (const line of lines) {\n // if (line.startsWith(\"data: \")) {\n // try {\n // const data = JSON.parse(line.slice(6));\n // // Process SSE event data here if needed\n // // You can emit events or handle the data as required\n // console.log(\"SSE event received:\", data);\n // } catch (e) {\n // // Ignore invalid JSON\n // console.warn(\"Failed to parse SSE data:\", line);\n // }\n // }\n // }\n }\n } catch (streamError) {\n console.error(\"Error reading SSE stream:\", streamError);\n throw streamError;\n } finally {\n reader.releaseLock();\n }\n\n // Stream has ended successfully\n if (callback_event) {\n const state = await agent_state({ assistant_id, thread_id });\n eventBus.publish(callback_event, {\n success: true,\n state: state,\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.log(\n `任务处理成功 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return true;\n } else {\n // Non-streaming response\n await response.text(); // Consume the response\n\n if (callback_event) {\n const state = await agent_state({ assistant_id, thread_id });\n eventBus.publish(callback_event, {\n success: true,\n state,\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.log(\n `任务处理成功 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return true;\n }\n } catch (error) {\n console.error(\n `Agent任务执行失败: ${assistant_id}, 线程: ${thread_id}`,\n error\n );\n\n // 重试逻辑,暂不用重试\n const maxRetries = 0;\n if (retryCount < maxRetries) {\n const nextRetryCount = retryCount + 1;\n const delayMs = Math.pow(2, nextRetryCount) * 1000; // 指数退避策略\n\n console.log(\n `将在 ${delayMs}ms 后重试任务 (${nextRetryCount}/${maxRetries})`\n );\n\n // 延迟后重试\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n return handleAgentTask(taskRequest, nextRetryCount);\n }\n\n if (callback_event) {\n eventBus.publish(callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.error(\n `任务处理失败,已达到最大重试次数 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return false;\n }\n};\n\n/**\n * Agent任务消费者\n * 负责监听和执行Agent任务事件,同时从队列中消费任务\n */\nexport class AgentTaskConsumer {\n private isPolling: boolean = false;\n private pollingInterval: NodeJS.Timeout | null = null;\n private pollingIntervalMs: number = 5000; // 默认5秒轮询一次\n private maxConcurrentTasks: number = 15; // 最大并发任务数\n private activeTasks: number = 0; // 当前活跃的任务数\n private processing: boolean = false; // 是否正在处理任务批次\n private immediateProcessingEnabled: boolean = true; // 是否启用即时处理模式\n public gatewayPort: number = 4001;\n public static agent_run_endpoint: string = \"http://localhost:4001/api/runs\";\n\n constructor(gatewayPort: number, pollingIntervalMs?: number) {\n this.gatewayPort = gatewayPort;\n AgentTaskConsumer.agent_run_endpoint = `http://localhost:${this.gatewayPort}/api/runs`;\n if (pollingIntervalMs) {\n this.pollingIntervalMs = pollingIntervalMs;\n }\n this.initialize();\n }\n\n /**\n * 初始化事件监听和队列轮询\n */\n private initialize(): void {\n // 监听事件总线上的任务\n eventBus.subscribe(AGENT_TASK_EVENT, this.trigger_agent_task.bind(this));\n\n // 启动队列轮询\n this.startPollingQueue();\n\n console.log(\"Agent任务消费者已启动并监听任务事件和队列\");\n }\n\n /**\n * 启动队列轮询\n */\n startPollingQueue(): void {\n if (this.isPolling) {\n return;\n }\n\n this.isPolling = true;\n\n this.pollingInterval = setInterval(async () => {\n try {\n // 如果上一批次任务还在处理中,跳过本次轮询\n if (this.processing) {\n console.log(\"队列处理中,跳过本次轮询\");\n return;\n }\n\n await this.consumeFromQueue();\n } catch (error) {\n console.error(\"队列轮询出错:\", error);\n }\n }, this.pollingIntervalMs);\n\n console.log(\n `开始轮询队列,间隔: ${this.pollingIntervalMs}ms,最大并发任务数: ${this.maxConcurrentTasks}`\n );\n }\n\n /**\n * 停止队列轮询\n */\n stopPollingQueue(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n this.pollingInterval = null;\n this.isPolling = false;\n console.log(\"已停止队列轮询\");\n }\n }\n\n /**\n * 处理单个任务并在完成后立即尝试处理下一个\n */\n async processNextTask(): Promise<boolean> {\n try {\n // 从队列中获取任务\n const queueResult = await popAgentTaskFromQueue();\n\n // 检查队列结果\n if (queueResult && queueResult.data) {\n const taskItem = queueResult.data;\n\n if (taskItem && typeof taskItem === \"object\") {\n const taskRequest = taskItem as AgentTaskRequest;\n\n console.log(\n `从队列中获取到任务 [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 增加活跃任务计数\n this.activeTasks++;\n\n // 处理任务(不使用await,允许并发执行)\n handleAgentTask(taskRequest)\n .then((success) => {\n if (!success) {\n console.error(`任务 处理失败`);\n // 可以在这里记录失败任务或执行补偿逻辑\n } else {\n console.log(`任务 处理成功`);\n }\n })\n .catch((error) => {\n console.error(`任务 处理时出错:`, error);\n })\n .finally(() => {\n // 减少活跃任务计数\n this.activeTasks--;\n\n // 如果启用了即时处理模式,尝试处理更多任务\n if (this.immediateProcessingEnabled && !this.processing) {\n this.checkQueueForTasks();\n }\n });\n\n // 任务已派发,返回true表示有任务被处理\n return true;\n } else {\n console.log(\"队列任务格式无效:\", taskItem);\n return false;\n }\n } else {\n // 队列为空\n return false;\n }\n } catch (error) {\n console.error(\"处理任务失败:\", error);\n return false;\n }\n }\n\n /**\n * 检查队列中是否有任务并处理\n */\n async checkQueueForTasks(): Promise<void> {\n // 如果已经在处理中或者并发任务已达上限,则不处理\n if (this.processing || this.activeTasks >= this.maxConcurrentTasks) {\n return;\n }\n\n this.processing = true;\n\n try {\n // 尝试获取并处理任务,直到达到并发上限\n while (this.activeTasks < this.maxConcurrentTasks) {\n const taskProcessed = await this.processNextTask();\n if (!taskProcessed) {\n // 没有更多任务,退出循环\n break;\n }\n }\n } catch (error) {\n console.error(\"检查队列任务失败:\", error);\n } finally {\n this.processing = false;\n }\n }\n\n /**\n * 从队列中消费任务\n */\n async consumeFromQueue(): Promise<void> {\n // 如果已经在处理中,跳过\n if (this.processing) {\n return;\n }\n\n // 调用任务检查方法\n await this.checkQueueForTasks();\n }\n\n /**\n * 处理通过事件触发的任务\n */\n trigger_agent_task(taskRequest: AgentTaskRequest): void {\n console.log(\n `通过事件触发任务: [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 处理任务,不阻塞事件处理流程\n handleAgentTask(taskRequest).catch((error) => {\n console.error(\"处理Agent任务时发生未捕获的错误:\", error);\n\n // 如果有回调事件,确保即使发生错误也能通知\n if (taskRequest.callback_event) {\n eventBus.publish(taskRequest.callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n config: {\n assistant_id: taskRequest.assistant_id,\n thread_id: taskRequest.thread_id,\n tenant_id: taskRequest[\"x-tenant-id\"],\n },\n });\n }\n });\n\n // 如果启用了即时处理且当前活跃任务数低于阈值,检查队列\n if (\n this.immediateProcessingEnabled &&\n this.activeTasks < this.maxConcurrentTasks\n ) {\n setImmediate(() => this.checkQueueForTasks());\n }\n }\n}\n"],"mappings":"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","names":["message","data","messages","import_uuid","import_core","app","pino","app","swagger","swaggerUi","import_core","import_core","fastify","cors","sensible"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/services/agent_service.ts","../src/controllers/run.ts","../src/controllers/memory.ts","../src/controllers/assistant.ts","../src/controllers/agent_task.ts","../src/schemas/index.ts","../src/routes/index.ts","../src/logger/Logger.ts","../src/swagger.ts","../src/services/queue_service.ts","../src/services/agent_task_consumer.ts"],"sourcesContent":["import fastify from \"fastify\";\nimport cors from \"@fastify/cors\";\nimport sensible from \"@fastify/sensible\";\nimport { registerLatticeRoutes } from \"./routes\";\n// 导入自定义 Logger 类\nimport { Logger } from \"./logger/Logger\";\nimport { configureSwagger } from \"./swagger\";\nimport {\n setQueueServiceType,\n QueueServiceType,\n} from \"./services/queue_service\";\nimport { AgentTaskConsumer } from \"./services/agent_task_consumer\";\n\nprocess.on(\"unhandledRejection\", (reason, promise) => {\n console.error(\"未处理的Promise拒绝:\", reason);\n // 可以在这里进行日志记录或其他处理\n});\n\n// 创建自定义日志记录器\nconst logger = new Logger({\n serviceName: \"lattice-gateway\",\n name: \"fastify-server\",\n});\n\n// 创建 Fastify 应用\nconst app = fastify({\n logger: false, // 禁用内置日志记录器\n});\n\n// 添加自定义日志记录\napp.addHook(\"onRequest\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n done();\n});\n\napp.addHook(\"onResponse\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n done();\n});\n\n// cors\napp.register(cors, {\n origin: true,\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\"],\n allowedHeaders: [\n \"Content-Type\",\n \"Authorization\",\n \"X-Requested-With\",\n \"x-tenant-id\",\n \"x-request-id\",\n ],\n exposedHeaders: [\"Content-Type\"],\n credentials: true,\n});\napp.register(sensible);\n\n// 错误处理\napp.setErrorHandler((error, request, reply) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n logger.error(\n `请求错误: ${request.method} ${request.url} error:${error.message}`,\n {\n ...context,\n error: error.message,\n stack: error.stack,\n statusCode: error.statusCode || 500,\n }\n );\n reply.status(error.statusCode || 500).send({\n success: false,\n error: error.message || \"服务器内部错误\",\n });\n});\n\n// 将日志记录器添加到应用实例中,以便在路由中使用\napp.decorate(\"logger\", logger);\n\n// Gateway configuration interface\nexport interface LatticeGatewayConfig {\n port?: number;\n queueServiceConfig?: {\n type: QueueServiceType;\n defaultStartPollingQueue: boolean;\n };\n}\n\n// Start server\nconst start = async (config?: LatticeGatewayConfig) => {\n try {\n const target_port = config?.port || Number(process.env.PORT) || 4001;\n\n await app.listen({ port: target_port, host: \"0.0.0.0\" });\n logger.info(`Lattice Gateway is running on port: ${target_port}`);\n\n // Configure queue service\n const queueServiceConfig = config?.queueServiceConfig;\n if (queueServiceConfig) {\n setQueueServiceType(queueServiceConfig.type);\n if (queueServiceConfig.defaultStartPollingQueue) {\n const agentTaskConsumer = new AgentTaskConsumer(target_port);\n agentTaskConsumer.startPollingQueue();\n }\n }\n } catch (err) {\n logger.error(\"Server start failed\", { error: err });\n process.exit(1);\n }\n};\n\nconst LatticeGateway = {\n startAsHttpEndpoint: start,\n configureSwagger,\n registerLatticeRoutes,\n app,\n AgentTaskConsumer,\n};\n\nexport { LatticeGateway };\n","import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n filterMessages,\n HumanMessage,\n ToolMessage,\n ToolMessageChunk,\n} from \"@langchain/core/messages\";\nimport { Command, CommandParams } from \"@langchain/langgraph\";\nimport { v4 } from \"uuid\";\n// 修改导入路径,使用 lattice_core 包\nimport {\n getAgentClient,\n getAgentLattice,\n InMemoryChunkBuffer,\n registerChunkBuffer,\n getChunkBuffer,\n hasChunkBuffer,\n} from \"@axiom-lattice/core\";\n\n/**\n * Get or create the global ChunkBuffer instance\n */\nfunction getOrCreateChunkBuffer(): InMemoryChunkBuffer {\n if (!hasChunkBuffer(\"default\")) {\n const buffer = new InMemoryChunkBuffer({\n ttl: 60 * 60 * 1000, // 1 hour TTL\n cleanupInterval: 5 * 60 * 1000, // Clean every 5 minutes\n });\n registerChunkBuffer(\"default\", buffer);\n }\n return getChunkBuffer(\"default\") as InMemoryChunkBuffer;\n}\n\nexport async function agent_invoke({\n input,\n thread_id,\n assistant_id,\n tenant_id,\n command,\n run_id,\n}: {\n assistant_id: string;\n input: any;\n thread_id: string;\n tenant_id: string;\n run_id?: string;\n command?: CommandParams<any>;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n const { message, ...rest } = input;\n const humanMessage = new HumanMessage(message || \"\");\n const messages = [humanMessage];\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n\n const result = await runnable_agent.invoke(\n command\n ? new Command(command)\n : { ...rest, messages, \"x-tenant-id\": tenant_id },\n {\n configurable: {\n thread_id: thread_id,\n run_id: run_id || v4(),\n \"x-tenant-id\": tenant_id,\n \"x-request-id\": run_id,\n \"x-thread-id\": thread_id,\n },\n recursionLimit: 200,\n }\n );\n\n const data = result.messages.map((message: BaseMessage) => {\n const { type, data } = message.toDict();\n return {\n ...data,\n role: type,\n };\n });\n return { messages: data };\n}\n\nexport async function agent_stream({\n input,\n thread_id,\n command,\n tenant_id,\n assistant_id,\n run_id,\n}: {\n assistant_id: string;\n input: any;\n thread_id: string;\n command?: CommandParams<any>;\n tenant_id: string;\n run_id?: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id) as any; // TODO: fix this\n const { message, ...rest } = input;\n let messages: BaseMessage[] = [];\n if (!command) {\n const humanMessage = new HumanMessage(message);\n messages = [humanMessage];\n }\n\n // Get ChunkBuffer instance\n const chunkBuffer = getOrCreateChunkBuffer();\n\n try {\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const agentStream = await runnable_agent.stream(\n command\n ? new Command(command)\n : {\n ...rest,\n messages,\n \"x-tenant-id\": tenant_id,\n },\n\n {\n configurable: {\n thread_id: thread_id,\n run_id: run_id || v4(),\n \"x-tenant-id\": tenant_id,\n \"x-request-id\": run_id,\n \"x-thread-id\": thread_id,\n },\n streamMode: [\"updates\", \"messages\"],\n subgraphs: false,\n recursionLimit: 200,\n }\n );\n\n // 创建一个可迭代的 ReadableStream with ChunkBuffer integration\n return {\n [Symbol.asyncIterator]: async function* () {\n try {\n for await (const chunk of agentStream) {\n let data;\n let chunkContent = \"\";\n\n if (chunk[0] === \"updates\") {\n const update = chunk[1];\n const values = Object.values(update);\n const messages = (values[0] as any)?.messages;\n if (messages?.[0]?.tool_call_id) {\n data = messages[0].toDict();\n }\n } else if (chunk[0] === \"messages\") {\n const messages = chunk[1];\n // console.log(messages);\n data = messages?.[0]?.toDict();\n }\n\n if ((chunk?.[1] as any)?.__interrupt__) {\n //data = chunk?.[1]?.[0]?.toDict();\n // 原有的中断消息处理\n data = {\n type: \"interrupt\",\n id: (chunk?.[1] as any)?.__interrupt__[0].id,\n data: { content: (chunk?.[1] as any)?.__interrupt__[0].value },\n };\n }\n\n if (data) {\n //console.log(data);\n if (data.type !== \"interrupt\") {\n await chunkBuffer.addChunk(thread_id, data);\n }\n yield data;\n }\n }\n\n // Mark thread as completed when streaming finishes successfully\n await chunkBuffer.completeThread(thread_id);\n } catch (error) {\n console.error(\"Stream error:\", error);\n // Mark thread as aborted on error\n await chunkBuffer.abortThread(thread_id);\n throw error;\n }\n },\n };\n } catch (error) {\n // Mark thread as aborted on initialization error\n await chunkBuffer.abortThread(thread_id);\n throw error;\n }\n}\n\nexport async function agent_state({\n thread_id,\n assistant_id,\n}: {\n assistant_id: string;\n thread_id: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const state = await runnable_agent.getState({\n configurable: { thread_id: thread_id, subgraphs: false },\n });\n return state;\n}\n\nexport async function agent_messages({\n thread_id,\n tenant_id,\n assistant_id,\n}: {\n assistant_id: string;\n thread_id: string;\n tenant_id: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const state = await runnable_agent.getState({\n configurable: { thread_id: thread_id, subgraphs: false },\n });\n\n const messages = state.values.messages || [];\n const filteredMessages = filterMessages(messages, {\n includeTypes: [\"ai\", \"human\", \"tool\"], //[\"human\", \"ai\", \"tool\"],\n });\n\n // console.log(filteredMessages);\n\n let messagesArray = filteredMessages.map((message: BaseMessage) => ({\n id: message.id,\n role: message.getType(),\n content: message.content,\n ...message.lc_kwargs,\n }));\n\n // const action_messages = state.tasks.flatMap((task) => {\n // return task.interrupts.map((interrupt) => {\n // return {\n // role: \"ai\",\n // content: interrupt.value,\n // type: \"action\",\n // };\n // });\n // });\n\n const new_messages = messagesArray;\n // console.log(messagesArray);\n\n return new_messages;\n}\n\nexport async function draw_graph(assistant_id: string) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const drawableGraph = await runnable_agent.getGraphAsync();\n const image = await drawableGraph.drawMermaid();\n return image;\n}\n\n/**\n * Resume streaming from a known position\n * Creates an async iterator that yields new chunks as they arrive\n *\n * @param thread_id - Thread identifier\n * @param message_id - Message identifier (usually run_id)\n * @param known_content - Content already received (used to find resume position)\n * @param poll_interval - Polling interval in milliseconds (default: 100ms)\n */\nexport async function resume_stream({\n thread_id,\n message_id,\n known_content,\n poll_interval = 100,\n}: {\n thread_id: string;\n message_id: string;\n known_content: string;\n poll_interval?: number;\n}) {\n const chunkBuffer = getOrCreateChunkBuffer();\n\n const stream = await chunkBuffer.getNewChunksSinceContentIterator(\n thread_id,\n message_id,\n known_content\n );\n return {\n [Symbol.asyncIterator]: async function* () {\n try {\n for await (const chunk of stream) {\n yield chunk;\n }\n } catch (error) {\n console.error(\"Resume stream error:\", error);\n throw error;\n }\n },\n };\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport * as agentService from \"../services/agent_service\";\nimport { CreateRunRequest } from \"../types\";\nimport { v4 } from \"uuid\";\n\ninterface ResumeStreamRequest {\n thread_id: string;\n message_id: string;\n known_content: string;\n poll_interval?: number;\n}\n\n// 创建运行\nexport const createRun = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const {\n assistant_id,\n thread_id,\n command,\n streaming,\n background,\n ...input\n } = request.body as CreateRunRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const x_request_id = (request.headers[\"x-request-id\"] as string) || v4();\n\n // 验证请求数据\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n // 如果请求streaming,则agent_stream\n if (streaming) {\n // 开始运行\n const stream = await agentService.agent_stream({\n assistant_id: assistant_id,\n input: input,\n thread_id: thread_id,\n command,\n tenant_id: tenant_id,\n run_id: x_request_id,\n });\n\n // 通知 Fastify 我们将手动处理响应\n reply.hijack();\n\n // 设置 SSE 响应头\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n for await (const chunk of stream) {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n } catch (error) {\n console.error(\"Stream processing error:\", error);\n } finally {\n reply.raw.end();\n }\n } else {\n // 后台运行的情况\n const result = await agentService.agent_invoke({\n assistant_id: assistant_id,\n input: input,\n command: command,\n thread_id: thread_id,\n tenant_id: tenant_id,\n run_id: x_request_id,\n });\n reply.status(200).send(result);\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `创建运行时发生错误: ${error.message}`,\n });\n }\n};\n\n// Resume stream from known position\nexport const resumeStream = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { thread_id, message_id, known_content, poll_interval } =\n request.body as ResumeStreamRequest;\n\n // Validate request data\n if (!thread_id || !message_id || known_content === undefined) {\n reply.status(400).send({\n success: false,\n error: \"thread_id, message_id, and known_content are required\",\n });\n return;\n }\n\n // Notify Fastify that we will manually handle the response\n reply.hijack();\n\n // Set SSE response headers\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n // Get the stream from agent service\n const stream = await agentService.resume_stream({\n thread_id,\n message_id,\n known_content: known_content,\n poll_interval: poll_interval || 100,\n });\n\n // Stream the chunks to the client\n for await (const chunk of stream) {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n } catch (error) {\n console.error(\"Resume stream processing error:\", error);\n } finally {\n reply.raw.end();\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Error resuming stream: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { agent_messages, agent_state } from \"../services/agent_service\";\n\n// 设置内存项\nexport const setMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n const value = request.body;\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n if (value === undefined) {\n reply.status(400).send({\n success: false,\n error: \"值是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.setMemoryItem(assistantId, key, value);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `设置内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取内存项\nexport const getMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.getMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(404).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取所有内存项\nexport const getAllMemoryItems = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const result = await agent_messages({\n assistant_id: assistantId,\n thread_id: thread_id,\n tenant_id: tenant_id,\n });\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取所有内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取助手状态\nexport const getAgentState = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const result = await agent_state({\n assistant_id: assistantId,\n thread_id: thread_id,\n });\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取助手状态时发生错误: ${error.message}`,\n });\n }\n};\n\n// 删除内存项\nexport const deleteMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.deleteMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `删除内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 清除内存\nexport const clearMemory = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId } = request.params as { assistantId: string };\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n let result: any; //= await memoryModel.clearMemory(assistantId);\n\n if (!result.success) {\n reply.status(500).send(result);\n return;\n }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `清除内存时发生错误: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { draw_graph } from \"../services/agent_service\";\n\nexport const getAgentGraph = async (\n request: FastifyRequest<{\n Params: { assistantId: string };\n }>,\n reply: FastifyReply\n) => {\n try {\n const { assistantId } = request.params;\n\n // 调用绘图服务获取图片数据\n const imageData = await draw_graph(assistantId);\n\n // 设置响应头并返回图片数据\n reply.header(\"Content-Type\", \"application/json\").send({\n image: imageData,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: error.message || \"获取代理图表失败\",\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { AgentManager } from \"@axiom-lattice/core\";\n\n/**\n * Request body interface for triggering agent task\n */\ninterface TriggerAgentTaskRequest {\n assistant_id: string;\n thread_id: string;\n input: any;\n command?: any;\n}\n\n/**\n * Trigger an agent task\n * This endpoint triggers an agent task through the AgentManager,\n * which publishes the task to the event bus for processing\n */\nexport const triggerAgentTask = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistant_id, thread_id, input, command } =\n request.body as TriggerAgentTaskRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n\n // Validate required fields\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"assistant_id is required\",\n });\n return;\n }\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"thread_id is required\",\n });\n return;\n }\n\n // Get AgentManager instance and trigger the task\n const agentManager = AgentManager.getInstance();\n const result = await agentManager.callAgentInQueue({\n assistant_id,\n thread_id,\n input,\n command,\n \"x-tenant-id\": tenant_id,\n });\n\n reply.status(200).send({\n success: true,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Failed to trigger agent task: ${error.message}`,\n });\n }\n};\n","import { FastifySchema } from \"fastify\";\n\n// Create Run Schemas\nexport const createRunSchema: FastifySchema = {\n description: \"Create a new agent run\",\n tags: [\"Runs\"],\n summary: \"Create Agent Run\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n assistant_id: { type: \"string\", description: \"Assistant ID\" },\n message: { type: \"string\", description: \"Message data for the run\" },\n command: {\n type: \"object\",\n description: \"Command data for the run\",\n nullable: true,\n },\n streaming: {\n type: \"boolean\",\n description: \"Whether to stream the response\",\n nullable: true,\n },\n background: {\n type: \"boolean\",\n description: \"Whether to run in background\",\n nullable: true,\n },\n },\n required: [\"thread_id\", \"assistant_id\", \"message\"],\n },\n response: {\n 200: {},\n 400: {},\n },\n};\n\n// Memory Schemas\nexport const getAllMemoryItemsSchema: FastifySchema = {\n description: \"Get all memory items for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get All Memory Items\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\nexport const getAgentStateSchema: FastifySchema = {\n description: \"Get agent state for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get Agent State\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const getMemoryItemSchema: FastifySchema = {\n description: \"Get a specific memory item by key\",\n tags: [\"Memory\"],\n summary: \"Get Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const setMemoryItemSchema: FastifySchema = {\n description: \"Set or update a memory item\",\n tags: [\"Memory\"],\n summary: \"Set Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n body: {\n type: \"object\",\n description: \"Memory item data\",\n },\n response: {\n 200: {},\n },\n};\n\nexport const deleteMemoryItemSchema: FastifySchema = {\n description: \"Delete a specific memory item\",\n tags: [\"Memory\"],\n summary: \"Delete Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const clearMemorySchema: FastifySchema = {\n description: \"Clear all memory items for an assistant\",\n tags: [\"Memory\"],\n summary: \"Clear Memory\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Graph Schema\nexport const getAgentGraphSchema: FastifySchema = {\n description: \"Get agent graph visualization\",\n tags: [\"Graph\"],\n summary: \"Get Agent Graph\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Resume Stream Schema\nexport const resumeStreamSchema: FastifySchema = {\n description: \"Resume streaming from a known position\",\n tags: [\"Streaming\"],\n summary: \"Resume Stream\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n message_id: {\n type: \"string\",\n description: \"Message ID (usually run_id)\",\n },\n known_content: {\n type: \"string\",\n description: \"Content already received\",\n },\n poll_interval: {\n type: \"number\",\n description: \"Polling interval in milliseconds\",\n nullable: true,\n default: 100,\n },\n },\n required: [\"thread_id\", \"message_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\n// Trigger Agent Task Schema\nexport const triggerAgentTaskSchema: FastifySchema = {\n description: \"Trigger an agent task\",\n tags: [\"Agent Tasks\"],\n summary: \"Trigger Agent Task\",\n body: {\n type: \"object\",\n properties: {\n assistant_id: {\n type: \"string\",\n description: \"Assistant ID\",\n },\n thread_id: {\n type: \"string\",\n description: \"Thread ID\",\n },\n input: {\n type: \"object\",\n description: \"Task input data\",\n },\n command: {\n type: \"object\",\n description: \"Command data for the task\",\n nullable: true,\n },\n },\n required: [\"assistant_id\", \"thread_id\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n result: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n","import { FastifyInstance } from \"fastify\";\n//import * as assistantController from \"../controllers/assistant\";\nimport * as runController from \"../controllers/run\";\nimport * as memoryController from \"../controllers/memory\";\nimport * as graphController from \"../controllers/assistant\";\nimport * as agentTaskController from \"../controllers/agent_task\";\nimport {\n createRunSchema,\n getAllMemoryItemsSchema,\n getAgentStateSchema,\n getMemoryItemSchema,\n setMemoryItemSchema,\n deleteMemoryItemSchema,\n clearMemorySchema,\n getAgentGraphSchema,\n resumeStreamSchema,\n triggerAgentTaskSchema,\n} from \"../schemas\";\n\nexport const registerLatticeRoutes = (app: FastifyInstance): void => {\n // 运行路由\n app.post<{\n Body: any;\n }>(\"/api/runs\", runController.createRun);\n\n // Resume stream route\n app.post<{\n Body: any;\n }>(\"/api/resume_stream\", runController.resumeStream);\n\n // app.get<{\n // Params: { id: string };\n // }>(\"/api/runs/:id\", runController.getRun);\n\n // app.get<{\n // Params: { assistantId: string };\n // }>(\"/api/assistants/:assistantId/runs\", runController.getRunsByAssistant);\n\n // app.post<{\n // Params: { id: string };\n // }>(\"/api/runs/:id/cancel\", runController.cancelRun);\n\n // 内存路由\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/memory\",\n { schema: getAllMemoryItemsSchema },\n memoryController.getAllMemoryItems\n );\n\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/state\",\n { schema: getAgentStateSchema },\n memoryController.getAgentState\n );\n\n app.get<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: getMemoryItemSchema },\n memoryController.getMemoryItem\n );\n\n app.put<{\n Params: { assistantId: string; key: string };\n Body: any;\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: setMemoryItemSchema },\n memoryController.setMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: deleteMemoryItemSchema },\n memoryController.deleteMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/memory\",\n { schema: clearMemorySchema },\n memoryController.clearMemory\n );\n\n // 图表路由\n app.get<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/graph\",\n { schema: getAgentGraphSchema },\n graphController.getAgentGraph\n );\n\n // Agent Task路由\n app.post<{\n Body: any;\n }>(\n \"/api/agent-tasks/trigger\",\n { schema: triggerAgentTaskSchema },\n agentTaskController.triggerAgentTask\n );\n};\n","import pino from \"pino\";\nimport \"pino-pretty\";\nimport \"pino-roll\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\nexport interface LoggerContext {\n \"x-user-id\"?: string;\n \"x-tenant-id\"?: string;\n \"x-request-id\"?: string;\n \"x-task-id\"?: string;\n \"x-thread-id\"?: string;\n}\n\nexport interface LoggerOptions {\n name?: string;\n serviceName?: string;\n context?: LoggerContext;\n}\n\n/**\n * 单例的Pino日志工厂类,管理底层pino实例\n */\nclass PinoLoggerFactory {\n private static instance: PinoLoggerFactory;\n private pinoLogger: pino.Logger;\n\n private constructor() {\n const isProd = process.env.NODE_ENV === \"production\";\n\n const loggerConfig: pino.LoggerOptions = {\n // 自定义时间戳格式\n timestamp: () => `,\"@timestamp\":\"${new Date().toISOString()}\"`,\n\n // 关闭默认的时间戳键\n base: {\n \"@version\": \"1\",\n app_name: \"lattice\",\n service_name: \"lattice/graph-server\",\n thread_name: \"main\",\n logger_name: \"lattice-graph-logger\",\n },\n\n formatters: {\n level: (label, number) => {\n return {\n level: label.toUpperCase(),\n level_value: number * 1000,\n };\n },\n },\n };\n\n // 生产环境使用文件日志\n if (isProd) {\n try {\n this.pinoLogger = pino(\n loggerConfig,\n pino.transport({\n target: \"pino-roll\",\n options: {\n file: \"./logs/fin_ai_graph_server\",\n frequency: \"daily\",\n mkdir: true,\n },\n })\n );\n } catch (error) {\n console.error(\n \"无法初始化 pino-roll 日志记录器,回退到控制台日志\",\n error\n );\n // 回退到开发环境的配置\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n } else {\n // 开发环境使用格式化输出\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n }\n\n public static getInstance(): PinoLoggerFactory {\n if (!PinoLoggerFactory.instance) {\n PinoLoggerFactory.instance = new PinoLoggerFactory();\n }\n return PinoLoggerFactory.instance;\n }\n\n public getPinoLogger(): pino.Logger {\n return this.pinoLogger;\n }\n}\n\n/**\n * Logger类,可以创建多个实例,每个实例有自己的上下文\n */\nexport class Logger {\n private context: LoggerContext;\n private name: string;\n private serviceName: string;\n\n constructor(options?: LoggerOptions) {\n this.context = options?.context || {};\n this.name = options?.name || \"lattice-graph-logger\";\n this.serviceName = options?.serviceName || \"lattice/graph-server\";\n }\n\n /**\n * 获取合并了上下文的日志对象\n * @param additionalContext 额外的上下文数据\n * @returns 带有上下文的pino日志对象\n */\n private getContextualLogger(additionalContext?: object): pino.Logger {\n const pinoLogger = PinoLoggerFactory.getInstance().getPinoLogger();\n\n // 合并Logger实例的上下文和额外上下文\n const contextObj = {\n \"x-user-id\": this.context[\"x-user-id\"] || \"\",\n \"x-tenant-id\": this.context[\"x-tenant-id\"] || \"\",\n \"x-request-id\": this.context[\"x-request-id\"] || \"\",\n \"x-task-id\": this.context[\"x-task-id\"] || \"\",\n \"x-thread-id\": this.context[\"x-thread-id\"] || \"\",\n service_name: this.serviceName,\n logger_name: this.name,\n ...additionalContext,\n };\n\n // 创建带有上下文的子日志记录器\n return pinoLogger.child(contextObj);\n }\n\n info(msg: string, obj?: object): void {\n this.getContextualLogger(obj).info(msg);\n }\n\n error(msg: string, obj?: object | Error): void {\n this.getContextualLogger(obj).error(msg);\n }\n\n warn(msg: string, obj?: object): void {\n this.getContextualLogger(obj).warn(msg);\n }\n\n debug(msg: string, obj?: object): void {\n this.getContextualLogger(obj).debug(msg);\n }\n\n /**\n * 更新Logger实例的上下文\n */\n updateContext(context: Partial<LoggerContext>): void {\n this.context = {\n ...this.context,\n ...context,\n };\n }\n\n /**\n * 创建一个新的Logger实例,继承当前Logger的上下文\n */\n child(options: Partial<LoggerOptions>): Logger {\n return new Logger({\n name: options.name || this.name,\n serviceName: options.serviceName || this.serviceName,\n context: {\n ...this.context,\n ...options.context,\n },\n });\n }\n}\n","import { FastifyInstance } from \"fastify\";\nimport swagger from \"@fastify/swagger\";\nimport swaggerUi from \"@fastify/swagger-ui\";\n// Example usage:\n// configureSwagger(app)\n// configureSwagger(app, { openapi: { info: { version: \"2.0.0\" } } })\n// configureSwagger(app, undefined, { routePrefix: \"/docs\" })\n\n// Default swagger configuration\nexport const defaultSwaggerConfig = {\n openapi: {\n openapi: \"3.0.0\",\n info: {\n title: \"Axiom Lattice Gateway API\",\n description: \"API Gateway for LangGraph agent-based applications\",\n version: \"1.0.0\",\n contact: {\n name: \"Axiom Lattice Team\",\n email: \"support@axiom-lattice.com\",\n },\n },\n servers: [\n {\n url: \"http://localhost:4001\",\n description: \"Development environment\",\n },\n ],\n components: {\n securitySchemes: {\n bearerAuth: {\n type: \"http\" as const,\n scheme: \"bearer\" as const,\n bearerFormat: \"JWT\",\n },\n },\n },\n security: [\n {\n bearerAuth: [],\n },\n ],\n tags: [\n { name: \"Runs\", description: \"Agent run management\" },\n { name: \"Memory\", description: \"Agent memory management\" },\n { name: \"Graph\", description: \"Agent graph visualization\" },\n { name: \"Health\", description: \"System health checks\" },\n ],\n },\n};\n\n// Default swagger UI configuration\nexport const defaultSwaggerUiConfig = {\n routePrefix: \"/api-docs\",\n uiConfig: {\n docExpansion: \"full\" as const,\n deepLinking: false,\n },\n staticCSP: true,\n transformStaticCSP: (header: string) => header,\n};\n\n// Configure Swagger with optional custom configuration\nexport const configureSwagger = async (\n app: FastifyInstance,\n customSwaggerConfig?: Partial<typeof defaultSwaggerConfig>,\n customSwaggerUiConfig?: Partial<typeof defaultSwaggerUiConfig>\n) => {\n // Merge default config with custom config\n const swaggerConfig = { ...defaultSwaggerConfig, ...customSwaggerConfig };\n const swaggerUiConfig = {\n ...defaultSwaggerUiConfig,\n ...customSwaggerUiConfig,\n };\n\n await app.register(swagger, swaggerConfig);\n await app.register(swaggerUi, swaggerUiConfig);\n};\n","// Queue service adapter that uses QueueLatticeManager from core package\n// Provides backward-compatible API for gateway services\n\nimport {\n queueLatticeManager,\n registerQueueLattice,\n getQueueLattice,\n} from \"@axiom-lattice/core\";\nimport { QueueType, QueueConfig, QueueClient } from \"@axiom-lattice/protocols\";\nimport { RedisQueueClient } from \"@axiom-lattice/queue-redis\";\n\nexport type QueueServiceType = \"memory\" | \"redis\";\n\n// Default queue key\nconst DEFAULT_QUEUE_KEY = \"default\";\n\n// Global configuration for queue service type\n// Can be set via environment variable QUEUE_SERVICE_TYPE or via LatticeGateway configuration\nlet queueServiceType: QueueServiceType =\n (process.env.QUEUE_SERVICE_TYPE as QueueServiceType) || \"memory\";\n\n/**\n * Configure the queue service type\n * This will register or update the default queue service\n * @param type - \"memory\" or \"redis\"\n */\nexport const setQueueServiceType = (type: QueueServiceType): void => {\n queueServiceType = type;\n console.log(`Queue service type set to: ${type}`);\n\n // Register or update the queue service\n const queueName = process.env.QUEUE_NAME || \"tasks\";\n const config: QueueConfig = {\n name: \"Default Queue Service\",\n description: `Default ${type} queue service`,\n type: type === \"redis\" ? QueueType.REDIS : QueueType.MEMORY,\n queueName,\n options:\n type === \"redis\"\n ? {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n }\n : undefined,\n };\n\n // Remove existing queue if it exists\n if (queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n queueLatticeManager.removeLattice(DEFAULT_QUEUE_KEY);\n }\n\n // Create client for Redis type\n let client: QueueClient | undefined;\n if (type === \"redis\") {\n client = new RedisQueueClient(queueName, {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n });\n }\n\n // Register the new queue service\n registerQueueLattice(DEFAULT_QUEUE_KEY, config, client);\n};\n\n/**\n * Get the current queue service type\n */\nexport const getQueueServiceType = (): QueueServiceType => {\n return queueServiceType;\n};\n\n/**\n * Get the default queue service\n * If not registered, register it with the current configuration\n */\nconst getQueueService = () => {\n // Check if queue is already registered\n if (!queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n // Auto-register with current configuration\n setQueueServiceType(queueServiceType);\n }\n\n return getQueueLattice(DEFAULT_QUEUE_KEY);\n};\n\n/**\n * Push agent task to queue\n * @param agentTask - Agent task to push\n */\nexport const pushAgentTaskToQueue = async (agentTask: any) => {\n const queue = getQueueService();\n const result = await queue.push(agentTask);\n return result;\n};\n\n/**\n * Pop agent task from queue\n */\nexport const popAgentTaskFromQueue = async () => {\n const queue = getQueueService();\n const result = await queue.pop();\n return result;\n};\n","import { eventBus, AGENT_TASK_EVENT } from \"@axiom-lattice/core\";\nimport { popAgentTaskFromQueue } from \"./queue_service\";\nimport { agent_state } from \"./agent_service\";\n\n// 任务请求结构\nexport interface AgentTaskRequest {\n assistant_id: string;\n input: any;\n thread_id: string;\n \"x-tenant-id\": string;\n command?: any;\n callback_event?: string; // 可选的回调事件名称\n}\n\n/**\n * 处理Agent任务事件\n * @param taskRequest 任务请求\n * @param retryCount 重试次数\n */\nconst handleAgentTask = async (\n taskRequest: AgentTaskRequest,\n retryCount: number = 0\n): Promise<boolean> => {\n const {\n assistant_id,\n input = {},\n thread_id,\n \"x-tenant-id\": tenant_id,\n command,\n callback_event,\n } = taskRequest;\n\n try {\n console.log(\n `开始处理任务 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n\n // 检查API服务器是否可用\n const apiUrl = AgentTaskConsumer.agent_run_endpoint;\n\n console.log(`apiUrl: ${apiUrl}`);\n\n const response = await fetch(apiUrl, {\n method: \"POST\",\n body: JSON.stringify({\n assistant_id,\n streaming: true,\n ...input,\n thread_id,\n command,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-tenant-id\": tenant_id,\n },\n }).catch((err) => {\n console.error(`fetch请求失败: ${err.message || String(err)}`);\n throw new Error(`fetch失败: ${err.message || String(err)}`);\n });\n\n if (!response.ok) {\n throw new Error(`API请求失败: ${response.status} ${response.statusText}`);\n }\n\n // Check if response is SSE stream\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"text/event-stream\")) {\n // Handle SSE stream\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n throw new Error(\"Response body is not readable\");\n }\n\n let buffer = \"\";\n let streamEnded = false;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Stream has ended\n streamEnded = true;\n console.log(\n `SSE流已结束 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n break;\n }\n\n // // Decode the chunk and process SSE events\n // buffer += decoder.decode(value, { stream: true });\n // const lines = buffer.split(\"\\n\");\n // buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n // for (const line of lines) {\n // if (line.startsWith(\"data: \")) {\n // try {\n // const data = JSON.parse(line.slice(6));\n // // Process SSE event data here if needed\n // // You can emit events or handle the data as required\n // console.log(\"SSE event received:\", data);\n // } catch (e) {\n // // Ignore invalid JSON\n // console.warn(\"Failed to parse SSE data:\", line);\n // }\n // }\n // }\n }\n } catch (streamError) {\n console.error(\"Error reading SSE stream:\", streamError);\n throw streamError;\n } finally {\n reader.releaseLock();\n }\n\n // Stream has ended successfully\n if (callback_event) {\n const state = await agent_state({ assistant_id, thread_id });\n eventBus.publish(callback_event, {\n success: true,\n state: state,\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.log(\n `任务处理成功 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return true;\n } else {\n // Non-streaming response\n await response.text(); // Consume the response\n\n if (callback_event) {\n const state = await agent_state({ assistant_id, thread_id });\n eventBus.publish(callback_event, {\n success: true,\n state,\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.log(\n `任务处理成功 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return true;\n }\n } catch (error) {\n console.error(\n `Agent任务执行失败: ${assistant_id}, 线程: ${thread_id}`,\n error\n );\n\n // 重试逻辑,暂不用重试\n const maxRetries = 0;\n if (retryCount < maxRetries) {\n const nextRetryCount = retryCount + 1;\n const delayMs = Math.pow(2, nextRetryCount) * 1000; // 指数退避策略\n\n console.log(\n `将在 ${delayMs}ms 后重试任务 (${nextRetryCount}/${maxRetries})`\n );\n\n // 延迟后重试\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n return handleAgentTask(taskRequest, nextRetryCount);\n }\n\n if (callback_event) {\n eventBus.publish(callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.error(\n `任务处理失败,已达到最大重试次数 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return false;\n }\n};\n\n/**\n * Agent任务消费者\n * 负责监听和执行Agent任务事件,同时从队列中消费任务\n */\nexport class AgentTaskConsumer {\n private isPolling: boolean = false;\n private pollingInterval: NodeJS.Timeout | null = null;\n private pollingIntervalMs: number = 5000; // 默认5秒轮询一次\n private maxConcurrentTasks: number = 15; // 最大并发任务数\n private activeTasks: number = 0; // 当前活跃的任务数\n private processing: boolean = false; // 是否正在处理任务批次\n private immediateProcessingEnabled: boolean = true; // 是否启用即时处理模式\n public gatewayPort: number = 4001;\n public static agent_run_endpoint: string = \"http://localhost:4001/api/runs\";\n\n constructor(gatewayPort: number, pollingIntervalMs?: number) {\n this.gatewayPort = gatewayPort;\n AgentTaskConsumer.agent_run_endpoint = `http://localhost:${this.gatewayPort}/api/runs`;\n if (pollingIntervalMs) {\n this.pollingIntervalMs = pollingIntervalMs;\n }\n this.initialize();\n }\n\n /**\n * 初始化事件监听和队列轮询\n */\n private initialize(): void {\n // 监听事件总线上的任务\n eventBus.subscribe(AGENT_TASK_EVENT, this.trigger_agent_task.bind(this));\n\n // 启动队列轮询\n this.startPollingQueue();\n\n console.log(\"Agent任务消费者已启动并监听任务事件和队列\");\n }\n\n /**\n * 启动队列轮询\n */\n startPollingQueue(): void {\n if (this.isPolling) {\n return;\n }\n\n this.isPolling = true;\n\n this.pollingInterval = setInterval(async () => {\n try {\n // 如果上一批次任务还在处理中,跳过本次轮询\n if (this.processing) {\n console.log(\"队列处理中,跳过本次轮询\");\n return;\n }\n\n await this.consumeFromQueue();\n } catch (error) {\n console.error(\"队列轮询出错:\", error);\n }\n }, this.pollingIntervalMs);\n\n console.log(\n `开始轮询队列,间隔: ${this.pollingIntervalMs}ms,最大并发任务数: ${this.maxConcurrentTasks}`\n );\n }\n\n /**\n * 停止队列轮询\n */\n stopPollingQueue(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n this.pollingInterval = null;\n this.isPolling = false;\n console.log(\"已停止队列轮询\");\n }\n }\n\n /**\n * 处理单个任务并在完成后立即尝试处理下一个\n */\n async processNextTask(): Promise<boolean> {\n try {\n // 从队列中获取任务\n const queueResult = await popAgentTaskFromQueue();\n\n // 检查队列结果\n if (queueResult && queueResult.data) {\n const taskItem = queueResult.data;\n\n if (taskItem && typeof taskItem === \"object\") {\n const taskRequest = taskItem as AgentTaskRequest;\n\n console.log(\n `从队列中获取到任务 [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 增加活跃任务计数\n this.activeTasks++;\n\n // 处理任务(不使用await,允许并发执行)\n handleAgentTask(taskRequest)\n .then((success) => {\n if (!success) {\n console.error(`任务 处理失败`);\n // 可以在这里记录失败任务或执行补偿逻辑\n } else {\n console.log(`任务 处理成功`);\n }\n })\n .catch((error) => {\n console.error(`任务 处理时出错:`, error);\n })\n .finally(() => {\n // 减少活跃任务计数\n this.activeTasks--;\n\n // 如果启用了即时处理模式,尝试处理更多任务\n if (this.immediateProcessingEnabled && !this.processing) {\n this.checkQueueForTasks();\n }\n });\n\n // 任务已派发,返回true表示有任务被处理\n return true;\n } else {\n console.log(\"队列任务格式无效:\", taskItem);\n return false;\n }\n } else {\n // 队列为空\n return false;\n }\n } catch (error) {\n console.error(\"处理任务失败:\", error);\n return false;\n }\n }\n\n /**\n * 检查队列中是否有任务并处理\n */\n async checkQueueForTasks(): Promise<void> {\n // 如果已经在处理中或者并发任务已达上限,则不处理\n if (this.processing || this.activeTasks >= this.maxConcurrentTasks) {\n return;\n }\n\n this.processing = true;\n\n try {\n // 尝试获取并处理任务,直到达到并发上限\n while (this.activeTasks < this.maxConcurrentTasks) {\n const taskProcessed = await this.processNextTask();\n if (!taskProcessed) {\n // 没有更多任务,退出循环\n break;\n }\n }\n } catch (error) {\n console.error(\"检查队列任务失败:\", error);\n } finally {\n this.processing = false;\n }\n }\n\n /**\n * 从队列中消费任务\n */\n async consumeFromQueue(): Promise<void> {\n // 如果已经在处理中,跳过\n if (this.processing) {\n return;\n }\n\n // 调用任务检查方法\n await this.checkQueueForTasks();\n }\n\n /**\n * 处理通过事件触发的任务\n */\n trigger_agent_task(taskRequest: AgentTaskRequest): void {\n console.log(\n `通过事件触发任务: [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 处理任务,不阻塞事件处理流程\n handleAgentTask(taskRequest).catch((error) => {\n console.error(\"处理Agent任务时发生未捕获的错误:\", error);\n\n // 如果有回调事件,确保即使发生错误也能通知\n if (taskRequest.callback_event) {\n eventBus.publish(taskRequest.callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n config: {\n assistant_id: taskRequest.assistant_id,\n thread_id: taskRequest.thread_id,\n tenant_id: taskRequest[\"x-tenant-id\"],\n },\n });\n }\n });\n\n // 如果启用了即时处理且当前活跃任务数低于阈值,检查队列\n if (\n this.immediateProcessingEnabled &&\n this.activeTasks < this.maxConcurrentTasks\n ) {\n setImmediate(() => this.checkQueueForTasks());\n }\n }\n}\n"],"mappings":"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","names":["message","data","messages","import_uuid","import_core","app","pino","app","swagger","swaggerUi","import_core","import_core","fastify","cors","sensible"]}
package/dist/index.mjs CHANGED
@@ -75,11 +75,10 @@ async function agent_stream({
75
75
  run_id
76
76
  }) {
77
77
  const runnable_agent = getAgentClient(assistant_id);
78
- const { files, message, ...rest } = input;
78
+ const { message, ...rest } = input;
79
79
  let messages = [];
80
80
  if (!command) {
81
81
  const humanMessage = new HumanMessage(message);
82
- humanMessage.additional_kwargs = { files };
83
82
  messages = [humanMessage];
84
83
  }
85
84
  const chunkBuffer = getOrCreateChunkBuffer();
@@ -184,7 +183,6 @@ async function agent_messages({
184
183
  id: message.id,
185
184
  role: message.getType(),
186
185
  content: message.content,
187
- files: message.additional_kwargs.files,
188
186
  ...message.lc_kwargs
189
187
  }));
190
188
  const new_messages = messagesArray;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/services/agent_service.ts","../src/controllers/run.ts","../src/controllers/memory.ts","../src/controllers/assistant.ts","../src/controllers/agent_task.ts","../src/schemas/index.ts","../src/routes/index.ts","../src/logger/Logger.ts","../src/swagger.ts","../src/services/queue_service.ts","../src/services/agent_task_consumer.ts"],"sourcesContent":["import fastify from \"fastify\";\nimport cors from \"@fastify/cors\";\nimport sensible from \"@fastify/sensible\";\nimport { registerLatticeRoutes } from \"./routes\";\n// 导入自定义 Logger 类\nimport { Logger } from \"./logger/Logger\";\nimport { configureSwagger } from \"./swagger\";\nimport {\n setQueueServiceType,\n QueueServiceType,\n} from \"./services/queue_service\";\nimport { AgentTaskConsumer } from \"./services/agent_task_consumer\";\n\nprocess.on(\"unhandledRejection\", (reason, promise) => {\n console.error(\"未处理的Promise拒绝:\", reason);\n // 可以在这里进行日志记录或其他处理\n});\n\n// 创建自定义日志记录器\nconst logger = new Logger({\n serviceName: \"lattice-gateway\",\n name: \"fastify-server\",\n});\n\n// 创建 Fastify 应用\nconst app = fastify({\n logger: false, // 禁用内置日志记录器\n});\n\n// 添加自定义日志记录\napp.addHook(\"onRequest\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n done();\n});\n\napp.addHook(\"onResponse\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n done();\n});\n\n// cors\napp.register(cors, {\n origin: true,\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\"],\n allowedHeaders: [\n \"Content-Type\",\n \"Authorization\",\n \"X-Requested-With\",\n \"x-tenant-id\",\n \"x-request-id\",\n ],\n exposedHeaders: [\"Content-Type\"],\n credentials: true,\n});\napp.register(sensible);\n\n// 错误处理\napp.setErrorHandler((error, request, reply) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n logger.error(\n `请求错误: ${request.method} ${request.url} error:${error.message}`,\n {\n ...context,\n error: error.message,\n stack: error.stack,\n statusCode: error.statusCode || 500,\n }\n );\n reply.status(error.statusCode || 500).send({\n success: false,\n error: error.message || \"服务器内部错误\",\n });\n});\n\n// 将日志记录器添加到应用实例中,以便在路由中使用\napp.decorate(\"logger\", logger);\n\n// Gateway configuration interface\nexport interface LatticeGatewayConfig {\n port?: number;\n queueServiceConfig?: {\n type: QueueServiceType;\n defaultStartPollingQueue: boolean;\n };\n}\n\n// Start server\nconst start = async (config?: LatticeGatewayConfig) => {\n try {\n const target_port = config?.port || Number(process.env.PORT) || 4001;\n\n await app.listen({ port: target_port, host: \"0.0.0.0\" });\n logger.info(`Lattice Gateway is running on port: ${target_port}`);\n\n // Configure queue service\n const queueServiceConfig = config?.queueServiceConfig;\n if (queueServiceConfig) {\n setQueueServiceType(queueServiceConfig.type);\n if (queueServiceConfig.defaultStartPollingQueue) {\n const agentTaskConsumer = new AgentTaskConsumer(target_port);\n agentTaskConsumer.startPollingQueue();\n }\n }\n } catch (err) {\n logger.error(\"Server start failed\", { error: err });\n process.exit(1);\n }\n};\n\nconst LatticeGateway = {\n startAsHttpEndpoint: start,\n configureSwagger,\n registerLatticeRoutes,\n app,\n AgentTaskConsumer,\n};\n\nexport { LatticeGateway };\n","import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n filterMessages,\n HumanMessage,\n ToolMessage,\n ToolMessageChunk,\n} from \"@langchain/core/messages\";\nimport { Command, CommandParams } from \"@langchain/langgraph\";\nimport { v4 } from \"uuid\";\n// 修改导入路径,使用 lattice_core 包\nimport {\n getAgentClient,\n getAgentLattice,\n InMemoryChunkBuffer,\n registerChunkBuffer,\n getChunkBuffer,\n hasChunkBuffer,\n} from \"@axiom-lattice/core\";\n\n/**\n * Get or create the global ChunkBuffer instance\n */\nfunction getOrCreateChunkBuffer(): InMemoryChunkBuffer {\n if (!hasChunkBuffer(\"default\")) {\n const buffer = new InMemoryChunkBuffer({\n ttl: 60 * 60 * 1000, // 1 hour TTL\n cleanupInterval: 5 * 60 * 1000, // Clean every 5 minutes\n });\n registerChunkBuffer(\"default\", buffer);\n }\n return getChunkBuffer(\"default\") as InMemoryChunkBuffer;\n}\n\nexport async function agent_invoke({\n input,\n thread_id,\n assistant_id,\n tenant_id,\n command,\n run_id,\n}: {\n assistant_id: string;\n input: any;\n thread_id: string;\n tenant_id: string;\n run_id?: string;\n command?: CommandParams<any>;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n const { message, ...rest } = input;\n const humanMessage = new HumanMessage(message || \"\");\n const messages = [humanMessage];\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n\n const result = await runnable_agent.invoke(\n command\n ? new Command(command)\n : { ...rest, messages, \"x-tenant-id\": tenant_id },\n {\n configurable: {\n thread_id: thread_id,\n run_id: run_id || v4(),\n \"x-tenant-id\": tenant_id,\n \"x-request-id\": run_id,\n \"x-thread-id\": thread_id,\n },\n recursionLimit: 200,\n }\n );\n\n const data = result.messages.map((message: BaseMessage) => {\n const { type, data } = message.toDict();\n return {\n ...data,\n role: type,\n };\n });\n return { messages: data };\n}\n\nexport async function agent_stream({\n input,\n thread_id,\n command,\n tenant_id,\n assistant_id,\n run_id,\n}: {\n assistant_id: string;\n input: any;\n thread_id: string;\n command?: CommandParams<any>;\n tenant_id: string;\n run_id?: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id) as any; // TODO: fix this\n const { files, message, ...rest } = input;\n let messages: BaseMessage[] = [];\n if (!command) {\n const humanMessage = new HumanMessage(message);\n humanMessage.additional_kwargs = { files: files };\n messages = [humanMessage];\n }\n\n // Get ChunkBuffer instance\n const chunkBuffer = getOrCreateChunkBuffer();\n\n try {\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const agentStream = await runnable_agent.stream(\n command\n ? new Command(command)\n : {\n ...rest,\n messages,\n \"x-tenant-id\": tenant_id,\n },\n\n {\n configurable: {\n thread_id: thread_id,\n run_id: run_id || v4(),\n \"x-tenant-id\": tenant_id,\n \"x-request-id\": run_id,\n \"x-thread-id\": thread_id,\n },\n streamMode: [\"updates\", \"messages\"],\n subgraphs: false,\n recursionLimit: 200,\n }\n );\n\n // 创建一个可迭代的 ReadableStream with ChunkBuffer integration\n return {\n [Symbol.asyncIterator]: async function* () {\n try {\n for await (const chunk of agentStream) {\n let data;\n let chunkContent = \"\";\n\n if (chunk[0] === \"updates\") {\n const update = chunk[1];\n const values = Object.values(update);\n const messages = (values[0] as any)?.messages;\n if (messages?.[0]?.tool_call_id) {\n data = messages[0].toDict();\n }\n } else if (chunk[0] === \"messages\") {\n const messages = chunk[1];\n // console.log(messages);\n data = messages?.[0]?.toDict();\n }\n\n if ((chunk?.[1] as any)?.__interrupt__) {\n //data = chunk?.[1]?.[0]?.toDict();\n // 原有的中断消息处理\n data = {\n type: \"interrupt\",\n id: (chunk?.[1] as any)?.__interrupt__[0].id,\n data: { content: (chunk?.[1] as any)?.__interrupt__[0].value },\n };\n }\n\n if (data) {\n //console.log(data);\n if (data.type !== \"interrupt\") {\n await chunkBuffer.addChunk(thread_id, data);\n }\n yield data;\n }\n }\n\n // Mark thread as completed when streaming finishes successfully\n await chunkBuffer.completeThread(thread_id);\n } catch (error) {\n console.error(\"Stream error:\", error);\n // Mark thread as aborted on error\n await chunkBuffer.abortThread(thread_id);\n throw error;\n }\n },\n };\n } catch (error) {\n // Mark thread as aborted on initialization error\n await chunkBuffer.abortThread(thread_id);\n throw error;\n }\n}\n\nexport async function agent_state({\n thread_id,\n assistant_id,\n}: {\n assistant_id: string;\n thread_id: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const state = await runnable_agent.getState({\n configurable: { thread_id: thread_id, subgraphs: false },\n });\n return state;\n}\n\nexport async function agent_messages({\n thread_id,\n tenant_id,\n assistant_id,\n}: {\n assistant_id: string;\n thread_id: string;\n tenant_id: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const state = await runnable_agent.getState({\n configurable: { thread_id: thread_id, subgraphs: false },\n });\n\n const messages = state.values.messages || [];\n const filteredMessages = filterMessages(messages, {\n includeTypes: [\"ai\", \"human\", \"tool\"], //[\"human\", \"ai\", \"tool\"],\n });\n\n // console.log(filteredMessages);\n\n let messagesArray = filteredMessages.map((message: BaseMessage) => ({\n id: message.id,\n role: message.getType(),\n content: message.content,\n files: message.additional_kwargs.files,\n ...message.lc_kwargs,\n }));\n\n // const action_messages = state.tasks.flatMap((task) => {\n // return task.interrupts.map((interrupt) => {\n // return {\n // role: \"ai\",\n // content: interrupt.value,\n // type: \"action\",\n // };\n // });\n // });\n\n const new_messages = messagesArray;\n // console.log(messagesArray);\n\n return new_messages;\n}\n\nexport async function draw_graph(assistant_id: string) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const drawableGraph = await runnable_agent.getGraphAsync();\n const image = await drawableGraph.drawMermaid();\n return image;\n}\n\n/**\n * Resume streaming from a known position\n * Creates an async iterator that yields new chunks as they arrive\n *\n * @param thread_id - Thread identifier\n * @param message_id - Message identifier (usually run_id)\n * @param known_content - Content already received (used to find resume position)\n * @param poll_interval - Polling interval in milliseconds (default: 100ms)\n */\nexport async function resume_stream({\n thread_id,\n message_id,\n known_content,\n poll_interval = 100,\n}: {\n thread_id: string;\n message_id: string;\n known_content: string;\n poll_interval?: number;\n}) {\n const chunkBuffer = getOrCreateChunkBuffer();\n\n const stream = await chunkBuffer.getNewChunksSinceContentIterator(\n thread_id,\n message_id,\n known_content\n );\n return {\n [Symbol.asyncIterator]: async function* () {\n try {\n for await (const chunk of stream) {\n yield chunk;\n }\n } catch (error) {\n console.error(\"Resume stream error:\", error);\n throw error;\n }\n },\n };\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport * as agentService from \"../services/agent_service\";\nimport { CreateRunRequest } from \"../types\";\nimport { v4 } from \"uuid\";\n\ninterface ResumeStreamRequest {\n thread_id: string;\n message_id: string;\n known_content: string;\n poll_interval?: number;\n}\n\n// 创建运行\nexport const createRun = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const {\n assistant_id,\n thread_id,\n command,\n streaming,\n background,\n ...input\n } = request.body as CreateRunRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const x_request_id = (request.headers[\"x-request-id\"] as string) || v4();\n\n // 验证请求数据\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n // 如果请求streaming,则agent_stream\n if (streaming) {\n // 开始运行\n const stream = await agentService.agent_stream({\n assistant_id: assistant_id,\n input: input,\n thread_id: thread_id,\n command,\n tenant_id: tenant_id,\n run_id: x_request_id,\n });\n\n // 通知 Fastify 我们将手动处理响应\n reply.hijack();\n\n // 设置 SSE 响应头\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n for await (const chunk of stream) {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n } catch (error) {\n console.error(\"Stream processing error:\", error);\n } finally {\n reply.raw.end();\n }\n } else {\n // 后台运行的情况\n const result = await agentService.agent_invoke({\n assistant_id: assistant_id,\n input: input,\n command: command,\n thread_id: thread_id,\n tenant_id: tenant_id,\n run_id: x_request_id,\n });\n reply.status(200).send(result);\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `创建运行时发生错误: ${error.message}`,\n });\n }\n};\n\n// Resume stream from known position\nexport const resumeStream = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { thread_id, message_id, known_content, poll_interval } =\n request.body as ResumeStreamRequest;\n\n // Validate request data\n if (!thread_id || !message_id || known_content === undefined) {\n reply.status(400).send({\n success: false,\n error: \"thread_id, message_id, and known_content are required\",\n });\n return;\n }\n\n // Notify Fastify that we will manually handle the response\n reply.hijack();\n\n // Set SSE response headers\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n // Get the stream from agent service\n const stream = await agentService.resume_stream({\n thread_id,\n message_id,\n known_content: known_content,\n poll_interval: poll_interval || 100,\n });\n\n // Stream the chunks to the client\n for await (const chunk of stream) {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n } catch (error) {\n console.error(\"Resume stream processing error:\", error);\n } finally {\n reply.raw.end();\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Error resuming stream: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { agent_messages, agent_state } from \"../services/agent_service\";\n\n// 设置内存项\nexport const setMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n const value = request.body;\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n if (value === undefined) {\n reply.status(400).send({\n success: false,\n error: \"值是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.setMemoryItem(assistantId, key, value);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `设置内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取内存项\nexport const getMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.getMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(404).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取所有内存项\nexport const getAllMemoryItems = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const result = await agent_messages({\n assistant_id: assistantId,\n thread_id: thread_id,\n tenant_id: tenant_id,\n });\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取所有内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取助手状态\nexport const getAgentState = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const result = await agent_state({\n assistant_id: assistantId,\n thread_id: thread_id,\n });\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取助手状态时发生错误: ${error.message}`,\n });\n }\n};\n\n// 删除内存项\nexport const deleteMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.deleteMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `删除内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 清除内存\nexport const clearMemory = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId } = request.params as { assistantId: string };\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n let result: any; //= await memoryModel.clearMemory(assistantId);\n\n if (!result.success) {\n reply.status(500).send(result);\n return;\n }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `清除内存时发生错误: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { draw_graph } from \"../services/agent_service\";\n\nexport const getAgentGraph = async (\n request: FastifyRequest<{\n Params: { assistantId: string };\n }>,\n reply: FastifyReply\n) => {\n try {\n const { assistantId } = request.params;\n\n // 调用绘图服务获取图片数据\n const imageData = await draw_graph(assistantId);\n\n // 设置响应头并返回图片数据\n reply.header(\"Content-Type\", \"application/json\").send({\n image: imageData,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: error.message || \"获取代理图表失败\",\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { AgentManager } from \"@axiom-lattice/core\";\n\n/**\n * Request body interface for triggering agent task\n */\ninterface TriggerAgentTaskRequest {\n assistant_id: string;\n thread_id: string;\n input: any;\n command?: any;\n}\n\n/**\n * Trigger an agent task\n * This endpoint triggers an agent task through the AgentManager,\n * which publishes the task to the event bus for processing\n */\nexport const triggerAgentTask = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistant_id, thread_id, input, command } =\n request.body as TriggerAgentTaskRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n\n // Validate required fields\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"assistant_id is required\",\n });\n return;\n }\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"thread_id is required\",\n });\n return;\n }\n\n // Get AgentManager instance and trigger the task\n const agentManager = AgentManager.getInstance();\n const result = await agentManager.callAgentInQueue({\n assistant_id,\n thread_id,\n input,\n command,\n \"x-tenant-id\": tenant_id,\n });\n\n reply.status(200).send({\n success: true,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Failed to trigger agent task: ${error.message}`,\n });\n }\n};\n","import { FastifySchema } from \"fastify\";\n\n// Create Run Schemas\nexport const createRunSchema: FastifySchema = {\n description: \"Create a new agent run\",\n tags: [\"Runs\"],\n summary: \"Create Agent Run\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n assistant_id: { type: \"string\", description: \"Assistant ID\" },\n message: { type: \"string\", description: \"Message data for the run\" },\n command: {\n type: \"object\",\n description: \"Command data for the run\",\n nullable: true,\n },\n streaming: {\n type: \"boolean\",\n description: \"Whether to stream the response\",\n nullable: true,\n },\n background: {\n type: \"boolean\",\n description: \"Whether to run in background\",\n nullable: true,\n },\n },\n required: [\"thread_id\", \"assistant_id\", \"message\"],\n },\n response: {\n 200: {},\n 400: {},\n },\n};\n\n// Memory Schemas\nexport const getAllMemoryItemsSchema: FastifySchema = {\n description: \"Get all memory items for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get All Memory Items\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\nexport const getAgentStateSchema: FastifySchema = {\n description: \"Get agent state for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get Agent State\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const getMemoryItemSchema: FastifySchema = {\n description: \"Get a specific memory item by key\",\n tags: [\"Memory\"],\n summary: \"Get Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const setMemoryItemSchema: FastifySchema = {\n description: \"Set or update a memory item\",\n tags: [\"Memory\"],\n summary: \"Set Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n body: {\n type: \"object\",\n description: \"Memory item data\",\n },\n response: {\n 200: {},\n },\n};\n\nexport const deleteMemoryItemSchema: FastifySchema = {\n description: \"Delete a specific memory item\",\n tags: [\"Memory\"],\n summary: \"Delete Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const clearMemorySchema: FastifySchema = {\n description: \"Clear all memory items for an assistant\",\n tags: [\"Memory\"],\n summary: \"Clear Memory\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Graph Schema\nexport const getAgentGraphSchema: FastifySchema = {\n description: \"Get agent graph visualization\",\n tags: [\"Graph\"],\n summary: \"Get Agent Graph\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Resume Stream Schema\nexport const resumeStreamSchema: FastifySchema = {\n description: \"Resume streaming from a known position\",\n tags: [\"Streaming\"],\n summary: \"Resume Stream\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n message_id: {\n type: \"string\",\n description: \"Message ID (usually run_id)\",\n },\n known_content: {\n type: \"string\",\n description: \"Content already received\",\n },\n poll_interval: {\n type: \"number\",\n description: \"Polling interval in milliseconds\",\n nullable: true,\n default: 100,\n },\n },\n required: [\"thread_id\", \"message_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\n// Trigger Agent Task Schema\nexport const triggerAgentTaskSchema: FastifySchema = {\n description: \"Trigger an agent task\",\n tags: [\"Agent Tasks\"],\n summary: \"Trigger Agent Task\",\n body: {\n type: \"object\",\n properties: {\n assistant_id: {\n type: \"string\",\n description: \"Assistant ID\",\n },\n thread_id: {\n type: \"string\",\n description: \"Thread ID\",\n },\n input: {\n type: \"object\",\n description: \"Task input data\",\n },\n command: {\n type: \"object\",\n description: \"Command data for the task\",\n nullable: true,\n },\n },\n required: [\"assistant_id\", \"thread_id\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n result: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n","import { FastifyInstance } from \"fastify\";\n//import * as assistantController from \"../controllers/assistant\";\nimport * as runController from \"../controllers/run\";\nimport * as memoryController from \"../controllers/memory\";\nimport * as graphController from \"../controllers/assistant\";\nimport * as agentTaskController from \"../controllers/agent_task\";\nimport {\n createRunSchema,\n getAllMemoryItemsSchema,\n getAgentStateSchema,\n getMemoryItemSchema,\n setMemoryItemSchema,\n deleteMemoryItemSchema,\n clearMemorySchema,\n getAgentGraphSchema,\n resumeStreamSchema,\n triggerAgentTaskSchema,\n} from \"../schemas\";\n\nexport const registerLatticeRoutes = (app: FastifyInstance): void => {\n // 运行路由\n app.post<{\n Body: any;\n }>(\"/api/runs\", runController.createRun);\n\n // Resume stream route\n app.post<{\n Body: any;\n }>(\"/api/resume_stream\", runController.resumeStream);\n\n // app.get<{\n // Params: { id: string };\n // }>(\"/api/runs/:id\", runController.getRun);\n\n // app.get<{\n // Params: { assistantId: string };\n // }>(\"/api/assistants/:assistantId/runs\", runController.getRunsByAssistant);\n\n // app.post<{\n // Params: { id: string };\n // }>(\"/api/runs/:id/cancel\", runController.cancelRun);\n\n // 内存路由\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/memory\",\n { schema: getAllMemoryItemsSchema },\n memoryController.getAllMemoryItems\n );\n\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/state\",\n { schema: getAgentStateSchema },\n memoryController.getAgentState\n );\n\n app.get<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: getMemoryItemSchema },\n memoryController.getMemoryItem\n );\n\n app.put<{\n Params: { assistantId: string; key: string };\n Body: any;\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: setMemoryItemSchema },\n memoryController.setMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: deleteMemoryItemSchema },\n memoryController.deleteMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/memory\",\n { schema: clearMemorySchema },\n memoryController.clearMemory\n );\n\n // 图表路由\n app.get<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/graph\",\n { schema: getAgentGraphSchema },\n graphController.getAgentGraph\n );\n\n // Agent Task路由\n app.post<{\n Body: any;\n }>(\n \"/api/agent-tasks/trigger\",\n { schema: triggerAgentTaskSchema },\n agentTaskController.triggerAgentTask\n );\n};\n","import pino from \"pino\";\nimport \"pino-pretty\";\nimport \"pino-roll\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\nexport interface LoggerContext {\n \"x-user-id\"?: string;\n \"x-tenant-id\"?: string;\n \"x-request-id\"?: string;\n \"x-task-id\"?: string;\n \"x-thread-id\"?: string;\n}\n\nexport interface LoggerOptions {\n name?: string;\n serviceName?: string;\n context?: LoggerContext;\n}\n\n/**\n * 单例的Pino日志工厂类,管理底层pino实例\n */\nclass PinoLoggerFactory {\n private static instance: PinoLoggerFactory;\n private pinoLogger: pino.Logger;\n\n private constructor() {\n const isProd = process.env.NODE_ENV === \"production\";\n\n const loggerConfig: pino.LoggerOptions = {\n // 自定义时间戳格式\n timestamp: () => `,\"@timestamp\":\"${new Date().toISOString()}\"`,\n\n // 关闭默认的时间戳键\n base: {\n \"@version\": \"1\",\n app_name: \"lattice\",\n service_name: \"lattice/graph-server\",\n thread_name: \"main\",\n logger_name: \"lattice-graph-logger\",\n },\n\n formatters: {\n level: (label, number) => {\n return {\n level: label.toUpperCase(),\n level_value: number * 1000,\n };\n },\n },\n };\n\n // 生产环境使用文件日志\n if (isProd) {\n try {\n this.pinoLogger = pino(\n loggerConfig,\n pino.transport({\n target: \"pino-roll\",\n options: {\n file: \"./logs/fin_ai_graph_server\",\n frequency: \"daily\",\n mkdir: true,\n },\n })\n );\n } catch (error) {\n console.error(\n \"无法初始化 pino-roll 日志记录器,回退到控制台日志\",\n error\n );\n // 回退到开发环境的配置\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n } else {\n // 开发环境使用格式化输出\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n }\n\n public static getInstance(): PinoLoggerFactory {\n if (!PinoLoggerFactory.instance) {\n PinoLoggerFactory.instance = new PinoLoggerFactory();\n }\n return PinoLoggerFactory.instance;\n }\n\n public getPinoLogger(): pino.Logger {\n return this.pinoLogger;\n }\n}\n\n/**\n * Logger类,可以创建多个实例,每个实例有自己的上下文\n */\nexport class Logger {\n private context: LoggerContext;\n private name: string;\n private serviceName: string;\n\n constructor(options?: LoggerOptions) {\n this.context = options?.context || {};\n this.name = options?.name || \"lattice-graph-logger\";\n this.serviceName = options?.serviceName || \"lattice/graph-server\";\n }\n\n /**\n * 获取合并了上下文的日志对象\n * @param additionalContext 额外的上下文数据\n * @returns 带有上下文的pino日志对象\n */\n private getContextualLogger(additionalContext?: object): pino.Logger {\n const pinoLogger = PinoLoggerFactory.getInstance().getPinoLogger();\n\n // 合并Logger实例的上下文和额外上下文\n const contextObj = {\n \"x-user-id\": this.context[\"x-user-id\"] || \"\",\n \"x-tenant-id\": this.context[\"x-tenant-id\"] || \"\",\n \"x-request-id\": this.context[\"x-request-id\"] || \"\",\n \"x-task-id\": this.context[\"x-task-id\"] || \"\",\n \"x-thread-id\": this.context[\"x-thread-id\"] || \"\",\n service_name: this.serviceName,\n logger_name: this.name,\n ...additionalContext,\n };\n\n // 创建带有上下文的子日志记录器\n return pinoLogger.child(contextObj);\n }\n\n info(msg: string, obj?: object): void {\n this.getContextualLogger(obj).info(msg);\n }\n\n error(msg: string, obj?: object | Error): void {\n this.getContextualLogger(obj).error(msg);\n }\n\n warn(msg: string, obj?: object): void {\n this.getContextualLogger(obj).warn(msg);\n }\n\n debug(msg: string, obj?: object): void {\n this.getContextualLogger(obj).debug(msg);\n }\n\n /**\n * 更新Logger实例的上下文\n */\n updateContext(context: Partial<LoggerContext>): void {\n this.context = {\n ...this.context,\n ...context,\n };\n }\n\n /**\n * 创建一个新的Logger实例,继承当前Logger的上下文\n */\n child(options: Partial<LoggerOptions>): Logger {\n return new Logger({\n name: options.name || this.name,\n serviceName: options.serviceName || this.serviceName,\n context: {\n ...this.context,\n ...options.context,\n },\n });\n }\n}\n","import { FastifyInstance } from \"fastify\";\nimport swagger from \"@fastify/swagger\";\nimport swaggerUi from \"@fastify/swagger-ui\";\n// Example usage:\n// configureSwagger(app)\n// configureSwagger(app, { openapi: { info: { version: \"2.0.0\" } } })\n// configureSwagger(app, undefined, { routePrefix: \"/docs\" })\n\n// Default swagger configuration\nexport const defaultSwaggerConfig = {\n openapi: {\n openapi: \"3.0.0\",\n info: {\n title: \"Axiom Lattice Gateway API\",\n description: \"API Gateway for LangGraph agent-based applications\",\n version: \"1.0.0\",\n contact: {\n name: \"Axiom Lattice Team\",\n email: \"support@axiom-lattice.com\",\n },\n },\n servers: [\n {\n url: \"http://localhost:4001\",\n description: \"Development environment\",\n },\n ],\n components: {\n securitySchemes: {\n bearerAuth: {\n type: \"http\" as const,\n scheme: \"bearer\" as const,\n bearerFormat: \"JWT\",\n },\n },\n },\n security: [\n {\n bearerAuth: [],\n },\n ],\n tags: [\n { name: \"Runs\", description: \"Agent run management\" },\n { name: \"Memory\", description: \"Agent memory management\" },\n { name: \"Graph\", description: \"Agent graph visualization\" },\n { name: \"Health\", description: \"System health checks\" },\n ],\n },\n};\n\n// Default swagger UI configuration\nexport const defaultSwaggerUiConfig = {\n routePrefix: \"/api-docs\",\n uiConfig: {\n docExpansion: \"full\" as const,\n deepLinking: false,\n },\n staticCSP: true,\n transformStaticCSP: (header: string) => header,\n};\n\n// Configure Swagger with optional custom configuration\nexport const configureSwagger = async (\n app: FastifyInstance,\n customSwaggerConfig?: Partial<typeof defaultSwaggerConfig>,\n customSwaggerUiConfig?: Partial<typeof defaultSwaggerUiConfig>\n) => {\n // Merge default config with custom config\n const swaggerConfig = { ...defaultSwaggerConfig, ...customSwaggerConfig };\n const swaggerUiConfig = {\n ...defaultSwaggerUiConfig,\n ...customSwaggerUiConfig,\n };\n\n await app.register(swagger, swaggerConfig);\n await app.register(swaggerUi, swaggerUiConfig);\n};\n","// Queue service adapter that uses QueueLatticeManager from core package\n// Provides backward-compatible API for gateway services\n\nimport {\n queueLatticeManager,\n registerQueueLattice,\n getQueueLattice,\n} from \"@axiom-lattice/core\";\nimport { QueueType, QueueConfig, QueueClient } from \"@axiom-lattice/protocols\";\nimport { RedisQueueClient } from \"@axiom-lattice/queue-redis\";\n\nexport type QueueServiceType = \"memory\" | \"redis\";\n\n// Default queue key\nconst DEFAULT_QUEUE_KEY = \"default\";\n\n// Global configuration for queue service type\n// Can be set via environment variable QUEUE_SERVICE_TYPE or via LatticeGateway configuration\nlet queueServiceType: QueueServiceType =\n (process.env.QUEUE_SERVICE_TYPE as QueueServiceType) || \"memory\";\n\n/**\n * Configure the queue service type\n * This will register or update the default queue service\n * @param type - \"memory\" or \"redis\"\n */\nexport const setQueueServiceType = (type: QueueServiceType): void => {\n queueServiceType = type;\n console.log(`Queue service type set to: ${type}`);\n\n // Register or update the queue service\n const queueName = process.env.QUEUE_NAME || \"tasks\";\n const config: QueueConfig = {\n name: \"Default Queue Service\",\n description: `Default ${type} queue service`,\n type: type === \"redis\" ? QueueType.REDIS : QueueType.MEMORY,\n queueName,\n options:\n type === \"redis\"\n ? {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n }\n : undefined,\n };\n\n // Remove existing queue if it exists\n if (queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n queueLatticeManager.removeLattice(DEFAULT_QUEUE_KEY);\n }\n\n // Create client for Redis type\n let client: QueueClient | undefined;\n if (type === \"redis\") {\n client = new RedisQueueClient(queueName, {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n });\n }\n\n // Register the new queue service\n registerQueueLattice(DEFAULT_QUEUE_KEY, config, client);\n};\n\n/**\n * Get the current queue service type\n */\nexport const getQueueServiceType = (): QueueServiceType => {\n return queueServiceType;\n};\n\n/**\n * Get the default queue service\n * If not registered, register it with the current configuration\n */\nconst getQueueService = () => {\n // Check if queue is already registered\n if (!queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n // Auto-register with current configuration\n setQueueServiceType(queueServiceType);\n }\n\n return getQueueLattice(DEFAULT_QUEUE_KEY);\n};\n\n/**\n * Push agent task to queue\n * @param agentTask - Agent task to push\n */\nexport const pushAgentTaskToQueue = async (agentTask: any) => {\n const queue = getQueueService();\n const result = await queue.push(agentTask);\n return result;\n};\n\n/**\n * Pop agent task from queue\n */\nexport const popAgentTaskFromQueue = async () => {\n const queue = getQueueService();\n const result = await queue.pop();\n return result;\n};\n","import { eventBus, AGENT_TASK_EVENT } from \"@axiom-lattice/core\";\nimport { popAgentTaskFromQueue } from \"./queue_service\";\nimport { agent_state } from \"./agent_service\";\n\n// 任务请求结构\nexport interface AgentTaskRequest {\n assistant_id: string;\n input: any;\n thread_id: string;\n \"x-tenant-id\": string;\n command?: any;\n callback_event?: string; // 可选的回调事件名称\n}\n\n/**\n * 处理Agent任务事件\n * @param taskRequest 任务请求\n * @param retryCount 重试次数\n */\nconst handleAgentTask = async (\n taskRequest: AgentTaskRequest,\n retryCount: number = 0\n): Promise<boolean> => {\n const {\n assistant_id,\n input = {},\n thread_id,\n \"x-tenant-id\": tenant_id,\n command,\n callback_event,\n } = taskRequest;\n\n try {\n console.log(\n `开始处理任务 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n\n // 检查API服务器是否可用\n const apiUrl = AgentTaskConsumer.agent_run_endpoint;\n\n console.log(`apiUrl: ${apiUrl}`);\n\n const response = await fetch(apiUrl, {\n method: \"POST\",\n body: JSON.stringify({\n assistant_id,\n streaming: true,\n ...input,\n thread_id,\n command,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-tenant-id\": tenant_id,\n },\n }).catch((err) => {\n console.error(`fetch请求失败: ${err.message || String(err)}`);\n throw new Error(`fetch失败: ${err.message || String(err)}`);\n });\n\n if (!response.ok) {\n throw new Error(`API请求失败: ${response.status} ${response.statusText}`);\n }\n\n // Check if response is SSE stream\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"text/event-stream\")) {\n // Handle SSE stream\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n throw new Error(\"Response body is not readable\");\n }\n\n let buffer = \"\";\n let streamEnded = false;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Stream has ended\n streamEnded = true;\n console.log(\n `SSE流已结束 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n break;\n }\n\n // // Decode the chunk and process SSE events\n // buffer += decoder.decode(value, { stream: true });\n // const lines = buffer.split(\"\\n\");\n // buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n // for (const line of lines) {\n // if (line.startsWith(\"data: \")) {\n // try {\n // const data = JSON.parse(line.slice(6));\n // // Process SSE event data here if needed\n // // You can emit events or handle the data as required\n // console.log(\"SSE event received:\", data);\n // } catch (e) {\n // // Ignore invalid JSON\n // console.warn(\"Failed to parse SSE data:\", line);\n // }\n // }\n // }\n }\n } catch (streamError) {\n console.error(\"Error reading SSE stream:\", streamError);\n throw streamError;\n } finally {\n reader.releaseLock();\n }\n\n // Stream has ended successfully\n if (callback_event) {\n const state = await agent_state({ assistant_id, thread_id });\n eventBus.publish(callback_event, {\n success: true,\n state: state,\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.log(\n `任务处理成功 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return true;\n } else {\n // Non-streaming response\n await response.text(); // Consume the response\n\n if (callback_event) {\n const state = await agent_state({ assistant_id, thread_id });\n eventBus.publish(callback_event, {\n success: true,\n state,\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.log(\n `任务处理成功 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return true;\n }\n } catch (error) {\n console.error(\n `Agent任务执行失败: ${assistant_id}, 线程: ${thread_id}`,\n error\n );\n\n // 重试逻辑,暂不用重试\n const maxRetries = 0;\n if (retryCount < maxRetries) {\n const nextRetryCount = retryCount + 1;\n const delayMs = Math.pow(2, nextRetryCount) * 1000; // 指数退避策略\n\n console.log(\n `将在 ${delayMs}ms 后重试任务 (${nextRetryCount}/${maxRetries})`\n );\n\n // 延迟后重试\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n return handleAgentTask(taskRequest, nextRetryCount);\n }\n\n if (callback_event) {\n eventBus.publish(callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.error(\n `任务处理失败,已达到最大重试次数 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return false;\n }\n};\n\n/**\n * Agent任务消费者\n * 负责监听和执行Agent任务事件,同时从队列中消费任务\n */\nexport class AgentTaskConsumer {\n private isPolling: boolean = false;\n private pollingInterval: NodeJS.Timeout | null = null;\n private pollingIntervalMs: number = 5000; // 默认5秒轮询一次\n private maxConcurrentTasks: number = 15; // 最大并发任务数\n private activeTasks: number = 0; // 当前活跃的任务数\n private processing: boolean = false; // 是否正在处理任务批次\n private immediateProcessingEnabled: boolean = true; // 是否启用即时处理模式\n public gatewayPort: number = 4001;\n public static agent_run_endpoint: string = \"http://localhost:4001/api/runs\";\n\n constructor(gatewayPort: number, pollingIntervalMs?: number) {\n this.gatewayPort = gatewayPort;\n AgentTaskConsumer.agent_run_endpoint = `http://localhost:${this.gatewayPort}/api/runs`;\n if (pollingIntervalMs) {\n this.pollingIntervalMs = pollingIntervalMs;\n }\n this.initialize();\n }\n\n /**\n * 初始化事件监听和队列轮询\n */\n private initialize(): void {\n // 监听事件总线上的任务\n eventBus.subscribe(AGENT_TASK_EVENT, this.trigger_agent_task.bind(this));\n\n // 启动队列轮询\n this.startPollingQueue();\n\n console.log(\"Agent任务消费者已启动并监听任务事件和队列\");\n }\n\n /**\n * 启动队列轮询\n */\n startPollingQueue(): void {\n if (this.isPolling) {\n return;\n }\n\n this.isPolling = true;\n\n this.pollingInterval = setInterval(async () => {\n try {\n // 如果上一批次任务还在处理中,跳过本次轮询\n if (this.processing) {\n console.log(\"队列处理中,跳过本次轮询\");\n return;\n }\n\n await this.consumeFromQueue();\n } catch (error) {\n console.error(\"队列轮询出错:\", error);\n }\n }, this.pollingIntervalMs);\n\n console.log(\n `开始轮询队列,间隔: ${this.pollingIntervalMs}ms,最大并发任务数: ${this.maxConcurrentTasks}`\n );\n }\n\n /**\n * 停止队列轮询\n */\n stopPollingQueue(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n this.pollingInterval = null;\n this.isPolling = false;\n console.log(\"已停止队列轮询\");\n }\n }\n\n /**\n * 处理单个任务并在完成后立即尝试处理下一个\n */\n async processNextTask(): Promise<boolean> {\n try {\n // 从队列中获取任务\n const queueResult = await popAgentTaskFromQueue();\n\n // 检查队列结果\n if (queueResult && queueResult.data) {\n const taskItem = queueResult.data;\n\n if (taskItem && typeof taskItem === \"object\") {\n const taskRequest = taskItem as AgentTaskRequest;\n\n console.log(\n `从队列中获取到任务 [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 增加活跃任务计数\n this.activeTasks++;\n\n // 处理任务(不使用await,允许并发执行)\n handleAgentTask(taskRequest)\n .then((success) => {\n if (!success) {\n console.error(`任务 处理失败`);\n // 可以在这里记录失败任务或执行补偿逻辑\n } else {\n console.log(`任务 处理成功`);\n }\n })\n .catch((error) => {\n console.error(`任务 处理时出错:`, error);\n })\n .finally(() => {\n // 减少活跃任务计数\n this.activeTasks--;\n\n // 如果启用了即时处理模式,尝试处理更多任务\n if (this.immediateProcessingEnabled && !this.processing) {\n this.checkQueueForTasks();\n }\n });\n\n // 任务已派发,返回true表示有任务被处理\n return true;\n } else {\n console.log(\"队列任务格式无效:\", taskItem);\n return false;\n }\n } else {\n // 队列为空\n return false;\n }\n } catch (error) {\n console.error(\"处理任务失败:\", error);\n return false;\n }\n }\n\n /**\n * 检查队列中是否有任务并处理\n */\n async checkQueueForTasks(): Promise<void> {\n // 如果已经在处理中或者并发任务已达上限,则不处理\n if (this.processing || this.activeTasks >= this.maxConcurrentTasks) {\n return;\n }\n\n this.processing = true;\n\n try {\n // 尝试获取并处理任务,直到达到并发上限\n while (this.activeTasks < this.maxConcurrentTasks) {\n const taskProcessed = await this.processNextTask();\n if (!taskProcessed) {\n // 没有更多任务,退出循环\n break;\n }\n }\n } catch (error) {\n console.error(\"检查队列任务失败:\", error);\n } finally {\n this.processing = false;\n }\n }\n\n /**\n * 从队列中消费任务\n */\n async consumeFromQueue(): Promise<void> {\n // 如果已经在处理中,跳过\n if (this.processing) {\n return;\n }\n\n // 调用任务检查方法\n await this.checkQueueForTasks();\n }\n\n /**\n * 处理通过事件触发的任务\n */\n trigger_agent_task(taskRequest: AgentTaskRequest): void {\n console.log(\n `通过事件触发任务: [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 处理任务,不阻塞事件处理流程\n handleAgentTask(taskRequest).catch((error) => {\n console.error(\"处理Agent任务时发生未捕获的错误:\", error);\n\n // 如果有回调事件,确保即使发生错误也能通知\n if (taskRequest.callback_event) {\n eventBus.publish(taskRequest.callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n config: {\n assistant_id: taskRequest.assistant_id,\n thread_id: taskRequest.thread_id,\n tenant_id: taskRequest[\"x-tenant-id\"],\n },\n });\n }\n });\n\n // 如果启用了即时处理且当前活跃任务数低于阈值,检查队列\n if (\n this.immediateProcessingEnabled &&\n this.activeTasks < this.maxConcurrentTasks\n ) {\n setImmediate(() => this.checkQueueForTasks());\n }\n }\n}\n"],"mappings":";AAAA,OAAO,aAAa;AACpB,OAAO,UAAU;AACjB,OAAO,cAAc;;;ACFrB;AAAA,EAIE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,eAA8B;AACvC,SAAS,UAAU;AAEnB;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAKP,SAAS,yBAA8C;AACrD,MAAI,CAAC,eAAe,SAAS,GAAG;AAC9B,UAAM,SAAS,IAAI,oBAAoB;AAAA,MACrC,KAAK,KAAK,KAAK;AAAA;AAAA,MACf,iBAAiB,IAAI,KAAK;AAAA;AAAA,IAC5B,CAAC;AACD,wBAAoB,WAAW,MAAM;AAAA,EACvC;AACA,SAAO,eAAe,SAAS;AACjC;AAEA,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,iBAAiB,eAAe,YAAY;AAClD,QAAM,EAAE,SAAS,GAAG,KAAK,IAAI;AAC7B,QAAM,eAAe,IAAI,aAAa,WAAW,EAAE;AACnD,QAAM,WAAW,CAAC,YAAY;AAC9B,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AAEA,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC,UACI,IAAI,QAAQ,OAAO,IACnB,EAAE,GAAG,MAAM,UAAU,eAAe,UAAU;AAAA,IAClD;AAAA,MACE,cAAc;AAAA,QACZ;AAAA,QACA,QAAQ,UAAU,GAAG;AAAA,QACrB,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,eAAe;AAAA,MACjB;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,SAAS,IAAI,CAACA,aAAyB;AACzD,UAAM,EAAE,MAAM,MAAAC,MAAK,IAAID,SAAQ,OAAO;AACtC,WAAO;AAAA,MACL,GAAGC;AAAA,MACH,MAAM;AAAA,IACR;AAAA,EACF,CAAC;AACD,SAAO,EAAE,UAAU,KAAK;AAC1B;AAEA,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,iBAAiB,eAAe,YAAY;AAClD,QAAM,EAAE,OAAO,SAAS,GAAG,KAAK,IAAI;AACpC,MAAI,WAA0B,CAAC;AAC/B,MAAI,CAAC,SAAS;AACZ,UAAM,eAAe,IAAI,aAAa,OAAO;AAC7C,iBAAa,oBAAoB,EAAE,MAAa;AAChD,eAAW,CAAC,YAAY;AAAA,EAC1B;AAGA,QAAM,cAAc,uBAAuB;AAE3C,MAAI;AACF,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,IACnD;AACA,UAAM,cAAc,MAAM,eAAe;AAAA,MACvC,UACI,IAAI,QAAQ,OAAO,IACnB;AAAA,QACE,GAAG;AAAA,QACH;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,MAEJ;AAAA,QACE,cAAc;AAAA,UACZ;AAAA,UACA,QAAQ,UAAU,GAAG;AAAA,UACrB,eAAe;AAAA,UACf,gBAAgB;AAAA,UAChB,eAAe;AAAA,QACjB;AAAA,QACA,YAAY,CAAC,WAAW,UAAU;AAAA,QAClC,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,IACF;AAGA,WAAO;AAAA,MACL,CAAC,OAAO,aAAa,GAAG,mBAAmB;AACzC,YAAI;AACF,2BAAiB,SAAS,aAAa;AACrC,gBAAI;AACJ,gBAAI,eAAe;AAEnB,gBAAI,MAAM,CAAC,MAAM,WAAW;AAC1B,oBAAM,SAAS,MAAM,CAAC;AACtB,oBAAM,SAAS,OAAO,OAAO,MAAM;AACnC,oBAAMC,YAAY,OAAO,CAAC,GAAW;AACrC,kBAAIA,YAAW,CAAC,GAAG,cAAc;AAC/B,uBAAOA,UAAS,CAAC,EAAE,OAAO;AAAA,cAC5B;AAAA,YACF,WAAW,MAAM,CAAC,MAAM,YAAY;AAClC,oBAAMA,YAAW,MAAM,CAAC;AAExB,qBAAOA,YAAW,CAAC,GAAG,OAAO;AAAA,YAC/B;AAEA,gBAAK,QAAQ,CAAC,GAAW,eAAe;AAGtC,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,IAAK,QAAQ,CAAC,GAAW,cAAc,CAAC,EAAE;AAAA,gBAC1C,MAAM,EAAE,SAAU,QAAQ,CAAC,GAAW,cAAc,CAAC,EAAE,MAAM;AAAA,cAC/D;AAAA,YACF;AAEA,gBAAI,MAAM;AAER,kBAAI,KAAK,SAAS,aAAa;AAC7B,sBAAM,YAAY,SAAS,WAAW,IAAI;AAAA,cAC5C;AACA,oBAAM;AAAA,YACR;AAAA,UACF;AAGA,gBAAM,YAAY,eAAe,SAAS;AAAA,QAC5C,SAAS,OAAO;AACd,kBAAQ,MAAM,iBAAiB,KAAK;AAEpC,gBAAM,YAAY,YAAY,SAAS;AACvC,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AAEd,UAAM,YAAY,YAAY,SAAS;AACvC,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,YAAY;AAAA,EAChC;AAAA,EACA;AACF,GAGG;AACD,QAAM,iBAAiB,eAAe,YAAY;AAClD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AACA,QAAM,QAAQ,MAAM,eAAe,SAAS;AAAA,IAC1C,cAAc,EAAE,WAAsB,WAAW,MAAM;AAAA,EACzD,CAAC;AACD,SAAO;AACT;AAEA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,iBAAiB,eAAe,YAAY;AAClD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AACA,QAAM,QAAQ,MAAM,eAAe,SAAS;AAAA,IAC1C,cAAc,EAAE,WAAsB,WAAW,MAAM;AAAA,EACzD,CAAC;AAED,QAAM,WAAW,MAAM,OAAO,YAAY,CAAC;AAC3C,QAAM,mBAAmB,eAAe,UAAU;AAAA,IAChD,cAAc,CAAC,MAAM,SAAS,MAAM;AAAA;AAAA,EACtC,CAAC;AAID,MAAI,gBAAgB,iBAAiB,IAAI,CAAC,aAA0B;AAAA,IAClE,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ,QAAQ;AAAA,IACtB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ,kBAAkB;AAAA,IACjC,GAAG,QAAQ;AAAA,EACb,EAAE;AAYF,QAAM,eAAe;AAGrB,SAAO;AACT;AAEA,eAAsB,WAAW,cAAsB;AACrD,QAAM,iBAAiB,eAAe,YAAY;AAClD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AACA,QAAM,gBAAgB,MAAM,eAAe,cAAc;AACzD,QAAM,QAAQ,MAAM,cAAc,YAAY;AAC9C,SAAO;AACT;AAWA,eAAsB,cAAc;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAClB,GAKG;AACD,QAAM,cAAc,uBAAuB;AAE3C,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL,CAAC,OAAO,aAAa,GAAG,mBAAmB;AACzC,UAAI;AACF,yBAAiB,SAAS,QAAQ;AAChC,gBAAM;AAAA,QACR;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,wBAAwB,KAAK;AAC3C,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;AClTA,SAAS,MAAAC,WAAU;AAUZ,IAAM,YAAY,OACvB,SACA,UACkB;AAClB,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,IAAI,QAAQ;AAEZ,UAAM,YAAY,QAAQ,QAAQ,aAAa;AAC/C,UAAM,eAAgB,QAAQ,QAAQ,cAAc,KAAgBA,IAAG;AAGvE,QAAI,CAAC,cAAc;AACjB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAGA,QAAI,WAAW;AAEb,YAAM,SAAS,MAAmB,aAAa;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAGD,YAAM,OAAO;AAGb,YAAM,IAAI,UAAU,KAAK;AAAA,QACvB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,+BAA+B;AAAA,MACjC,CAAC;AAED,UAAI;AACF,yBAAiB,SAAS,QAAQ;AAChC,gBAAM,IAAI,MAAM,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA,CAAM;AAAA,QACtD;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,4BAA4B,KAAK;AAAA,MACjD,UAAE;AACA,cAAM,IAAI,IAAI;AAAA,MAChB;AAAA,IACF,OAAO;AAEL,YAAM,SAAS,MAAmB,aAAa;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAAA,IAC/B;AAAA,EACF,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,2DAAc,MAAM,OAAO;AAAA,IACpC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,eAAe,OAC1B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,WAAW,YAAY,eAAe,cAAc,IAC1D,QAAQ;AAGV,QAAI,CAAC,aAAa,CAAC,cAAc,kBAAkB,QAAW;AAC5D,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAGA,UAAM,OAAO;AAGb,UAAM,IAAI,UAAU,KAAK;AAAA,MACvB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,+BAA+B;AAAA,IACjC,CAAC;AAED,QAAI;AAEF,YAAM,SAAS,MAAmB,cAAc;AAAA,QAC9C;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,iBAAiB;AAAA,MAClC,CAAC;AAGD,uBAAiB,SAAS,QAAQ;AAChC,cAAM,IAAI,MAAM,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA,CAAM;AAAA,MACtD;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,mCAAmC,KAAK;AAAA,IACxD,UAAE;AACA,YAAM,IAAI,IAAI;AAAA,IAChB;AAAA,EACF,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,0BAA0B,MAAM,OAAO;AAAA,IAChD,CAAC;AAAA,EACH;AACF;;;AC5IO,IAAM,gBAAgB,OAC3B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,IAAI,QAAQ;AAIrC,UAAM,QAAQ,QAAQ;AAEtB,QAAI,CAAC,eAAe,CAAC,KAAK;AACxB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI,UAAU,QAAW;AACvB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAKA,UAAM,OAAO,GAAG,EAAE,KAAK;AACvB;AAAA,EAIF,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,iEAAe,MAAM,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,gBAAgB,OAC3B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,IAAI,QAAQ;AAKrC,QAAI,CAAC,eAAe,CAAC,KAAK;AACxB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAKA,UAAM,OAAO,GAAG,EAAE,KAAK;AACvB;AAAA,EAIF,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,iEAAe,MAAM,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,oBAAoB,OAC/B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,UAAU,IAAI,QAAQ;AAI3C,UAAM,YAAY,QAAQ,QAAQ,aAAa;AAE/C,QAAI,CAAC,WAAW;AACd,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,eAAe;AAAA,MAClC,cAAc;AAAA,MACd;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAQ;AACX,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAC7B;AAAA,IACF;AAEA,UAAM,KAAK,MAAM;AAAA,EACnB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,6EAAiB,MAAM,OAAO;AAAA,IACvC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,gBAAgB,OAC3B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,UAAU,IAAI,QAAQ;AAK3C,QAAI,CAAC,WAAW;AACd,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,YAAY;AAAA,MAC/B,cAAc;AAAA,MACd;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAQ;AACX,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAC7B;AAAA,IACF;AAEA,UAAM,KAAK,MAAM;AAAA,EACnB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,uEAAgB,MAAM,OAAO;AAAA,IACtC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,mBAAmB,OAC9B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,IAAI,QAAQ;AAKrC,QAAI,CAAC,eAAe,CAAC,KAAK;AACxB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAKA,UAAM,OAAO,GAAG,EAAE,KAAK;AACvB;AAGA,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,EACzB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,iEAAe,MAAM,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,cAAc,OACzB,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,YAAY,IAAI,QAAQ;AAEhC,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI;AAEJ,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAC7B;AAAA,IACF;AAEA,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,EACzB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,2DAAc,MAAM,OAAO;AAAA,IACpC,CAAC;AAAA,EACH;AACF;;;AC9OO,IAAM,gBAAgB,OAC3B,SAGA,UACG;AACH,MAAI;AACF,UAAM,EAAE,YAAY,IAAI,QAAQ;AAGhC,UAAM,YAAY,MAAM,WAAW,WAAW;AAG9C,UAAM,OAAO,gBAAgB,kBAAkB,EAAE,KAAK;AAAA,MACpD,OAAO;AAAA,IACT,CAAC;AAAA,EACH,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,MAAM,WAAW;AAAA,IAC1B,CAAC;AAAA,EACH;AACF;;;ACxBA,SAAS,oBAAoB;AAiBtB,IAAM,mBAAmB,OAC9B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,cAAc,WAAW,OAAO,QAAQ,IAC9C,QAAQ;AAEV,UAAM,YAAY,QAAQ,QAAQ,aAAa;AAG/C,QAAI,CAAC,cAAc;AACjB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,WAAW;AACd,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAGA,UAAM,eAAe,aAAa,YAAY;AAC9C,UAAM,SAAS,MAAM,aAAa,iBAAiB;AAAA,MACjD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AAED,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,IACX,CAAC;AAAA,EACH,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,iCAAiC,MAAM,OAAO;AAAA,IACvD,CAAC;AAAA,EACH;AACF;;;AC1BO,IAAM,0BAAyC;AAAA,EACpD,aAAa;AAAA,EACb,MAAM,CAAC,QAAQ;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,MAC3D,WAAW,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,IACxD;AAAA,IACA,UAAU,CAAC,eAAe,WAAW;AAAA,EACvC;AAAA,EACA,UAAU;AAAA,IACR,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,EACR;AACF;AAEO,IAAM,sBAAqC;AAAA,EAChD,aAAa;AAAA,EACb,MAAM,CAAC,QAAQ;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,MAC3D,WAAW,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,IACxD;AAAA,IACA,UAAU,CAAC,eAAe,WAAW;AAAA,EACvC;AAAA,EACA,UAAU;AAAA,IACR,KAAK,CAAC;AAAA,EACR;AACF;AAEO,IAAM,sBAAqC;AAAA,EAChD,aAAa;AAAA,EACb,MAAM,CAAC,QAAQ;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,MAC3D,KAAK,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,IACnD;AAAA,IACA,UAAU,CAAC,eAAe,KAAK;AAAA,EACjC;AAAA,EACA,UAAU;AAAA,IACR,KAAK,CAAC;AAAA,EACR;AACF;AAEO,IAAM,sBAAqC;AAAA,EAChD,aAAa;AAAA,EACb,MAAM,CAAC,QAAQ;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,MAC3D,KAAK,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,IACnD;AAAA,IACA,UAAU,CAAC,eAAe,KAAK;AAAA,EACjC;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,KAAK,CAAC;AAAA,EACR;AACF;AAEO,IAAM,yBAAwC;AAAA,EACnD,aAAa;AAAA,EACb,MAAM,CAAC,QAAQ;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,MAC3D,KAAK,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,IACnD;AAAA,IACA,UAAU,CAAC,eAAe,KAAK;AAAA,EACjC;AAAA,EACA,UAAU;AAAA,IACR,KAAK,CAAC;AAAA,EACR;AACF;AAEO,IAAM,oBAAmC;AAAA,EAC9C,aAAa;AAAA,EACb,MAAM,CAAC,QAAQ;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,IAC7D;AAAA,IACA,UAAU,CAAC,aAAa;AAAA,EAC1B;AAAA,EACA,UAAU;AAAA,IACR,KAAK,CAAC;AAAA,EACR;AACF;AAGO,IAAM,sBAAqC;AAAA,EAChD,aAAa;AAAA,EACb,MAAM,CAAC,OAAO;AAAA,EACd,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,IAC7D;AAAA,IACA,UAAU,CAAC,aAAa;AAAA,EAC1B;AAAA,EACA,UAAU;AAAA,IACR,KAAK,CAAC;AAAA,EACR;AACF;AAoCO,IAAM,yBAAwC;AAAA,EACnD,aAAa;AAAA,EACb,MAAM,CAAC,aAAa;AAAA,EACpB,SAAS;AAAA,EACT,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,MACV,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,UAAU,CAAC,gBAAgB,WAAW;AAAA,EACxC;AAAA,EACA,UAAU;AAAA,IACR,KAAK;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU;AAAA,QAC3B,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU;AAAA,QAC3B,OAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU;AAAA,QAC3B,OAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;;;ACnOO,IAAM,wBAAwB,CAACC,SAA+B;AAEnE,EAAAA,KAAI,KAED,aAA2B,SAAS;AAGvC,EAAAA,KAAI,KAED,sBAAoC,YAAY;AAenD,EAAAA,KAAI;AAAA,IAGF;AAAA,IACA,EAAE,QAAQ,wBAAwB;AAAA,IACjB;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACA,EAAE,QAAQ,oBAAoB;AAAA,IACb;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACA,EAAE,QAAQ,oBAAoB;AAAA,IACb;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAIF;AAAA,IACA,EAAE,QAAQ,oBAAoB;AAAA,IACb;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACA,EAAE,QAAQ,uBAAuB;AAAA,IAChB;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACA,EAAE,QAAQ,kBAAkB;AAAA,IACX;AAAA,EACnB;AAGA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACA,EAAE,QAAQ,oBAAoB;AAAA,IACd;AAAA,EAClB;AAGA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACA,EAAE,QAAQ,uBAAuB;AAAA,IACb;AAAA,EACtB;AACF;;;AC7GA,OAAO,UAAU;AACjB,OAAO;AACP,OAAO;AAoBP,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EAId,cAAc;AACpB,UAAM,SAAS,QAAQ,IAAI,aAAa;AAExC,UAAM,eAAmC;AAAA;AAAA,MAEvC,WAAW,MAAM,mBAAkB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA,MAG3D,MAAM;AAAA,QACJ,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,cAAc;AAAA,QACd,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AAAA,MAEA,YAAY;AAAA,QACV,OAAO,CAAC,OAAO,WAAW;AACxB,iBAAO;AAAA,YACL,OAAO,MAAM,YAAY;AAAA,YACzB,aAAa,SAAS;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ;AACV,UAAI;AACF,aAAK,aAAa;AAAA,UAChB;AAAA,UACA,KAAK,UAAU;AAAA,YACb,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,MAAM;AAAA,cACN,WAAW;AAAA,cACX,OAAO;AAAA,YACT;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAEA,aAAK,aAAa,KAAK;AAAA,UACrB,GAAG;AAAA,UACH,WAAW;AAAA,YACT,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AAEL,WAAK,aAAa,KAAK;AAAA,QACrB,GAAG;AAAA,QACH,WAAW;AAAA,UACT,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAc,cAAiC;AAC7C,QAAI,CAAC,mBAAkB,UAAU;AAC/B,yBAAkB,WAAW,IAAI,mBAAkB;AAAA,IACrD;AACA,WAAO,mBAAkB;AAAA,EAC3B;AAAA,EAEO,gBAA6B;AAClC,WAAO,KAAK;AAAA,EACd;AACF;AAKO,IAAM,SAAN,MAAM,QAAO;AAAA,EAKlB,YAAY,SAAyB;AACnC,SAAK,UAAU,SAAS,WAAW,CAAC;AACpC,SAAK,OAAO,SAAS,QAAQ;AAC7B,SAAK,cAAc,SAAS,eAAe;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,mBAAyC;AACnE,UAAM,aAAa,kBAAkB,YAAY,EAAE,cAAc;AAGjE,UAAM,aAAa;AAAA,MACjB,aAAa,KAAK,QAAQ,WAAW,KAAK;AAAA,MAC1C,eAAe,KAAK,QAAQ,aAAa,KAAK;AAAA,MAC9C,gBAAgB,KAAK,QAAQ,cAAc,KAAK;AAAA,MAChD,aAAa,KAAK,QAAQ,WAAW,KAAK;AAAA,MAC1C,eAAe,KAAK,QAAQ,aAAa,KAAK;AAAA,MAC9C,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,GAAG;AAAA,IACL;AAGA,WAAO,WAAW,MAAM,UAAU;AAAA,EACpC;AAAA,EAEA,KAAK,KAAa,KAAoB;AACpC,SAAK,oBAAoB,GAAG,EAAE,KAAK,GAAG;AAAA,EACxC;AAAA,EAEA,MAAM,KAAa,KAA4B;AAC7C,SAAK,oBAAoB,GAAG,EAAE,MAAM,GAAG;AAAA,EACzC;AAAA,EAEA,KAAK,KAAa,KAAoB;AACpC,SAAK,oBAAoB,GAAG,EAAE,KAAK,GAAG;AAAA,EACxC;AAAA,EAEA,MAAM,KAAa,KAAoB;AACrC,SAAK,oBAAoB,GAAG,EAAE,MAAM,GAAG;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAuC;AACnD,SAAK,UAAU;AAAA,MACb,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAyC;AAC7C,WAAO,IAAI,QAAO;AAAA,MAChB,MAAM,QAAQ,QAAQ,KAAK;AAAA,MAC3B,aAAa,QAAQ,eAAe,KAAK;AAAA,MACzC,SAAS;AAAA,QACP,GAAG,KAAK;AAAA,QACR,GAAG,QAAQ;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACxLA,OAAO,aAAa;AACpB,OAAO,eAAe;AAOf,IAAM,uBAAuB;AAAA,EAClC,SAAS;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,KAAK;AAAA,QACL,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,YAAY;AAAA,MACV,iBAAiB;AAAA,QACf,YAAY;AAAA,UACV,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,EAAE,MAAM,QAAQ,aAAa,uBAAuB;AAAA,MACpD,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,MACzD,EAAE,MAAM,SAAS,aAAa,4BAA4B;AAAA,MAC1D,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,IACxD;AAAA,EACF;AACF;AAGO,IAAM,yBAAyB;AAAA,EACpC,aAAa;AAAA,EACb,UAAU;AAAA,IACR,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AAAA,EACA,WAAW;AAAA,EACX,oBAAoB,CAAC,WAAmB;AAC1C;AAGO,IAAM,mBAAmB,OAC9BC,MACA,qBACA,0BACG;AAEH,QAAM,gBAAgB,EAAE,GAAG,sBAAsB,GAAG,oBAAoB;AACxE,QAAM,kBAAkB;AAAA,IACtB,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,QAAMA,KAAI,SAAS,SAAS,aAAa;AACzC,QAAMA,KAAI,SAAS,WAAW,eAAe;AAC/C;;;ACzEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAA2C;AACpD,SAAS,wBAAwB;AAKjC,IAAM,oBAAoB;AAI1B,IAAI,mBACD,QAAQ,IAAI,sBAA2C;AAOnD,IAAM,sBAAsB,CAAC,SAAiC;AACnE,qBAAmB;AACnB,UAAQ,IAAI,8BAA8B,IAAI,EAAE;AAGhD,QAAM,YAAY,QAAQ,IAAI,cAAc;AAC5C,QAAM,SAAsB;AAAA,IAC1B,MAAM;AAAA,IACN,aAAa,WAAW,IAAI;AAAA,IAC5B,MAAM,SAAS,UAAU,UAAU,QAAQ,UAAU;AAAA,IACrD;AAAA,IACA,SACE,SAAS,UACL;AAAA,MACE,UAAU,QAAQ,IAAI;AAAA,MACtB,eAAe,QAAQ,IAAI;AAAA,IAC7B,IACA;AAAA,EACR;AAGA,MAAI,oBAAoB,WAAW,iBAAiB,GAAG;AACrD,wBAAoB,cAAc,iBAAiB;AAAA,EACrD;AAGA,MAAI;AACJ,MAAI,SAAS,SAAS;AACpB,aAAS,IAAI,iBAAiB,WAAW;AAAA,MACvC,UAAU,QAAQ,IAAI;AAAA,MACtB,eAAe,QAAQ,IAAI;AAAA,IAC7B,CAAC;AAAA,EACH;AAGA,uBAAqB,mBAAmB,QAAQ,MAAM;AACxD;AAaA,IAAM,kBAAkB,MAAM;AAE5B,MAAI,CAAC,oBAAoB,WAAW,iBAAiB,GAAG;AAEtD,wBAAoB,gBAAgB;AAAA,EACtC;AAEA,SAAO,gBAAgB,iBAAiB;AAC1C;AAeO,IAAM,wBAAwB,YAAY;AAC/C,QAAM,QAAQ,gBAAgB;AAC9B,QAAM,SAAS,MAAM,MAAM,IAAI;AAC/B,SAAO;AACT;;;ACtGA,SAAS,UAAU,wBAAwB;AAmB3C,IAAM,kBAAkB,OACtB,aACA,aAAqB,MACA;AACrB,QAAM;AAAA,IACJ;AAAA,IACA,QAAQ,CAAC;AAAA,IACT;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI;AACF,YAAQ;AAAA,MACN,uDAAyB,YAAY,gBAAgB,SAAS;AAAA,IAChE;AAGA,UAAM,SAAS,kBAAkB;AAEjC,YAAQ,IAAI,WAAW,MAAM,EAAE;AAE/B,UAAM,WAAW,MAAM,MAAM,QAAQ;AAAA,MACnC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,WAAW;AAAA,QACX,GAAG;AAAA,QACH;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe;AAAA,MACjB;AAAA,IACF,CAAC,EAAE,MAAM,CAAC,QAAQ;AAChB,cAAQ,MAAM,kCAAc,IAAI,WAAW,OAAO,GAAG,CAAC,EAAE;AACxD,YAAM,IAAI,MAAM,sBAAY,IAAI,WAAW,OAAO,GAAG,CAAC,EAAE;AAAA,IAC1D,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,gCAAY,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,IACtE;AAGA,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,QAAI,aAAa,SAAS,mBAAmB,GAAG;AAE9C,YAAM,SAAS,SAAS,MAAM,UAAU;AACxC,YAAM,UAAU,IAAI,YAAY;AAEhC,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAEA,UAAI,SAAS;AACb,UAAI,cAAc;AAElB,UAAI;AACF,eAAO,MAAM;AACX,gBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,cAAI,MAAM;AAER,0BAAc;AACd,oBAAQ;AAAA,cACN,8CAA0B,YAAY,gBAAgB,SAAS;AAAA,YACjE;AACA;AAAA,UACF;AAAA,QAoBF;AAAA,MACF,SAAS,aAAa;AACpB,gBAAQ,MAAM,6BAA6B,WAAW;AACtD,cAAM;AAAA,MACR,UAAE;AACA,eAAO,YAAY;AAAA,MACrB;AAGA,UAAI,gBAAgB;AAClB,cAAM,QAAQ,MAAM,YAAY,EAAE,cAAc,UAAU,CAAC;AAC3D,iBAAS,QAAQ,gBAAgB;AAAA,UAC/B,SAAS;AAAA,UACT;AAAA,UACA,QAAQ,EAAE,cAAc,WAAW,UAAU;AAAA,QAC/C,CAAC;AAAA,MACH;AAEA,cAAQ;AAAA,QACN,uDAAyB,YAAY,gBAAgB,SAAS;AAAA,MAChE;AACA,aAAO;AAAA,IACT,OAAO;AAEL,YAAM,SAAS,KAAK;AAEpB,UAAI,gBAAgB;AAClB,cAAM,QAAQ,MAAM,YAAY,EAAE,cAAc,UAAU,CAAC;AAC3D,iBAAS,QAAQ,gBAAgB;AAAA,UAC/B,SAAS;AAAA,UACT;AAAA,UACA,QAAQ,EAAE,cAAc,WAAW,UAAU;AAAA,QAC/C,CAAC;AAAA,MACH;AAEA,cAAQ;AAAA,QACN,uDAAyB,YAAY,gBAAgB,SAAS;AAAA,MAChE;AACA,aAAO;AAAA,IACT;AAAA,EACF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,8CAAgB,YAAY,mBAAS,SAAS;AAAA,MAC9C;AAAA,IACF;AAGA,UAAM,aAAa;AACnB,QAAI,aAAa,YAAY;AAC3B,YAAM,iBAAiB,aAAa;AACpC,YAAM,UAAU,KAAK,IAAI,GAAG,cAAc,IAAI;AAE9C,cAAQ;AAAA,QACN,gBAAM,OAAO,sCAAa,cAAc,IAAI,UAAU;AAAA,MACxD;AAGA,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAC3D,aAAO,gBAAgB,aAAa,cAAc;AAAA,IACpD;AAEA,QAAI,gBAAgB;AAClB,eAAS,QAAQ,gBAAgB;AAAA,QAC/B,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC5D,QAAQ,EAAE,cAAc,WAAW,UAAU;AAAA,MAC/C,CAAC;AAAA,IACH;AAEA,YAAQ;AAAA,MACN,mHAAmC,YAAY,gBAAgB,SAAS;AAAA,IAC1E;AACA,WAAO;AAAA,EACT;AACF;AAMO,IAAM,qBAAN,MAAM,mBAAkB;AAAA,EAW7B,YAAY,aAAqB,mBAA4B;AAV7D,SAAQ,YAAqB;AAC7B,SAAQ,kBAAyC;AACjD,SAAQ,oBAA4B;AACpC;AAAA,SAAQ,qBAA6B;AACrC;AAAA,SAAQ,cAAsB;AAC9B;AAAA,SAAQ,aAAsB;AAC9B;AAAA,SAAQ,6BAAsC;AAC9C;AAAA,SAAO,cAAsB;AAI3B,SAAK,cAAc;AACnB,uBAAkB,qBAAqB,oBAAoB,KAAK,WAAW;AAC3E,QAAI,mBAAmB;AACrB,WAAK,oBAAoB;AAAA,IAC3B;AACA,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAmB;AAEzB,aAAS,UAAU,kBAAkB,KAAK,mBAAmB,KAAK,IAAI,CAAC;AAGvE,SAAK,kBAAkB;AAEvB,YAAQ,IAAI,mHAAyB;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA0B;AACxB,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AAEA,SAAK,YAAY;AAEjB,SAAK,kBAAkB,YAAY,YAAY;AAC7C,UAAI;AAEF,YAAI,KAAK,YAAY;AACnB,kBAAQ,IAAI,0EAAc;AAC1B;AAAA,QACF;AAEA,cAAM,KAAK,iBAAiB;AAAA,MAC9B,SAAS,OAAO;AACd,gBAAQ,MAAM,yCAAW,KAAK;AAAA,MAChC;AAAA,IACF,GAAG,KAAK,iBAAiB;AAEzB,YAAQ;AAAA,MACN,2DAAc,KAAK,iBAAiB,uDAAe,KAAK,kBAAkB;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAyB;AACvB,QAAI,KAAK,iBAAiB;AACxB,oBAAc,KAAK,eAAe;AAClC,WAAK,kBAAkB;AACvB,WAAK,YAAY;AACjB,cAAQ,IAAI,4CAAS;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAoC;AACxC,QAAI;AAEF,YAAM,cAAc,MAAM,sBAAsB;AAGhD,UAAI,eAAe,YAAY,MAAM;AACnC,cAAM,WAAW,YAAY;AAE7B,YAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,gBAAM,cAAc;AAEpB,kBAAQ;AAAA,YACN,sEAAyB,YAAY,YAAY,aAAa,YAAY,SAAS;AAAA,UACrF;AAGA,eAAK;AAGL,0BAAgB,WAAW,EACxB,KAAK,CAAC,YAAY;AACjB,gBAAI,CAAC,SAAS;AACZ,sBAAQ,MAAM,uCAAS;AAAA,YAEzB,OAAO;AACL,sBAAQ,IAAI,uCAAS;AAAA,YACvB;AAAA,UACF,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,oBAAQ,MAAM,gDAAa,KAAK;AAAA,UAClC,CAAC,EACA,QAAQ,MAAM;AAEb,iBAAK;AAGL,gBAAI,KAAK,8BAA8B,CAAC,KAAK,YAAY;AACvD,mBAAK,mBAAmB;AAAA,YAC1B;AAAA,UACF,CAAC;AAGH,iBAAO;AAAA,QACT,OAAO;AACL,kBAAQ,IAAI,qDAAa,QAAQ;AACjC,iBAAO;AAAA,QACT;AAAA,MACF,OAAO;AAEL,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,yCAAW,KAAK;AAC9B,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAoC;AAExC,QAAI,KAAK,cAAc,KAAK,eAAe,KAAK,oBAAoB;AAClE;AAAA,IACF;AAEA,SAAK,aAAa;AAElB,QAAI;AAEF,aAAO,KAAK,cAAc,KAAK,oBAAoB;AACjD,cAAM,gBAAgB,MAAM,KAAK,gBAAgB;AACjD,YAAI,CAAC,eAAe;AAElB;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,qDAAa,KAAK;AAAA,IAClC,UAAE;AACA,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAkC;AAEtC,QAAI,KAAK,YAAY;AACnB;AAAA,IACF;AAGA,UAAM,KAAK,mBAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,aAAqC;AACtD,YAAQ;AAAA,MACN,iEAAyB,YAAY,YAAY,aAAa,YAAY,SAAS;AAAA,IACrF;AAGA,oBAAgB,WAAW,EAAE,MAAM,CAAC,UAAU;AAC5C,cAAQ,MAAM,wFAAuB,KAAK;AAG1C,UAAI,YAAY,gBAAgB;AAC9B,iBAAS,QAAQ,YAAY,gBAAgB;AAAA,UAC3C,SAAS;AAAA,UACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC5D,QAAQ;AAAA,YACN,cAAc,YAAY;AAAA,YAC1B,WAAW,YAAY;AAAA,YACvB,WAAW,YAAY,aAAa;AAAA,UACtC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAGD,QACE,KAAK,8BACL,KAAK,cAAc,KAAK,oBACxB;AACA,mBAAa,MAAM,KAAK,mBAAmB,CAAC;AAAA,IAC9C;AAAA,EACF;AACF;AAjNa,mBASG,qBAA6B;AATtC,IAAM,oBAAN;;;AXhLP,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,YAAY;AACpD,UAAQ,MAAM,gDAAkB,MAAM;AAExC,CAAC;AAGD,IAAM,SAAS,IAAI,OAAO;AAAA,EACxB,aAAa;AAAA,EACb,MAAM;AACR,CAAC;AAGD,IAAM,MAAM,QAAQ;AAAA,EAClB,QAAQ;AAAA;AACV,CAAC;AAGD,IAAI,QAAQ,aAAa,CAAC,SAAS,OAAO,SAAS;AACjD,QAAM,UAAU;AAAA,IACd,eAAe,QAAQ,QAAQ,aAAa;AAAA,IAC5C,gBAAgB,QAAQ,QAAQ,cAAc;AAAA,EAChD;AACA,OAAK;AACP,CAAC;AAED,IAAI,QAAQ,cAAc,CAAC,SAAS,OAAO,SAAS;AAClD,QAAM,UAAU;AAAA,IACd,eAAe,QAAQ,QAAQ,aAAa;AAAA,IAC5C,gBAAgB,QAAQ,QAAQ,cAAc;AAAA,EAChD;AACA,OAAK;AACP,CAAC;AAGD,IAAI,SAAS,MAAM;AAAA,EACjB,QAAQ;AAAA,EACR,SAAS,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS;AAAA,EACnD,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB,CAAC,cAAc;AAAA,EAC/B,aAAa;AACf,CAAC;AACD,IAAI,SAAS,QAAQ;AAGrB,IAAI,gBAAgB,CAAC,OAAO,SAAS,UAAU;AAC7C,QAAM,UAAU;AAAA,IACd,eAAe,QAAQ,QAAQ,aAAa;AAAA,IAC5C,gBAAgB,QAAQ,QAAQ,cAAc;AAAA,EAChD;AACA,SAAO;AAAA,IACL,6BAAS,QAAQ,MAAM,IAAI,QAAQ,GAAG,UAAU,MAAM,OAAO;AAAA,IAC7D;AAAA,MACE,GAAG;AAAA,MACH,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,MACb,YAAY,MAAM,cAAc;AAAA,IAClC;AAAA,EACF;AACA,QAAM,OAAO,MAAM,cAAc,GAAG,EAAE,KAAK;AAAA,IACzC,SAAS;AAAA,IACT,OAAO,MAAM,WAAW;AAAA,EAC1B,CAAC;AACH,CAAC;AAGD,IAAI,SAAS,UAAU,MAAM;AAY7B,IAAM,QAAQ,OAAO,WAAkC;AACrD,MAAI;AACF,UAAM,cAAc,QAAQ,QAAQ,OAAO,QAAQ,IAAI,IAAI,KAAK;AAEhE,UAAM,IAAI,OAAO,EAAE,MAAM,aAAa,MAAM,UAAU,CAAC;AACvD,WAAO,KAAK,uCAAuC,WAAW,EAAE;AAGhE,UAAM,qBAAqB,QAAQ;AACnC,QAAI,oBAAoB;AACtB,0BAAoB,mBAAmB,IAAI;AAC3C,UAAI,mBAAmB,0BAA0B;AAC/C,cAAM,oBAAoB,IAAI,kBAAkB,WAAW;AAC3D,0BAAkB,kBAAkB;AAAA,MACtC;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,uBAAuB,EAAE,OAAO,IAAI,CAAC;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,IAAM,iBAAiB;AAAA,EACrB,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":["message","data","messages","v4","app","app"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/services/agent_service.ts","../src/controllers/run.ts","../src/controllers/memory.ts","../src/controllers/assistant.ts","../src/controllers/agent_task.ts","../src/schemas/index.ts","../src/routes/index.ts","../src/logger/Logger.ts","../src/swagger.ts","../src/services/queue_service.ts","../src/services/agent_task_consumer.ts"],"sourcesContent":["import fastify from \"fastify\";\nimport cors from \"@fastify/cors\";\nimport sensible from \"@fastify/sensible\";\nimport { registerLatticeRoutes } from \"./routes\";\n// 导入自定义 Logger 类\nimport { Logger } from \"./logger/Logger\";\nimport { configureSwagger } from \"./swagger\";\nimport {\n setQueueServiceType,\n QueueServiceType,\n} from \"./services/queue_service\";\nimport { AgentTaskConsumer } from \"./services/agent_task_consumer\";\n\nprocess.on(\"unhandledRejection\", (reason, promise) => {\n console.error(\"未处理的Promise拒绝:\", reason);\n // 可以在这里进行日志记录或其他处理\n});\n\n// 创建自定义日志记录器\nconst logger = new Logger({\n serviceName: \"lattice-gateway\",\n name: \"fastify-server\",\n});\n\n// 创建 Fastify 应用\nconst app = fastify({\n logger: false, // 禁用内置日志记录器\n});\n\n// 添加自定义日志记录\napp.addHook(\"onRequest\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n done();\n});\n\napp.addHook(\"onResponse\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n done();\n});\n\n// cors\napp.register(cors, {\n origin: true,\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\"],\n allowedHeaders: [\n \"Content-Type\",\n \"Authorization\",\n \"X-Requested-With\",\n \"x-tenant-id\",\n \"x-request-id\",\n ],\n exposedHeaders: [\"Content-Type\"],\n credentials: true,\n});\napp.register(sensible);\n\n// 错误处理\napp.setErrorHandler((error, request, reply) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n logger.error(\n `请求错误: ${request.method} ${request.url} error:${error.message}`,\n {\n ...context,\n error: error.message,\n stack: error.stack,\n statusCode: error.statusCode || 500,\n }\n );\n reply.status(error.statusCode || 500).send({\n success: false,\n error: error.message || \"服务器内部错误\",\n });\n});\n\n// 将日志记录器添加到应用实例中,以便在路由中使用\napp.decorate(\"logger\", logger);\n\n// Gateway configuration interface\nexport interface LatticeGatewayConfig {\n port?: number;\n queueServiceConfig?: {\n type: QueueServiceType;\n defaultStartPollingQueue: boolean;\n };\n}\n\n// Start server\nconst start = async (config?: LatticeGatewayConfig) => {\n try {\n const target_port = config?.port || Number(process.env.PORT) || 4001;\n\n await app.listen({ port: target_port, host: \"0.0.0.0\" });\n logger.info(`Lattice Gateway is running on port: ${target_port}`);\n\n // Configure queue service\n const queueServiceConfig = config?.queueServiceConfig;\n if (queueServiceConfig) {\n setQueueServiceType(queueServiceConfig.type);\n if (queueServiceConfig.defaultStartPollingQueue) {\n const agentTaskConsumer = new AgentTaskConsumer(target_port);\n agentTaskConsumer.startPollingQueue();\n }\n }\n } catch (err) {\n logger.error(\"Server start failed\", { error: err });\n process.exit(1);\n }\n};\n\nconst LatticeGateway = {\n startAsHttpEndpoint: start,\n configureSwagger,\n registerLatticeRoutes,\n app,\n AgentTaskConsumer,\n};\n\nexport { LatticeGateway };\n","import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n filterMessages,\n HumanMessage,\n ToolMessage,\n ToolMessageChunk,\n} from \"@langchain/core/messages\";\nimport { Command, CommandParams } from \"@langchain/langgraph\";\nimport { v4 } from \"uuid\";\n// 修改导入路径,使用 lattice_core 包\nimport {\n getAgentClient,\n getAgentLattice,\n InMemoryChunkBuffer,\n registerChunkBuffer,\n getChunkBuffer,\n hasChunkBuffer,\n} from \"@axiom-lattice/core\";\n\n/**\n * Get or create the global ChunkBuffer instance\n */\nfunction getOrCreateChunkBuffer(): InMemoryChunkBuffer {\n if (!hasChunkBuffer(\"default\")) {\n const buffer = new InMemoryChunkBuffer({\n ttl: 60 * 60 * 1000, // 1 hour TTL\n cleanupInterval: 5 * 60 * 1000, // Clean every 5 minutes\n });\n registerChunkBuffer(\"default\", buffer);\n }\n return getChunkBuffer(\"default\") as InMemoryChunkBuffer;\n}\n\nexport async function agent_invoke({\n input,\n thread_id,\n assistant_id,\n tenant_id,\n command,\n run_id,\n}: {\n assistant_id: string;\n input: any;\n thread_id: string;\n tenant_id: string;\n run_id?: string;\n command?: CommandParams<any>;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n const { message, ...rest } = input;\n const humanMessage = new HumanMessage(message || \"\");\n const messages = [humanMessage];\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n\n const result = await runnable_agent.invoke(\n command\n ? new Command(command)\n : { ...rest, messages, \"x-tenant-id\": tenant_id },\n {\n configurable: {\n thread_id: thread_id,\n run_id: run_id || v4(),\n \"x-tenant-id\": tenant_id,\n \"x-request-id\": run_id,\n \"x-thread-id\": thread_id,\n },\n recursionLimit: 200,\n }\n );\n\n const data = result.messages.map((message: BaseMessage) => {\n const { type, data } = message.toDict();\n return {\n ...data,\n role: type,\n };\n });\n return { messages: data };\n}\n\nexport async function agent_stream({\n input,\n thread_id,\n command,\n tenant_id,\n assistant_id,\n run_id,\n}: {\n assistant_id: string;\n input: any;\n thread_id: string;\n command?: CommandParams<any>;\n tenant_id: string;\n run_id?: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id) as any; // TODO: fix this\n const { message, ...rest } = input;\n let messages: BaseMessage[] = [];\n if (!command) {\n const humanMessage = new HumanMessage(message);\n messages = [humanMessage];\n }\n\n // Get ChunkBuffer instance\n const chunkBuffer = getOrCreateChunkBuffer();\n\n try {\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const agentStream = await runnable_agent.stream(\n command\n ? new Command(command)\n : {\n ...rest,\n messages,\n \"x-tenant-id\": tenant_id,\n },\n\n {\n configurable: {\n thread_id: thread_id,\n run_id: run_id || v4(),\n \"x-tenant-id\": tenant_id,\n \"x-request-id\": run_id,\n \"x-thread-id\": thread_id,\n },\n streamMode: [\"updates\", \"messages\"],\n subgraphs: false,\n recursionLimit: 200,\n }\n );\n\n // 创建一个可迭代的 ReadableStream with ChunkBuffer integration\n return {\n [Symbol.asyncIterator]: async function* () {\n try {\n for await (const chunk of agentStream) {\n let data;\n let chunkContent = \"\";\n\n if (chunk[0] === \"updates\") {\n const update = chunk[1];\n const values = Object.values(update);\n const messages = (values[0] as any)?.messages;\n if (messages?.[0]?.tool_call_id) {\n data = messages[0].toDict();\n }\n } else if (chunk[0] === \"messages\") {\n const messages = chunk[1];\n // console.log(messages);\n data = messages?.[0]?.toDict();\n }\n\n if ((chunk?.[1] as any)?.__interrupt__) {\n //data = chunk?.[1]?.[0]?.toDict();\n // 原有的中断消息处理\n data = {\n type: \"interrupt\",\n id: (chunk?.[1] as any)?.__interrupt__[0].id,\n data: { content: (chunk?.[1] as any)?.__interrupt__[0].value },\n };\n }\n\n if (data) {\n //console.log(data);\n if (data.type !== \"interrupt\") {\n await chunkBuffer.addChunk(thread_id, data);\n }\n yield data;\n }\n }\n\n // Mark thread as completed when streaming finishes successfully\n await chunkBuffer.completeThread(thread_id);\n } catch (error) {\n console.error(\"Stream error:\", error);\n // Mark thread as aborted on error\n await chunkBuffer.abortThread(thread_id);\n throw error;\n }\n },\n };\n } catch (error) {\n // Mark thread as aborted on initialization error\n await chunkBuffer.abortThread(thread_id);\n throw error;\n }\n}\n\nexport async function agent_state({\n thread_id,\n assistant_id,\n}: {\n assistant_id: string;\n thread_id: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const state = await runnable_agent.getState({\n configurable: { thread_id: thread_id, subgraphs: false },\n });\n return state;\n}\n\nexport async function agent_messages({\n thread_id,\n tenant_id,\n assistant_id,\n}: {\n assistant_id: string;\n thread_id: string;\n tenant_id: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const state = await runnable_agent.getState({\n configurable: { thread_id: thread_id, subgraphs: false },\n });\n\n const messages = state.values.messages || [];\n const filteredMessages = filterMessages(messages, {\n includeTypes: [\"ai\", \"human\", \"tool\"], //[\"human\", \"ai\", \"tool\"],\n });\n\n // console.log(filteredMessages);\n\n let messagesArray = filteredMessages.map((message: BaseMessage) => ({\n id: message.id,\n role: message.getType(),\n content: message.content,\n ...message.lc_kwargs,\n }));\n\n // const action_messages = state.tasks.flatMap((task) => {\n // return task.interrupts.map((interrupt) => {\n // return {\n // role: \"ai\",\n // content: interrupt.value,\n // type: \"action\",\n // };\n // });\n // });\n\n const new_messages = messagesArray;\n // console.log(messagesArray);\n\n return new_messages;\n}\n\nexport async function draw_graph(assistant_id: string) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const drawableGraph = await runnable_agent.getGraphAsync();\n const image = await drawableGraph.drawMermaid();\n return image;\n}\n\n/**\n * Resume streaming from a known position\n * Creates an async iterator that yields new chunks as they arrive\n *\n * @param thread_id - Thread identifier\n * @param message_id - Message identifier (usually run_id)\n * @param known_content - Content already received (used to find resume position)\n * @param poll_interval - Polling interval in milliseconds (default: 100ms)\n */\nexport async function resume_stream({\n thread_id,\n message_id,\n known_content,\n poll_interval = 100,\n}: {\n thread_id: string;\n message_id: string;\n known_content: string;\n poll_interval?: number;\n}) {\n const chunkBuffer = getOrCreateChunkBuffer();\n\n const stream = await chunkBuffer.getNewChunksSinceContentIterator(\n thread_id,\n message_id,\n known_content\n );\n return {\n [Symbol.asyncIterator]: async function* () {\n try {\n for await (const chunk of stream) {\n yield chunk;\n }\n } catch (error) {\n console.error(\"Resume stream error:\", error);\n throw error;\n }\n },\n };\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport * as agentService from \"../services/agent_service\";\nimport { CreateRunRequest } from \"../types\";\nimport { v4 } from \"uuid\";\n\ninterface ResumeStreamRequest {\n thread_id: string;\n message_id: string;\n known_content: string;\n poll_interval?: number;\n}\n\n// 创建运行\nexport const createRun = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const {\n assistant_id,\n thread_id,\n command,\n streaming,\n background,\n ...input\n } = request.body as CreateRunRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const x_request_id = (request.headers[\"x-request-id\"] as string) || v4();\n\n // 验证请求数据\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n // 如果请求streaming,则agent_stream\n if (streaming) {\n // 开始运行\n const stream = await agentService.agent_stream({\n assistant_id: assistant_id,\n input: input,\n thread_id: thread_id,\n command,\n tenant_id: tenant_id,\n run_id: x_request_id,\n });\n\n // 通知 Fastify 我们将手动处理响应\n reply.hijack();\n\n // 设置 SSE 响应头\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n for await (const chunk of stream) {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n } catch (error) {\n console.error(\"Stream processing error:\", error);\n } finally {\n reply.raw.end();\n }\n } else {\n // 后台运行的情况\n const result = await agentService.agent_invoke({\n assistant_id: assistant_id,\n input: input,\n command: command,\n thread_id: thread_id,\n tenant_id: tenant_id,\n run_id: x_request_id,\n });\n reply.status(200).send(result);\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `创建运行时发生错误: ${error.message}`,\n });\n }\n};\n\n// Resume stream from known position\nexport const resumeStream = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { thread_id, message_id, known_content, poll_interval } =\n request.body as ResumeStreamRequest;\n\n // Validate request data\n if (!thread_id || !message_id || known_content === undefined) {\n reply.status(400).send({\n success: false,\n error: \"thread_id, message_id, and known_content are required\",\n });\n return;\n }\n\n // Notify Fastify that we will manually handle the response\n reply.hijack();\n\n // Set SSE response headers\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n // Get the stream from agent service\n const stream = await agentService.resume_stream({\n thread_id,\n message_id,\n known_content: known_content,\n poll_interval: poll_interval || 100,\n });\n\n // Stream the chunks to the client\n for await (const chunk of stream) {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n } catch (error) {\n console.error(\"Resume stream processing error:\", error);\n } finally {\n reply.raw.end();\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Error resuming stream: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { agent_messages, agent_state } from \"../services/agent_service\";\n\n// 设置内存项\nexport const setMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n const value = request.body;\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n if (value === undefined) {\n reply.status(400).send({\n success: false,\n error: \"值是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.setMemoryItem(assistantId, key, value);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `设置内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取内存项\nexport const getMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.getMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(404).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取所有内存项\nexport const getAllMemoryItems = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const result = await agent_messages({\n assistant_id: assistantId,\n thread_id: thread_id,\n tenant_id: tenant_id,\n });\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取所有内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取助手状态\nexport const getAgentState = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const result = await agent_state({\n assistant_id: assistantId,\n thread_id: thread_id,\n });\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取助手状态时发生错误: ${error.message}`,\n });\n }\n};\n\n// 删除内存项\nexport const deleteMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.deleteMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `删除内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 清除内存\nexport const clearMemory = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId } = request.params as { assistantId: string };\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n let result: any; //= await memoryModel.clearMemory(assistantId);\n\n if (!result.success) {\n reply.status(500).send(result);\n return;\n }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `清除内存时发生错误: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { draw_graph } from \"../services/agent_service\";\n\nexport const getAgentGraph = async (\n request: FastifyRequest<{\n Params: { assistantId: string };\n }>,\n reply: FastifyReply\n) => {\n try {\n const { assistantId } = request.params;\n\n // 调用绘图服务获取图片数据\n const imageData = await draw_graph(assistantId);\n\n // 设置响应头并返回图片数据\n reply.header(\"Content-Type\", \"application/json\").send({\n image: imageData,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: error.message || \"获取代理图表失败\",\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { AgentManager } from \"@axiom-lattice/core\";\n\n/**\n * Request body interface for triggering agent task\n */\ninterface TriggerAgentTaskRequest {\n assistant_id: string;\n thread_id: string;\n input: any;\n command?: any;\n}\n\n/**\n * Trigger an agent task\n * This endpoint triggers an agent task through the AgentManager,\n * which publishes the task to the event bus for processing\n */\nexport const triggerAgentTask = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistant_id, thread_id, input, command } =\n request.body as TriggerAgentTaskRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n\n // Validate required fields\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"assistant_id is required\",\n });\n return;\n }\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"thread_id is required\",\n });\n return;\n }\n\n // Get AgentManager instance and trigger the task\n const agentManager = AgentManager.getInstance();\n const result = await agentManager.callAgentInQueue({\n assistant_id,\n thread_id,\n input,\n command,\n \"x-tenant-id\": tenant_id,\n });\n\n reply.status(200).send({\n success: true,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Failed to trigger agent task: ${error.message}`,\n });\n }\n};\n","import { FastifySchema } from \"fastify\";\n\n// Create Run Schemas\nexport const createRunSchema: FastifySchema = {\n description: \"Create a new agent run\",\n tags: [\"Runs\"],\n summary: \"Create Agent Run\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n assistant_id: { type: \"string\", description: \"Assistant ID\" },\n message: { type: \"string\", description: \"Message data for the run\" },\n command: {\n type: \"object\",\n description: \"Command data for the run\",\n nullable: true,\n },\n streaming: {\n type: \"boolean\",\n description: \"Whether to stream the response\",\n nullable: true,\n },\n background: {\n type: \"boolean\",\n description: \"Whether to run in background\",\n nullable: true,\n },\n },\n required: [\"thread_id\", \"assistant_id\", \"message\"],\n },\n response: {\n 200: {},\n 400: {},\n },\n};\n\n// Memory Schemas\nexport const getAllMemoryItemsSchema: FastifySchema = {\n description: \"Get all memory items for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get All Memory Items\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\nexport const getAgentStateSchema: FastifySchema = {\n description: \"Get agent state for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get Agent State\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const getMemoryItemSchema: FastifySchema = {\n description: \"Get a specific memory item by key\",\n tags: [\"Memory\"],\n summary: \"Get Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const setMemoryItemSchema: FastifySchema = {\n description: \"Set or update a memory item\",\n tags: [\"Memory\"],\n summary: \"Set Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n body: {\n type: \"object\",\n description: \"Memory item data\",\n },\n response: {\n 200: {},\n },\n};\n\nexport const deleteMemoryItemSchema: FastifySchema = {\n description: \"Delete a specific memory item\",\n tags: [\"Memory\"],\n summary: \"Delete Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const clearMemorySchema: FastifySchema = {\n description: \"Clear all memory items for an assistant\",\n tags: [\"Memory\"],\n summary: \"Clear Memory\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Graph Schema\nexport const getAgentGraphSchema: FastifySchema = {\n description: \"Get agent graph visualization\",\n tags: [\"Graph\"],\n summary: \"Get Agent Graph\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Resume Stream Schema\nexport const resumeStreamSchema: FastifySchema = {\n description: \"Resume streaming from a known position\",\n tags: [\"Streaming\"],\n summary: \"Resume Stream\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n message_id: {\n type: \"string\",\n description: \"Message ID (usually run_id)\",\n },\n known_content: {\n type: \"string\",\n description: \"Content already received\",\n },\n poll_interval: {\n type: \"number\",\n description: \"Polling interval in milliseconds\",\n nullable: true,\n default: 100,\n },\n },\n required: [\"thread_id\", \"message_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\n// Trigger Agent Task Schema\nexport const triggerAgentTaskSchema: FastifySchema = {\n description: \"Trigger an agent task\",\n tags: [\"Agent Tasks\"],\n summary: \"Trigger Agent Task\",\n body: {\n type: \"object\",\n properties: {\n assistant_id: {\n type: \"string\",\n description: \"Assistant ID\",\n },\n thread_id: {\n type: \"string\",\n description: \"Thread ID\",\n },\n input: {\n type: \"object\",\n description: \"Task input data\",\n },\n command: {\n type: \"object\",\n description: \"Command data for the task\",\n nullable: true,\n },\n },\n required: [\"assistant_id\", \"thread_id\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n result: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n","import { FastifyInstance } from \"fastify\";\n//import * as assistantController from \"../controllers/assistant\";\nimport * as runController from \"../controllers/run\";\nimport * as memoryController from \"../controllers/memory\";\nimport * as graphController from \"../controllers/assistant\";\nimport * as agentTaskController from \"../controllers/agent_task\";\nimport {\n createRunSchema,\n getAllMemoryItemsSchema,\n getAgentStateSchema,\n getMemoryItemSchema,\n setMemoryItemSchema,\n deleteMemoryItemSchema,\n clearMemorySchema,\n getAgentGraphSchema,\n resumeStreamSchema,\n triggerAgentTaskSchema,\n} from \"../schemas\";\n\nexport const registerLatticeRoutes = (app: FastifyInstance): void => {\n // 运行路由\n app.post<{\n Body: any;\n }>(\"/api/runs\", runController.createRun);\n\n // Resume stream route\n app.post<{\n Body: any;\n }>(\"/api/resume_stream\", runController.resumeStream);\n\n // app.get<{\n // Params: { id: string };\n // }>(\"/api/runs/:id\", runController.getRun);\n\n // app.get<{\n // Params: { assistantId: string };\n // }>(\"/api/assistants/:assistantId/runs\", runController.getRunsByAssistant);\n\n // app.post<{\n // Params: { id: string };\n // }>(\"/api/runs/:id/cancel\", runController.cancelRun);\n\n // 内存路由\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/memory\",\n { schema: getAllMemoryItemsSchema },\n memoryController.getAllMemoryItems\n );\n\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/state\",\n { schema: getAgentStateSchema },\n memoryController.getAgentState\n );\n\n app.get<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: getMemoryItemSchema },\n memoryController.getMemoryItem\n );\n\n app.put<{\n Params: { assistantId: string; key: string };\n Body: any;\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: setMemoryItemSchema },\n memoryController.setMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: deleteMemoryItemSchema },\n memoryController.deleteMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/memory\",\n { schema: clearMemorySchema },\n memoryController.clearMemory\n );\n\n // 图表路由\n app.get<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/graph\",\n { schema: getAgentGraphSchema },\n graphController.getAgentGraph\n );\n\n // Agent Task路由\n app.post<{\n Body: any;\n }>(\n \"/api/agent-tasks/trigger\",\n { schema: triggerAgentTaskSchema },\n agentTaskController.triggerAgentTask\n );\n};\n","import pino from \"pino\";\nimport \"pino-pretty\";\nimport \"pino-roll\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\nexport interface LoggerContext {\n \"x-user-id\"?: string;\n \"x-tenant-id\"?: string;\n \"x-request-id\"?: string;\n \"x-task-id\"?: string;\n \"x-thread-id\"?: string;\n}\n\nexport interface LoggerOptions {\n name?: string;\n serviceName?: string;\n context?: LoggerContext;\n}\n\n/**\n * 单例的Pino日志工厂类,管理底层pino实例\n */\nclass PinoLoggerFactory {\n private static instance: PinoLoggerFactory;\n private pinoLogger: pino.Logger;\n\n private constructor() {\n const isProd = process.env.NODE_ENV === \"production\";\n\n const loggerConfig: pino.LoggerOptions = {\n // 自定义时间戳格式\n timestamp: () => `,\"@timestamp\":\"${new Date().toISOString()}\"`,\n\n // 关闭默认的时间戳键\n base: {\n \"@version\": \"1\",\n app_name: \"lattice\",\n service_name: \"lattice/graph-server\",\n thread_name: \"main\",\n logger_name: \"lattice-graph-logger\",\n },\n\n formatters: {\n level: (label, number) => {\n return {\n level: label.toUpperCase(),\n level_value: number * 1000,\n };\n },\n },\n };\n\n // 生产环境使用文件日志\n if (isProd) {\n try {\n this.pinoLogger = pino(\n loggerConfig,\n pino.transport({\n target: \"pino-roll\",\n options: {\n file: \"./logs/fin_ai_graph_server\",\n frequency: \"daily\",\n mkdir: true,\n },\n })\n );\n } catch (error) {\n console.error(\n \"无法初始化 pino-roll 日志记录器,回退到控制台日志\",\n error\n );\n // 回退到开发环境的配置\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n } else {\n // 开发环境使用格式化输出\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n }\n\n public static getInstance(): PinoLoggerFactory {\n if (!PinoLoggerFactory.instance) {\n PinoLoggerFactory.instance = new PinoLoggerFactory();\n }\n return PinoLoggerFactory.instance;\n }\n\n public getPinoLogger(): pino.Logger {\n return this.pinoLogger;\n }\n}\n\n/**\n * Logger类,可以创建多个实例,每个实例有自己的上下文\n */\nexport class Logger {\n private context: LoggerContext;\n private name: string;\n private serviceName: string;\n\n constructor(options?: LoggerOptions) {\n this.context = options?.context || {};\n this.name = options?.name || \"lattice-graph-logger\";\n this.serviceName = options?.serviceName || \"lattice/graph-server\";\n }\n\n /**\n * 获取合并了上下文的日志对象\n * @param additionalContext 额外的上下文数据\n * @returns 带有上下文的pino日志对象\n */\n private getContextualLogger(additionalContext?: object): pino.Logger {\n const pinoLogger = PinoLoggerFactory.getInstance().getPinoLogger();\n\n // 合并Logger实例的上下文和额外上下文\n const contextObj = {\n \"x-user-id\": this.context[\"x-user-id\"] || \"\",\n \"x-tenant-id\": this.context[\"x-tenant-id\"] || \"\",\n \"x-request-id\": this.context[\"x-request-id\"] || \"\",\n \"x-task-id\": this.context[\"x-task-id\"] || \"\",\n \"x-thread-id\": this.context[\"x-thread-id\"] || \"\",\n service_name: this.serviceName,\n logger_name: this.name,\n ...additionalContext,\n };\n\n // 创建带有上下文的子日志记录器\n return pinoLogger.child(contextObj);\n }\n\n info(msg: string, obj?: object): void {\n this.getContextualLogger(obj).info(msg);\n }\n\n error(msg: string, obj?: object | Error): void {\n this.getContextualLogger(obj).error(msg);\n }\n\n warn(msg: string, obj?: object): void {\n this.getContextualLogger(obj).warn(msg);\n }\n\n debug(msg: string, obj?: object): void {\n this.getContextualLogger(obj).debug(msg);\n }\n\n /**\n * 更新Logger实例的上下文\n */\n updateContext(context: Partial<LoggerContext>): void {\n this.context = {\n ...this.context,\n ...context,\n };\n }\n\n /**\n * 创建一个新的Logger实例,继承当前Logger的上下文\n */\n child(options: Partial<LoggerOptions>): Logger {\n return new Logger({\n name: options.name || this.name,\n serviceName: options.serviceName || this.serviceName,\n context: {\n ...this.context,\n ...options.context,\n },\n });\n }\n}\n","import { FastifyInstance } from \"fastify\";\nimport swagger from \"@fastify/swagger\";\nimport swaggerUi from \"@fastify/swagger-ui\";\n// Example usage:\n// configureSwagger(app)\n// configureSwagger(app, { openapi: { info: { version: \"2.0.0\" } } })\n// configureSwagger(app, undefined, { routePrefix: \"/docs\" })\n\n// Default swagger configuration\nexport const defaultSwaggerConfig = {\n openapi: {\n openapi: \"3.0.0\",\n info: {\n title: \"Axiom Lattice Gateway API\",\n description: \"API Gateway for LangGraph agent-based applications\",\n version: \"1.0.0\",\n contact: {\n name: \"Axiom Lattice Team\",\n email: \"support@axiom-lattice.com\",\n },\n },\n servers: [\n {\n url: \"http://localhost:4001\",\n description: \"Development environment\",\n },\n ],\n components: {\n securitySchemes: {\n bearerAuth: {\n type: \"http\" as const,\n scheme: \"bearer\" as const,\n bearerFormat: \"JWT\",\n },\n },\n },\n security: [\n {\n bearerAuth: [],\n },\n ],\n tags: [\n { name: \"Runs\", description: \"Agent run management\" },\n { name: \"Memory\", description: \"Agent memory management\" },\n { name: \"Graph\", description: \"Agent graph visualization\" },\n { name: \"Health\", description: \"System health checks\" },\n ],\n },\n};\n\n// Default swagger UI configuration\nexport const defaultSwaggerUiConfig = {\n routePrefix: \"/api-docs\",\n uiConfig: {\n docExpansion: \"full\" as const,\n deepLinking: false,\n },\n staticCSP: true,\n transformStaticCSP: (header: string) => header,\n};\n\n// Configure Swagger with optional custom configuration\nexport const configureSwagger = async (\n app: FastifyInstance,\n customSwaggerConfig?: Partial<typeof defaultSwaggerConfig>,\n customSwaggerUiConfig?: Partial<typeof defaultSwaggerUiConfig>\n) => {\n // Merge default config with custom config\n const swaggerConfig = { ...defaultSwaggerConfig, ...customSwaggerConfig };\n const swaggerUiConfig = {\n ...defaultSwaggerUiConfig,\n ...customSwaggerUiConfig,\n };\n\n await app.register(swagger, swaggerConfig);\n await app.register(swaggerUi, swaggerUiConfig);\n};\n","// Queue service adapter that uses QueueLatticeManager from core package\n// Provides backward-compatible API for gateway services\n\nimport {\n queueLatticeManager,\n registerQueueLattice,\n getQueueLattice,\n} from \"@axiom-lattice/core\";\nimport { QueueType, QueueConfig, QueueClient } from \"@axiom-lattice/protocols\";\nimport { RedisQueueClient } from \"@axiom-lattice/queue-redis\";\n\nexport type QueueServiceType = \"memory\" | \"redis\";\n\n// Default queue key\nconst DEFAULT_QUEUE_KEY = \"default\";\n\n// Global configuration for queue service type\n// Can be set via environment variable QUEUE_SERVICE_TYPE or via LatticeGateway configuration\nlet queueServiceType: QueueServiceType =\n (process.env.QUEUE_SERVICE_TYPE as QueueServiceType) || \"memory\";\n\n/**\n * Configure the queue service type\n * This will register or update the default queue service\n * @param type - \"memory\" or \"redis\"\n */\nexport const setQueueServiceType = (type: QueueServiceType): void => {\n queueServiceType = type;\n console.log(`Queue service type set to: ${type}`);\n\n // Register or update the queue service\n const queueName = process.env.QUEUE_NAME || \"tasks\";\n const config: QueueConfig = {\n name: \"Default Queue Service\",\n description: `Default ${type} queue service`,\n type: type === \"redis\" ? QueueType.REDIS : QueueType.MEMORY,\n queueName,\n options:\n type === \"redis\"\n ? {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n }\n : undefined,\n };\n\n // Remove existing queue if it exists\n if (queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n queueLatticeManager.removeLattice(DEFAULT_QUEUE_KEY);\n }\n\n // Create client for Redis type\n let client: QueueClient | undefined;\n if (type === \"redis\") {\n client = new RedisQueueClient(queueName, {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n });\n }\n\n // Register the new queue service\n registerQueueLattice(DEFAULT_QUEUE_KEY, config, client);\n};\n\n/**\n * Get the current queue service type\n */\nexport const getQueueServiceType = (): QueueServiceType => {\n return queueServiceType;\n};\n\n/**\n * Get the default queue service\n * If not registered, register it with the current configuration\n */\nconst getQueueService = () => {\n // Check if queue is already registered\n if (!queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n // Auto-register with current configuration\n setQueueServiceType(queueServiceType);\n }\n\n return getQueueLattice(DEFAULT_QUEUE_KEY);\n};\n\n/**\n * Push agent task to queue\n * @param agentTask - Agent task to push\n */\nexport const pushAgentTaskToQueue = async (agentTask: any) => {\n const queue = getQueueService();\n const result = await queue.push(agentTask);\n return result;\n};\n\n/**\n * Pop agent task from queue\n */\nexport const popAgentTaskFromQueue = async () => {\n const queue = getQueueService();\n const result = await queue.pop();\n return result;\n};\n","import { eventBus, AGENT_TASK_EVENT } from \"@axiom-lattice/core\";\nimport { popAgentTaskFromQueue } from \"./queue_service\";\nimport { agent_state } from \"./agent_service\";\n\n// 任务请求结构\nexport interface AgentTaskRequest {\n assistant_id: string;\n input: any;\n thread_id: string;\n \"x-tenant-id\": string;\n command?: any;\n callback_event?: string; // 可选的回调事件名称\n}\n\n/**\n * 处理Agent任务事件\n * @param taskRequest 任务请求\n * @param retryCount 重试次数\n */\nconst handleAgentTask = async (\n taskRequest: AgentTaskRequest,\n retryCount: number = 0\n): Promise<boolean> => {\n const {\n assistant_id,\n input = {},\n thread_id,\n \"x-tenant-id\": tenant_id,\n command,\n callback_event,\n } = taskRequest;\n\n try {\n console.log(\n `开始处理任务 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n\n // 检查API服务器是否可用\n const apiUrl = AgentTaskConsumer.agent_run_endpoint;\n\n console.log(`apiUrl: ${apiUrl}`);\n\n const response = await fetch(apiUrl, {\n method: \"POST\",\n body: JSON.stringify({\n assistant_id,\n streaming: true,\n ...input,\n thread_id,\n command,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-tenant-id\": tenant_id,\n },\n }).catch((err) => {\n console.error(`fetch请求失败: ${err.message || String(err)}`);\n throw new Error(`fetch失败: ${err.message || String(err)}`);\n });\n\n if (!response.ok) {\n throw new Error(`API请求失败: ${response.status} ${response.statusText}`);\n }\n\n // Check if response is SSE stream\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"text/event-stream\")) {\n // Handle SSE stream\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n throw new Error(\"Response body is not readable\");\n }\n\n let buffer = \"\";\n let streamEnded = false;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Stream has ended\n streamEnded = true;\n console.log(\n `SSE流已结束 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n break;\n }\n\n // // Decode the chunk and process SSE events\n // buffer += decoder.decode(value, { stream: true });\n // const lines = buffer.split(\"\\n\");\n // buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n // for (const line of lines) {\n // if (line.startsWith(\"data: \")) {\n // try {\n // const data = JSON.parse(line.slice(6));\n // // Process SSE event data here if needed\n // // You can emit events or handle the data as required\n // console.log(\"SSE event received:\", data);\n // } catch (e) {\n // // Ignore invalid JSON\n // console.warn(\"Failed to parse SSE data:\", line);\n // }\n // }\n // }\n }\n } catch (streamError) {\n console.error(\"Error reading SSE stream:\", streamError);\n throw streamError;\n } finally {\n reader.releaseLock();\n }\n\n // Stream has ended successfully\n if (callback_event) {\n const state = await agent_state({ assistant_id, thread_id });\n eventBus.publish(callback_event, {\n success: true,\n state: state,\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.log(\n `任务处理成功 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return true;\n } else {\n // Non-streaming response\n await response.text(); // Consume the response\n\n if (callback_event) {\n const state = await agent_state({ assistant_id, thread_id });\n eventBus.publish(callback_event, {\n success: true,\n state,\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.log(\n `任务处理成功 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return true;\n }\n } catch (error) {\n console.error(\n `Agent任务执行失败: ${assistant_id}, 线程: ${thread_id}`,\n error\n );\n\n // 重试逻辑,暂不用重试\n const maxRetries = 0;\n if (retryCount < maxRetries) {\n const nextRetryCount = retryCount + 1;\n const delayMs = Math.pow(2, nextRetryCount) * 1000; // 指数退避策略\n\n console.log(\n `将在 ${delayMs}ms 后重试任务 (${nextRetryCount}/${maxRetries})`\n );\n\n // 延迟后重试\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n return handleAgentTask(taskRequest, nextRetryCount);\n }\n\n if (callback_event) {\n eventBus.publish(callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n config: { assistant_id, thread_id, tenant_id },\n });\n }\n\n console.error(\n `任务处理失败,已达到最大重试次数 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return false;\n }\n};\n\n/**\n * Agent任务消费者\n * 负责监听和执行Agent任务事件,同时从队列中消费任务\n */\nexport class AgentTaskConsumer {\n private isPolling: boolean = false;\n private pollingInterval: NodeJS.Timeout | null = null;\n private pollingIntervalMs: number = 5000; // 默认5秒轮询一次\n private maxConcurrentTasks: number = 15; // 最大并发任务数\n private activeTasks: number = 0; // 当前活跃的任务数\n private processing: boolean = false; // 是否正在处理任务批次\n private immediateProcessingEnabled: boolean = true; // 是否启用即时处理模式\n public gatewayPort: number = 4001;\n public static agent_run_endpoint: string = \"http://localhost:4001/api/runs\";\n\n constructor(gatewayPort: number, pollingIntervalMs?: number) {\n this.gatewayPort = gatewayPort;\n AgentTaskConsumer.agent_run_endpoint = `http://localhost:${this.gatewayPort}/api/runs`;\n if (pollingIntervalMs) {\n this.pollingIntervalMs = pollingIntervalMs;\n }\n this.initialize();\n }\n\n /**\n * 初始化事件监听和队列轮询\n */\n private initialize(): void {\n // 监听事件总线上的任务\n eventBus.subscribe(AGENT_TASK_EVENT, this.trigger_agent_task.bind(this));\n\n // 启动队列轮询\n this.startPollingQueue();\n\n console.log(\"Agent任务消费者已启动并监听任务事件和队列\");\n }\n\n /**\n * 启动队列轮询\n */\n startPollingQueue(): void {\n if (this.isPolling) {\n return;\n }\n\n this.isPolling = true;\n\n this.pollingInterval = setInterval(async () => {\n try {\n // 如果上一批次任务还在处理中,跳过本次轮询\n if (this.processing) {\n console.log(\"队列处理中,跳过本次轮询\");\n return;\n }\n\n await this.consumeFromQueue();\n } catch (error) {\n console.error(\"队列轮询出错:\", error);\n }\n }, this.pollingIntervalMs);\n\n console.log(\n `开始轮询队列,间隔: ${this.pollingIntervalMs}ms,最大并发任务数: ${this.maxConcurrentTasks}`\n );\n }\n\n /**\n * 停止队列轮询\n */\n stopPollingQueue(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n this.pollingInterval = null;\n this.isPolling = false;\n console.log(\"已停止队列轮询\");\n }\n }\n\n /**\n * 处理单个任务并在完成后立即尝试处理下一个\n */\n async processNextTask(): Promise<boolean> {\n try {\n // 从队列中获取任务\n const queueResult = await popAgentTaskFromQueue();\n\n // 检查队列结果\n if (queueResult && queueResult.data) {\n const taskItem = queueResult.data;\n\n if (taskItem && typeof taskItem === \"object\") {\n const taskRequest = taskItem as AgentTaskRequest;\n\n console.log(\n `从队列中获取到任务 [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 增加活跃任务计数\n this.activeTasks++;\n\n // 处理任务(不使用await,允许并发执行)\n handleAgentTask(taskRequest)\n .then((success) => {\n if (!success) {\n console.error(`任务 处理失败`);\n // 可以在这里记录失败任务或执行补偿逻辑\n } else {\n console.log(`任务 处理成功`);\n }\n })\n .catch((error) => {\n console.error(`任务 处理时出错:`, error);\n })\n .finally(() => {\n // 减少活跃任务计数\n this.activeTasks--;\n\n // 如果启用了即时处理模式,尝试处理更多任务\n if (this.immediateProcessingEnabled && !this.processing) {\n this.checkQueueForTasks();\n }\n });\n\n // 任务已派发,返回true表示有任务被处理\n return true;\n } else {\n console.log(\"队列任务格式无效:\", taskItem);\n return false;\n }\n } else {\n // 队列为空\n return false;\n }\n } catch (error) {\n console.error(\"处理任务失败:\", error);\n return false;\n }\n }\n\n /**\n * 检查队列中是否有任务并处理\n */\n async checkQueueForTasks(): Promise<void> {\n // 如果已经在处理中或者并发任务已达上限,则不处理\n if (this.processing || this.activeTasks >= this.maxConcurrentTasks) {\n return;\n }\n\n this.processing = true;\n\n try {\n // 尝试获取并处理任务,直到达到并发上限\n while (this.activeTasks < this.maxConcurrentTasks) {\n const taskProcessed = await this.processNextTask();\n if (!taskProcessed) {\n // 没有更多任务,退出循环\n break;\n }\n }\n } catch (error) {\n console.error(\"检查队列任务失败:\", error);\n } finally {\n this.processing = false;\n }\n }\n\n /**\n * 从队列中消费任务\n */\n async consumeFromQueue(): Promise<void> {\n // 如果已经在处理中,跳过\n if (this.processing) {\n return;\n }\n\n // 调用任务检查方法\n await this.checkQueueForTasks();\n }\n\n /**\n * 处理通过事件触发的任务\n */\n trigger_agent_task(taskRequest: AgentTaskRequest): void {\n console.log(\n `通过事件触发任务: [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 处理任务,不阻塞事件处理流程\n handleAgentTask(taskRequest).catch((error) => {\n console.error(\"处理Agent任务时发生未捕获的错误:\", error);\n\n // 如果有回调事件,确保即使发生错误也能通知\n if (taskRequest.callback_event) {\n eventBus.publish(taskRequest.callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n config: {\n assistant_id: taskRequest.assistant_id,\n thread_id: taskRequest.thread_id,\n tenant_id: taskRequest[\"x-tenant-id\"],\n },\n });\n }\n });\n\n // 如果启用了即时处理且当前活跃任务数低于阈值,检查队列\n if (\n this.immediateProcessingEnabled &&\n this.activeTasks < this.maxConcurrentTasks\n ) {\n setImmediate(() => this.checkQueueForTasks());\n }\n }\n}\n"],"mappings":"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","names":["message","data","messages","v4","app","app"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiom-lattice/gateway",
3
- "version": "2.1.9",
3
+ "version": "2.1.11",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
@@ -32,7 +32,7 @@
32
32
  "pino-roll": "^3.1.0",
33
33
  "redis": "^5.0.1",
34
34
  "uuid": "^9.0.1",
35
- "@axiom-lattice/core": "2.1.6",
35
+ "@axiom-lattice/core": "2.1.8",
36
36
  "@axiom-lattice/protocols": "2.1.3",
37
37
  "@axiom-lattice/queue-redis": "1.0.2"
38
38
  },
@@ -98,11 +98,10 @@ export async function agent_stream({
98
98
  run_id?: string;
99
99
  }) {
100
100
  const runnable_agent = getAgentClient(assistant_id) as any; // TODO: fix this
101
- const { files, message, ...rest } = input;
101
+ const { message, ...rest } = input;
102
102
  let messages: BaseMessage[] = [];
103
103
  if (!command) {
104
104
  const humanMessage = new HumanMessage(message);
105
- humanMessage.additional_kwargs = { files: files };
106
105
  messages = [humanMessage];
107
106
  }
108
107
 
@@ -238,7 +237,6 @@ export async function agent_messages({
238
237
  id: message.id,
239
238
  role: message.getType(),
240
239
  content: message.content,
241
- files: message.additional_kwargs.files,
242
240
  ...message.lc_kwargs,
243
241
  }));
244
242