{"version":3,"sources":["../src/agent.ts","../src/util.ts","../src/checkpoint.ts","../src/cloudbase-saver.ts","../../../../node_modules/.pnpm/@langchain+langgraph-checkpoint@1.0.0_@langchain+core@1.1.31_@opentelemetry+api@1.9.0_@_f8605a0e27fd524beadfb98ef47a22ac/node_modules/@langchain/langgraph-checkpoint/src/serde/types.ts","../../../../node_modules/.pnpm/@langchain+langgraph-checkpoint@1.0.0_@langchain+core@1.1.31_@opentelemetry+api@1.9.0_@_f8605a0e27fd524beadfb98ef47a22ac/node_modules/@langchain/langgraph-checkpoint/src/base.ts","../src/store/tdai-store.ts","../src/index.ts"],"sourcesContent":["import {\n  RunAgentInput,\n  Message,\n  ToolCall,\n  BaseEvent,\n  EventType,\n  RunStartedEvent,\n  RunFinishedEvent,\n  RunErrorEvent,\n  TextMessageStartEvent,\n  TextMessageContentEvent,\n  TextMessageEndEvent,\n  ToolCallStartEvent,\n  ToolCallArgsEvent,\n  ToolCallEndEvent,\n  ToolCallResultEvent,\n  AbstractAgent,\n  AgentConfig,\n  BinaryInputContent,\n} from \"@ag-ui/client\";\n\nimport { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\n\nimport { Observable, Subscriber } from \"rxjs\";\n\nimport {\n  Annotation,\n  AnnotationRoot,\n  StateDefinition,\n  StateGraph,\n  MessagesAnnotation,\n} from \"@langchain/langgraph\";\nimport { InteropZodObject } from \"@langchain/core/utils/types\";\nimport { convertActionsToDynamicStructuredTools } from \"./util\";\nimport { Logger, noopLogger, isErrorWithCode } from \"@cloudbase/agent-shared\";\n\n// Import observability callback (optional)\n// The class reference is shared across all agent instances (lazy-loaded once)\n// but each agent creates its own handler instance\nlet LangChainCallbackHandler: any;\n\ntype SDZod = StateDefinition | InteropZodObject;\n\ntype CompiledStateGraph<SD extends SDZod> = ReturnType<\n  StateGraph<SD>[\"compile\"]\n>;\n\ntype AnnotationInside<T> = T extends AnnotationRoot<infer U> ? U : never;\n\ntype ClientStateDefinition = AnnotationInside<typeof ClientStateAnnotation>;\n\nexport const ClientPropertiesAnnotation = Annotation.Root({\n  tools: Annotation<any[]>,\n});\n\nexport const ClientStateAnnotation = Annotation.Root({\n  client: Annotation<typeof ClientPropertiesAnnotation.State>,\n  ...MessagesAnnotation.spec,\n});\n\nexport type ClientState = typeof ClientStateAnnotation.State;\n\nexport class LanggraphAgent extends AbstractAgent {\n  compiledWorkflow?: CompiledStateGraph<ClientStateDefinition>;\n  private observabilityCallback?: any;\n  private adapterName: string;\n  private logger: Logger;\n\n  constructor(\n    agentConfig: AgentConfig & {\n      compiledWorkflow: any;\n      adapterName?: string; // Optional: e.g., \"LangGraph\" or \"LangChain\"\n      /**\n       * Logger instance for structured logging.\n       * @default noopLogger (silent)\n       */\n      logger?: Logger;\n    }\n  ) {\n    super(agentConfig);\n    this.compiledWorkflow =\n      agentConfig.compiledWorkflow as CompiledStateGraph<ClientStateDefinition>;\n    // Observability callback will be lazily loaded in _run method\n    this.adapterName = agentConfig.adapterName || \"LangGraph\";\n\n    // Create component-specific child logger\n    const baseLogger = agentConfig.logger ?? noopLogger;\n    this.logger =\n      baseLogger.child?.({ component: \"langgraph-agent\" }) ?? baseLogger;\n  }\n\n  run(input: RunAgentInput) {\n    return new Observable<BaseEvent>((subscriber) => {\n      this._run(subscriber, input);\n    });\n  }\n\n  async _run(subscriber: Subscriber<BaseEvent>, input: RunAgentInput) {\n    const { messages, runId, threadId } = input;\n\n    // Create run-specific child logger with context\n    const logger = this.logger.child?.({ runId, threadId }) ?? this.logger;\n\n    logger.info?.(\"Run started\");\n\n    // Setup observability for this execution\n    await this.setupObservability(input, logger);\n\n    const runStartedEvent: RunStartedEvent = {\n      type: EventType.RUN_STARTED,\n      threadId,\n      runId,\n    };\n    logger.trace?.({ aguiEvent: runStartedEvent }, \"Emitting AGUI event\");\n    subscriber.next(runStartedEvent);\n\n    // DEBUG: summary of input\n    const lastUserMessage = messages.filter((m) => m.role === \"user\").pop();\n    logger.debug?.(\n      {\n        messageCount: messages.length,\n        toolCount: input.tools?.length ?? 0,\n        tools: input.tools?.map((t) => t.name),\n        lastUserMessage:\n          typeof lastUserMessage?.content === \"string\"\n            ? lastUserMessage.content.slice(0, 200)\n            : undefined,\n      },\n      \"Preparing stream input\"\n    );\n\n    // TRACE: full input\n    logger.trace?.({ messages, tools: input.tools }, \"Full input messages\");\n\n    // Convert messages to LangGraph format\n    const langChainMessages = aguiMessagesToLangChain(messages, logger);\n\n    // TRACE: converted LangGraph messages for debugging message ordering issues\n    logger.trace?.(\n      {\n        langChainMessages,\n        messageCount: langChainMessages.length,\n        messageTypes: langChainMessages.map((m) => ({\n          type: m.type,\n          id: m.id,\n          hasToolCalls:\n            \"tool_calls\" in m &&\n            Array.isArray(m.tool_calls) &&\n            m.tool_calls.length > 0,\n          toolCallId: \"tool_call_id\" in m ? m.tool_call_id : undefined,\n        })),\n      },\n      \"Converted LangGraph messages\"\n    );\n\n    const streamEventInput = {\n      messages: langChainMessages,\n      client: {\n        tools: convertActionsToDynamicStructuredTools(\n          input.tools.map((x) => ({\n            ...x,\n            parameters:\n              typeof x.parameters === \"string\"\n                ? JSON.parse(x.parameters)\n                : x.parameters,\n          }))\n        ),\n      },\n    };\n\n    const stream = this.compiledWorkflow!.streamEvents(streamEventInput, {\n      version: \"v2\",\n      ...(this.observabilityCallback\n        ? { callbacks: [this.observabilityCallback] }\n        : {}),\n      runId,\n      configurable: {\n        thread_id: threadId,\n      },\n    });\n\n    logger.debug?.(\"Stream created, starting event processing\");\n\n    const chatModelRuns: Array<{ runId: string; messageId?: string }> = [];\n\n    // Pre-populate handledToolCallIds with tool call IDs from INPUT messages.\n    // This prevents emitting duplicate TOOL_CALL_RESULT events for tool results\n    // that were already processed in a previous run and are now being sent back\n    // by the client as part of the message history.\n    const handledToolCallIds: Set<string> = new Set();\n    for (const msg of messages) {\n      if (msg.role === \"tool\" && msg.toolCallId) {\n        handledToolCallIds.add(msg.toolCallId);\n      }\n    }\n    if (handledToolCallIds.size > 0) {\n      logger.debug?.(\n        { count: handledToolCallIds.size },\n        \"Pre-populated handled tool call IDs from input messages\"\n      );\n    }\n\n    let currentToolCall: { name: string; args: string; id: string } | null =\n      null;\n\n    // Statistics for run summary\n    let eventCount = 0;\n    let toolCallCount = 0;\n    let textChunkCount = 0;\n\n    try {\n      for await (const event of stream) {\n        eventCount++;\n        // TRACE: full LangGraph event\n        logger.trace?.(\n          { eventType: event.event, eventCount, langGraphEvent: event },\n          \"Processing stream event\"\n        );\n\n        if (event.event.startsWith(\"ChannelWrite<\")) {\n          continue;\n        }\n\n        if (event.event === \"on_chat_model_start\") {\n          logger.debug?.(\n            { chatModelRunId: event.run_id },\n            \"Chat model started\"\n          );\n          chatModelRuns.push({ runId: event.run_id });\n          continue;\n        }\n\n        if (event.event === \"on_chat_model_stream\") {\n          // First, find or create chatModelRun and ensure messageId is set\n          // This must happen BEFORE processing tool_call_chunks so we have parentMessageId\n          const chatModelRun = chatModelRuns.find(\n            (run) => run.runId === event.run_id\n          );\n          if (!chatModelRun) {\n            logger.warn?.(\n              { chatModelRunId: event.run_id },\n              \"Received message from unknown chat model run\"\n            );\n            subscriber.next({\n              type: EventType.RUN_ERROR,\n              code: \"INTERNAL_ERROR\",\n              message: `Received a message from an unknown chat model run. Run Id: ${event.run_id}`,\n            } as RunErrorEvent);\n            continue;\n          }\n\n          // Initialize messageId if not set yet\n          const chunkId = event.data.chunk.id;\n          if (!chatModelRun.messageId) {\n            chatModelRun.messageId = chunkId;\n            const textStartEvent: TextMessageStartEvent = {\n              messageId: chunkId,\n              type: EventType.TEXT_MESSAGE_START,\n              role: \"assistant\",\n            };\n            logger.debug?.({ messageId: chunkId }, \"Text message started\");\n            logger.trace?.(\n              { aguiEvent: textStartEvent },\n              \"Emitting AGUI event\"\n            );\n            subscriber.next(textStartEvent);\n          } else if (chatModelRun.messageId !== chunkId) {\n            logger.warn?.(\n              {\n                expectedMessageId: chatModelRun.messageId,\n                receivedMessageId: chunkId,\n                chatModelRunId: event.run_id,\n              },\n              \"Received message with unexpected ID\"\n            );\n            subscriber.next({\n              type: EventType.RUN_ERROR,\n              code: \"INTERNAL_ERROR\",\n              message: `Received a message of unknown message id from current run. Run Id: ${event.run_id} Message Id from current run: ${chatModelRun.messageId} Message Id from received message: ${chunkId}`,\n            } as RunErrorEvent);\n            continue;\n          }\n\n          // Now process tool_call_chunks with parentMessageId available\n          if (\n            Array.isArray(event.data.chunk?.tool_call_chunks) &&\n            event.data.chunk?.tool_call_chunks?.length > 0\n          ) {\n            const parentMessageId = chatModelRun.messageId;\n            (\n              event.data.chunk.tool_call_chunks as Array<{\n                name: string;\n                args: unknown;\n                id: string;\n              }>\n            )\n              .map((x) => ({\n                ...x,\n                args:\n                  typeof x.args === \"string\"\n                    ? x.args\n                    : x.args\n                      ? JSON.stringify(x.args)\n                      : \"\",\n              }))\n              .forEach((toolCall) => {\n                if (currentToolCall) {\n                  if (toolCall.id && currentToolCall.id !== toolCall.id) {\n                    // end the current tool call\n                    const toolEndEvent: ToolCallEndEvent = {\n                      toolCallId: currentToolCall.id,\n                      type: EventType.TOOL_CALL_END,\n                    };\n                    logger.debug?.(\n                      {\n                        toolCallId: currentToolCall.id,\n                        toolCallName: currentToolCall.name,\n                      },\n                      \"Tool call ended\"\n                    );\n                    logger.trace?.(\n                      { aguiEvent: toolEndEvent },\n                      \"Emitting AGUI event\"\n                    );\n                    subscriber.next(toolEndEvent);\n\n                    // set the new tool call as the current tool call\n                    if (toolCall.name && toolCall.id) {\n                      currentToolCall = toolCall;\n                      toolCallCount++;\n                      const toolStartEvent: ToolCallStartEvent = {\n                        toolCallId: currentToolCall.id,\n                        toolCallName: currentToolCall.name,\n                        parentMessageId,\n                        type: EventType.TOOL_CALL_START,\n                      };\n                      logger.debug?.(\n                        {\n                          toolCallId: toolCall.id,\n                          toolCallName: toolCall.name,\n                        },\n                        \"Tool call started\"\n                      );\n                      logger.trace?.(\n                        { aguiEvent: toolStartEvent },\n                        \"Emitting AGUI event\"\n                      );\n                      subscriber.next(toolStartEvent);\n                      if (currentToolCall.args) {\n                        const toolArgsEvent: ToolCallArgsEvent = {\n                          toolCallId: currentToolCall.id,\n                          delta: currentToolCall.args,\n                          type: EventType.TOOL_CALL_ARGS,\n                        };\n                        logger.trace?.(\n                          { aguiEvent: toolArgsEvent },\n                          \"Emitting AGUI event\"\n                        );\n                        subscriber.next(toolArgsEvent);\n\n                        if (isValidJson(currentToolCall.args)) {\n                          // args is valid json, tool call streaming ends\n                          const toolEndEvent2: ToolCallEndEvent = {\n                            toolCallId: currentToolCall.id,\n                            type: EventType.TOOL_CALL_END,\n                          };\n                          logger.debug?.(\n                            { toolCallId: currentToolCall.id },\n                            \"Tool call ended (args complete)\"\n                          );\n                          logger.trace?.(\n                            { aguiEvent: toolEndEvent2 },\n                            \"Emitting AGUI event\"\n                          );\n                          subscriber.next(toolEndEvent2);\n                          currentToolCall = null;\n                        }\n                      }\n                    }\n                  } else {\n                    // update the current tool call\n                    if (toolCall.args) {\n                      currentToolCall.args += toolCall.args;\n                      const toolArgsEvent: ToolCallArgsEvent = {\n                        toolCallId: currentToolCall.id,\n                        delta: toolCall.args,\n                        type: EventType.TOOL_CALL_ARGS,\n                      };\n                      logger.trace?.(\n                        { aguiEvent: toolArgsEvent },\n                        \"Emitting AGUI event\"\n                      );\n                      subscriber.next(toolArgsEvent);\n\n                      if (isValidJson(currentToolCall.args)) {\n                        // args is valid json, tool call streaming ends\n                        const toolEndEvent: ToolCallEndEvent = {\n                          toolCallId: currentToolCall.id,\n                          type: EventType.TOOL_CALL_END,\n                        };\n                        logger.debug?.(\n                          { toolCallId: currentToolCall.id },\n                          \"Tool call ended (args complete)\"\n                        );\n                        logger.trace?.(\n                          { aguiEvent: toolEndEvent },\n                          \"Emitting AGUI event\"\n                        );\n                        subscriber.next(toolEndEvent);\n                        currentToolCall = null;\n                      }\n                    }\n                  }\n                } else {\n                  if (toolCall.name && toolCall.id) {\n                    currentToolCall = toolCall;\n                    toolCallCount++;\n                    const toolStartEvent: ToolCallStartEvent = {\n                      toolCallId: toolCall.id,\n                      toolCallName: toolCall.name,\n                      parentMessageId,\n                      type: EventType.TOOL_CALL_START,\n                    };\n                    logger.debug?.(\n                      { toolCallId: toolCall.id, toolCallName: toolCall.name },\n                      \"Tool call started\"\n                    );\n                    logger.trace?.(\n                      { aguiEvent: toolStartEvent },\n                      \"Emitting AGUI event\"\n                    );\n                    subscriber.next(toolStartEvent);\n                    if (toolCall.args) {\n                      const toolArgsEvent: ToolCallArgsEvent = {\n                        toolCallId: toolCall.id,\n                        delta: toolCall.args,\n                        type: EventType.TOOL_CALL_ARGS,\n                      };\n                      logger.trace?.(\n                        { aguiEvent: toolArgsEvent },\n                        \"Emitting AGUI event\"\n                      );\n                      subscriber.next(toolArgsEvent);\n\n                      if (isValidJson(toolCall.args)) {\n                        // args is valid json, tool call streaming ends\n                        const toolEndEvent: ToolCallEndEvent = {\n                          toolCallId: toolCall.id,\n                          type: EventType.TOOL_CALL_END,\n                        };\n                        logger.debug?.(\n                          { toolCallId: toolCall.id },\n                          \"Tool call ended (args complete)\"\n                        );\n                        logger.trace?.(\n                          { aguiEvent: toolEndEvent },\n                          \"Emitting AGUI event\"\n                        );\n                        subscriber.next(toolEndEvent);\n                        currentToolCall = null;\n                      }\n                    }\n                  }\n                }\n              });\n          }\n\n          // Process text content\n          const delta = event.data.chunk.content;\n          if (typeof delta === \"string\" && delta) {\n            textChunkCount++;\n            const textContentEvent: TextMessageContentEvent = {\n              messageId: chatModelRun.messageId!,\n              type: EventType.TEXT_MESSAGE_CONTENT,\n              delta,\n            };\n            logger.trace?.(\n              { aguiEvent: textContentEvent },\n              \"Emitting AGUI event\"\n            );\n            subscriber.next(textContentEvent);\n          }\n\n          continue;\n        }\n\n        if (event.event === \"on_chat_model_end\") {\n          const chatModelRun = chatModelRuns.find(\n            (run) => run.runId === event.run_id\n          );\n\n          if (!chatModelRun) {\n            logger.warn?.(\n              { chatModelRunId: event.run_id },\n              \"Received on_chat_model_end from unknown run\"\n            );\n            subscriber.next({\n              type: EventType.RUN_ERROR,\n              code: \"INTERNAL_ERROR\",\n              message: `Received a on_chat_model_end event from an unknown chat model run. Run Id: ${event.run_id}`,\n            } as RunErrorEvent);\n            continue;\n          }\n\n          const textEndEvent: TextMessageEndEvent = {\n            type: EventType.TEXT_MESSAGE_END,\n            messageId: chatModelRun.messageId!,\n          };\n          logger.debug?.(\n            { messageId: chatModelRun.messageId },\n            \"Text message ended\"\n          );\n          logger.trace?.({ aguiEvent: textEndEvent }, \"Emitting AGUI event\");\n          subscriber.next(textEndEvent);\n\n          continue;\n        }\n\n        // Handle on_tool_end: Pre-assign ID to toolMessage BEFORE messagesStateReducer runs.\n        // This ensures the same ID is used in:\n        // 1. TOOL_CALL_RESULT event (sent to frontend)\n        // 2. Checkpoint (stored in LangGraph state)\n        // 3. Second request (frontend sends back the same ID for deduplication)\n        if (event.event === \"on_tool_end\") {\n          const toolMessage = event.data.output;\n          if (toolMessage && toolMessage.tool_call_id) {\n            if (!handledToolCallIds.has(toolMessage.tool_call_id)) {\n              // Pre-assign ID before messagesStateReducer runs.\n              // The reducer checks: if (m.id === null || m.id === undefined) m.id = v4()\n              // By setting ID here, the reducer will skip assigning a new one.\n              if (!toolMessage.id) {\n                toolMessage.id = crypto.randomUUID();\n                // Also set lc_kwargs.id to match what the reducer does\n                if (toolMessage.lc_kwargs) {\n                  toolMessage.lc_kwargs.id = toolMessage.id;\n                }\n              }\n\n              const toolResultEvent: ToolCallResultEvent = {\n                toolCallId: toolMessage.tool_call_id,\n                type: EventType.TOOL_CALL_RESULT,\n                content:\n                  typeof toolMessage.content === \"string\"\n                    ? toolMessage.content\n                    : JSON.stringify(toolMessage.content),\n                messageId: toolMessage.id,\n              };\n              logger.debug?.(\n                {\n                  toolCallId: toolMessage.tool_call_id,\n                  messageId: toolMessage.id,\n                },\n                \"Tool call result received\"\n              );\n              logger.trace?.(\n                { aguiEvent: toolResultEvent },\n                \"Emitting AGUI event\"\n              );\n              subscriber.next(toolResultEvent);\n              handledToolCallIds.add(toolMessage.tool_call_id);\n            } else {\n              logger.trace?.(\n                { toolCallId: toolMessage.tool_call_id },\n                \"Skipping duplicate tool call result\"\n              );\n            }\n          }\n          continue;\n        }\n\n        if (event.event === \"on_chain_stream\") {\n          const chunk = event.data.chunk;\n\n          // TRACE: state updates including messages for debugging ordering issues\n          if (chunk?.messages && Array.isArray(chunk.messages)) {\n            logger.trace?.(\n              {\n                nodeName: event.name,\n                stateMessages: chunk.messages.map((m: LangGraphMessage) => ({\n                  type: m.type,\n                  id: m.id,\n                  contentPreview:\n                    typeof m.content === \"string\"\n                      ? m.content.slice(0, 100)\n                      : \"[non-string content]\",\n                  hasToolCalls:\n                    \"tool_calls\" in m &&\n                    Array.isArray(m.tool_calls) &&\n                    m.tool_calls.length > 0,\n                  toolCallId: \"tool_call_id\" in m ? m.tool_call_id : undefined,\n                })),\n                messageCount: chunk.messages.length,\n              },\n              \"State update with messages\"\n            );\n          }\n        }\n      }\n\n      const stats = { eventCount, toolCallCount, textChunkCount };\n\n      const runFinishedEvent: RunFinishedEvent = {\n        type: EventType.RUN_FINISHED,\n        threadId,\n        runId,\n      };\n      logger.info?.({ outcome: \"complete\", ...stats }, \"Run finished\");\n      logger.trace?.({ aguiEvent: runFinishedEvent }, \"Emitting AGUI event\");\n      subscriber.next(runFinishedEvent);\n    } catch (error) {\n      logger.error?.(\n        { err: error, eventCount, toolCallCount, textChunkCount },\n        \"Error during stream processing\"\n      );\n\n      // Extract code from error if available\n      const errorCode = isErrorWithCode(error) ? error.code : \"INTERNAL_ERROR\";\n      const errorMessage =\n        error instanceof Error ? error.message : String(error);\n\n      subscriber.next({\n        type: EventType.RUN_ERROR,\n        code: errorCode,\n        message: errorMessage,\n      } as RunErrorEvent);\n    }\n\n    subscriber.complete();\n  }\n\n  clone() {\n    const workflow = this.compiledWorkflow;\n    const logger = this.logger;\n    this.compiledWorkflow = undefined;\n\n    const cloned = super.clone() as LanggraphAgent;\n\n    this.compiledWorkflow = workflow;\n    cloned.compiledWorkflow = workflow;\n    cloned.logger = logger;\n\n    return cloned;\n  }\n\n  /**\n   * Setup observability for agent execution.\n   * Lazy loads observability callback, restores server context from forwardedProps,\n   * and configures the callback for graph execution.\n   */\n  private async setupObservability(\n    input: RunAgentInput,\n    logger: Logger\n  ): Promise<void> {\n    // Lazy load observability callback (shared across all instances)\n    if (!LangChainCallbackHandler) {\n      try {\n        logger.debug?.(\"Attempting to load observability...\");\n        const obsModule = await import(\"@cloudbase/agent-observability/langchain\");\n        LangChainCallbackHandler = obsModule.CallbackHandler;\n        logger.debug?.(\"✓ Observability handler loaded\");\n      } catch (e) {\n        logger.debug?.(\n          \"✗ Observability not available:\",\n          e instanceof Error ? e.message : String(e)\n        );\n      }\n    }\n\n    // Use shared handler instance for this agent\n    this.observabilityCallback = LangChainCallbackHandler\n      ? new LangChainCallbackHandler({\n          adapterName: this.adapterName,\n          logger: logger,\n        })\n      : undefined;\n\n    // Restore server SpanContext if available\n    if (\n      this.observabilityCallback &&\n      input.forwardedProps?.__agui_server_context\n    ) {\n      try {\n        const serverContextData = input.forwardedProps.__agui_server_context;\n\n        // Reconstruct SpanContext from serialized data\n        const serverSpanContext = {\n          traceId: serverContextData.traceId,\n          spanId: serverContextData.spanId,\n          traceFlags: serverContextData.traceFlags,\n          isRemote: true,\n        };\n\n        // Set external parent context in CallbackHandler with threadId/runId metadata\n        this.observabilityCallback.setExternalParentContext(serverSpanContext, {\n          threadId: input.threadId,\n          runId: input.runId,\n        });\n\n        logger.debug?.(\"✓ Server context restored:\", {\n          traceId: serverSpanContext.traceId,\n          spanId: serverSpanContext.spanId,\n          threadId: input.threadId,\n          runId: input.runId,\n        });\n      } catch (e) {\n        logger.debug?.(\"Failed to restore server context:\", e);\n      }\n    }\n  }\n}\n\nfunction aguiMessagesToLangChain(\n  messages: Message[],\n  logger?: Logger\n): LangGraphMessage[] {\n  return messages.map((message) => {\n    switch (message.role) {\n      case \"user\":\n        if (typeof message.content === \"string\") {\n          return {\n            id: message.id,\n            role: message.role,\n            content: message.content,\n            type: \"human\",\n          };\n        } else {\n          // Convert AG-UI InputContent[] to LangChain multimodal format\n          const langChainContent: Array<\n            | { type: \"text\"; text: string }\n            | { type: \"image_url\"; image_url: { url: string } }\n          > = [];\n\n          for (const part of message.content) {\n            if (part.type === \"text\") {\n              langChainContent.push({ type: \"text\", text: part.text });\n            } else if (part.type === \"binary\") {\n              const imageUrl = convertBinaryToImageUrl(\n                part,\n                message.id,\n                logger\n              );\n              if (imageUrl) {\n                langChainContent.push({\n                  type: \"image_url\",\n                  image_url: { url: imageUrl },\n                });\n              }\n            }\n          }\n\n          if (langChainContent.length === 0) {\n            logger?.warn?.(\n              { messageId: message.id },\n              \"User message content array resulted in empty LangChain content\"\n            );\n          }\n\n          return {\n            id: message.id,\n            role: message.role,\n            content: langChainContent,\n            type: \"human\",\n          };\n        }\n\n      case \"assistant\":\n        return {\n          id: message.id,\n          type: \"ai\",\n          role: message.role,\n          content: message.content ?? \"\",\n          tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n            id: tc.id,\n            name: tc.function.name,\n            args: JSON.parse(tc.function.arguments),\n            type: \"tool_call\",\n          })),\n        };\n      case \"system\":\n        return {\n          id: message.id,\n          role: message.role,\n          content: message.content,\n          type: \"system\",\n        };\n      case \"tool\":\n        return {\n          content: message.content,\n          role: message.role,\n          type: message.role,\n          tool_call_id: message.toolCallId,\n          id: message.id,\n        };\n      default:\n        // Note: Can't use this.logger here as this is a standalone function\n        // The error will be caught and logged by the caller\n        throw new Error(`Message role ${message.role} is not supported.`);\n    }\n  });\n}\n\nfunction isValidJson(json: string) {\n  try {\n    JSON.parse(json);\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Converts a BinaryInputContent to a LangChain image_url format.\n * Only supports image/* mimeTypes.\n *\n * @returns The image URL string, or undefined if:\n *   - mimeType is not an image type\n *   - Only `id` is provided (requires external resolution, not supported)\n *   - No valid payload (url/data) is available\n */\nfunction convertBinaryToImageUrl(\n  part: BinaryInputContent,\n  messageId: string,\n  logger?: Logger\n): string | undefined {\n  // Only support image types\n  if (!part.mimeType.startsWith(\"image/\")) {\n    logger?.debug?.(\n      { mimeType: part.mimeType, messageId },\n      \"Skipping non-image binary content\"\n    );\n    return undefined;\n  }\n\n  // Prefer url, then data URL\n  if (part.url) {\n    return part.url;\n  }\n\n  if (part.data) {\n    return `data:${part.mimeType};base64,${part.data}`;\n  }\n\n  return undefined;\n}\n","import { RunAgentInput } from \"@ag-ui/client\";\nimport { DynamicStructuredTool } from \"@langchain/core/tools\";\nimport z from \"zod/v4\";\n\nexport function convertActionsToDynamicStructuredTools(\n  tools: RunAgentInput[\"tools\"]\n): DynamicStructuredTool<any>[] {\n  return tools.map(convertActionToDynamicStructuredTool);\n}\n\nexport function convertActionToDynamicStructuredTool(\n  actionInput: RunAgentInput[\"tools\"][number]\n): DynamicStructuredTool<any> {\n  return new DynamicStructuredTool({\n    name: actionInput.name,\n    description: actionInput.description,\n    schema: convertJsonSchemaToZodSchema(actionInput.parameters, true),\n    func: async () => {\n      return \"\";\n    },\n  });\n}\n\nexport function convertJsonSchemaToZodSchema(\n  jsonSchema: any,\n  required: boolean\n): z.ZodSchema {\n  if (jsonSchema.type === \"object\") {\n    const spec: { [key: string]: z.ZodSchema } = {};\n\n    if (!jsonSchema.properties || !Object.keys(jsonSchema.properties).length) {\n      return !required ? z.object(spec).optional() : z.object(spec);\n    }\n\n    for (const [key, value] of Object.entries(jsonSchema.properties)) {\n      spec[key] = convertJsonSchemaToZodSchema(\n        value,\n        jsonSchema.required ? jsonSchema.required.includes(key) : false\n      );\n    }\n    let schema = z.object(spec).describe(jsonSchema.description);\n    return required ? schema : schema.optional();\n  } else if (jsonSchema.type === \"string\") {\n    let schema = z.string().describe(jsonSchema.description);\n    return required ? schema : schema.optional();\n  } else if (jsonSchema.type === \"number\") {\n    let schema = z.number().describe(jsonSchema.description);\n    return required ? schema : schema.optional();\n  } else if (jsonSchema.type === \"boolean\") {\n    let schema = z.boolean().describe(jsonSchema.description);\n    return required ? schema : schema.optional();\n  } else if (jsonSchema.type === \"array\") {\n    let itemSchema = convertJsonSchemaToZodSchema(jsonSchema.items, true);\n    let schema = z.array(itemSchema).describe(jsonSchema.description);\n    return required ? schema : schema.optional();\n  }\n  throw new Error(\"Invalid JSON schema\");\n}\n","import {\n  BaseCheckpointSaver,\n  Checkpoint,\n  CheckpointMetadata,\n  CheckpointTuple,\n} from \"@langchain/langgraph\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n  MemoryClient,\n  IMemoryClientOptions,\n  Order,\n} from \"@cloudbase/agent-agents\";\n\n// Define types locally if not available from langgraph\ntype PendingWrite = [string, any];\ntype CheckpointPendingWrite = [string, string, any];\n\ninterface CheckpointListOptions {\n  limit?: number;\n  before?: RunnableConfig;\n  filter?: Record<string, any>;\n}\n\nexport interface TDAISaverConfig extends IMemoryClientOptions {\n  checkpointType?: string;\n  checkpointWritesType?: string;\n}\n\n/**\n * TDAISaver - LangGraph checkpoint saver implementation using TDAI Memory\n *\n * Storage Strategy:\n * - Events (NoSQL): Store checkpoint data and pending writes in separate collections\n * - Supports namespaces and parent checkpoint relationships\n */\nexport class TDAISaver extends BaseCheckpointSaver {\n  private memoryClient: MemoryClient;\n  private checkpointType: string;\n  private checkpointWritesType: string;\n\n  constructor(config: TDAISaverConfig) {\n    super();\n    const {\n      checkpointType = \"checkpoints\",\n      checkpointWritesType = \"checkpoint_writes\",\n      ...clientConfig\n    } = config;\n\n    this.memoryClient = new MemoryClient(clientConfig);\n    this.checkpointType = checkpointType;\n    this.checkpointWritesType = checkpointWritesType;\n  }\n\n  /**\n   * Retrieves a checkpoint from TDAI Memory based on the provided config.\n   * If the config contains a \"checkpoint_id\" key, the checkpoint with the matching\n   * thread ID and checkpoint ID is retrieved. Otherwise, the latest checkpoint\n   * for the given thread ID is retrieved.\n   */\n  async getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined> {\n    try {\n      const {\n        thread_id,\n        checkpoint_ns = \"\",\n        checkpoint_id,\n      } = config.configurable ?? {};\n\n      if (!thread_id) {\n        return undefined;\n      }\n\n      const query: Record<string, any> = {\n        collection: this.checkpointType,\n        checkpoint_ns,\n      };\n\n      if (checkpoint_id) {\n        query.checkpoint_id = checkpoint_id;\n      }\n\n      // Query events for checkpoint data\n      const { events = [] } = await this.memoryClient.queryEvents({\n        sessionId: thread_id,\n        where: query,\n        orderBy: { checkpoint_id: Order.DESCENDING },\n        limit: 1,\n      });\n\n      if (events.length === 0) {\n        return undefined;\n      }\n\n      const doc = events[0];\n      const configurableValues = {\n        checkpoint_ns,\n        checkpoint_id: doc.checkpoint_id,\n      };\n\n      // Get checkpoint data (stored as JSON)\n      const checkpoint: Checkpoint = doc.checkpoint;\n\n      // Get pending writes\n      const { events: serializedWrites = [] } =\n        await this.memoryClient.queryEvents({\n          sessionId: thread_id,\n          where: {\n            collection: this.checkpointWritesType,\n            ...configurableValues,\n          },\n        });\n\n      const pendingWrites: CheckpointPendingWrite[] = serializedWrites.map(\n        (serializedWrite: any) => {\n          return [\n            serializedWrite.task_id,\n            serializedWrite.channel,\n            serializedWrite.value,\n          ] as CheckpointPendingWrite;\n        }\n      );\n\n      // Get metadata (stored as JSON)\n      const metadata: CheckpointMetadata = doc.metadata || {};\n\n      return {\n        config: { configurable: configurableValues },\n        checkpoint,\n        pendingWrites,\n        metadata,\n        parentConfig:\n          doc.parent_checkpoint_id != null\n            ? {\n                configurable: {\n                  thread_id,\n                  checkpoint_ns,\n                  checkpoint_id: doc.parent_checkpoint_id,\n                },\n              }\n            : undefined,\n      };\n    } catch (error) {\n      console.error(\"Error getting checkpoint:\", error);\n      return undefined;\n    }\n  }\n\n  /**\n   * Retrieve a list of checkpoint tuples from TDAI Memory based on the provided config.\n   * The checkpoints are ordered by checkpoint ID in descending order (newest first).\n   */\n  async *list(\n    config: RunnableConfig,\n    options?: CheckpointListOptions\n  ): AsyncGenerator<CheckpointTuple> {\n    const { limit, before, filter } = options ?? {};\n\n    if (!config?.configurable?.thread_id) {\n      throw new Error(\"Thread ID is required\");\n    }\n\n    const query: Record<string, any> = {\n      collection: this.checkpointType,\n    };\n\n    if (\n      config?.configurable?.checkpoint_ns !== undefined &&\n      config?.configurable?.checkpoint_ns !== null\n    ) {\n      query.checkpoint_ns = config.configurable.checkpoint_ns;\n    }\n\n    // Apply metadata filters\n    if (filter) {\n      Object.entries(filter).forEach(([key, value]) => {\n        query[`metadata.${key}`] = value;\n      });\n    }\n\n    // Apply before filter\n    if (before) {\n      query.checkpoint_id = { $lt: before.configurable?.checkpoint_id };\n    }\n\n    // Query events\n    const { events = [] } = await this.memoryClient.queryEvents({\n      sessionId: config?.configurable?.thread_id || \"default\",\n      where: query,\n      orderBy: { checkpoint_id: Order.DESCENDING },\n      limit: limit,\n    });\n\n    for (const doc of events) {\n      // Get checkpoint and metadata (stored directly without serialization)\n      const checkpoint: Checkpoint = doc.checkpoint;\n      const metadata: CheckpointMetadata = doc.metadata || {};\n\n      yield {\n        config: {\n          configurable: {\n            thread_id: doc.thread_id,\n            checkpoint_ns: doc.checkpoint_ns,\n            checkpoint_id: doc.checkpoint_id,\n          },\n        },\n        checkpoint,\n        metadata,\n        parentConfig: doc.parent_checkpoint_id\n          ? {\n              configurable: {\n                thread_id: doc.thread_id,\n                checkpoint_ns: doc.checkpoint_ns,\n                checkpoint_id: doc.parent_checkpoint_id,\n              },\n            }\n          : undefined,\n      };\n    }\n  }\n\n  /**\n   * Saves a checkpoint to TDAI Memory. The checkpoint is associated with the\n   * provided config and its parent config (if any).\n   */\n  async put(\n    config: RunnableConfig,\n    checkpoint: Checkpoint,\n    metadata: CheckpointMetadata\n  ): Promise<RunnableConfig> {\n    try {\n      const thread_id = config.configurable?.thread_id;\n      const checkpoint_ns = config.configurable?.checkpoint_ns ?? \"\";\n      const checkpoint_id = checkpoint.id;\n\n      if (thread_id === undefined) {\n        throw new Error(\n          `The provided config must contain a configurable field with a \"thread_id\" field.`\n        );\n      }\n\n      // Prepare document for storage (store as JSON)\n      const doc = {\n        collection: this.checkpointType,\n        checkpoint_ns,\n        checkpoint_id,\n        parent_checkpoint_id: config.configurable?.checkpoint_id,\n        checkpoint: checkpoint,\n        metadata: metadata,\n      };\n\n      const { events = [] } = await this.memoryClient.queryEvents({\n        sessionId: thread_id,\n        where: {\n          collection: this.checkpointType,\n          checkpoint_ns,\n          checkpoint_id,\n        },\n      });\n\n      if (events[0]) {\n        this.memoryClient.deleteEvent({\n          sessionId: thread_id,\n          eventId: events[0].id,\n          //   messages: doc,\n        });\n      } else {\n        await this.memoryClient.appendEvent({\n          sessionId: thread_id,\n          messages: doc,\n        });\n      }\n\n      return {\n        configurable: {\n          thread_id,\n          checkpoint_ns,\n          checkpoint_id,\n        },\n      };\n    } catch (error) {\n      console.error(\"Error saving checkpoint:\", error);\n      throw error;\n    }\n  }\n\n  /**\n   * Saves intermediate writes associated with a checkpoint to TDAI Memory.\n   */\n  async putWrites(\n    config: RunnableConfig,\n    writes: PendingWrite[],\n    taskId: string\n  ): Promise<void> {\n    try {\n      const thread_id = config.configurable?.thread_id;\n      const checkpoint_ns = config.configurable?.checkpoint_ns;\n      const checkpoint_id = config.configurable?.checkpoint_id;\n\n      if (\n        thread_id === undefined ||\n        checkpoint_ns === undefined ||\n        checkpoint_id === undefined\n      ) {\n        throw new Error(\n          `The provided config must contain a configurable field with \"thread_id\", \"checkpoint_ns\" and \"checkpoint_id\" fields.`\n        );\n      }\n\n      // Process writes in parallel\n      const writePromises = writes.map(async ([channel, value], idx) => {\n        const writeDoc = {\n          collection: this.checkpointWritesType,\n          checkpoint_ns,\n          checkpoint_id,\n          task_id: taskId,\n          idx,\n          channel,\n          value: value, // Store directly as JSON\n        };\n\n        return this.memoryClient.appendEvent({\n          sessionId: thread_id,\n          messages: writeDoc,\n        });\n      });\n\n      await Promise.all(writePromises);\n    } catch (error) {\n      console.error(\"Error storing writes:\", error);\n      throw error;\n    }\n  }\n\n  /**\n   * Delete all checkpoints and writes for a thread from TDAI Memory.\n   */\n  async deleteThread(threadId: string): Promise<void> {\n    try {\n      // Delete the entire session which will remove all data\n      await this.memoryClient.deleteSession({\n        sessionId: threadId,\n      });\n    } catch (error) {\n      console.error(\"Error deleting thread:\", error);\n      throw error;\n    }\n  }\n\n  /**\n   * Close the memory client connection\n   */\n  close(): void {\n    this.memoryClient.close();\n  }\n}\n\n","import {\n  BaseCheckpointSaver,\n  Checkpoint,\n  CheckpointMetadata,\n  CheckpointTuple,\n} from \"@langchain/langgraph\";\nimport {\n  copyCheckpoint,\n  type CheckpointListOptions,\n  type CheckpointPendingWrite,\n  type PendingWrite,\n} from \"@langchain/langgraph-checkpoint\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport type { CloudBase } from \"@cloudbase/node-sdk\";\n\n/** CloudBase database instance type (from app.database()) */\ntype CloudBaseDb = ReturnType<CloudBase[\"database\"]>;\n\nexport interface CloudBaseSaverConfig {\n  /** CloudBase database instance from app.database() */\n  db: CloudBaseDb;\n\n  /** User ID for multi-tenant isolation */\n  userId: string;\n\n  /** Agent ID to distinguish different agents/graphs (default: \"default\") */\n  agentId?: string;\n\n  /** Collection name for checkpoints (default: \"checkpoints\") */\n  checkpointsCollection?: string;\n\n  /** Collection name for writes (default: \"checkpoint_writes\") */\n  writesCollection?: string;\n}\n\n/**\n * CloudBaseSaver - LangGraph checkpoint saver implementation using Tencent CloudBase\n *\n * Storage Strategy:\n * - Uses 2 collections: checkpoints and checkpoint_writes\n * - Data is serialized using BaseCheckpointSaver's serde (base64 encoded)\n * - Multi-tenant isolation via userId field\n */\nexport class CloudBaseSaver extends BaseCheckpointSaver {\n  private db: CloudBaseDb;\n  private userId: string;\n  private agentId: string;\n  private checkpointsCollection: string;\n  private writesCollection: string;\n\n  constructor(config: CloudBaseSaverConfig) {\n    super();\n    this.db = config.db;\n    this.userId = config.userId;\n    this.agentId = config.agentId ?? \"default\";\n    this.checkpointsCollection = config.checkpointsCollection ?? \"checkpoints\";\n    this.writesCollection = config.writesCollection ?? \"checkpoint_writes\";\n  }\n\n  /**\n   * Setup the required collections in CloudBase.\n   * Call this once before using the saver. Safe to call multiple times.\n   */\n  async setup(): Promise<void> {\n    const createIfNotExists = async (name: string): Promise<void> => {\n      try {\n        await this.db.createCollection(name);\n      } catch (e) {\n        const error = e as { code?: string };\n        if (error.code !== \"DATABASE_COLLECTION_ALREADY_EXIST\") {\n          throw e;\n        }\n      }\n    };\n\n    await Promise.all([\n      createIfNotExists(this.checkpointsCollection),\n      createIfNotExists(this.writesCollection),\n    ]);\n  }\n\n  /**\n   * Serialize data to JSON object using serde.\n   * CloudBase is a document database, so we store JSON directly instead of Base64.\n   * Binary data (Uint8Array) is not supported - fail early if encountered.\n   */\n  private async serialize(data: unknown): Promise<unknown> {\n    const [type, bytes] = await this.serde.dumpsTyped(data);\n\n    if (type === \"bytes\") {\n      throw new Error(\n        \"Binary data (Uint8Array) is not supported in CloudBaseSaver. \" +\n          \"CloudBase is a document database that only supports JSON-serializable data.\"\n      );\n    }\n\n    // type === \"json\": bytes is UTF-8 encoded JSON string\n    const jsonString = new TextDecoder().decode(bytes);\n    return JSON.parse(jsonString);\n  }\n\n  /**\n   * Deserialize JSON object back to data using serde.\n   */\n  private async deserialize(data: unknown): Promise<unknown> {\n    const jsonString = JSON.stringify(data);\n    const bytes = new TextEncoder().encode(jsonString);\n    return this.serde.loadsTyped(\"json\", bytes);\n  }\n\n  /**\n   * Retrieves a checkpoint from CloudBase based on the provided config.\n   */\n  async getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined> {\n    const {\n      thread_id,\n      checkpoint_ns = \"\",\n      checkpoint_id,\n    } = config.configurable ?? {};\n\n    if (!thread_id) {\n      return undefined;\n    }\n\n    // Build query\n    const query: Record<string, unknown> = {\n      _openid: this.userId,\n      agent_id: this.agentId,\n      thread_id,\n      checkpoint_ns,\n    };\n\n    if (checkpoint_id) {\n      query.checkpoint_id = checkpoint_id;\n    }\n\n    // Query checkpoints\n    const { data: docs } = await this.db\n      .collection(this.checkpointsCollection)\n      .where(query)\n      .orderBy(\"checkpoint_id\", \"desc\")\n      .limit(1)\n      .get();\n\n    if (docs.length === 0) {\n      return undefined;\n    }\n\n    const doc = docs[0];\n    const checkpointId = doc.checkpoint_id as string;\n\n    // Deserialize checkpoint and metadata\n    const checkpoint = (await this.deserialize(doc.checkpoint)) as Checkpoint;\n    const metadata = (await this.deserialize(\n      doc.metadata\n    )) as CheckpointMetadata;\n\n    // Query pending writes with pagination (CloudBase max 100 per query)\n    const writeDocs: Record<string, unknown>[] = [];\n    let writeSkip = 0;\n    const writePageSize = 100;\n\n    while (true) {\n      const { data: docs } = await this.db\n        .collection(this.writesCollection)\n        .where({\n          _openid: this.userId,\n          agent_id: this.agentId,\n          thread_id,\n          checkpoint_ns,\n          checkpoint_id: checkpointId,\n        })\n        .orderBy(\"idx\", \"asc\")\n        .skip(writeSkip)\n        .limit(writePageSize)\n        .get();\n\n      writeDocs.push(...docs);\n      if (docs.length < writePageSize) break;\n      writeSkip += docs.length;\n    }\n\n    const pendingWrites: CheckpointPendingWrite[] = await Promise.all(\n      writeDocs.map(async (writeDoc) => {\n        const value = await this.deserialize(writeDoc.value);\n        return [\n          writeDoc.task_id as string,\n          writeDoc.channel as string,\n          value,\n        ] as CheckpointPendingWrite;\n      })\n    );\n\n    return {\n      config: {\n        configurable: {\n          thread_id,\n          checkpoint_ns,\n          checkpoint_id: checkpointId,\n        },\n      },\n      checkpoint,\n      metadata,\n      pendingWrites,\n      parentConfig: doc.parent_checkpoint_id\n        ? {\n            configurable: {\n              thread_id,\n              checkpoint_ns,\n              checkpoint_id: doc.parent_checkpoint_id as string,\n            },\n          }\n        : undefined,\n    };\n  }\n\n  /**\n   * List checkpoints from CloudBase, ordered by checkpoint_id descending.\n   */\n  async *list(\n    config: RunnableConfig,\n    options?: CheckpointListOptions\n  ): AsyncGenerator<CheckpointTuple> {\n    const { limit, before, filter } = options ?? {};\n    const thread_id = config.configurable?.thread_id;\n    const checkpoint_ns = config.configurable?.checkpoint_ns;\n\n    if (!thread_id) {\n      throw new Error(\"Thread ID is required\");\n    }\n\n    const _ = this.db.command;\n    const query: Record<string, unknown> = {\n      _openid: this.userId,\n      agent_id: this.agentId,\n      thread_id,\n    };\n\n    // Only filter by checkpoint_ns if explicitly provided\n    if (checkpoint_ns !== undefined && checkpoint_ns !== null) {\n      query.checkpoint_ns = checkpoint_ns;\n    }\n\n    // Apply before filter using lt operator\n    if (before?.configurable?.checkpoint_id) {\n      query.checkpoint_id = _.lt(before.configurable.checkpoint_id);\n    }\n\n    // Apply metadata filters (only valid keys)\n    const validCheckpointMetadataKeys = [\"source\", \"step\", \"writes\", \"parents\"];\n    if (filter) {\n      for (const [key, value] of Object.entries(filter)) {\n        if (value !== undefined && validCheckpointMetadataKeys.includes(key)) {\n          query[`metadata.${key}`] = value;\n        }\n      }\n    }\n\n    // CloudBase max 100 records per query\n    let skip = 0;\n    const pageSize = Math.min(limit ?? 100, 100);\n    let yielded = 0;\n\n    while (true) {\n      const { data: docs } = await this.db\n        .collection(this.checkpointsCollection)\n        .where(query)\n        .orderBy(\"checkpoint_id\", \"desc\")\n        .skip(skip)\n        .limit(pageSize)\n        .get();\n\n      if (docs.length === 0) break;\n\n      for (const doc of docs) {\n        // Deserialize\n        const checkpoint = (await this.deserialize(\n          doc.checkpoint\n        )) as Checkpoint;\n        const metadata = (await this.deserialize(\n          doc.metadata\n        )) as CheckpointMetadata;\n\n        // Query pending writes for this checkpoint with pagination\n        const writeDocs: Record<string, unknown>[] = [];\n        let writeSkip = 0;\n        const writePageSize = 100;\n\n        while (true) {\n          const { data: pageWriteDocs } = await this.db\n            .collection(this.writesCollection)\n            .where({\n              _openid: this.userId,\n              agent_id: this.agentId,\n              thread_id: doc.thread_id,\n              checkpoint_ns: doc.checkpoint_ns,\n              checkpoint_id: doc.checkpoint_id,\n            })\n            .orderBy(\"idx\", \"asc\")\n            .skip(writeSkip)\n            .limit(writePageSize)\n            .get();\n\n          writeDocs.push(...pageWriteDocs);\n          if (pageWriteDocs.length < writePageSize) break;\n          writeSkip += pageWriteDocs.length;\n        }\n\n        const pendingWrites: CheckpointPendingWrite[] = await Promise.all(\n          writeDocs.map(async (writeDoc) => {\n            const value = await this.deserialize(writeDoc.value);\n            return [\n              writeDoc.task_id as string,\n              writeDoc.channel as string,\n              value,\n            ] as CheckpointPendingWrite;\n          })\n        );\n\n        yield {\n          config: {\n            configurable: {\n              thread_id: doc.thread_id as string,\n              checkpoint_ns: doc.checkpoint_ns as string,\n              checkpoint_id: doc.checkpoint_id as string,\n            },\n          },\n          checkpoint,\n          metadata,\n          pendingWrites,\n          parentConfig: doc.parent_checkpoint_id\n            ? {\n                configurable: {\n                  thread_id: doc.thread_id as string,\n                  checkpoint_ns: doc.checkpoint_ns as string,\n                  checkpoint_id: doc.parent_checkpoint_id as string,\n                },\n              }\n            : undefined,\n        };\n\n        yielded++;\n        if (limit && yielded >= limit) return;\n      }\n\n      skip += docs.length;\n      if (docs.length < pageSize) break;\n    }\n  }\n\n  /**\n   * Save a checkpoint to CloudBase.\n   */\n  async put(\n    config: RunnableConfig,\n    checkpoint: Checkpoint,\n    metadata: CheckpointMetadata\n  ): Promise<RunnableConfig> {\n    if (!config.configurable) {\n      throw new Error(\"Empty configuration supplied.\");\n    }\n\n    const thread_id = config.configurable.thread_id;\n    const checkpoint_ns = config.configurable.checkpoint_ns ?? \"\";\n    const checkpoint_id = checkpoint.id;\n\n    if (!thread_id) {\n      throw new Error(\n        'Missing \"thread_id\" field in passed \"config.configurable\".'\n      );\n    }\n\n    // Copy checkpoint to avoid mutation during serialization\n    const preparedCheckpoint = copyCheckpoint(checkpoint);\n\n    // Serialize checkpoint and metadata to JSON objects\n    const serializedCheckpoint = await this.serialize(preparedCheckpoint);\n    const serializedMetadata = await this.serialize(metadata);\n\n    const doc = {\n      _openid: this.userId,\n      agent_id: this.agentId,\n      thread_id,\n      checkpoint_ns,\n      checkpoint_id,\n      parent_checkpoint_id: config.configurable.checkpoint_id ?? null,\n      checkpoint: serializedCheckpoint,\n      metadata: serializedMetadata,\n      created_at: new Date(),\n    };\n\n    // Use custom _id + set() for INSERT OR REPLACE behavior\n    const docId = `${this.agentId}:${thread_id}:${checkpoint_ns}:${checkpoint_id}`;\n    await this.db.collection(this.checkpointsCollection).doc(docId).set(doc);\n\n    return {\n      configurable: {\n        thread_id,\n        checkpoint_ns,\n        checkpoint_id,\n      },\n    };\n  }\n\n  /**\n   * Save intermediate writes to CloudBase.\n   */\n  async putWrites(\n    config: RunnableConfig,\n    writes: PendingWrite[],\n    taskId: string\n  ): Promise<void> {\n    if (!config.configurable) {\n      throw new Error(\"Empty configuration supplied.\");\n    }\n    if (!config.configurable.thread_id) {\n      throw new Error(\"Missing thread_id field in config.configurable.\");\n    }\n    if (!config.configurable.checkpoint_id) {\n      throw new Error(\"Missing checkpoint_id field in config.configurable.\");\n    }\n\n    const thread_id = config.configurable.thread_id;\n    const checkpoint_ns = config.configurable.checkpoint_ns ?? \"\";\n    const checkpoint_id = config.configurable.checkpoint_id;\n\n    // Pre-serialize all values before transaction (async operations must be outside)\n    const serializedWrites = await Promise.all(\n      writes.map(async ([channel, value], idx) => ({\n        channel,\n        value: await this.serialize(value),\n        idx,\n        docId: `${this.agentId}:${thread_id}:${checkpoint_ns}:${checkpoint_id}:${taskId}:${idx}`,\n      }))\n    );\n\n    // Use transaction for atomic writes\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    await this.db.runTransaction(async (transaction: any) => {\n      for (const { channel, value, idx, docId } of serializedWrites) {\n        await transaction.collection(this.writesCollection).doc(docId).set({\n          _openid: this.userId,\n          agent_id: this.agentId,\n          thread_id,\n          checkpoint_ns,\n          checkpoint_id,\n          task_id: taskId,\n          idx,\n          channel,\n          value,\n        });\n      }\n    });\n  }\n\n  /**\n   * Delete all checkpoints and writes for a thread.\n   */\n  async deleteThread(threadId: string): Promise<void> {\n    // Delete from checkpoints collection\n    await this.db\n      .collection(this.checkpointsCollection)\n      .where({\n        _openid: this.userId,\n        agent_id: this.agentId,\n        thread_id: threadId,\n      })\n      .remove();\n\n    // Delete from writes collection\n    await this.db\n      .collection(this.writesCollection)\n      .where({\n        _openid: this.userId,\n        agent_id: this.agentId,\n        thread_id: threadId,\n      })\n      .remove();\n  }\n}\n","export const TASKS = \"__pregel_tasks\";\nexport const ERROR = \"__error__\";\nexport const SCHEDULED = \"__scheduled__\";\nexport const INTERRUPT = \"__interrupt__\";\nexport const RESUME = \"__resume__\";\n\n// Mirrors BaseChannel in \"@langchain/langgraph\"\nexport interface ChannelProtocol<\n  ValueType = unknown,\n  UpdateType = unknown,\n  CheckpointType = unknown\n> {\n  ValueType: ValueType;\n\n  UpdateType: UpdateType;\n\n  /**\n   * The name of the channel.\n   */\n  lc_graph_name: string;\n\n  /**\n   * Return a new identical channel, optionally initialized from a checkpoint.\n   * Can be thought of as a \"restoration\" from a checkpoint which is a \"snapshot\" of the channel's state.\n   *\n   * @param {CheckpointType | undefined} checkpoint\n   * @returns {this}\n   */\n  fromCheckpoint(checkpoint?: CheckpointType): this;\n\n  /**\n   * Update the channel's value with the given sequence of updates.\n   * The order of the updates in the sequence is arbitrary.\n   *\n   * @throws {InvalidUpdateError} if the sequence of updates is invalid.\n   * @param {Array<UpdateType>} values\n   * @returns {void}\n   */\n  update(values: UpdateType[]): void;\n\n  /**\n   * Return the current value of the channel.\n   *\n   * @throws {EmptyChannelError} if the channel is empty (never updated yet).\n   * @returns {ValueType}\n   */\n  get(): ValueType;\n\n  /**\n   * Return a string representation of the channel's current state.\n   *\n   * @throws {EmptyChannelError} if the channel is empty (never updated yet), or doesn't support checkpoints.\n   * @returns {CheckpointType | undefined}\n   */\n  checkpoint(): CheckpointType | undefined;\n}\n\n// Mirrors SendInterface in \"@langchain/langgraph\"\nexport interface SendProtocol {\n  node: string;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  args: any;\n}\n","import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { SerializerProtocol } from \"./serde/base.js\";\nimport { uuid6 } from \"./id.js\";\nimport type {\n  PendingWrite,\n  CheckpointPendingWrite,\n  CheckpointMetadata,\n} from \"./types.js\";\nimport { ERROR, INTERRUPT, RESUME, SCHEDULED } from \"./serde/types.js\";\nimport { JsonPlusSerializer } from \"./serde/jsonplus.js\";\n\n/** @inline */\ntype ChannelVersion = number | string;\n\nexport type ChannelVersions = Record<string, ChannelVersion>;\n\nexport interface Checkpoint<\n  N extends string = string,\n  C extends string = string\n> {\n  /**\n   * The version of the checkpoint format. Currently 4\n   */\n  v: number;\n  /**\n   * Checkpoint ID {uuid6}\n   */\n  id: string;\n  /**\n   * Timestamp {new Date().toISOString()}\n   */\n  ts: string;\n  /**\n   * @default {}\n   */\n  channel_values: Record<C, unknown>;\n  /**\n   * @default {}\n   */\n  channel_versions: Record<C, ChannelVersion>;\n  /**\n   * @default {}\n   */\n  versions_seen: Record<N, Record<C, ChannelVersion>>;\n}\n\nexport interface ReadonlyCheckpoint extends Readonly<Checkpoint> {\n  readonly channel_values: Readonly<Record<string, unknown>>;\n  readonly channel_versions: Readonly<Record<string, ChannelVersion>>;\n  readonly versions_seen: Readonly<\n    Record<string, Readonly<Record<string, ChannelVersion>>>\n  >;\n}\n\nexport function deepCopy<T>(obj: T): T {\n  if (typeof obj !== \"object\" || obj === null) {\n    return obj;\n  }\n\n  const newObj = Array.isArray(obj) ? [] : {};\n\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      (newObj as Record<PropertyKey, unknown>)[key] = deepCopy(\n        (obj as Record<string, unknown>)[key]\n      );\n    }\n  }\n\n  return newObj as T;\n}\n\n/** @hidden */\nexport function emptyCheckpoint(): Checkpoint {\n  return {\n    v: 4,\n    id: uuid6(-2),\n    ts: new Date().toISOString(),\n    channel_values: {},\n    channel_versions: {},\n    versions_seen: {},\n  };\n}\n\n/** @hidden */\nexport function copyCheckpoint(checkpoint: ReadonlyCheckpoint): Checkpoint {\n  return {\n    v: checkpoint.v,\n    id: checkpoint.id,\n    ts: checkpoint.ts,\n    channel_values: { ...checkpoint.channel_values },\n    channel_versions: { ...checkpoint.channel_versions },\n    versions_seen: deepCopy(checkpoint.versions_seen),\n  };\n}\n\nexport interface CheckpointTuple {\n  config: RunnableConfig;\n  checkpoint: Checkpoint;\n  metadata?: CheckpointMetadata;\n  parentConfig?: RunnableConfig;\n  pendingWrites?: CheckpointPendingWrite[];\n}\n\nexport type CheckpointListOptions = {\n  limit?: number;\n  before?: RunnableConfig;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  filter?: Record<string, any>;\n};\n\nexport abstract class BaseCheckpointSaver<V extends string | number = number> {\n  serde: SerializerProtocol = new JsonPlusSerializer();\n\n  constructor(serde?: SerializerProtocol) {\n    this.serde = serde || this.serde;\n  }\n\n  async get(config: RunnableConfig): Promise<Checkpoint | undefined> {\n    const value = await this.getTuple(config);\n    return value ? value.checkpoint : undefined;\n  }\n\n  abstract getTuple(\n    config: RunnableConfig\n  ): Promise<CheckpointTuple | undefined>;\n\n  abstract list(\n    config: RunnableConfig,\n    options?: CheckpointListOptions\n  ): AsyncGenerator<CheckpointTuple>;\n\n  abstract put(\n    config: RunnableConfig,\n    checkpoint: Checkpoint,\n    metadata: CheckpointMetadata,\n    newVersions: ChannelVersions\n  ): Promise<RunnableConfig>;\n\n  /**\n   * Store intermediate writes linked to a checkpoint.\n   */\n  abstract putWrites(\n    config: RunnableConfig,\n    writes: PendingWrite[],\n    taskId: string\n  ): Promise<void>;\n\n  /**\n   * Delete all checkpoints and writes associated with a specific thread ID.\n   * @param threadId The thread ID whose checkpoints should be deleted.\n   */\n  abstract deleteThread(threadId: string): Promise<void>;\n\n  /**\n   * Generate the next version ID for a channel.\n   *\n   * Default is to use integer versions, incrementing by 1. If you override, you can use str/int/float versions,\n   * as long as they are monotonically increasing.\n   */\n  getNextVersion(current: V | undefined): V {\n    if (typeof current === \"string\") {\n      throw new Error(\"Please override this method to use string versions.\");\n    }\n    return (\n      current !== undefined && typeof current === \"number\" ? current + 1 : 1\n    ) as V;\n  }\n}\n\nexport function compareChannelVersions(\n  a: ChannelVersion,\n  b: ChannelVersion\n): number {\n  if (typeof a === \"number\" && typeof b === \"number\") {\n    return Math.sign(a - b);\n  }\n\n  return String(a).localeCompare(String(b));\n}\n\nexport function maxChannelVersion(\n  ...versions: ChannelVersion[]\n): ChannelVersion {\n  return versions.reduce((max, version, idx) => {\n    if (idx === 0) return version;\n    return compareChannelVersions(max, version) >= 0 ? max : version;\n  });\n}\n\n/**\n * Mapping from error type to error index.\n * Regular writes just map to their index in the list of writes being saved.\n * Special writes (e.g. errors) map to negative indices, to avoid those writes from\n * conflicting with regular writes.\n * Each Checkpointer implementation should use this mapping in put_writes.\n */\nexport const WRITES_IDX_MAP: Record<string, number> = {\n  [ERROR]: -1,\n  [SCHEDULED]: -2,\n  [INTERRUPT]: -3,\n  [RESUME]: -4,\n};\n\nexport function getCheckpointId(config: RunnableConfig): string {\n  return (\n    config.configurable?.checkpoint_id || config.configurable?.thread_ts || \"\"\n  );\n}\n","import {\n  BaseStore,\n  type Operation,\n  type OperationResults,\n  type ListNamespacesOperation,\n  type PutOperation,\n  type GetOperation,\n  type Item,\n  type MatchCondition,\n} from \"@langchain/langgraph\";\n\nimport { MemoryClient } from \"@cloudbase/agent-agents\";\n\n/**\n * TDAI Store configuration\n */\nexport interface TDAIStoreConfig {\n  /**\n   * TDAI Memory Client instance for long-term storage\n   */\n  memoryClient: MemoryClient;\n\n  /**\n   * Session ID for storing records\n   */\n  sessionId: string;\n\n  /**\n   * Optional namespace prefix for all operations\n   */\n  namespacePrefix?: string[];\n\n  /**\n   * TTL configuration for records\n   */\n  ttl?: {\n    defaultTtlSeconds?: number;\n    sweepIntervalMinutes?: number;\n  };\n\n  /**\n   * Whether to ensure tables/collections exist on startup\n   */\n  ensureTables?: boolean;\n\n  /**\n   * Default strategy for storing records\n   */\n  defaultStrategy?: string;\n}\n\n/**\n * Filter operators for advanced filtering\n */\nexport interface FilterOperators {\n  $eq?: unknown;\n  $ne?: unknown;\n  $gt?: number | Date;\n  $gte?: number | Date;\n  $lt?: number | Date;\n  $lte?: number | Date;\n  $in?: unknown[];\n  $nin?: unknown[];\n  $exists?: boolean;\n  $regex?: string;\n}\n\n/**\n * TDAI implementation of the BaseStore interface.\n * Uses TDAI Memory Client for long-term record storage.\n */\nexport class TDAIStore extends BaseStore {\n  private client: MemoryClient;\n  private namespacePrefix: string[];\n  private ttlConfig?: TDAIStoreConfig[\"ttl\"];\n  private ensureTables: boolean;\n  private isSetup: boolean = false;\n  private isClosed: boolean = false;\n  private sweepInterval?: NodeJS.Timeout;\n  private sessionId: string;\n  private defaultStrategy: string;\n\n  constructor(config: TDAIStoreConfig) {\n    super();\n\n    this.client = config.memoryClient;\n    this.namespacePrefix = config.namespacePrefix || [];\n    this.ttlConfig = config.ttl;\n    this.ensureTables = config.ensureTables ?? true;\n    this.sessionId = config.sessionId || \"default_session\";\n    this.defaultStrategy = config.defaultStrategy || \"store\";\n  }\n\n  /**\n   * Create a storage key from namespace and key\n   */\n  private createStorageKey(namespace: string[], key: string): string {\n    const fullNamespace = [...this.namespacePrefix, ...namespace];\n    return `${fullNamespace.join(\":\")}:${key}`;\n  }\n\n  /**\n   * Parse a storage key back to namespace and key\n   */\n  private parseStorageKey(storageKey: string): {\n    namespace: string[];\n    key: string;\n  } {\n    const parts = storageKey.split(\":\");\n    const prefixLength = this.namespacePrefix.length;\n\n    // Remove the prefix from the namespace\n    const namespace = parts.slice(prefixLength, -1);\n    const key = parts[parts.length - 1];\n\n    return { namespace, key };\n  }\n\n  /**\n   * Put an item with optional TTL.\n   */\n  async put(\n    namespace: string[],\n    key: string,\n    value: Record<string, unknown>,\n    index?: false | string[],\n    options?: { ttl?: number }\n  ): Promise<void> {\n    if (!this.isSetup && this.ensureTables) {\n      await this.setup();\n    }\n\n    const storageKey = this.createStorageKey(namespace, key);\n\n    // Prepare the content with metadata\n    const content = JSON.stringify({\n      storageKey,\n      namespace,\n      key,\n      value,\n      index,\n      ttl: options?.ttl || this.ttlConfig?.defaultTtlSeconds,\n    });\n\n    await this.client.appendRecord({\n      sessionId: this.sessionId,\n      content,\n      strategy: this.defaultStrategy,\n    });\n  }\n\n  /**\n   * Get an item by namespace and key.\n   */\n  async get(namespace: string[], key: string): Promise<Item | null> {\n    if (!this.isSetup && this.ensureTables) {\n      await this.setup();\n    }\n\n    const storageKey = this.createStorageKey(namespace, key);\n\n    try {\n      const { records = [] } = await this.client.searchRecords({\n        content: storageKey,\n        sessionId: this.sessionId,\n        limit: 1,\n      });\n\n      if (!records.length) {\n        return null;\n      }\n\n      const record = records[0];\n      const data = JSON.parse(record.record_content);\n\n      // Check TTL if present\n      if (data.ttl && record.created_at) {\n        const createdTime = new Date(record.created_at).getTime();\n        const now = Date.now();\n        if (now > createdTime + data.ttl * 1000) {\n          // Item has expired, delete it\n          await this.delete(namespace, key);\n          return null;\n        }\n      }\n\n      return {\n        namespace,\n        key,\n        value: data.value,\n        createdAt: new Date(record.created_at || Date.now()),\n        updatedAt: new Date(record.updated_at || Date.now()),\n      };\n    } catch (error) {\n      return null;\n    }\n  }\n\n  /**\n   * Delete an item by namespace and key.\n   */\n  async delete(namespace: string[], key: string): Promise<void> {\n    if (!this.isSetup && this.ensureTables) {\n      await this.setup();\n    }\n\n    const storageKey = this.createStorageKey(namespace, key);\n\n    try {\n      const { records = [] } = await this.client.searchRecords({\n        content: storageKey,\n        sessionId: this.sessionId,\n        limit: 1,\n      });\n\n      const record = records[0];\n      if (record) {\n        await this.client.deleteRecord({\n          sessionId: this.sessionId,\n          recordId: record.record_id,\n        });\n      }\n    } catch (error) {\n      // Ignore errors if item doesn't exist\n    }\n  }\n\n  /**\n   * List namespaces with optional filtering.\n   */\n  async listNamespaces(\n    options: {\n      prefix?: string[];\n      suffix?: string[];\n      maxDepth?: number;\n      limit?: number;\n      offset?: number;\n    } = {}\n  ): Promise<string[][]> {\n    if (!this.isSetup && this.ensureTables) {\n      await this.setup();\n    }\n\n    const { prefix, suffix, maxDepth, limit = 100, offset = 0 } = options;\n\n    try {\n      // Get all records to extract namespaces\n      const { records = [] } = await this.client.queryRecords({\n        limit: 1000, // Large limit to get all records\n      });\n\n      const namespaceSet = new Set<string>();\n\n      for (const record of records) {\n        try {\n          const data = JSON.parse(record.record_content);\n          if (data.namespace) {\n            const namespace = data.namespace;\n\n            // Apply prefix filter if specified\n            if (prefix && prefix.length > 0) {\n              const hasPrefix = prefix.every((p, i) => namespace[i] === p);\n              if (!hasPrefix) continue;\n            }\n\n            // Apply suffix filter if specified\n            if (suffix && suffix.length > 0) {\n              const namespaceSuffix = namespace.slice(-suffix.length);\n              if (JSON.stringify(namespaceSuffix) !== JSON.stringify(suffix)) {\n                continue;\n              }\n            }\n\n            // Apply maxDepth filter if specified\n            if (maxDepth !== undefined && namespace.length > maxDepth) {\n              continue;\n            }\n\n            namespaceSet.add(JSON.stringify(namespace));\n          }\n        } catch (error) {\n          // Skip invalid records\n        }\n      }\n\n      // Convert back to arrays and apply pagination\n      const namespaces = Array.from(namespaceSet)\n        .map((ns) => JSON.parse(ns))\n        .sort()\n        .slice(offset, offset + limit);\n\n      return namespaces;\n    } catch (error) {\n      return [];\n    }\n  }\n\n  /**\n   * Execute multiple operations in a single batch.\n   */\n  async batch<Op extends Operation[]>(\n    operations: Op\n  ): Promise<OperationResults<Op>> {\n    if (!this.isSetup && this.ensureTables) {\n      await this.setup();\n    }\n\n    const results: unknown[] = [];\n\n    for (const operation of operations) {\n      if (\"namespacePrefix\" in operation) {\n        // SearchOperation\n        results.push(await this.executeSearch(operation));\n      } else if (\"key\" in operation && !(\"value\" in operation)) {\n        // GetOperation\n        const getOp = operation as GetOperation;\n        results.push(await this.get(getOp.namespace, getOp.key));\n      } else if (\"value\" in operation) {\n        // PutOperation\n        const putOp = operation as PutOperation & {\n          options?: { ttl?: number };\n        };\n        if (putOp.value !== null) {\n          await this.put(\n            putOp.namespace,\n            putOp.key,\n            putOp.value,\n            putOp.index,\n            putOp.options\n          );\n        }\n        results.push(undefined);\n      } else if (\"matchConditions\" in operation) {\n        // ListNamespacesOperation\n        const listOp = operation as ListNamespacesOperation;\n        results.push(await this.executeListNamespaces(listOp));\n      } else {\n        throw new Error(\n          `Unsupported operation type: ${JSON.stringify(operation)}`\n        );\n      }\n    }\n\n    return results as OperationResults<Op>;\n  }\n\n  /**\n   * Execute search operation\n   */\n  private async executeSearch(operation: any): Promise<Item[]> {\n    const { namespacePrefix, ...searchOptions } = operation;\n    return this.search(namespacePrefix, searchOptions);\n  }\n\n  /**\n   * Execute list namespaces operation\n   */\n  private async executeListNamespaces(\n    operation: ListNamespacesOperation\n  ): Promise<string[][]> {\n    const { matchConditions, maxDepth, limit = 100, offset = 0 } = operation;\n\n    // Convert match conditions to prefix/suffix filters\n    let prefix: string[] | undefined;\n    let suffix: string[] | undefined;\n\n    if (matchConditions && matchConditions.length > 0) {\n      for (const condition of matchConditions) {\n        if (condition.matchType === \"prefix\") {\n          prefix = condition.path;\n        } else if (condition.matchType === \"suffix\") {\n          suffix = condition.path;\n        }\n      }\n    }\n\n    return this.listNamespaces({\n      prefix,\n      suffix,\n      maxDepth,\n      limit,\n      offset,\n    });\n  }\n\n  /**\n   * Initialize the store.\n   */\n  async setup(): Promise<void> {\n    if (this.isSetup) return;\n\n    // Start TTL sweeper if configured\n    if (this.ttlConfig?.sweepIntervalMinutes) {\n      const intervalMs = this.ttlConfig.sweepIntervalMinutes * 60 * 1000;\n      this.sweepInterval = setInterval(async () => {\n        try {\n          await this.sweepExpiredItems();\n        } catch (error) {\n          console.error(\"Error during TTL sweep:\", error);\n        }\n      }, intervalMs);\n    }\n\n    this.isSetup = true;\n  }\n\n  /**\n   * Start the store.\n   */\n  async start(): Promise<void> {\n    if (this.ensureTables && !this.isSetup) {\n      await this.setup();\n    }\n  }\n\n  /**\n   * Stop the store and close all connections.\n   */\n  async stop(): Promise<void> {\n    if (this.isClosed) return;\n\n    if (this.sweepInterval) {\n      clearInterval(this.sweepInterval);\n      this.sweepInterval = undefined;\n    }\n\n    this.client.close();\n    this.isClosed = true;\n  }\n\n  /**\n   * Manually sweep expired items from the store.\n   */\n  async sweepExpiredItems(): Promise<number> {\n    if (!this.isSetup && this.ensureTables) {\n      await this.setup();\n    }\n\n    try {\n      const { records = [] } = await this.client.queryRecords({\n        limit: 1000,\n      });\n\n      let cleanedCount = 0;\n      const now = Date.now();\n\n      for (const record of records) {\n        try {\n          const data = JSON.parse(record.record_content);\n          if (data.ttl && data.createdAt) {\n            const createdTime = new Date(data.createdAt).getTime();\n            if (now > createdTime + data.ttl * 1000) {\n              await this.client.deleteRecord({\n                sessionId: this.sessionId,\n                recordId: record.record_id,\n              });\n              cleanedCount++;\n            }\n          }\n        } catch (error) {\n          // Skip invalid records\n        }\n      }\n\n      return cleanedCount;\n    } catch (error) {\n      return 0;\n    }\n  }\n\n  /**\n   * Get statistics about the store.\n   */\n  async getStats(): Promise<{\n    totalItems: number;\n    expiredItems: number;\n    namespaceCount: number;\n    oldestItem: Date | null;\n    newestItem: Date | null;\n  }> {\n    if (!this.isSetup && this.ensureTables) {\n      await this.setup();\n    }\n\n    try {\n      const { records = [] } = await this.client.queryRecords({\n        limit: 1000,\n      });\n\n      let totalItems = 0;\n      let expiredItems = 0;\n      const namespaces = new Set<string>();\n      const dates: Date[] = [];\n      const now = Date.now();\n\n      for (const record of records) {\n        try {\n          const data = JSON.parse(record.record_content);\n          totalItems++;\n\n          if (data.namespace) {\n            namespaces.add(data.namespace.join(\":\"));\n          }\n\n          if (data.createdAt) {\n            dates.push(new Date(data.createdAt));\n          }\n\n          if (data.ttl && data.createdAt) {\n            const createdTime = new Date(data.createdAt).getTime();\n            if (now > createdTime + data.ttl * 1000) {\n              expiredItems++;\n            }\n          }\n        } catch (error) {\n          // Skip invalid records\n        }\n      }\n\n      const oldestItem =\n        dates.length > 0\n          ? new Date(Math.min(...dates.map((d) => d.getTime())))\n          : null;\n      const newestItem =\n        dates.length > 0\n          ? new Date(Math.max(...dates.map((d) => d.getTime())))\n          : null;\n\n      return {\n        totalItems,\n        expiredItems,\n        namespaceCount: namespaces.size,\n        oldestItem,\n        newestItem,\n      };\n    } catch (error) {\n      return {\n        totalItems: 0,\n        expiredItems: 0,\n        namespaceCount: 0,\n        oldestItem: null,\n        newestItem: null,\n      };\n    }\n  }\n\n  /**\n   * Search for items in the store with support for text search and filtering.\n   */\n  async search(\n    namespacePrefix: string[],\n    options: {\n      /**\n       * Filter conditions with support for advanced operators.\n       */\n      filter?: Record<\n        string,\n        string | number | boolean | null | FilterOperators\n      >;\n\n      /**\n       * Natural language search query.\n       */\n      query?: string;\n\n      /**\n       * Maximum number of results to return.\n       * @default 10\n       */\n      limit?: number;\n\n      /**\n       * Number of results to skip for pagination.\n       * @default 0\n       */\n      offset?: number;\n\n      /**\n       * Whether to refresh TTL for returned items.\n       */\n      refreshTtl?: boolean;\n    } = {}\n  ): Promise<Item[]> {\n    if (!this.isSetup && this.ensureTables) {\n      await this.setup();\n    }\n\n    const { filter, query, limit = 10, offset = 0, refreshTtl } = options;\n\n    try {\n      // Build search query\n      const namespaceKey = [...this.namespacePrefix, ...namespacePrefix].join(\n        \":\"\n      );\n\n      let searchResult;\n      if (query) {\n        searchResult = await this.client.searchRecords({\n          content: query,\n          limit: limit + offset,\n        });\n      } else {\n        searchResult = await this.client.queryRecords({\n          limit: limit + offset,\n        });\n      }\n\n      const items: Item[] = [];\n      const now = Date.now();\n\n      if (searchResult.records) {\n        for (const record of searchResult.records.slice(\n          offset,\n          offset + limit\n        )) {\n          try {\n            const data = JSON.parse(record.record_content);\n\n            // Filter by namespace prefix\n            if (namespaceKey && !data.storageKey?.startsWith(namespaceKey)) {\n              continue;\n            }\n\n            // Check TTL\n            if (data.ttl && data.createdAt) {\n              const createdTime = new Date(data.createdAt).getTime();\n              if (now > createdTime + data.ttl * 1000) {\n                continue; // Skip expired items\n              }\n            }\n\n            // Apply filters (basic implementation)\n            if (filter) {\n              let matches = true;\n              for (const [key, value] of Object.entries(filter)) {\n                if (data.value[key] !== value) {\n                  matches = false;\n                  break;\n                }\n              }\n              if (!matches) continue;\n            }\n\n            const item: Item = {\n              namespace: data.namespace,\n              key: data.key,\n              value: data.value,\n              createdAt: new Date(record.created_at || Date.now()),\n              updatedAt: new Date(record.updated_at || Date.now()),\n            };\n\n            items.push(item);\n\n            // Refresh TTL if requested\n            if (refreshTtl && this.ttlConfig?.defaultTtlSeconds) {\n              await this.put(data.namespace, data.key, data.value, undefined, {\n                ttl: this.ttlConfig.defaultTtlSeconds,\n              });\n            }\n          } catch (error) {\n            // Skip invalid records\n          }\n        }\n      }\n\n      return items;\n    } catch (error) {\n      return [];\n    }\n  }\n}\n\n","export * from \"./agent\";\nexport { TDAISaver, type TDAISaverConfig } from \"./checkpoint\";\nexport { CloudBaseSaver, type CloudBaseSaverConfig } from \"./cloudbase-saver\";\nexport { TDAIStore, type TDAIStoreConfig } from \"./store/tdai-store\";\n\n// Re-export Logger from shared for convenience\nexport { type Logger, noopLogger, createConsoleLogger } from \"@cloudbase/agent-shared\";\n"],"mappings":"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","names":["BaseCheckpointSaver","WRITES_IDX_MAP: Record<string, number>","BaseCheckpointSaver","docs","BaseStore","noopLogger"]}